Kubesphere部署Ruoyi:为什么是Ruoyi和Kubesphere?

Posted belchance

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kubesphere部署Ruoyi:为什么是Ruoyi和Kubesphere?相关的知识,希望对你有一定的参考价值。

引言

2023年3月30日
Ruoyi探讨:

  1. 它的业务应用场景是什么?
  2. 有什么应用使用了Ruoyi?
  3. 它作为一个后台系统对应的前台是什么?
  4. 为什么选择Ruoyi-Cloud去部署?
  5. 为什么是kubesphere平台部署Ruoyi?

Ruoyi的业务应用场景是什么?

Ruoyi的作者写道:

一直想做一款后台管理系统,看了很多优秀的开源项目但是发现没有合适自己的。于是利用空闲休息时间开始自己写一套后台系统。如此有了若依管理系统,她可以用于所有的Web应用程序,如网站管理后台,网站会员中心,CMS,CRM,OA等等,当然,您也可以对她进行深度定制,以做出更强系统。所有前端后台代码封装过后十分精简易上手,出错概率低。同时支持移动客户端访问。系统会陆续更新一些实用功能。
内置模块如:部门管理、角色用户、菜单及按钮授权、数据权限、系统参数、日志管理、通知公告等。在线定时任务配置;支持集群,支持多数据源,支持分布式事务。

按照作者的意思,也就是说,所有Web应用程序都可以使用Ruoyi作为后台管理系统。
Ruoyi的内置模块可以对公司的部门、角色进行划分和授权,还可以查看日志、通知公告。
在上面这些内置模块的基础上,可以开发一些别的模块,以完成目标需求。
比如可以作为公司内部的一个请假管理系统或工资管理系统,也可以作为一个售后支持工单系统……需要强调的是,Ruoyi自带的内置模块,不足以满足全部需求,只是提供了比较基础的用户、部门等模块。
想学习Ruoyi后台系统如何使用可以参考这篇博客及其后续博客:

https://blog.kdyzm.cn/post/44

也有人在Ruoyi-Cloud的基础上进行了二次开发,增加了一层租户模式

http://platform.vctgo.cn/system/config

在知乎上,也有人在回答中现身说法,自己在公司就在使用Ruoyi框架。

https://www.zhihu.com/question/365634958/answer/2063830296

有什么应用使用了Ruoyi吗?

前文我们提及了有的人在回答中现身说法,但是要找到一个实际的公司使用Ruoyi,还是有些难找。
于是我转而从Ruoyi解决方案的角度去寻找,看看能寻找到什么蛛丝马迹。
Ruoyi解决了什么痛点吗?

Ruoyi是一款基于Spring Boot和Vue.js开发的通用后台管理系统,其主要解决了以下痛点:
开发效率低下:传统的后台管理系统需要从零开始编写,包括基础框架、权限管理、代码生成等等,耗费时间和精力。而Ruoyi基于Spring Boot和Vue.js,提供了一套快速开发的后台管理系统框架,开发人员可以在这个框架上进行快速的二次开发。
权限管理繁琐:传统的后台管理系统权限管理通常需要手动编写代码,设置用户、角色、权限等等,管理繁琐。而Ruoyi提供了一套完整的RBAC权限管理系统,可以通过简单的配置即可实现权限管理。
数据库开发效率低下:传统的后台管理系统开发中,需要手动编写各种CRUD操作代码,工作量大,效率低。而Ruoyi提供了一套代码生成器,可以快速生成常见的CURD操作代码,提高开发效率。
系统部署麻烦:传统的后台管理系统部署需要手动搭建环境,部署复杂,容易出错。而Ruoyi支持快速部署,可以使用Docker容器技术部署到云平台上,简化了系统部署流程。

总之,Ruoyi解决了后台管理系统开发效率低下、权限管理繁琐、数据库开发效率低下、系统部署麻烦等痛点,提供了一套高效、易用、可靠的后台管理系统框架,帮助开发人员快速开发和部署后台管理系统。

Ruoyi作为一个后台系统对应的前台是什么?

按照作者的意思,也就是说,所有Web应用程序都可以使用Ruoyi作为后台管理系统。
以下是一些可能是应用场景:

