商城-学习整理-高级-商城业务-商品上架es(十)

目录

  • 一、商品上架
    • 1、sku在ES中存储模型分析
    • 2、nested数据类型场景
    • 3、构造基本数据(商品上架)
  • 二、首页
    • 1、项目介绍
    • 2、整合thymeleaf(spring-boot下模板引擎)渲染页面
    • 3、页面修改不重启服务器实时更新
    • 4、渲染二级三级数据
  • 三、搭建域名访问环境
    • 1、nginx反向代理配置
    • 2、nginx负债均衡配置
    • 3、多个网卡,nacos注册的服务ip有误,导致服务无法访问

一、商品上架

1、sku在ES中存储模型分析

只有上架的商品才可以在前台展示,不上架的在后台管理系统。上架就是放到ES中。
在这里插入图片描述
1、商品 Mapping
分析:商品上架在 es 中是存 sku 还是 spu?
1)、检索的时候输入名字,是需要按照 sku 的 title 进行全文检索的
2)、检索使用商品规格,规格是 spu 的公共属性,每个 spu 是一样的
3)、按照分类 id 进去的都是直接列出 spu 的,还可以切换。
4)、我们如果将 sku 的全量信息保存到 es 中(包括 spu 属性)就太多量字段了。
5)、我们如果将 spu 以及他包含的 sku 信息保存到 es 中,也可以方便检索。但是 sku 属于
spu 的级联对象,在 es 中需要 nested 模型,这种性能差点。
6)、但是存储与检索我们必须性能折中。
7)、如果我们分拆存储,spu 和 attr 一个索引,sku 单独一个索引可能涉及的问题。
检索商品的名字,如“手机”,对应的 spu 有很多,我们要分析出这些 spu 的所有关联属性,再做一次查询,就必须将所有 spu_id 都发出去。假设有 1 万个数据,数据传输一次就10000*4=4MB;并发情况下假设 1000 检索请求,那就是 4GB 的数据,,传输阻塞时间会很长,业务更加无法继续。
所以,我们如下设计,这样才是文档区别于关系型数据库的地方,宽表设计,不能去考虑数据库范式。
1)、PUT product

product 的 mapping
{ "mappings": { "properties": { "skuId": { "type": "long"
},"spuId": { "type": "keyword"
},"skuTitle": { "type": "text", "analyzer": "ik_smart"
},"skuPrice": { "type": "keyword"
},"skuImg": { "type": "keyword",
"index": false, "doc_values": false
},"saleCount": { "type": "long"
},"hasStock": { "type": "boolean"
},"hotScore": { "type": "long"
},"brandId": { "type": "long"
},"catalogId": { "type": "long"
},"brandName": { "type": "keyword", "index": false, "doc_values": false
},"brandImg": { "type": "keyword", "index": false, "doc_values": false
},"catalogName": { "type": "keyword", "index": false, "doc_values": false
},"attrs": { "type": "nested", "properties": { "attrId": { "type": "long"
},"attrName": { "type": "keyword", "index": false, "doc_values": false
},
"attrValue": { "type": "keyword"
}
}
}
}
}
}
index:
默认 true,如果为 false,表示该字段不会被索引,但是检索结果里面有,但字段本身不能
当做检索条件。
doc_values:
默认 true,设置为 false,表示不可以做排序、聚合以及脚本操作,这样更节省磁盘空间。
还可以通过设定 doc_values 为 true,index 为 false 来让字段不能被搜索但可以用于排序、聚
合以及脚本操作:

2、nested数据类型场景

在这里插入图片描述
https://www.elastic.co/guide/en/elasticsearch/reference/7.5/nested.html
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、构造基本数据(商品上架)

在SpuInfoController.java中编写上架接口spuUp。
需要远程调用库存系统,看下库存系统是否还有库存。
将上架数据保存到es中。
远程查询库存&泛型结果封装。
在这里插入图片描述
debug进行联调测试。

二、首页

1、项目介绍

整个项目是一个前后分离的项目,前端是需要给我们的后台发送微服务请求,返回相应的数据进行操作即可,包括商城也是一个前后分离的项目来进行开发,但是处于学习的考虑,使用前后分离就会屏蔽掉很多细节,所以最终页面模块代码基本已经写好了,进行服务端的页面渲染式开发,将这些页面放到微服务里面开发组成整个商城系统。
最终整个微服务架构如下:
在这里插入图片描述

