# nacos-seata-demo
**Repository Path**: bootstrap2table/nacos-seata-demo
## Basic Information
- **Project Name**: nacos-seata-demo
- **Description**: nacos1.4.2+seata1.4.2+sentinel1.8.0整合,sentinel-dashboard持久化nacos存储
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: alpha
- **Homepage**: https://gitee.com/bootstrap2table/boot_master
- **GVP Project**: No
## Statistics
- **Stars**: 63
- **Forks**: 34
- **Created**: 2020-07-06
- **Last Updated**: 2025-08-28
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# nacos-seata-demo
#### 介绍
SpringCloud集成Seata并使用Nacos做注册中心与配置中心的微服务源码,配置sentinel作为微服务的熔断限流工具,确保系统的稳定安全运行。
#### 软件架构
nacos1.4.2+seata1.4.2+sentinel1.8.0+SpringCloudAlibaba2.2.6+SpringCloud.Hoxton.SR12+SpringBoot2.3.12+nexpion6.11+mybatis-plus+mybatis+oauth2.0
#### 依赖工具
- sentinel源码,本处已经基于1.8.0持久化到nacos,请 [点我查看](https://gitee.com/bootstrap2table/sentinel1.8.0.git)
- 系统配置自动代码生成工具,获取源码,请 [点我查看](https://gitee.com/bootstrap2table/open-code.git)。
#### **项目特点**
> * SpringBoot快速入门与进阶,请[点我查看](https://gitee.com/bootstrap2table/boot_master.git)。
> * 项目配置nexpion,实现微服务的蓝绿灰度发布等多场景的特性功能。
> * 项目admin服务,管理微服务权限,接口需在admin配置角色权限才可访问。
> * 项目gateway网关配置oauth2.0,针对微服务访问入口进行权限验证。
> * 微服务调用配置oauth2.0实现授权认证,确保系统的安全性。
> * 采用nacos作为配置和注册中心,采用分环境的不同配置来实现多环境配置。
> * 采用sentinel作为服务熔断与限流工具,基于1.8.0持久化规则到nacos。
> * 采用gateway持久化nacos方式,实现网关的路由动态路由功能。
> * 分布式事务采用seata实现,确保微服务跨系统的数据一致性。
> * 配置xxl-job2.3.0轻量级定时任务管理,集中管理微服务的定时任务。
> * 配置activeMq微服务解耦,客户下单时,积分服务降级处理送积分功能。
> * 配置完善的全局异常处理,参数验证等功能,swagger在线文档功能。
> * 采用SkyWalking实现微服务的链路追踪功能,完善微服务的链路监控。
> * 配置springBootAdmin监控集群环境下各微服务节点的系统运行状态,实施预警。
> * 基于spi封装的Redisson分布式锁组件[点我查看](https://gitee.com/bootstrap2table/nacos-seata-demo/blob/center/support/lock-redisson-spring-boot-starter/README.md)。
> * 基于spi封装的Redisson限流组件[点我查看](https://gitee.com/bootstrap2table/nacos-seata-demo/blob/center/support/rate-redisson-spring-boot-starter/README.md)。
> * 基于spi封装的通用线程池切面日志组件[点我查看](https://gitee.com/bootstrap2table/nacos-seata-demo/blob/center/support/log-async-db-spring-boot-starter/README.md)。
#### **项目结构**
```
soft
│
├─doc 微服务初始化文档
│
├─admin 微服务后台权限系统 端口:7000
│
├─auth 微服务认证授权中心 端口:7001
│
├─business 微服务业务服务系统 端口:7002
│
├─demo 微服务演示服务部分 端口:7003
│
├─order 微服务订单服务中心 端口:7004
│
├─product 微服务产品服务中心 端口:7005
│
├─user 微服务用户服务中心 端口:7006
│
├─common 微服务公共组件
│ ├─common-core 微服务公共核心组件
│ └─common-remote 微服务远程调用组件
│
├─dashboard 微服务可视化组件
│ ├─visual-admin springBootAdmin服务监控端 端口:8010
│ ├─visual-sentinel sentinel服务熔断器控制台 端口:8080
│ ├─visual-autocode 服务mybatis-plus代码生成模块 端口:8020
│ └─vusual-xxl-job xxljob分布式调度任务控制台 端口:8030
│
├─support 微服务组件增强模块
│ ├─cache-redis-spring-boot-starter redis缓存模块
│ ├─lock-redisson-spring-boot-starter 分布式锁模块
│ ├─lock-zookeeper-spring-boot-starter zk分布式锁模块
│ ├─log-async-db-spring-boot-starter 日志组件模块
│ ├─rate-redisson-spring-boot-starter 限流组件模块
│ ├─task-layout-spring-boot-starter 任务编排模块
│ └─xxl-job-spring-boot-starter 任务调度模块
│
├──webgate 微服务网关模块
│ ├─gateway 网关模块(集成oauth2.0) 端口:9999
│ └─zuul 网关模块 端口:9989
```
#### 快速启动
- 1.启动系统之前,请仔细参考微服务部分的[doc文档](https://docs.apipost.cn/preview/1add88839cfb5033/9522c14528d7003b),了解系统的信息,快速入门上手使用。
- 2.远程服务器已经配置大部分资源,请拉取seata分布式事务分支,并且本地下载jar。
- 3.官网下载nacos,本地解压直接启动本地nacos(项目代码默认加载本地nacos,只需要本地启动即可,配置信息还是读取的远程)。
- 4.依次启动所有服务,看下控制台是否启动成功。
- 5.本地安装nginx,映射一下demo项目的静态页面,启动nginx,默认80端口
- 6.请求参数参考代码,测试seata分布式事务可以post访问:http://localhost:9999/business/booking
- 7.测试nacos配置中心,启动demo项目成功,读取到nacos配置访问http://localhost/boot/nacosValue
- 8.测试sentinel,下载sentinel,直接本地启动,所有项目启动,访问:http://localhost:8080 用户名:sentinel 密码: sentinel
#### 注意事项
- #### 1.seata1.4跟以前版本不大一样,需要在nacos中导入seata-server配置信息,否则seata无法正常服务
- #### 2.尤其是nacos配置单机启动之后,需要将seata的配置导入nacos,不然服务启动会出现找不到服务的错误
- #### 3.数据库的脚本在doc文件夹下面,还有导入的nacos-config.sh脚本,请将config.txt调整好配置放入到nacos/conf目录下
- #### 4.config.txt配置项vgroupMapping.my_test_tx_group是和在项目里配置的一致,项目中配置的也是my_test_tx_group。请保持一致
- ####5.每一个业务系统必须含有表undo_log表,同时每个表必须设置主键,不然发起全局事物时,可能会出现getmata filed错误。
- ####6.本处采用了nacos+springCloud配置中心的方式,针对的多环境的配置,多data-id配置
- 参考: https://www.cnblogs.com/larscheng/p/11392466.html
- 参考: https://github.com/nacos-group/nacos-examples
- 启动之后记得到nacos页面新增一个boot.properties,
- boot.properties配置内容:
- service.name=apple
- useLocalCache=true
- ####7.事务分组时,请务必配置seata.tx-service-group=my_test_tx_group,其他暂时无法连接到seata-server,原因后续研究在看
- seata分布式事务
- seata:
- enabled: true
- application-id: ${spring.application.name}
- tx-service-group: my_test_tx_group
- service:
- vgroup-mapping: 《boot》-seata-service-group: {boot} #这个boot名字随便但是要保证{}括号的地方要一致,《》包住的内容取得${spring.application.name}也可以写别的
- grouplist:
- {boot}: 114.67.207.106:8091
- #### 8.sentinel-dashboard官网默认的限流规则存储内存中,一旦服务重启就会导致限流规则失效,本人基于sentinel1.7.1已经修改持久化到nacos环境
- #### 9.sentinel基于1.8.0版本开发持久化nacos,运行过程自行maven打包。
- sentinel的nacos.config配置信息:
- nacos.server.addr=127.0.0.1:8848
- nacos.server.group-id=SENTINEL
- nacos.server.namespace=
- nacos.data.id.postfix.gateway.api=-sentinel-gateway-api
- nacos.data.id.postfix.gateway.flow=-sentinel-gateway-flow
- nacos.data.id.postfix.authority=-sentinel-authority
- nacos.data.id.postfix.degrade=-sentinel-degrade
- nacos.data.id.postfix.flow=-sentinel-flow
- nacos.data.id.postfix.param.flow=-sentinel-param-flow
- nacos.data.id.postfix.system=-sentinel-system
- 启动方式:
- java -Dserver.port=8080 -Dnacos.server.addr=127.0.0.1:8848 -jar sentinel-dashboard.jar
- #### 10.gateway启动时,建议配置JVM参数:-Dcsp.sentinel.app.type=1 -Dcsp.sentinel.log.use.pid=true
- #### 11.gateway动态路由配置,采用nacos持久化gateway.yaml,修改nacos的yaml之后,gateway服务会自动重新采用nacos的配置,绑定路由属性
- #### 12.admin监控针对内存还有线程导出时,存在泄漏用户信息风险,建议监控以及客户端都采用sercurityj加密,对于不需要健康检查的项目,例如:mail 可以选择actuator关闭
- #### 13.配置okhttp替换httpclient,发起feign请求时,具有更高的性能,目前采用的都是okhttp的默认配置
- #### 14.配置skywalking时,需要加上忽略监控检查路由信息,链路追踪时,排除无效检查信息
- #### 15.系统采用的都是yaml文件发版时,在父pom.xml里面配置多个环境参数,打包替换掉子服务内部的bootstrap.yaml配置项,application.yaml或application-uat.yaml文件直接都是放在nacos动态配置即可,每个微服务只需要配置bootstrap.yaml的nacos注册配置。
- #### 16.seata开启分布式事务时,主线程开启子线程进行其他数据库操作,当子线程抛出异常,(主线程不会回滚),默认情况下,主线程不会受到干扰。
- #### 16.1如果想要主线程等待子线程执行完毕,继续执行可以采用Thread.join()。如果将主线程设置守护线程,(主线程停止子线程结束)采用Thread.currentThread().setDaemon(true);
- #### 17 sentinel目前最新版1.7.2还不支持设置设置用户名密码,所以在使用sentinel动态路由时,nacos最好不开启验证,需要等待sentinel发布新版修复此问题
- #### 18 项目发版时,设置统一版本号可以在顶级pom.xml运行mvn -N versions:update-child-modules,以及 mvn versions:set -DnewVersion=1.0.1-SNAPSHOT 可以[版本统一更新](https://www.cnblogs.com/zhengwangzw/p/10604763.html)
- #### 19 项目发版时,在最顶级POM,从(dev,test,uat)选择一个profile打包,整个项目会统一打包成对应环境程序,本地IDEA开发时,需要idea指定运行的profile,指定JVM参数-Dspring.profiles.active=dev
- #### 20 配置log4j2时,log4j2-test.yml(xml,properties,json)是log4j2默认加载的文件,如果存在log4j2-test.yml时,指定dev环境时,会出现日志文件多出一个空的demo-test.log日志,需要把log4j2-test.yaml改个名字,比如:log4j2-fat.yml
- #### 21 配置使用skywalking时,整个微服务集群都采用log4j2,相同的一次请求中网关gateway获取的traceId跟其他内部微服务获取的traceId不一样,boot的微服务内部使用线程池开启的子线程获取的traceId也跟主线程获取traceId不一致。
- #### 22 全链路还是使用gateway生成一次请求的全局traceId,然后将全局traceId放入header,后续的微服务直接获取header的traceId,针对微服务开启线程池子线程情况,使用mdc可以在子线程跟主线程保持全局traceId。
- #### 23 全链路还是使用gateway生成一次请求的全局traceId,然后将全局traceId放入header,后续的微服务使用OncePerRequestFilter配置MDC绑定traceId到线程上下文,线程池方式请参考demo项目线程池配置。
- #### 24 全链路还是使用zuul生成一次请求的全局traceId,是跟skywalking的全局traceId对的上,微服务内部线程池开启子线程获取traceId时,线程池方式请参考demo项目线程池配置。
- #### 25 全链路skywalking针对多线程环境,[跨线程追踪](https://skyapm.github.io/document-cn-translation-of-skywalking/zh/8.0.0/setup/service-agent/java-agent/Application-toolkit-trace-cross-thread.html) 更多资料请参考:[官网文档](https://skyapm.github.io/document-cn-translation-of-skywalking/zh/8.0.0/)
- #### 26 全链路日志追踪时,实际上不需要在feign的header传递网关的token,因为SW的trace是可以串联到一起,代码可以进一步优化,此处只是展示用法,框架使用可以参考business和demo两个结合即可。
- #### 27 集成XxlJob集中式定时任务管理,所有定时任务全部集中管理,负责整个微服务环境的定时任务触发调度与管理
- #### 28 sentinel官网已经升级到1.8.0,最好等待alibabaSpringCloud组件升级适配1.8.0版本,目前可以尝试升级,但是会存在切换成sentinel1.8.0之后跟alibabaSpringCloud2.2.1兼容性的问题,建议等待alibabaSpringCloud整个版本全量升级。
- #### 29 support已经针对redisson分布式锁,zookeeper分布式锁(zookeeper>=3.5.8),redis自动cacheable注解方法级缓存,redisson限流器提供starter封装,具体使用实例,可以参考user服务的TUserController对应方法,大幅提高开发效率。
- #### 30 Starter生成元数据文档,存在一定问题,cache-redis直接配置文档,建议开启元数据文档,[元数据文档](https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-configuration-metadata.html#configuration-metadata-format)。
- #### 31 系统全面升级sentinel1.8.0,nacos1.4.0,seata1.4.0,采用nacos多环境配置,目前全部接入线上dev环境配置项,配置多环境时,namespace区分dev,test,pre等,group区分多个项目所在组,比如c4i项目,app,bi等,data-id区分具体哪个项目组的项目,例如app。目前全面接入dev环境,配置nacos账户密码
- #### 32 系统添加MALL_GROUP分组,用来标识一个微服务组,比如C4I系统,里面含有admin,app,bi,ci,job等微服务,这些微服务所属的项目组,data-id是项目组里面的具体项目。
- #### 33 目前采用bootstrap.yml里面配置多套环境,后续改成直接在父pom里面设置多套环境的配置参数,每个服务统一读取POM.XML里面的配置。
- #### 34 nacos-dsicovery服务,默认采用nacos的rule,开启ribbon负载均衡,需要单独配置rule的话建议参考bussiness服务RibbonConfig配置方法。
- #### 35 SpringCloudAlibaba对应springBoot以及nacos等组件版本建议严格按照官网说明的版本使用组件,否则可能会出现一些版本兼容性问题,[版本对应说明](https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E)
- #### 36 引入组件nepxion解决服务的多版本实例共存的场景,配置全链路版本号执行,[nepxion官方说明](http://nepxion.gitee.io/discovery/#/)
- #### 37 微服务需要在网关接口的header传递对应版本号,实现是采用NepxionStrategy自定义的组合策略,实际上也可以直接采用如下的38说明,整个服务都是相同版才允许访问参数:version:1.0.0,表示整个微服务都是走的1.0.0版本实例,如果传递version:2.0.0表示整个服务都是走的2.0.0实例
- #### 38 组件nepxion默认加载规则时,先加载局部规则在加载全局规则,两个规则使用时,依次生效,远程局部规则,比如服务gateway:那么group为元数据spring.cloud.nacos.discovery.metadata.group=discovery-guide-group,dataId就是spring.application.name=gateway,全局规则时,group和dataId都是spring.cloud.nacos.discovery.metadata.group=discovery-guide-group
- #### 39 系统引入OAuth2.0,统一在网关做服务认证和鉴权,各微服务之间调用不在单独做鉴权服务,参考资料[SpringCloudOAuth2教程](https://www.jianshu.com/p/3427549a148a),[SpringCloudGatewayOauth2实现统一认证和鉴权](https://blog.csdn.net/zhenghongcs/article/details/107241168?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control&dist_request_id=0c2bcf3a-8aca-4f23-a508-0bb7a429a36e&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control)
- #### 40 OAuth2.0采用RedisTokenStore时,默认采用jdk序列化,userDetailServie鉴权通过的用户会一起存入redis,网关读取token用户权限时,必须保证auth跟gateway存储的user路径完全一致,否则没法序列化,这里auth和gateway同时依赖common,将auth查询的用户user放在common模块,防止出现auth存储user,gateway无法序列化的情况出现,gateway目前针对token有一个filter验证token,鉴权服务器验证权限.
- #### 41 整个微服务系统gateway-->auth认证---->user获取用户权限-->认证通过,存储到tokenStore。user服务初始化和权限变动时,自动维护redis存储的全系统角色资源权限数据。gateway鉴权时,获取tokenStroe权限数据和redis存储的全系统角色权限数据比对验证,鉴权当前token用户资源权限。
- #### 42 微服务整合springBootAdmin,配置日志在线展示,统一配置在线日志,需要配置logging.file.name=/logs/auth-dev.log,management.endpoint.logfile.external-file=/logs/auth-dev.log,这两个参数才会在admin在线展示日志和配置日志级别
- #### 43 微服务整合springBootAdmin,配置多台admin监控时,需要指定spring.boot.admin.client.url=http://localhost:9999,http://localhost:9998,多个admin地址之间使用逗号区分,配置多个监控admin地址
- #### 44 Skywalking8.4.0配置grpc日志组件,会存在gateway日志webflux异常,zuul组件配置完毕但是不生效,skywalking日志组件查看时间格式不对等问题,此处暂时关闭下线grpc的日志功能,等待skywalking修复缺陷发布新版在做尝试。
- #### 46 微服务调用文档,使用时请参考[微服务文档](https://gitee.com/bootstrap2table/nacos-seata-demo/tree/auth2/doc/docment.htm),测试oauth2微服务网关时,请参考[网关文档](https://gitee.com/bootstrap2table/nacos-seata-demo/tree/auth2/doc/apipost.txt)
- #### 47 后台权限采用[pb_cms](https://gitee.com/bootstrap2table/pb-cms/tree/oauth2),后台配置的微服务系统资源数据,微服务授权登录时,可直接读取权限资源并鉴权处理,可生产环境使用该项目。
- #### 48 客户端请求微服务资源服务器时,需要带上client_id和token,以及version,微服务的资源服务器会自动连接auth验证token和资源权限,用来保证微服务资源服务器数据安全,具体请参考business和order微服务。
- #### 49 统一打包版本号,设置版本号,打包运行(如下命令表示打包2.0.0.RELEASE版本,发布程序运行,设置版本号: mvn versions:set -DnewVersion=2.0.0.RELEASE -DgenerateBackupPoms=false 打包:mvn clean install -Dmaven.test.skip=true
- #### 50 demo服务目前同时配置devtools和spring-cloud-starter-alibaba-sentinel2.2.6时,启动会提示CGLIB无法注入feign的异常,调整spring-cloud-starter-alibaba-sentinel2.2.5或者拿掉devtools工具皆可正常启动,存在devtools影响到sentinel2.2.6的bean初始化顺序,建议排除掉devtools热部署插件
- #### 51 定时任务XXL-JOB使用时,建议一个微服务配置一个执行器,对应多个任务。同时微服务内部执行任务时,采用XxlJobHelper.getJobParam()获取执行参数,并做后续任务解析参数处理。
- #### 52 用户服务集成knife4j,完善接口自动化配置,完善项目结构,分层更加合理且完善,打包时采用@key@方式,不要使用${key},会出现无法替换的问题。