软件研究之Ruoyi微服务部署

标签: 无 分类: 未分类 创建时间:2022-07-06 04:53:08 更新时间:2023-10-20 11:23:28

1.总结

使用docker容器进行部署的话,可以把核心的jar运行起来就可以了。容器部署,就是使用Docker进行部署,因为官方的docker-compose.yml配置有点问题,所以使用deploy.sh进行部署的时候,可能会有问题,最好的方式就是使用docker-compose进行操作,操作步骤:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
## 1.修改各个模块的application.yml中的nacos地址,默认使用的是127.0.0.1,如果在容器中部署,就不能使用这个地址了

## 2.在工程目录下进行后端程序打包
mvn clean package

## 3.在ruoyi-ui目录下,进行前端打包
pnpm build:prod

## 在docker目录下进行应用程序部署
## 4.启动mysql和redis
docker-compose up -d ruoyi-mysql ruoyi-redis

## 5.启动nacos
docker-compose up -d ruoyi-nacos

## 6.进行jar文件的拷贝
bash copy.sh

## 7.启动模块
docker-compose up -d ruoyi-nginx ruoyi-gateway ruoyi-auth ruoyi-modules-system

## 8.打开浏览器进行查看
localhost

2.docker-compose改造

官方的仓库中在每一个文件夹下都有一个dockerfile文件夹,本意是使用这个文件夹进行构建镜像,但是在docker-compose中并没有使用build命令进行构建,因为dockerfile文件需要使用docker build进行调用才能生成一个镜像文件,在docker-compose.yml中,就体现在了services.容器名.build参数上了,这个对于我这种初学者来说,总是摸不着头脑,因为我修改了docker/ruoyi下的dockerfile文件,总是无法生效,让我很头大。

(1) 修改容器的挂载目录
在docker-compose.yml中,将本地的ruoyi/gateway映射为容器内的/home目录,如下增加volumes配置,我尝试了在ruoyigateway下的dockerfile文件中,使用VOLUME进行目录挂载,发现无法起作用。

1
2
3
4
5
6
7
8
9
10
11
ruoyi-gateway:
container_name: ruoyi-gateway
build:
context: ./ruoyi/gateway
dockerfile: dockerfile
ports:
- "8080:8080"
volumes:
- ./ruoyi/gateway:/home
- ./ruoyi/gateway/logs:/home/ruoyi/logs

问题

刚开始的时候,我总是想不明白到底该如何进行部署,尝试了很多的方法,总是遇到问题,比如404,比如nacos启动不了,经过反复的尝试和思考总结,最后才有了上面的总结

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
## 1.修改了copy.sh脚本,将sql文件改为了当前需要的版本,执行复制
bash copy.sh

## 2.关闭了系统的防火墙

## 3.关闭了系统的redis、mysql、nginx,nacos 服务

## 4.进入到docker目录
cd docker

## 5.执行部署,显示了Creating ruoyi-mysql、 ruoyi-redis、ruoyi-nacos done
bash deploy.sh base

## 6.使用Dbeaver链接Docker中的3306数据库,用户名:root 密码:password,显示链接成功,并且里面有了数据库ry-config和ry-cloud
## 7.但是打开docker/nacos/logs中的nacos.log,显示 Could not create connection to database server

## 8.重启nacos容器,因为nacos依赖于mysql,但是nacos启动的时候,mysql可能还没有初始化完毕,在执行完 deploy.sh base 之后,过一段时间还要重启下nacos/nacos-server
docker ps
## 重启容器实例
docker restart 容器ID

常用的辅助脚本:

1
2
3
4
## 删除所有容器
docker rm $(docker ps -aq)
## 删除全部镜像
docker rmi $(docker images -q)

部署完成之后,就可以打开 localhost:80 端口查看相关的信息了。至于问题,就看下面的问题解决吧。

参考文章:
1.部署系统
2.若依微服务版部署学习 从mysql安装,nginx安装,jdk安装,都进行了大致步骤的总结。
3.Docker部署若依微服务项目详细教程
4.停止、删除所有的docker容器和镜像

1.接口404

这里我进行了部署,结果出现了接口404,使用:docker-compose logs 命令查看,发现是nacos没有启动,我在浏览器中输入 8848/nacos ,也是没有控制台。经过查看 docker/nacos/logs下面的日志文件,我发现是因为 :Could not create connection to database server ,无法链接数据库。

【解决】
我修改了 docker-compose.yml中的 MYSQL_ROOT_PASSWORD 关于数据库的初始密码的,然后修改了 nacos/conf 的 application.properties 中的关于数据库的配置的用户名密码


2.No DataSource set

