1、Rouyi-Cloud架构
2、项目上云分析
将rouyi-cloud项目搬上云需要考虑的问题如下:
- 1,项目中用到了多少中间件?中间件是有状态应用,有些中间件需要导入默认的数据后才能上云。
- 2,ruoyi-cloud包含8个微服务子模块(带端口的模块对应一个微服务)
- ruoyi-ui // 前端框架 [80] - ruoyi-gateway // 网关模块 [8080] - ruoyi-auth // 认证中心 [9200] - ruoyi-system // 系统模块 [9201] - ruoyi-gen // 代码生成 [9202] - ruoyi-job // 定时任务 [9203] - ruoyi-file // 文件服务 [9300] - ruoyi-visual-monitor // 监控中心 [9100]
它们都是无状态的应用,自己写的微服务需要自己制作镜像(编写Dockerfile文件)。
- 3,中间件和微服务上云以后,各个中间件和微服务之间的访问问题,涉及整个项目的网络拓扑模型;优先集群内网地址访问微服务中间件(使用内网ip或者内网域名)。
- 4,每个微服务的配置如何分离(生产配置分离URL),生产环境与开发环境的配置分离。
- 中间件:有状态、数据导入
- 微服务:无状态、制作镜像
- 网络:各种访问地址,各个微服务和中间件之间访问(通过集群内部网络进行)
- 配置:生产配置分离、URL
每个微服务上云需要做的工作:
- 1、每个微服务准备 bootstrap.properties,配置 nacos地址信息(默认使用本地链接),nacos配置中心中每个配置文件信息需要修改为上云后的mysql和redis链接地址。
- 2、每个微服务准备Dockerfile,启动命令,指定线上nacos配置等。
- 3、每个微服务制作自己镜像。
3、开始部署
3.1、部署中间件
根据ruoyi-cloud架构图分析得到,项目需要的中间件有三个,分别是:
- mysql(数据迁移:将若依的数据库迁移到云上的mysql中,共三个库)
- redis
- nacos(注册和配置中心)
3.1.1 部署mysql和redis
首先保证在kubesphere上已经部署好mysql和redis两个服务,具体部署流程参见我的上两篇博客:
- redis部署:https://tigerhhzz.blog.csdn.net/article/details/135640662
- mysql部署:https://tigerhhzz.blog.csdn.net/article/details/135623659
名称 | 集群内访问地址 | 集群外部访问地址 |
mysql | his-mysql.his:3306 | 192.168.162.31:30201 |
redis | his-redis.his:6379 | 192.168.162.31:30608 |
3.1.2 mysql数据库迁移到云上mysql
mysql数据库初始化导入,将ruoyi-cloud所需的三个数据库内容导入到部署好的mysql中;三个数据库如下:
- ry-cloud
- ry-config
- ry-seata
具体操作可以通过navicat工具中的数据传输进行数据库的迁移。
3.1.3 部署nacos
具体参见nacos的官方文档
https://nacos.io/docs/v2/guide/admin/cluster-mode-quick-start/
配置文件 application.properties
如果是集群配置nacos多一个配置文件:cluster.conf
挂载配置文件使用子路径进行挂载。
/home/nacos/conf/application.properties /home/nacos/conf/cluster.conf
在kubesphere上创建nacos服务
- 首先创建nacos的配置
使用子路径挂载nacose的两个配置文件:
上面配置文件别忘了修改mysql数据库的链接地址:his-mysql.his:3306 以及登录账号和密码。 - 创建nacos服务:
镜像名称:nacos/nacos-server:v2.1.0 nacos客户端下载地址:https://github.com/alibaba/nacos/releases/tag/2.0.3 • 1 • 2
这里补充一个bug:
因为nacos启动需要连接mysql数据库,当nacos服务启动了,然而mysql服务还没有准备就绪,此时会出现服务从nacos中读取配置文件失败的情况。
解决办法:使用探针,nacos服务中增加健康检查机制,定时向nacos容器组发请求来探究运行状况,如果状态是错误的,k8s就不断的重启服务,直到服务正常。
nacos数据没有挂载的,都存在mysql数据库;
创建一个外网能访问的nacos服务,以node方式访问,暴露外网端口
游览器访问nacos: 192.168.162.31:30986
至此,我们部署完成nacos,redis和mysql 三个中间件服务。
接下来我们开始部署rouyi-cloud项目的微服务模块。
3.2、部署ruoyi-cloud微服务模块前的准备
根据ruoyi-cloud架构图分析得到:
首先是前端vue项目模块,用来用户发送请求到网关服务;网关模块接受到前端的请求后分发给各个微服务模块。
微服务部署
3.2.1. 云上环境Dockerfile配置
- nacos中创建prod命名空间:
- 克隆dev环境中配置到prod命名空间中
- Dockerfile文件
FROM openjdk:8-jdk LABEL maintainer=tigerhhzz #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}"]
启动镜像时,加一些额外的参数,每个微服务启动后对应一个pod,每个pod有不同的ip,但是端口都是8080,这样每个pod的访问地址就是唯一的。
规则:
1、容器默认以8080端口启动 2、时间为CST 3、环境变量 PARAMS 可以动态指定配置文件中任意的值,默认激活的是开发dev环境,去nacos配置中心中找xxxxx-dev.yml配置文件,应用上云打包镜像启动会自动激活生产环境pro,然后去nacos配置中心中找xxxxx-prod.yml配置文件。 4、nacos集群内地址为 his-nacos.his:8848 5、微服务默认启动加载 nacos中 服务名-激活的环境.yml 文件,所以线上的配置可以全部写在nacos中。
3.2.1. 微服务上云分析
idea中使用maven打包jar包。
所用微服务模块打包成功。
编辑整理各个模块的jar和Dockerfile文件(每个微服务模块制作镜像的准备工作)
上传Dockerfile-images-ry整个文件夹到服务器(任何一个节点)
3.2.2. 制作微服务镜像并推送给个人阿里云镜像仓库
##打包镜像命令 docker build -t ruoyi-auth:v1.0 . ##查看镜像 docker images|grep ruoyi
创建阿里云个人镜像仓库
开通阿里云“容器镜像服务(个人版)
阿里云镜像服务参考官网地址:https://cr.console.aliyun.com/cn-hangzhou/instance/repositories
首先创建一个命名空间,默认仓库类型设置为公开
然后,在自己的命名空间下,创建一个镜像仓库:
最后,进行镜像推送
##登录阿里云Docker Registry docker login --username=hehu****@126.com registry.cn-hangzhou.aliyuncs.com ##将镜像推送到Registry docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/tiger-ruoyi/ruoyi:[镜像版本号] docker push registry.cn-hangzhou.aliyuncs.com/tiger-ruoyi/ruoyi:[镜像版本号]
把所有微服务镜像推送到个人阿里云镜像仓库。
docker push registry.cn-hangzhou.aliyuncs.com/tiger-ruoyi/ruoyi-auth:v1.0 docker push registry.cn-hangzhou.aliyuncs.com/tiger-ruoyi/ruoyi-file:v1.0 docker push registry.cn-hangzhou.aliyuncs.com/tiger-ruoyi/ruoyi-gateway:v1.0 docker push registry.cn-hangzhou.aliyuncs.com/tiger-ruoyi/ruoyi-gen:v1.0 docker push registry.cn-hangzhou.aliyuncs.com/tiger-ruoyi/ruoyi-job:v1.0 docker push registry.cn-hangzhou.aliyuncs.com/tiger-ruoyi/ruoyi-system:v1.0 docker push registry.cn-hangzhou.aliyuncs.com/tiger-ruoyi/ruoyi-visual-monitor:v1.0
思考两个问题:
- 手动一个个制作镜像,很费力费时,有没有一个自动化制作镜像流程?
- 这是使用了阿里云个人镜像仓库,有没有自己搭建公司仓库?一般开发中,搭建公司的habor私有仓库;专门存放项目镜像。
3.3、部署ruoyi-cloud微服务模块上云
ruoyi-cloud所用镜像都已经推送到个人阿里云镜像仓库:
3.3.1、部署规则
● 应用一启动会从云上nacos获取到 "应用名-激活的环境标识.yml"的配置文件
● 每次部署应用的时候,需要提前修改nacos线上配置,确认好每个中间件的连接地址是否正确
● 云上nacos配置文件中的中间件例如redis、mysql等链接地址一定是集群内的访问地址
3.3.2、ruoyi-visual-monitor微服务模块上云
整个操作在kubesphere云平台进行
查看容器运行日志:
监控模块启动成功!!!
3.3.2、ruoyi-system微服务模块上云
阿里云镜像名称为:registry.cn-hangzhou.aliyuncs.com/tiger-ruoyi/ruoyi-system:v1.0
过程同3.3.1一样。
3.3.3、ruoyi-job微服务模块上云
阿里云镜像名称为:registry.cn-hangzhou.aliyuncs.com/tiger-ruoyi/ruoyi-job:v1.0
过程同3.3.1一样。
3.3.4、ruoyi-gen微服务模块上云
阿里云镜像名称为:registry.cn-hangzhou.aliyuncs.com/tiger-ruoyi/ruoyi-gen:v1.0
过程同3.3.1一样。
3.3.5、ruoyi-gateway微服务模块上云
阿里云镜像名称为:registry.cn-hangzhou.aliyuncs.com/tiger-ruoyi/ruoyi-gateway:v1.0
过程同3.3.1一样。
3.3.5、ruoyi-file微服务模块上云
阿里云镜像名称为:registry.cn-hangzhou.aliyuncs.com/tiger-ruoyi/ruoyi-file:v1.0
过程同3.3.1一样。
3.3.6、ruoyi-auth微服务模块上云
阿里云镜像名称为:registry.cn-hangzhou.aliyuncs.com/tiger-ruoyi/ruoyi-auth:v1.0
过程同3.3.1一样。
3.3.7、所有后端微服务和中间件服务总览
工作负载一览:
3.4、部署ruoyi-cloud前端vue项目上云
ruoyi-cloud前端是vue项目,端口是80
打包方式:其实就是ngnix镜像,将前端打包的文件夹放到ngnix指定文件夹下。
其实就是运行package.json文件中的脚本build:prod
3.4.1、修改vue.config.js
修改的内容是:
http://ruoyi-gateway.his:8080
3.4.2、打包前端项目
打包命令:
# 构建生产环境 npm run build:prod
3.4.3、存放前端ruoyi-ui构建好的静态文件,用于nginx请求访问
打包完毕后,会生成一个dist文件,然后将dist文件夹中的内容拷贝到如图下的位置中:
存放前端ruoyi-ui构建好的静态文件,用于nginx请求访问。
3.4.4、修改ngnix配置文件
修改后的 nginx.conf文件如下
worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name _; location / { root /home/ruoyi/projects/ruoyi-ui; try_files $uri $uri/ /index.html; index index.html index.htm; } location /prod-api/{ proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://ruoyi-gateway.his:8080/; } # 避免actuator暴露 if ($request_uri ~ "/actuator") { return 403; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
3.4.5、压缩上传到云服务器
压缩上传到集群内任意节点机子上。
3.4.6、解压并制作镜像并推送到阿里云个人镜像仓库
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
制作ngnix镜像:
docker build -t registry.cn-hangzhou.aliyuncs.com/tiger-ruoyi/ruoyi-ui:v1.0 -f dockerfile .
镜像制作成功:
推送到阿里云个人镜像仓库
docker push registry.cn-hangzhou.aliyuncs.com/tiger-ruoyi/ruoyi-ui:v1.0
3.4.7、使用kubesphere平台部署ruoyi-cloud前端项目
创建无状态服务
需要注意的时候,前端项目云部署暴露外网访问地址nodeport。
前端项目启动成功:
如果内存不够,(启动无顺序限制)
Auth服务和Gateway服务必须启动 system服务如果你想访问后台就启动 job和gen服务这两个一个是定时任务一个是代码生成 如果你有用得到就启动 反则不需要启动
前端项目启动成功!!至此所有服务都部署完成!!!
试一下,你会比你自己想象中的还要强大