JeeSite Cloud 分布式架构、微服务架构相关文档
# 引言
JeeSite Cloud 具备 JeeSite 4.x、5.x (opens new window) 的所有功能,是在 JeeSite 4.x、5.x 基础之上,完成的 Spring Cloud (opens new window) 分布式系统套件的整合。它利用 JeeSite 4.x、5.x 的开发便利性巧妙地简化了分布式系统开发。
JeeSite Cloud 并没有重复制造轮子,它只是将目前比较成熟的、经得起实际考验的服务框架组合起来,通过 Spring Boot 风格进行再封装屏蔽掉了复杂的配置和实现原理,重新了设计架构和新增了很多实用的工具,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发平台。
集成阿里优秀组件 Nacos 服务治理与配置中心、集成 Sentinel 流量卫兵;集成 Zipkin 链路追踪;集成 Seata 分布式事务等,详见技术选型章节。
主要特点:用经典开发模式,开发分布式微服务应用,上手简单,开发快
- 源码仓库地址:https://gitee.com/thinkgem/jeesite-cloud (opens new window)
- 分离版前端源码仓库:https://gitee.com/thinkgem/jeesite-vue (opens new window)
什么场景下,需要用 JeeSite Cloud 微服务:
- 微服务化的核心就是将传统的系统,根据业务进行拆分一个个的小服务,一个服务出现问题不会有影响其他服务的运行
- 某一个服务并发要求比较高时,可单独增加该服务节点(如果传统应用,需要整体增加会浪费资源)提高服务可用性
- 可直观的看到服务的运行状态,可统一配置各个微服务的配置参数,统一的基础数据管理(人员组织基础架构)
# 优势(只写别人没有的)
- 在 JeeSite 单应用基础之上,完成的 Cloud 功能,使用经典开发模式,就像开发单应用一样开发分布式应用
- 它提供了微服务模块的代码生成工具,快速生成开发微服务功能,包含微服务的发布和调用接口
- 我们将 api 和 client 合体为一个工程,自动适应自己调用自己 client 的影响,简化工程数量
- 解决 Feign 接口不能多重继承问题,如一些通用操作(增删改查)微服务接口基类实现,这些都不用自己写了
- 统一的授权认证、基础数据微服务,都已经提供查询 client 接口,其他微服务应用模块中可直接获取用户、组织、权限、字典等基础数据。微服务之间调用中,出现的会话及缓存的一致性统一得到解决。
- 如 UserUtils、EmpUtils、EmpUserService、OfficeService 等等众多的基础服务工具类,都可以直接从基础数据的微服务中获取数据,您不必考虑跨 web 服务的数据交互,我们已经帮您做了。
- 微服务组件 Nacos、Sentinel、Zipkin 提供源码方式启动部署,方便开发调试。
- 写一个别人有的,使用柔性事务入侵性小,跨 web 服务的情况,支持单个微服务独立数据库。
- 集成工作流,提供BPM引擎独立的服务,客户端只需调用API,无需加载复杂流程引擎。
- 支持两套前端技术选型实现,全栈版(Bootstrap+Beetl)、分离版(TS+Vue3+Antdv)。
- 其它优势(按 Ctrl + Shift 点击链接):http://jeesite.com/docs/feature/ (opens new window)
# 技术选型
- 分布式系统套件版本:Spring Cloud 2022.0.4 + Alibaba 2022.0.0
- 服务治理注册与发现:Spring Cloud Eureka / Consul / Nacos 2.2
- 分布式统一配置中心:Spring Cloud Config / Nacos 2.2
- 网关路由代理调用:Spring Cloud Gateway (动态网关)
- 声明式服务调用:Spring Cloud OpenFeign
- 客户端负载均衡:Spring Cloud LoadBalancer
- 阿里流量防卫兵:Sentinel 1.8 (限流、熔断降级、负载保护)
- 分布式事务框架:Seata 1.6 (可选组件)
- 分布式链路追踪:Zipkin / SkyWalking (可选组件)
- 工作流引擎框架:Flowable 6.6 / 7.0 (可选组件)
- 多租户 Saas 架构:表共享、独立模式、独立库方式
- ShardingSphere 分库分表、读写分离
- Spring Boot Admin 监控系统
- ELK 日志搜集分析
# 子项目介绍
- 服务注册:jeesite-cloud-eureka : http://127.0.0.1:8970 (opens new window)
- 配置中心:jeesite-cloud-config : http://127.0.0.1:8971/project/default (opens new window)
- 服务注册和配置中心 Nacos 版本(推荐) :http://127.0.0.1:8848/nacos/index.html (opens new window)
- 网关路由:jeesite-cloud-gateway : http://127.0.0.1:8980/js/a/login (opens new window)
- 核心模块(统一授权认证服务、平台基础数据服务):
- 核心主项目:jeesite-cloud-module-core : http://127.0.0.1:8981/js (opens new window)
- 客户端项目(提供其它模块调用):jeesite-cloud-module-core-client
- 测试模块1(可选,单表增删改查示例):
- 模块1主项目:jeesite-cloud-module-test1 : http://127.0.0.1:8982/js (opens new window)
- 模块1客户端项目(提供其它模块调用):jeesite-cloud-module-test1-client
- 测试模块2(可选,树表增删改查示例):
- 模块2主项目:jeesite-cloud-module-test2 : http://127.0.0.1:8983/js (opens new window)
- 模块2客户端项目(提供其它模块调用):jeesite-cloud-module-test2-client
- 测试模块3(可选,代码生成的模块和代码生成的增删改查,该模块完全没有手写,全部为生成的):
- 模块3主项目:jeesite-cloud-module-test3 : http://127.0.0.1:8985/js (opens new window)
- 模块3客户端项目(提供其它模块调用):jeesite-cloud-module-test3-client
- 业务流程基础服务(可选,流程引擎服务,客户端只需调用接口,无需加载引擎逻辑):
- 流程主项目:jeesite-cloud-module-bpm : http://127.0.0.1:8990 (opens new window)
- 客户端项目(提供其它模块调用):jeesite-cloud-module-bpm-client
- 分布式事务 Seata 服务(可选,1.5之后新增监控界面,端口7091):
- 服务主项目:jeesite-cloud-module-seata : http://127.0.0.1:7091 (opens new window)
- 客户端项目(提供其它模块调用):jeesite-cloud-module-seata-client
- 消息推送服务(可选,消息接受,消息推送,消息心跳):
- 服务主项目:jeesite-cloud-module-msg : http://127.0.0.1:7998 (opens new window)
- 文件管理服务(可选,文件上传、文件预览、文件管理):
- 服务主项目:jeesite-cloud-module-files : http://127.0.0.1:7999 (opens new window)
- 扩展模块服务(可选,报表,大屏,APP,CMS,ES 等):
- 服务主项目:jeesite-cloud-module-extends : http://127.0.0.1:8999 (opens new window)
- 熔断限流:jeesite-cloud-sentinel : http://127.0.0.1:9311 (opens new window)
- 链路追踪:jeesite-cloud-zipkin : http://127.0.0.1:9411 (opens new window)
- 解释:主项目为服务提供者、客户端项目为服务消费者
# 快速运行
# 初始化数据库
JeeSite Cloud 版本的数据库与 JeeSite 单机版数据库相同,您可以 下载最新的mysql脚本 (opens new window)(仅适应于社区版),推荐使用 init-data.bat(sh) (opens new window) 命令完成初始化(支持多种类型的数据库)
数据库初始化文档:http://jeesite.com/docs/install-deploy/#初始化数据库 (opens new window)
# 安装 Redis
Redis 是一个缓存数据库,主要用来集中式管理共享会话和系统缓存的,如果您已安装 Redis,可以忽略这个步骤。
由于 Windows 版本的 Redis 安装不太方便,所以我们提供了该版本的安装文件和安装脚本。
下载地址:https://gitee.com/thinkgem/jeesite-cloud/attach_files (opens new window) 找到 Redis-x64-4.0.2.2.zip
下载文件。
解压 Redis-x64-4.0.2.2.zip
压缩包,运行 service-install.bat
安装 Windows 系统服务。
默认地址:127.0.0.1;默认端口:6379;默认密码:1234,可根据自己需要修改 conf 文件。
# 启动 Nacos 服务
Nacos 致力于帮助您发现、配置和管理微服务。 Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。 Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
如果使用 Nacos 就不用部署 jeesite-cloud-eureka
和 jeesite-cloud-config
了。
JeeSite Cloud 提供了 2 种部署方式,您可以下载 jar 也可以 src 方式运行:
jar 方式:
- 下载地址:https://github.com/alibaba/nacos/releases/download/2.2.3/nacos-server-2.2.3.zip (opens new window)
- 解压
nacos-server-2.2.3.zip
压缩包,运行/bin/startup.cmd(sh)
启动服务。
src 方式:
- 在 Eclipse 或 IDEA 中 找到 jeesite-cloud-nacos 项目。
- 运行 NacosApplication 类的 main 方法,即可启动服务。
配置 mysql 存储:
- 默认情况 Nacos 采用 Derby 数据库,您可以将数据库切换到 MySQL 下。
- 找到 /nacos/src/main/resources/config/nacos-mysql.sql 文件导入数据表。
- 找到 Nacos 的配置文件(application.properties 或 application.yml)如下:
spring.datasource.platform=mysql
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?useSSL=false&characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&serverTimezone=UTC
db.user=root
db.password=123456
# 如果是 application.properties 文件,将 key 后的冒号换为等号即可。
2
3
4
5
6
7
8
9
10
11
注意事项
生产环境,请务必修改 application.properties
配置文件中的秘钥,
属性 nacos.core.auth.plugin.nacos.token.secret.key
值,为一个新的秘钥。
支持自定义鉴权:https://nacos.io/zh-cn/docs/v2/plugin/auth-plugin.html (opens new window)
启动完成后:
浏览器访问:http://127.0.0.1:8848/nacos/index.html (opens new window) 用户名密码:nacos
登录后,进入菜单 配置管理 -> 配置列表
点击 导入配置
按钮,选择 /config/src/main/resources/jeesite-cloud-yml.zip
上传文件。
然后编辑 Data Id 为 application.yml
的文件里的 JDBC 和 Redis 信息。
# 启动 Sentinel 服务
可选组件,随着微服务的流行,服务和服务之间的稳定性变得越来越重要。 Sentinel 是面向分布式服务架构的流量控制组件,主要以流量为切入点, 从流量控制、熔断降级、系统自适应保护等多个维度来帮助您保障微服务的稳定性。
- 在 Eclipse 或 IDEA 中 找到 jeesite-cloud-sentinel 项目。
- 运行 SentinelApplication 类的 main 方法,即可启动服务。
浏览器访问:http://127.0.0.1:9311 (opens new window) 用户名密码:sentinel
# 启动 Zipkin 服务
可选组件,Zipkin 是一个开放源代码分布式的跟踪系统,每个服务向 Zipkin 报告计时数据,Zipkin会根据调用关系通过 Zipkin UI 生成依赖关系图。
- 在 Eclipse 或 IDEA 中 找到 jeesite-cloud-zipkin 项目。
- 运行 ZipkinApplication 类的 main 方法,即可启动服务。
浏览器访问:http://127.0.0.1:9411 (opens new window)
如果使用 SkyWalking,安装文档见:https://jeesite.com/docs/skywalking/ (opens new window)
# 启动 Seata 服务
如果需分布式事务处理,阅读本节,也可先跳过
# 启动微服务项目
- 在每个微服务中可以找的
config/bootstrap.yml
配置服务注册和配置中心地址。 - 启动网关和核心基础服务(运行 Application 启动类的main方法)
- /jeesite-cloud-gateway/../GatewayApplication.java
- /jeesite-cloud-module-core/../CoreApplication.java
- 因为服务有直接依赖,请启动完成基础服务后再继续启动下面的服务
- /jeesite-cloud-module-test1/../Test1Application.java
- /jeesite-cloud-module-test2/../Test2Application.java
- 其外一些子项目,可根据需要是否启动,无顺序要求
- /jeesite-cloud-module-files/../FilesApplication.java
- /jeesite-cloud-module-msg/../MsgApplication.java
- /jeesite-cloud-module-bpm/../BpmApplication.java
- /jeesite-cloud-module-extends/../ExtendsApplication.java
- 服务启动成功后,浏览器访问网关项目地址即可:
- 访问地址:http://127.0.0.1:8980/js (opens new window) 用户名密码: system admin
- 若访问报错,请再等待一会,可能服务未完全启动完成
常见问题:
- 如果提示
获取不到 ${service.core.name} 属性,请检查配置
错误,说明没有从 nacos 或 config 配置中心获取到配置信息。一般有以下原因。1:Nacos 里未导入jeesite-cloud-yml.zip
配置文件;2:如果您自定义了 Nacos 的 Group Name,请于 bootstrap.yml 里的 Group Name 一致;3:如果 Nacos 提示了 yml 读取错误,请在启动参数,配上环境变量 JAVA_OPTS,值为-Dfile.encoding=UTF-8
(不同IDE里的设置方法:Eclipse:Window->Preferences->General->Workspace->Text file encoding->Other->UTF-8;IDEA:File->Settings->Editor->FileEncodings->Project Encodeing->UTF-8)
# 调用实例演示
# 网关代理模块调用
- 代理 test1 模块(单表):http://127.0.0.1:8980/js/a/test1/testData/list (opens new window)
- 控制器位置:/jeesite-cloud-module-test1/../web/TestData1Controller.java
- 代理 test2 模块(树表):http://127.0.0.1:8980/js/a/test2/testTree/list (opens new window)
- 控制器位置:/jeesite-cloud-module-test2/../web/TestTree2Controller.java
# 模块之间互相调用
- test2 模块调用 test1 模块(单表):http://127.0.0.1:8980/js/a/test2/testData/list (opens new window)
- 服务消费者位置:/jeesite-cloud-module-test2/../web/TestData2Controller.java
- 服务提供者位置:/jeesite-cloud-module-test1/../service/TestDataService.java
- test1 模块调用 test2 模块(树表):http://127.0.0.1:8980/js/a/test1/testTree/list (opens new window)
- 服务消费者位置:/jeesite-cloud-module-test1/../web/TestTree1Controller.java
- 服务提供者位置:/jeesite-cloud-module-test2/../service/TestTreeService.java
# 新增微服务工程
# 1、新建模块
1)进入菜单:系统管理 -> 系统设置 -> 模块管理,新建一个模块,填写:
- 模块名称:测试模块
- 模块编码:test3
- 生成基础路径:填写新建模块的根目录
- 代码生成模板:生成微服务模块代码(Cloud)
点击 “保存并生成代码” 按钮,即可完成微服务模块的工程代码新建。
2)新建微服务功能,进入代码生成器功能菜单,生成时选择 Cloud 的代码生成模板即可。
v4.2.2之前版本:
由于之前版本没有微服务模块生成器功能,所以需要参考其它模块。举例新增一个微服务模块模块叫 test3
,该模块的所有映射地址均在 ${adminPath}/test3/**
这个路径下,该模块可以参照 test1
进行,步骤如下:
拷贝 jeesite-cloud-module-test1 项目为 jeesite-cloud-module-test3 文件夹:
1)修改 pom.xml 中的应用名:
<artifactId>jeesite-cloud-module-test1</artifactId>
替换为:
<artifactId>jeesite-cloud-module-test3</artifactId>
2
3
<artifactId>jeesite-cloud-module-test1-client</artifactId>
替换为:
<artifactId>jeesite-cloud-module-test3-client</artifactId>
2
3
2)修改 application.yml 中的应用名:
spring:
application:
name: jeesite-cloud-module-test3
2
3
3)修改 *Client.java 里的应用名:
service.test1 替换为 service.test3
4)修改 *Controller.java 里的映射路径:
${adminPath}/test1 替换为 ${adminPath}/test3
# 2、配置服务参数
在 jeesite-config 或 Nacos 的微服务配置文件 application.yml 中,新增微服务:
# 微服务列表
service:
test3:
name: jeesite-cloud-module-test3
path: ${server.servlet.context-path}
2
3
4
5
# 3、配置网关映射
在 jeesite-cloud-gateway 配置文件中新增网关路由
spring:
cloud:
gateway:
routes:
# 测试模块3
- id: test3
uri: lb://jeesite-cloud-module-test3
predicates:
- Path=/js/a/test3/**,/js/a/jeesite-cloud-module-test3/**,/js/static/modules/test3/**
2
3
4
5
6
7
8
9
注意:新增的配置请放到 core 基础权限模块之上。
# 微服务增删改查
进入 “代码生成器” 菜单,同单机版使用方法,只需在生成代码时,选择 Cloud 版本的生成模板即可。