解决了上面的问题之后,再次启动nacos,出现了新的问题:“ java.lang.RuntimeException: [db-load-error]load jdbc.properties error ” , “Error creating bean with name ‘externalStoragePersistServiceImpl’”,“No DataSource set” “Error creating bean with name ‘consoleHealth’ defined in URL”,总之就是无法链接数据库

【尝试】
1,我尝试修改了数据库的密码,修改docker-compose.yml中的MYSQL_ROOT_PASSWORD数据库密码和nacos/conf/application.properties中的db.password配置,删除docker/mysql/data目录和nacos/logs文件夹,重新deploy base,还是无法链接.

2.尝试修改url.0地址,增加了时区serverTimezone=Asia/Shanghai,结果无法链接.

1
2
3
4
5
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/ry-config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai
db.user=root
db.password=phkj13Kd

3.修改密码为简单密码,结果还是不行.

4.尝试修改 nacos/nacos-server 版本,nacos/nacos-server:v2.0.3,结果也还是不行

5.尝试修改nacos的链接地址127.0.0.1,宿主机的IP 192.168.1.121 等,都不行

6.在群里有人说了查询mysql的ip地址,我使用命令,查出的ruoyi-mysql的ip,既不是127.0.0.1,也不是本机的192.168.1.121,而是一个:172.18.0.3。

1
docker inspect ruoyi-mysql | grep IPAddress

显示结果,先bash deploy.sh stop,然后再 bash deploy.sh base,并且每一次的显示结果都不相同,有时候是0.2,有时候是0.3,这个时候,再次使用容器名进行链接,但是又回到了原先的问题,用容器名,链接不是数据库啊。

1
2
3
4
"SecondaryIPAddresses": null,
"IPAddress": "",
"IPAddress": "172.18.0.2",

【解决】
终于还是让我解决了,我根据参考文章的7的说法,是一模一样的:因为我将nacos容器和mysql容器放到了一个docker-compose.yml文件中, 而nacos服务的初始化sql放到了mysql容器的 /docker-entrypoint-initdb.d 了,在容器启动时初始化,而mysql容器初始化sql需要时间,多等一会,再重启一下nacos容器就可以了。这个问题的原因可以参考问题5,进行相应的解决。

1
2
3
4
## 查看所有容器
docker ps
## 重启容器实例
docker restart 容器ID
参考文章:
1.Nacos启动报错:[db-load-error]load jdbc.properties error 这里说的是配置一个用户名密码
2.Nacos 2.0.4 standalone mode failed to start (Nacos 2.0.4 standalone 模式启动失败)
3.nacos连接mysql出现:Could not create connection to database server. Attempted reconnect 3 times. Giving u
4.docker compose 快速搭建Nacos 数据库无法连接问题处理 查看数据库用户权限没有正确配置,为用户nacos 设置权限
5.nacos2.0.3 use mysql error:UnsatisfiedDependencyException No DataSource set 这里有人说是因为密码里面有特殊字符。
6.Docker Compose 网络设置
7.mysql 5.7无法连接 #167 找到原因了, 因为我将nacos容器和mysql容器放到了一个docker-compose.yml文件中, 而nacos服务的初始化sql放到了mysql容器的 /docker-entrypoint-initdb.d 了,在容器启动时初始化,而mysql容器初始化sql需要时间,多等一会,再重启一下nacos容器就可以了

3.No such service

当我想要改变 docker-compose.yml 文件的配置,也就是说我删除了ruoyi-mysql,ruoyi-redis,ruoyi-nacos时,出现了这个错误:Found orphan containers (ruoyi-mysql, ruoyi-redis, ruoyi-nacos) for this project. If you removed or renamed this service in your compose file, you can run this command with the –remove-orphans flag to clean it up.ERROR: No such service: ruoyi-nginx

【解决】
主要就是因为启动的时候:docker-compose up -d ruoyi-nginx ruoyi-gateway ruoyi-auth ruoyi-modules-system,启动了我删除的ruoyi-nginx,删除就可以了。


4.gateway无法访问nacos

我打算使用宿主机安装的nacos,宿主机安装的mysql和redis,但是在启动之后,ruoyi-gateway始终无法访问127.0.0.1:8848,显示连接失败:Connection refused: /127.0.0.1:9848,导致后端接口启动不了,其他的模块也是无法访问。

【解决】
这个问题其实主要就是在开发版的时候,各个模块的yml中写的nacos地址,是127.0.0.1,但是部署到容器中,这个127.0.0.1,指的是容器的回环地址,而不是宿主机的地址了。所以需要使用宿主机的ip地址,或者是容器名称来代替。

小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。