电商管理后台:可以提供商品管理、订单管理、用户管理等功能,可以方便地构建电商管理后台。
学校信息管理系统:可以提供学生信息管理、教师信息管理、课程管理等功能,可以用于构建学校信息管理系统。
医院信息管理系统:可以提供医生信息管理、病人信息管理、药品管理等功能,可以用于构建医院信息管理系统。
政府信息管理系统:可以提供政务管理、人事管理、公文管理等功能,可以用于构建政府信息管理系统。
企业管理后台:可以提供员工管理、部门管理、任务管理等功能,可以用于构建企业管理后台。

对这些应用场景进行更细致的描述的话,会是这样的:

人事管理:对部门的人事信息进行管理,包括人员档案、工资福利、考勤请假等方面的信息。
数据统计:对数据进行统计和分析,了解政务事务的运行情况和趋势,为决策提供科学依据。
商品管理:支持商品的增删改查、上下架、价格管理等功能。管理员可以方便地对商品进行管理和调整。
订单管理:支持订单的查询、修改、取消、发货等功能。管理员可以方便地对订单进行管理和跟踪。

为什么选择Ruoyi-Cloud去部署?

Ruoyi提供不同的版本
RuoYi-Vue:基于SpringBoot、Spring Security、Jwt、Vue的前后端分离的后台管理系统。
Ruo Yi-Cloud:基于Spring Boot、Spring Cloud & Alibaba的微服务的权限管理系统。
RuoYi-App:基于uniapp+uniui封装的一套基础模版,支持H5、APP、微信小程序、支付宝小程序等。
我们主要从RuoYi-Vue和Ruo Yi-Cloud进行考虑,RuoYi-App主要是面向小程序的,所以我们这里先暂不考虑。
让我们看一下它们的后端项目结构。
RuoYi-Vue的后端项目结构

//RuoYi-Vue的后端项目结构
com.ruoyi     
├── common            // 工具类
│       └── annotation                    // 自定义注解
│       └── config                        // 全局配置
│       └── constant                      // 通用常量
│       └── core                          // 核心控制
│       └── enums                         // 通用枚举
│       └── exception                     // 通用异常
│       └── filter                        // 过滤器处理
│       └── utils                         // 通用类处理
├── framework         // 框架核心
│       └── aspectj                       // 注解实现
│       └── config                        // 系统配置
│       └── datasource                    // 数据权限
│       └── interceptor                   // 拦截器
│       └── manager                       // 异步处理
│       └── security                      // 权限控制
│       └── web                           // 前端控制
├── ruoyi-generator   // 代码生成(可移除)
├── ruoyi-quartz      // 定时任务(可移除)
├── ruoyi-system      // 系统代码
├── ruoyi-admin       // 后台服务
├── ruoyi-xxxxxx      // 其他模块

Ruo Yi-Cloud的后端项目结构

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                // 公共依赖

Ruoyi-Cloud的项目结构,以业务模块为例,划分的更加细致,更便于我们把这些服务模块分开部署上云,并且这些服务以后将会以一个pod的形式部署到kubesphere上,一个pod的起落,对其他pod起落并没有太多影响,降低了每个pod之间的耦合度,这么一想,是不是与软件工程中的“高内聚,低耦合”理念一致呢?

pod,是容器的集合。一个pod内可以有一个或多个容器。

高内聚,低耦合:"高内聚,低耦合" 是软件工程中一个非常重要的设计原则,它指的是在设计软件模块时,应该让一个模块内部的各个组件紧密地联系在一起(高内聚),而让不同的模块之间的联系尽可能地少(低耦合)。
高内聚指的是一个模块内部各个组件之间的联系紧密程度。如果一个模块内部的各个组件都围绕着一个共同的目标或功能展开,那么这个模块就具有很高的内聚性。高内聚的模块可以让代码更加清晰、易于理解和维护,因为模块内的各个组件都是紧密相关的,它们共同完成了一个任务。
低耦合指的是不同模块之间的联系尽可能地少。如果两个模块之间的联系太紧密,就会出现一个模块修改了代码,另一个模块也需要相应地做出修改的情况,这样就增加了代码的复杂度和维护难度。通过降低模块之间的耦合度,我们可以使得代码更加灵活,容易修改和维护。

为什么是kubesphere?

