黑马商城(微服务项目) 黑马商城微服务前期部署遇到的问题和命令行
从P36开始跟着视频微服务01-01.导入黑马商城_哔哩哔哩_bilibili和在线学习文档day03-微服务01 - 成电飞书云文档 (feishu.cn)一起部署
一、环境配置:
1.yum问题:Cannot find a valid baseurl for repo: base/7/x86_6
解决:centos7 There are no enabled repos - Jerry` - 博客园 (cnblogs.com)
2.MobaXterm Home Edition安装:关杀毒软件避免下载失败
idea打开hmall在Maven中reload失败:
3.hmall项目配置文件(如 Maven 的 pom.xml)中声明的外部库无法从远程仓库下载
报错情况1:依赖解析失败,未成功下载,点报错下面的try,强制更新Maven快照
报错情况2:用jdk11,项目中的依赖版本都不用改,然后记得不仅要按照文档的springboot里点开设置Java11,还有点开项目中的依赖配置看是不是sdk11,要一致,否则还是报错。
便捷点可以直接在报错中点开这种:
报错情况3:package报错Class com.sun.tools.javac.tree.JCTree$JCImport does not have member field 'com.sun.tools.javac.tree.JCTree qualid',可以用http://t.csdnimg.cn/doeNi解决
报错情况4:进入18080端口登录出现用户名和密码错误,这是浏览器出现了问题
【4.1idea报错】ERROR 10476 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.hmall.common.exception.UnauthorizedException: 未登录] with root cause
【4.2浏览器控制台报错】Failed to load resource: net::ERR_CERT_DATE_INVALID
utils.js:1 Uncaught (in promise) Object
解决:禁用ssl,使用http不要用https
server: port: 8080 ssl: enabled: false
4.SSH配置
要注意自己设置的ip和net8、net1、物理机的ip地址是不是相同了,然后注意要在同一网段(源主机的掩码和源主机的ip,源主机的掩码和虚拟机的ip,与运算结果相同)
5.centos7发现vim按esc没反应
按照这个方法顺利解决http://t.csdnimg.cn/2byoe
6.安装MobaXterm后就可以直接在上面上传文件,安装了,按照http://t.csdnimg.cn/vjRFR安装了vs
7.docker安装
出现报错:[Errno 14] curl#7 - "Failed to connect to 2a03:2880:f11a:83:face:b00c:0:25de: Network is unreachable"
解决:注意关闭防火墙没用,应该是源的问题,用这篇文章中的源安装:Centos环境docker的正确安装及疑难杂症 - 东邪西毒 - 博客园 (cnblogs.com)
8.安装mysql
出现报错:Unable to find image 'mysql:latest' locally
解决:http://t.csdnimg.cn/G9QH8先按照这个,然后docker pull mysql:latest,最后就按照学习文档中的run命令就可以了。
使用MySQL的客户端工具连接MySQL:i.http://t.csdnimg.cn/gNmjj,ii.cmd测试:mysql -h 虚拟机ip -P 3306 -u root -p,iii.MySQL客户端软件连接这个mysql
如果都没有问题,再次打开出现连接不上且logs里没有报错,就全部重启一遍
9.nginx
开启运行闪退,没有关系,先看任务管理器中有没有nginx进程,有就是对的,没有就看logs
10.sentinel
启动报错:找不到或无法加载主类 .port=8090 以及Error: Unable to access jarfile .\xxxx.jar
二、环境布置部署命令行
#安装docker
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo yum install docker-ce
sudo systemctl start docker
#阿里云镜像加速,https://www.aliyun.com/
产品-容器-ACR-管理控制台-镜像加速器-centos-具体命令
#安装mysql,把mysql文件夹直接复制到root目录下
docker network create hm-net
vi /etc/resolv.conf
nameserver 223.5.5.5//改不是添加
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
-v /root/mysql/data:/var/lib/mysql \
-v /root/mysql/conf:/etc/mysql/conf.d \
-v /root/mysql/init:/docker-entrypoint-initdb.d \
--network hm-net\
mysql
#安装nginx,把nginx直接复制到root目录下
docker run -d \
--name nginx \
-p 18080:18080 \
-p 18081:18081 \
-v /root/nginx/html:/usr/share/nginx/html \
-v /root/nginx/nginx.conf:/etc/nginx/nginx.conf \
--network hm-net\
nginx
#idea后端
1)运行和编译都确定是jdk11和sdk11,active profile=local(hmall、hm-common、hmall-service)
2)application.yaml替换一下虚拟机的ip地址
3)去掉测试,maven中'skip test',点击hmal-lifecycle-package【如果报错了,就lombok改为1.18.30】,在hm-service文件夹中出现target目录,把hm-service/Dockerfile和hm-service/target/hm-service.jar复制到虚拟机的root目录下
#一键部署,docker-compose.yml文件复制到root目录下,不用指定目录
docker compose up -d
docker compose down
#前端
idea:springboot运行
三、单体拆分为微服务,maven聚合多个module
#item-service【全从hm-service拷贝】
i.依赖pom.xml:从hm-service/pom.xml中复制,删掉登录所需的“加密”,父工程已经引用的“单元测试”,暂时不确定需不需要的“redis”【需要再添】,然后点右上角的load maven
ii.创建包和启动类:
1.java/:新建包“com.hmall.item”
2.com.hmall.item/:拷贝“HMallApplication”到包中为“ItemApplication”,并且修改其中的类名Class和扫描包MapperScan
3.com.hmall.item/:创建包mapper,service.controller,domain
4.java/resoureces/:配置文件从hm-service中拷贝三个,dev和local不用改
修改“application.yaml”【port: 8081,name: item-service,3306/hm-item?,
黑马商城商品管理接口文档,api-rule-resources:-
com.hmall.item.controller】,删除最后登录用户加密部分
(hm:jwt...,auth...)
5.具体代码:拷贝顺序,最后——controller依赖service依赖mapper依赖domain——最先
i.四个包:有的全拷贝过来,数据传输对象dto,前端的表单提交和服务的交互。
ii.mapper:报错修改,根据报错再把缺的代码拷贝一下
iii.service:impl包中有个不会报错但要修改的地方,String sqlStatement =
"com.hmall.item.mapper...."
#cart-service
大体步骤跟item一样,1-4可以从item拷贝,省去筛选的过程
1.CartServiceImpl:购物车功能依赖于商品查询功能,
需要注入这个功能:查询购物车的时候不仅查询购物车的信息,
还要查询最新的价格和状态信息,可以提醒用户价格更便宜。
但是微服务拆分要实现单一职责,所以这部分是无法查询商品的数据库的。
先隐藏这部分的报错,进行运行测试,后面再处理
如何解决服务拆分后数据和服务隔离,无法进行本地调用,要去查询别的服务的数据库?网络调用
如何通过Java代码从一个服务向另一个服务发起网络请求查询数据?
例:前端向后端发起网络请求获得数据,发起http请求
具体实现:API,RestTemplate-exchange,可以把返回的Jason反序列化成Java。
先去掉第三张图的注释,复制ItemDTO代码到cart包中
#在启动类中写配置
public RestTemplate restTemplate(){
return new RestTemplate();
}
#CartServiceImpl
RestTemplate-exchange缺点:
在服务较少时,还可以使用,但是为了满足实际中更高的并发请求压力,将一个服务部署多份,创建多个容器同时启动同时接收,形成负载均衡的集群,多实例部署
解决:注册中心技术,服务治理,开源的注册中心组件Nacos
nacos启动时报错:No DataSource set,先删掉容器,重新运行
查询商品部分代码,由于商品在另一个微服务,查询的时候只能远程调用查询,又因为不写死ip,就需要拉取服务实现服务,所以代码中需要根据服务名称获取服务实例列表,然后对列表做负载均衡挑出具体实例,然后去发送请求,最后解析结果。
优化1:相比于单体架构,跨服务代码复杂,可以通过OpenFeign连接池优化解决,OpenFeign声明式的http客户端。
优化2:当其他服务需要调用同一个服务时,都需要写一个服务接口,这算是重复编写,并且如果这个服务发生变化,意味着调用这个服务的其他服务也需要变化,为了避免重复编写和重复修改。
拆分trade-service:
OrderServiceImpl报错:.OrderServiceImpl不是抽象的, 并且未覆盖com.hmall.trade.service.IOrderService中的抽象方法markOrderPaySuccess(java.lang.Long)
解决:
@Override
public void markOrderPaySuccess(Long orderId) {
Order order=new Order();
order.setId(orderId);
order.setStatus(2);
order.setPayTime(LocalDateTime.now());
updateById(order);
}
直至拆分完成,面临两个主要问题:1.服务地址过多,而且将来可能变化,前端不知道该请求谁。2.每个服务都可能需要登录用户信息,如果各自去做登录校验,不仅麻烦还会有泄露秘钥的风险。
解决这些问题:网关,请求路由转发和身份校验,是微服务开发必不可少的组件