0


黑马商城(微服务项目)

从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

解决:http://t.csdnimg.cn/2UfSC

二、环境布置部署命令行

#安装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.每个服务都可能需要登录用户信息,如果各自去做登录校验,不仅麻烦还会有泄露秘钥的风险。

解决这些问题:网关,请求路由转发和身份校验,是微服务开发必不可少的组件


本文转载自: https://blog.csdn.net/weixin_44619922/article/details/140079173
版权归原作者 weixin_44619922 所有, 如有侵权,请联系我们删除。

“黑马商城(微服务项目)”的评论:

还没有评论