RuoYi-Cloud部署实战 · 语雀
1. 若依源码和架构
RuoYi-Cloud: 🎉 基于Spring Boot、Spring Cloud & Alibaba的分布式微服务架构权限管理系统,同时提供了 Vue3 的版本
若依项目结构
带端口号的是需要启动的服务
com.ruoyi
├── ruoyi-ui // 前端框架 [80]
├── ruoyi-gateway // 网关模块 [8080]
├── ruoyi-auth // 认证中心 [9200]
├── ruoyi-api // 接口模块
│ └── ruoyi-api-system // 系统接口
├── ruoyi-common // 通用模块
│ └── ruoyi-common-core // 核心模块
│ └── ruoyi-common-datascope // 权限范围
│ └── ruoyi-common-datasource // 多数据源
│ └── ruoyi-common-log // 日志记录
│ └── ruoyi-common-redis // 缓存服务
│ └── ruoyi-common-seata // 分布式事务
│ └── ruoyi-common-security // 安全模块
│ └── ruoyi-common-swagger // 系统接口
├── ruoyi-modules // 业务模块
│ └── ruoyi-system // 系统模块 [9201]
│ └── ruoyi-gen // 代码生成 [9202]
│ └── ruoyi-job // 定时任务 [9203]
│ └── ruoyi-file // 文件服务 [9300]
├── ruoyi-visual // 图形化管理模块
│ └── ruoyi-visual-monitor // 监控中心 [9100]
├──pom.xml // 公共依赖
架构图 - doc/ruoyi-cloud.png · wind/ruoyi-cloud - Gitee.com
上云的架构
2. 准备工作
2.1 启动nacos
Nacos学习笔记-CSDN博客
数据库中执行脚本RuoYi-Cloud/sql/ry_config_20210730.sql,会创建出ry-config
数据库,供nacos使用。
修改nacos的application.properties
文件中的db.url.0
参数,使用刚刚创建的ry_config数据库。
此处仅单节点启动演示
startup.cmd -m standalone
登录进nacos,可以看到ruoyi-cloud在nacos中存放的配置,随便打开一个看到spring.database.datasource.master.url
配置的数据库名是ry-cloud
2.2 初始化数据
创建数据库ry-cloud
执行脚本RuoYi-Cloud/sql/ry_config_20210918.sql
,创建RuoYi所用的一些表
执行脚本RuoYi-Cloud/sql/quartz.sql
,创建任务调度所用的一些表(在nacos中可以看到,quartz所用到的表也在ry-cloud数据库下)
执行脚本RuoYi-Cloud/sql/ry_seata_20210128.sql
,是seata分布式事务用到的表,该脚本中会创建新的数据库ry_seata
2.3 Nacos中修改RuoYi的数据库信息
包括Mysql和Redis的配置:url、用户名、密码
3. 本地部署步骤
3.1 启动前端ruoyi-ui
https://gitee.com/y_project/RuoYi-Cloud/tree/master/ruoyi-ui
事先安装node.js
cd ruoyi-ui
# 安装依赖
# npm install
# 建议不要直接使用 cnpm 安装依赖,会有各种诡异的 bug。可以通过如下操作解决 npm 下载速度慢的问题
npm install --registry=https://registry.npmmirror.com
# 启动服务
npm run dev
浏览器访问http://localhost:80
3.2 启动网关ruoyi-gateway
该网关需要Redis,在nacos中配置好响应的信息。没有热更新,先改配置,再启动服务。
3.3 启动其他微服务
nacos中的数据库信息用到的都改一下。没有热更新,先改配置,再启动服务。
4. 上云部署步骤(手动)
4.1 关注的要素
关注的点 | 详情 |
---|---|
中间件 | 有状态、可能要导入数据 |
微服务 | 无状态、制作镜像 |
网络 | 各种访问地址 |
配置 | 生产配置分离、URL |
4.2 迁移数据库
把先前本地的数据库(Mysql、Redis)的数据,迁移到云上的数据库里
Mysql可以在配置文件中设置忽略大小写lower_case_table_names=1
4.3 nacos上云
nacos官网 - 集群部署说明
高可用模式上云部署,架构图
分析
nacos要使用有状态部署。
部署3个nacos,对于上云来说,其实就是部署三个pod。
这三个Pod对外暴露一个SLB(Service Load Balance,服务负载均衡),并且是内网模式。这将由k8s的Service来完成,Service统一暴露一个地址或者域名。
nacos官网【配置集群配置文件】时,使用的是ip:port,而k8s内pod重启后ip会变化,因此需要配置内部的域名而不是ip。
可以把配置文件/home/nacos/conf/application.properties
和/home/nacos/conf/cluster.conf
挂载出来,但注意该路径下并不只有这两个配置文件,还有其他的。
注意nacos的数据库等信息配置,然后启动3个pod。
如果要使用单击模式部署,可以在环境变量中添加MODE=standalone
,参考:registry.hub.docker.com/r/nacos/nacos-server
注意:nacos的存活探针
要保证Mysql启动成功了,nacos才能启动,否则nacos的pod实际是没有在提供服务的,因为连不上database。
nacos启动成功的标识:curl http://127.0.0.1/nacos
能成功
有了这个探针,只要探测到nacos是不存活的,k8s就会重启nacos。这样即使nacos在Mysql之前启动也没关系,等Mysql启动好之后,nacos再重启时就正常了。
4.4 部署各个微服务
4.4.1 上云优化
- 每个微服务准备
bootstrap.properties
,配置nacos地址信息。默认使用本地 - 每个微服务准备Dockerfile,启动命令,指定线上nacos配置等。
- 每个微服务制作自己镜像。
4.4.2 Dockerfile
FROM openjdk:8-jdk
LABEL maintainer=leifengyang
# 具体信息要改成自己的
# docker run -e PARAMS="--server.port 9090"
ENV PARAMS="--server.port=8080 --spring.profiles.active=prod --spring.cloud.nacos.discovery.server-addr=his-nacos.his:8848 --spring.cloud.nacos.config.server-addr=his-nacos.his:8848 --spring.cloud.nacos.config.namespace=prod --spring.cloud.nacos.config.file-extension=yml"
# 镜像使用的时区
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
COPY target/*.jar /app.jar
EXPOSE 8080
#
ENTRYPOINT ["/bin/sh","-c","java -Dfile.encoding=utf8 -Djava.security.egd=file:/dev/./urandom -jar app.jar ${PARAMS}"]
4.4.3 上云流程
打包
使用maven打成可执行jar(clean、pakage),上传到服务器
制作镜像
服务器使用Docker根据dockerfile把包打成指定的镜像
服务器上的路径,以ruoyi-auth为例
/root/docker/ruoyi-auth
├── target
│ └── ruoyi-auth.jar
├─ Dockerfile
执行命令
docker build -t ruoyi-auth:v1 -f Dockerfile .
docker images | grep ruoyi
推送镜像
将镜像推送给镜像仓库(以阿里云为例)
开通阿里云“容器镜像服务(个人版)”,创建一个名称空间(lfy_ruoyi)
# 以下命令在阿里云的页面上有提示
$ docker login --username=forsum**** registry.cn-hangzhou.aliyuncs.com
#把本地镜像,改名,成符合阿里云名字规范的镜像。
$ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/lfy_ruoyi/镜像名:[镜像版本号]
## docker tag 461955fe1e57 registry.cn-hangzhou.aliyuncs.com/lfy_ruoyi/ruoyi-visual-monitor:v1
$ docker push registry.cn-hangzhou.aliyuncs.com/lfy_ruoyi/镜像名:[镜像版本号]
## docker push registry.cn-hangzhou.aliyuncs.com/lfy_ruoyi/ruoyi-visual-monitor:v1
应用部署
k8s部署应用
后端
应用一启动会获取到 “应用名-激活的环境标识.yml”
每次部署应用的时候,需要提前修改nacos线上配置,确认好每个中间件的连接地址是否正确
把后端各微服务模块上云:ruoyi-visual-monitor、ruoyi-system、ruoyi-job、ruoyi-gateway、ruoyi-file、ruoyi-auth
前端
https://gitee.com/y_project/RuoYi-Cloud/tree/master/ruoyi-ui
ruoyi-ui是用vue写的前端项目,打包方式跟Java项目不一样。
打生产环境的包前,注意/RuoYi-Cloud/ruoyi-ui/vue.config.js
中devServer中有target配置,要改成云上的gateway地址。
在/RuoYi-Cloud/ruoyi-ui/package.json
中有运行的脚本:
// 以下为部分内容
"scripts": {
"dev": "vue-cli-service serve",
"build:prod": "vue-cli-service build",
"build:stage": "vue-cli-service build --mode staging",
"preview": "node build/index.js --preview",
"lint": "eslint --ext .js,.vue src"
},
运行打包命令,会在前端项目路径下生成dist文件夹。
# 构建测试环境
# npm run build:stage
# 构建生产环境
npm run build:prod
/RuoYi-Cloud/docker/nginx
中有对应nginx的dockerfile,将上一步生成的dist文件夹替换/RuoYi-Cloud/docker/nginx/html/dist
。以下是dockerfile内容
# 基础镜像
FROM nginx
# author
MAINTAINER ruoyi
# 挂载目录
VOLUME /home/ruoyi/projects/ruoyi-ui
# 创建目录
RUN mkdir -p /home/ruoyi/projects/ruoyi-ui
# 指定路径
WORKDIR /home/ruoyi/projects/ruoyi-ui
# 复制conf文件到路径
COPY ./conf/nginx.conf /etc/nginx/nginx.conf
# 复制html文件到路径
COPY ./html/dist /home/ruoyi/projects/ruoyi-ui
修改/RuoYi-Cloud/docker/nginx/confi/nginx.conf
,
server_name要由localhost改为“_”,代表无论是什么地址的80端口,来到这个nginx就都给处理
代理的网关地址也要改成对应的云上的地址。
/RuoYi-Cloud/docker/nginx
替换dist并修改完配置之后,传到服务器上,执行命令
docker build -t registry.cn-hangzhou.aliyuncs.com/lfy_ruoyi/ruoyi-ui:v2 -f dockerfile .
docker push registry.cn-hangzhou.aliyuncs.com/lfy_ruoyi/ruoyi-ui:v2
在k8s中拉取镜像部署服务,并且将服务暴露给外网。