KubeSphere 是一个开源的 Kubernetes 管理平台,它提供了一系列的工具和功能,可以帮助企业更加高效地在 Kubernetes 上运行应用程序。而在 KubeSphere 上部署 Ruoyi-cloud 有以下优点:

简化部署:KubeSphere 提供了基于 Web 的图形化界面,可以简化 Ruoyi-cloud 的部署过程,使得非专业人员也可以轻松地进行部署。
自动化管理:KubeSphere 可以自动管理 Ruoyi-cloud 应用程序的生命周期,包括创建、部署、升级、扩展和回滚等操作,大大降低了管理的工作量。
高可用性:KubeSphere 提供了多种容器编排技术,例如 Kubernetes 的 ReplicaSet 和 Deployment 等,可以确保 Ruoyi-cloud 应用程序的高可用性和可靠性。
安全可控:KubeSphere 提供了严格的权限管理和访问控制机制,可以确保 Ruoyi-cloud 应用程序的安全性和可控性。

综上所述,KubeSphere 可以帮助企业更加高效、自动化地管理 Ruoyi-cloud 应用程序,并提高应用程序的 可靠性 和 安全性。

云原生Java架构实战 K8s+Docker+KubeSphere+DevOps(下)

应用部署实战

ruo-yi-cloud

1、项目
https://gitee.com/y_project/RuoYi-Cloud

2、架构

下载项目

本地环境nacos启动

单机模式mysql启动nacos,nacos conf/application.properties配置文件添加如下配置,并运行目录下的sql文件

spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTime=3000&autoReconnect=true
db.user.0=root
db.password.0=123456

导入ruoyi数据库

生成了一个ry-config数据

更改nacos配置,使其连接到新创建的数据库

db.url.0=jdbc:mysql://127.0.0.1:3306/ry-config?characterEncoding=utf8&connectTimeout=1000&socketTime=3000&autoReconnect=true

再创建ry-cloud数据库导入数据表

启动前段项目

cd ruoyi-ui/
npm install --registry=https://registry.npm.taobao.org
npm run dev

ruo-yi-cloud上云

1、迁移数据库
三个表

2、nacos上云

将nacos部署为有状态应用,这样才能有固定的域名访问,将来服务奔溃后重新拉起分配的IP改变但是域名没有改变,这就是有状态应用和无状态应用的区别

创建有状态服务

先不挂载外部配置文件,分析nacos的集群配置

服务创建完毕,开两台副本发现命名规则

ping分配的服务地址DNS,返回真实ping地址,发现命名规则

 ping mall-naos.mall
 64 bytes from mall-naos-v1-0.mall-naos.mall.svc.cluster.local (192.168.169.158): icmp_seq=2 ttl=64 time=0.029 ms

那么这两台pod的地址久分别为,为集群分配的固定域名访问

mall-naos-v1-0.mall-naos.mall.svc.cluster.local
mall-naos-v1-1.mall-naos.mall.svc.cluster.local

进入容器查看配置文件都在/home/nacos/conf

两个核心配置文件 application.properties cluster.conf集群配置文件挂载,配置文件子路径挂载,不要被容器内的这两个配置文件覆盖


重新创建nacos有状态应用

将两个配置文件都以特定的建和路径挂载,以免被覆盖
注意修改数据库地址为集群内的mysql

Java微服务上云

云上环境Dockerfile配置

FROM openjdk:8-jdk
LABEL maintainer=zhuazhu

#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"]

规则:
1、容器默认以8080端口启动
2、时间为CST
3、环境变量 PARAMS 可以动态指定配置文件中任意的值(指定了配置文件 应用名-prod.yml)
4、nacos集群内地址为 his-nacos.his:8848
5、微服务默认启动加载 nacos中 服务名-激活的环境.yml 文件,所以线上的配置可以全部写在nacos中。

准备好nacos的命名空间prod并将dev空间的配置文件克隆至prod空间

微服务上云流程分析

将各个微服务模块打包

整体上传至服务器

镜像推送

挨个执行镜像构建打包

cd ruoyi-auth/
docker build -t ruoyi-auth:v1 -f dockerfile .

打包完成后再阿里云的容器镜像服务中个人实例创建一个命名空间仓库