用户访问所有请求,先访问nginx,nginx作为反向代理全部转发给网关,网关再路由到各个服务,网关的好处(做统一的鉴权、认证、以及限流),页面可以写到各个微服务里面,引用的静态资源可以放到nginx服务器上,这样就做到了静(静态资源,让nginx返回)动(动态请求)分离,可分担微服务的压力,如果将静态资源也放到微服务里面,请求一个图片也需要微服务的tomcat建立连接处理,再返回,tomcat的并发本来就不高,假如有5000个并发,4000个都是处理图片的,那么只有1000个是真正来进行业务调用和处理的,这样就会让我们的项目没有办法支持高并发的功能。

2、整合thymeleaf(spring-boot下模板引擎)渲染页面

自然化语言,编写的页面,前端可以直接使用,性能稍差,如果在生产环境开启缓存功能,性能也很高。
在product项目下引入spring-boot-starter-thymeleaf,不需要填写版本号,会有spring-boot控制
在这里插入图片描述
在这里插入图片描述

static:放静态资源,将静态资源index放到static下。
templates:将index.html页面放到templates下

在这里插入图片描述
thymeleaf要使用,需要做一个预先的配置(就算不配置,默认启动也可以使用),关闭缓存,开发期间可以看到效果,配置thymeleaf的前缀以及后缀,所有的默认的前缀都是classpath,就是要找所有页面都是到类路径(respurces)下的templates,后缀是.html,相当于我们以后controller返回的数据只要不是json数据,而是一个字符串,按照这个字符串springmvc的视图解析解析字符串,来到我们的页面,前缀就是找templates,后缀就是找.html页面,而且我们的微服务也可以提供接口功能,controller里面都是一个rest接口,所有和web页面有关的,我们再单独放一个包,包模块就要web,然后就重启我们的商品服务,看看页面能不能访问。也可以访问index/css/GL.css静态资源(http://localhost:20001/index/css/GL.css)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
重写访问页面
在这里插入图片描述

找到thymeleaf的官方文档,看下如何使用
https://www.thymeleaf.org/documentation.html
在这里插入图片描述
使用thymeleaf,需要给每一个页面加上名称空间
在这里插入图片描述

3、页面修改不重启服务器实时更新

pom中引入:devtools,修改完页面,ctrl shift F9重新自动编译一下。
在这里插入图片描述

4、渲染二级三级数据

三、搭建域名访问环境

1、nginx反向代理配置

在这里插入图片描述
nginx里面目前放了分词器,远程请求nginx,返回分词器的数据。

在这里插入图片描述

正向与反向对于我们这台电脑来说,如果是帮我们上网的,那么就是正向代理,如果是帮助对方服务器的就是反向代理,比如我们想要访问谷歌,访问不上,我们可以搭建一台代理服务器,我们电脑配置一台代理服务器的地址,以后电脑想访问所有的网址,我们的请求都会由代理服务器帮我们请求谷歌,拿到数据再帮我们返回,那么这个就是正向代理,作用就是隐藏客户端信息,因为我们的请求是发给我们的代理服务器的,由代理服务器转给我们的网络,所以互联网看到所有的访问都是代理服务器的ip。
反向代理对于搭建集群环境很需要,比如我们访问我们的商城,我们的商城由我们的后台集群,我们的集群都要由我们的服务器在内网部署,不可能把服务器的每个外网IP暴漏给外界,这样容易受到攻击,为了能找到内网集群服务器,可以在前面前置一个服务器,这个服务器就叫反向代理,前置一个nginx,这个nginx是一个公网ip,大家都可以访问的,如果我们访问我们公网nginx的服务器,真正的服务在内网中部署,所以由我们的nginx转给我们的内网服务器,这个nginx服务器也是和我们后台服务器搭建在同一个环境里面,只有这个服务器对外暴漏公网IP,屏蔽内部其他集群的信息。

真言商城,我们的客户端访问zhenyanmall,以我本机环境为例,搭建域名访问环境,本机访问zhenyanmall,或者访问www.baidu.com,这个请求会先被网络的DNS进行解析,解析到百度的IP地址到底在哪,然后我们的浏览器就会访问到这个地址对应的内容,就是因为这个域名解析,虽然我们没有购买zhenyanmall这个域名,我们可以在windows的hosts文件里面配置zhenyanmall.com域名对应哪个虚拟机IP地址,比如我们在浏览器里面请求zhenyanmall.com,windows如何知道域名对应哪个IP地址,第一步会先查看系统内部的域名映射规则,如果这个域名已经有映射了,说明这个zhenyanmall在哪个地址,那么浏览器就可以直接去这个地址,网卡带我们直接转过去。第二步,如果系统没有zhenyanmall这个域名映射,那么会去网络上的DNS(114.114.114.114等公共网络域名解析服务器),解析出我们的域名,DNS中保存了哪个域名对应哪个IP地址,再来转到那个IP地址。
因为我们访问zhenyanmall.com,在windows系统内部配置(hosts文件),告诉这个域名在哪,直接来到我们指定的IP地址,就不需要过网络DNS了,由于我们把nginx放到了虚拟机上,因此可以让zhenyanmall.com指定我们虚拟机的地址,完整的域名配置环境。
在这里插入图片描述
每次修改hosts有点麻烦,我们可以使用SwitchHosts管理域名映射,以管理员方式打开,创建zhenyanmall本地方案,记得勾选右下角的对号,应用当前方案。
在这里插入图片描述
我们使用域名访问es集群,能访问到,说明域名环境配置好了
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
我们每一个系统都有对应的域名,全部都是先访问虚拟机的的IP地址,接下来我们要访问虚拟机的nginx,开启虚拟机的nginx
将nginx设为开机自启。
在这里插入图片描述
直接请求域名,发现访问到nginx的index.html文件
在这里插入图片描述
第一步:当我们访问域名的时候,保证第一步访问虚拟机的nginx,接下来还要访问到我们的项目,让我们所有的请求都转给我们的网关,由网关再代转给每一个项目,也可以让nginx转给我们指定的项目,比如访问zhenyanmall.com,现在我们想要用商城的首页作为第一跳转,zhenyanmall的所有请求都转发到http://localhost:20001 端口(就是商品项目,拥有我们首页的内容)。这样做不好,当我们的product部署的有多台的时候,ip和port都不一样,每次我们都得修改nginx,所以需要nginx给我们做反向代理,那么和网关功能就是一样了,所有来自原zhenyanmall.com的请求,都转到商品服务,可以不用去网关,直接转到商品服务,转发到http://localhost:20001 端口。
在这里插入图片描述
nginx装好之后所有的配置都挂载到了/mydata/nginx/下
nginx有一个总配置:nginx.conf
在这里插入图片描述
nginx.conf介绍
在这里插入图片描述
在这里插入图片描述

用户组
工作线程
错误日志的地址
pid文件的位置
最大连接数
http块:支持的mime类型,默认返回的构造数据类型,日志格式,访问日志路径,以及是否开启压缩,做负载均衡upstream上下游信息,http的server块,
include /etc/nginx/conf.d/*.conf; 包含所有的conf配置,只要是conf.d下的文件都会被合并到nginx.conf中,这样一个文件不会很大,也会很清晰,看下默认配置default.conf
在这里插入图片描述

一个server块,配置虚拟主机相关的信息,监听80端口,server name 利用域名配置的主机,监听域名下的80端口,包括一些访问日志#access_log /var/log/nginx/log/host.access.log main;,location /的意思是,这个域名下的所有请求都可以在 root /usr/share/nginx/html;根文件夹找,包括默认的首页 index index.html index.htm;,还能配置一些404页面。500页面。

我们现在想做的事就是,希望把源自与zhenyanmall.com的请求转给我们的商品服务,把default复制一份,编辑zhenyanmall.conf
在这里插入图片描述
修改server name 为zhenyanmall.com 意思是这个模块是监听来自zhenyanmall.com下的80端口,

在这里插入图片描述
请求zhenyanmall.com这个域名,是nginx的服务器地址,相当于把这个请求交给nginx,因为server name配置的是zhenyanmall.com,nginx会拿到请求的host进行匹配,看看是不是zhenyanmall.com的,类似于网关,将location下的root和index的配置删掉,添加proxy_pass(代理通过),就是代理给谁,把我们的请求再转发给(因为目前是开发环境,商品服务在我的机器,没在虚拟机,相当于又绕了一圈转回来)商品服务,目前是开发环境因此就是自己的机器,输入ipconfig,查看自己的ip地址,192.168.56.1虚拟网卡,192.168.137.1本机地址,172.28.65.75公网地址,配置这三个任何都可以,最好配置192.168.56.1,因为公网地址切换网络会变化
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
重启nginx,再次请求,页面就变成了商城的首页了
在这里插入图片描述
可以看到域名访问效果了。
但是还有一个问题,如果是分布式的情况下,商品系统有很多,不只一个,那我们每次都需要修改nginx的配置,每次修改就麻烦了,所以应该将nginx配置zhenyanmall.com这个请求直接给我们代理网关,由网关再自动转发给我们的服务,网关就能动态的发现哪些应用上线下线,以及负债均衡。

2、nginx负债均衡配置

http://nginx.org/en/index.html
在这里插入图片描述
在这里插入图片描述

在总的nginx.conf配置上游服务器配置网关,因为只配置了一个网关,只需要写一个即可。
在这里插入图片描述
修改zhenyanmall.conf,监听80端口的所有请求,代理的话不直接代理给商品服务了,直接代理给网关,网关上游服务器的名字为zhenyanmall。
在这里插入图片描述
重启nginx
在这里插入图片描述

然后请求zhenyanmall.com,报404,这是因为网关没有配置,网关也需要帮我们转到指定的服务,在网关添加路由规则,负债均衡给商品服务,以前是按照路径进行映射,现在按照host进行映射(参照网关对应的文档),只要是zhenyanmall.com下的请求,都转给商品服务。

在这里插入图片描述

在这里插入图片描述

然后重启网关服务。请求http://zhenyanmall.com/,还是404,是因为nginx代理给网关时,会丢失请求的host信息(会丢掉很多信息),我们用到什么需要加什么,需要配置nginx不要丢掉这些,我们需要修改nginx的路径映射规则location,加上proxy_set_header Host $host取出当前请求的真正的host值
在这里插入图片描述
在这里插入图片描述
重启nginx。

在这里插入图片描述
http://zhenyanmall.com/api/product/attrattrgrouprelation/list
也可以访问成功。

域名映射效果:
请求接口:zhenyanmall.com
请求页面:zhenyanmall.com
都可以使用域名,nginx直接代理给网关,网关判断,通过网关转发请求。如果是/api/**,转交给对应的服务器,如果是满足域名,转交给对应的服务。

3、多个网卡,nacos注册的服务ip有误,导致服务无法访问

因为电脑装了虚拟机,所以存在多块网卡,服务注册到nacos时默认使用了虚拟机的网卡,导致网关无法将请求路由到正确的服务上。

nacos查看服务的IP地址如下:
在这里插入图片描述
实际想使用的IP地址是 127.0.0.1 ,即我本机的IP地址,因为开发环境服务是运行在本机的。

解决办法,直接在nacos的配置里加上ip这一项属性,将注册的服务IP直接设置为想要的IP地址,然后重启服务即可。

spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        ip: 127.0.0.1

修改完成重启服务之后在nacos查看的地址如下:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/79604.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

「UG/NX」Block UI 面收集器FaceCollector

✨博客主页何曾参静谧的博客📌文章专栏「UG/NX」BlockUI集合📚全部专栏「UG/NX」NX二次开发「UG/NX」BlockUI集合「VS」Visual Studio「QT」QT5程序设计「C/C+&#

LeetCode150道面试经典题-- 求算数平方根(简单)

1.题目 给你一个非负整数 x ,计算并返回 x 的 算术平方根 。 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。 注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。 2.示例 …

【目标检测中对IoU的改进】GIoU,DIoU,CIoU的详细介绍

文章目录 1、IoU2、GIoU(Generalized Intersection over Union)3、DIoU4、CIoU 1、IoU IoU为交并比,即对于pred和Ground Truth:交集/并集 1、IoU可以作为评价指标使用,也可以用于构建IoU loss 1 - IoU 缺点: 2、对于pred和GT相…

机器学习|DBSCAN 算法的数学原理及代码解析

机器学习|DBSCAN 算法的数学原理及代码解析 引言 聚类是机器学习领域中一项重要的任务,它可以将数据集中相似的样本归为一类。DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种是一种经典的密度聚类…

博客系统之单元测试

对博客系统进行单元测试 1、测试查找已存在的用户 测试名称 selectByUsernameTest01 测试源码 //查找用户,存在 Test public void selectByUsernameTest01 () { UserDao userDao new UserDao(); String ret1 userDao.selectByUsername("张三").toStr…

全开放式耳机什么品牌好?全开放式耳机推荐

​在音乐的世界中,开放式耳机提供了更真实、更通透的音质体验,开放式耳机采用不入耳设计,佩戴更为稳固舒适,还允许外界的声音自由地流入,使你在享受音乐的同时,也能保持对周围环境的感知,户外运…

自动驾驶卡车量产-第一章-用户需求

1、中国干线物流行业现状 万亿级市场,规模巨大。由中重卡承运的干线运输占到整体公路货运市场的82%,全国中重卡保有量约730 万台1,市场规模达4.6 万亿元1,体量全球第一,超过同城物流及乘用出租市场规模之和。同样&…

SpringBoot 的 RedisTemplate、Redisson

一、Jedis、Lettuce、Redisson的简介 优先使用Lettuce, 需要分布式锁,分布式集合等分布式的高级特性,添加Redisson结合使用。 对于高并发,1000/s的并发,数据库可能由行锁变成表锁,性能下降会厉害。 1.1、…

卷积神经网络全解!CNN结构、训练与优化全维度介绍!

目录 一、引言1.1 背景和重要性1.2 卷积神经网络概述 二、卷积神经网络层介绍2.1 卷积操作卷积核与特征映射卷积核大小多通道卷积 步长与填充步长填充 空洞卷积(Dilated Convolution)分组卷积(Grouped Convolution) 2.2 激活函数R…

Eclipse集成MapStruct

Eclipse集成MapStruct 在Eclipse中添加MapStruct依赖配置Eclipse支持MapStruct①安装 m2e-aptEclipse Marketplace的方式安装Install new software的方式安装(JDK8用到) ②添加到pom.xml 今天拿到同事其他项目的源码,导入并运行的时候抛出了异…

leetcode做题笔记86分隔链表

给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应当 保留 两个分区中每个节点的初始相对位置。 示例 1: 输入:head [1,4,3,2,5,2], x 3 输出&am…

【数据结构OJ题】复制带随机指针的链表

原题链接:https://leetcode.cn/problems/copy-list-with-random-pointer/description/ 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 此题可以分三步进行: 1. 拷贝链表的每一个结点,拷贝的结点先链接到被拷贝结点…

什么是异常处理

文章目录 异常处理介绍自定义异常页面文档:自定义异常页面说明 自定义异常页面-应用实例需求:代码实现 全局异常说明全局异常-应用实例需求:代码实现完成测试 自定义异常说明自定义异常-应用实例需求:代码实现完成测试 注意事项完成测试 异常处理 介绍 默认情况下…

飞天使-k8s简单搭建(编写中)

文章目录 k8s概念安装部署无密钥配置与hosts与关闭swap开启ipv4转发安装前启用脚本开启ip_vs安装指定版本docker 安装kubeadm kubectl kubelet,此部分为基础构建模版 k8s一主一worker节点部署k8s三个master部署虚拟负载均衡ip创建 参考链接地址 k8s概念 K8sMaster : 管理K8sNo…

Python学习笔记_基础篇(二)_数据类型之字符串

一.基本数据类型 整数:int 字符串:str(注:\t等于一个tab键) 布尔值: bool 列表:list 列表用[] 元祖:tuple 元祖用() 字典:dict 注:所有的数据类型都存在想对应…

Jmeter 连接 MySQL 数据库脚本

1、创建线程组 2、创建 JDBC Connection Configuration 3、创建 JDBC Request 4、最终创建的目录 5、重点来了 5.1 在百度中下载个 MySQL-connector-Java-8.0.28.jar,放在 jmeter 的 bin 目录下 5.2 在测试计划中,将 jar 包添加到脚本中 5.3 输入参…

【动态map】牛客挑战赛67 B

登录—专业IT笔试面试备考平台_牛客网 题意: 思路: 考虑动态的map 可以先定义一个状态,然后用map统计前缀这个状态的出现次数 在这里,定义{a,b}为cnt1 - cnt0和cnt2 - cnt0 当cnt0 和 cnt1都和cnt2相同时,统计贡献…

算法通关村第3关【白银】| 双指针思想

1. 双指针思想 双指针不仅指两个指针,也可以是两个变量,指向两个值。 有三种类型: 快慢型:一前一后对撞型:从两端向中间靠拢背向型:从中间向两端分开 2. 删除元素专题 2.1原地移除元素 (1)快慢指针 思…

Docker安装基础使用练习

目录 1、安装Docker-CE 1)简单使用yum方式安装 ! 2)配置镜像加速: 2、下载系统镜像(Ubuntu、 centos) 1)先查看我们所需的镜像有哪些版本。使用search命令! 2)下载镜像使用的是pul…

nestjs 基础、使用 passport 来进行鉴权

回顾一些定义 NestJS 部分 Module 模块结构 模块是一个图状引用关系。 模块的实例化有三种模式。默认情况是 singletones 模式,也就是模块可能被引用,但不同的引用处拿的是同一个共享实例,也就是说一个进程有一个唯一的实例被共享。 模块&a…
最新文章