# 改成自己登录阿里云的账号,登录阿里云镜像仓库
docker login --username=zhuxuhua159@gmail.com registry.cn-hangzhou.aliyuncs.com

#把本地镜像,改名,成符合阿里云名字规范的镜像。
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/zhu_ruoyi/镜像名:[镜像版本号]
# 试例
# docker tag 461955fe1e57 registry.cn-hangzhou.aliyuncs.com/zhu_ruoyi/ruoyi-visual-monitor:v2

docker push registry.cn-hangzhou.aliyuncs.com/zhu_ruoyi/镜像名:[镜像版本号]
# 试例
# docker push registry.cn-hangzhou.aliyuncs.com/lfy_ruoyi/ruoyi-visual-monitor:v1

docker tag 9e5e5f4a8b88 registry.cn-hangzhou.aliyuncs.com/zhu_ruoyi/ruoyi-visual-monitor:v2
docker tag ece0d4dad3e0 registry.cn-hangzhou.aliyuncs.com/zhu_ruoyi/ruoyi-system:v2
docker tag 04aeddb539ca registry.cn-hangzhou.aliyuncs.com/zhu_ruoyi/ruoyi-job:v2
docker tag 8ceee5721625 registry.cn-hangzhou.aliyuncs.com/zhu_ruoyi/ruoyi-gateway:v2
docker tag ca68bd4945fd registry.cn-hangzhou.aliyuncs.com/zhu_ruoyi/ruoyi-file:v2
docker tag a425688539cc registry.cn-hangzhou.aliyuncs.com/zhu_ruoyi/ruoyi-auth:v2


docker push registry.cn-hangzhou.aliyuncs.com/zhu_ruoyi/ruoyi-visual-monitor:v2
docker push registry.cn-hangzhou.aliyuncs.com/zhu_ruoyi/ruoyi-system:v2
docker push registry.cn-hangzhou.aliyuncs.com/zhu_ruoyi/ruoyi-job:v2
docker push registry.cn-hangzhou.aliyuncs.com/zhu_ruoyi/ruoyi-gateway:v2
docker push registry.cn-hangzhou.aliyuncs.com/zhu_ruoyi/ruoyi-file:v2
docker push registry.cn-hangzhou.aliyuncs.com/zhu_ruoyi/ruoyi-auth:v2

服务创建

创建无状态服务

同步主机时区

启动后查看服务启动日志,有报错

NacosException: Nacos cluster is running with 1.X mode

错误为当前是nacos的1.x集群模式,需要改成2模式

将nacos改为单节点模式不以集群运行,修改启动配置添加启动时环境变量

报错,数据库连接错误,排查数据库忽略大小写

gateway报错,9848,因为本地文件配置了sentinel,所以更改配置文件,将这段放置线上,用线上覆盖本地

因为nacos做流量保护的配置没改到,放到线上就可覆盖

前段上云&测试

更改根目录下vue.config.js中网关地址为已上线的gateway地址

npm run build:prod

打包完成生产dist文件,前段所有文件在其中,将其放入nginx静态目录即可

修改nginx中负载均衡的网关地址
localhost只处理本机请求改为_任意请求

打包上传

创建无状态服务,TCP80,外网访问NodePort

nacos的存活探针

重启服务器时,mysql后于nacos启动,导致nacos启动失败,微服务注册不了,启动失败

启动20秒后检查设置的请求,超时时间3s

DevOps

DevOps基础

1、DevOps简介
DevOps 是一系列做法和工具,可以使 IT 和软件开发团队之间的流程实现自动化。其中,随着敏捷软件开发日趋流行,持续集成 (CI) 和持续交付 (CD) 已经成为该领域一个理想的解决方案。在 CI/CD 工作流中,每次集成都通过自动化构建来验证,包括编码、发布和测试,从而帮助开发者提前发现集成错误,团队也可以快速、安全、可靠地将内部软件交付到生产环境。

尚医通上云

1、项目架构

`yygh-parent
|---common                                  //通用模块
|---hospital-manage                      //医院后台				[9999]   
|---model										//数据模型
|---server-gateway						//网关    				[80]
|---service									//微服务层
|-------service-cmn						//公共服务				[8202]
|-------service-hosp						//医院数据服务		[8201]
|-------service-order						//预约下单服务		[8206]
|-------service-oss						//对象存储服务		[8205]
|-------service-sms						//短信服务				[8204]
|-------service-statistics				//统计服务				[8208]
|-------service-task						//定时服务				[8207]
|-------service-user						//会员服务				[8203]


====================================================================

yygh-admin									//医院管理后台		[9528]
yygh-site										//挂号平台				[3000]` 

![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)

*   1
*   2
*   3
*   4
*   5
*   6
*   7
*   8
*   9
*   10
*   11
*   12
*   13
*   14
*   15
*   16
*   17
*   18
*   19
*   20


2、中间件

中间件集群内地址外部访问地址
Nacoshis-nacos.his.
.
.
.
.
.
.

中间件部署

1、sentinel
有状态服务,镜像地址
leifengyang/sentinel:1.8.2

2、mongeodb
应用负载-应用-部署新应用-来自应用模版
从之前设置的bitnami仓库中拉取镜像,只关闭账号密码访问,其他不变

3、mysql
数据库数据初始化,导入数据

生产环境配置抽离

将本地配置文件复制一份至nacos的prod空间,为所有应用修改好配置

创建DevOps工程

创建DevOps工程,而后创建流水线,只输入名称创建完成,而后编辑流水线,生成一个流水线模版,不做改动保存此模版,再以后在此模版基础上做改动

可视化Pipeline

编辑流水线

1、拉取代码

maven代理,git 拉取,ls -al

2、项目编译

设置集群拉取时的maven镜像仓库

admin登录kubesphere,集群管理-配置中心-配置-ksdevops-agent-修改配置-添加mirror标签

编辑流水线,添加步骤,maven容器
shell mvn clean package -Dmaven.test.skip=true

3、构建镜像

docker build -t hospital-manage:latest -f hospital-manage/Dockerfile ./hospital-manage/

测试单个打包成功

并发构建

此时编辑dockerfile更快捷

4、推送镜像

嵌套步骤中添加凭证,将凭证中的账号密码输出到环境变量中

stage('推送镜像') 
   steps 
     container('maven') 
       //加载凭证中的爱里云镜像仓库账号密码
       withCredentials([usernamePassword(credentialsId : 'aliyun-docker-registry' ,usernameVariable : 'DOCKER_USER_VAR' ,passwordVariable : 'DOCKER_PWD_VAR' ,)]) 
         sh 'echo "$DOCKER_PWD_VAR" | docker login $REGISTRY -u "$DOCKER_USER_VAR" --password-stdin'
         sh 'docker tag hospital-manage:latest $REGISTRY/$DOCKERHUB_NAMESPACE/hospital-manage:SNAPSHOT-$BUILD_NUMBER'  
         sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/hospital-manage:SNAPSHOT-$BUILD_NUMBER'
       
     

   


5、部署到dev环境

可以添加审核步骤,@项目中的其他人来确认审核,这里不做审核

根据配置文件yml来部署镜像

  • 给每一个微服务准备一个 deploy.yaml(k8s的部署配置文件)

  • 执行以下步骤

  • 传入 deploy.yaml 的位置就能部署
    ○ kubectl apply -f xxxx

在k8s集群中,默认在非master节点中是无法执行apply配置文件部署的,需要获取到授权信息

由于每一个镜像都得登录阿里云镜像下载镜像,设置凭证名为aliyun-docker-hub,所以提前创建好此凭证

项目空间下-配置中-密钥-创建密钥

6、系统邮件功能

admin账号-平台设置-通知管理-邮件

end

以上是关于Kubesphere部署Ruoyi:为什么是Ruoyi和Kubesphere?的主要内容,如果未能解决你的问题,请参考以下文章

云原生Java架构实战 K8s+Docker+KubeSphere+DevOps(下)

[云原生专题-56]:Kubesphere云治理-操作-分步部署Web业务平台RuoYi Cloud-项目简介

容器化 在 KubeSphere 中部署 MySQL 集群

[云原生专题-53]:Kubesphere云治理-操作-通过Kubesphere应用商店一键部署微服务应用-消息中间件RabbitMQ的安装与部署

Ruoyi前后端分离式开源项目实战部署总结-部署测试

KubeSphere 如何把容器部署到指定节点