# LuCloud **Repository Path**: ljm888/LuCloud ## Basic Information - **Project Name**: LuCloud - **Description**: springboot、spring-cloud、spring-cloud-alibaba。 集成常见的分布式解决方案,集群负载均衡、分布式事务、分布式锁等等,日志SPI组件,ELK采集分析。 nacos集群,nginx搭建负载均衡、共享配置与优先级配置。 sentinel集群,持久化、数据双向同步、集群限流,url模糊匹配。 seata集群,AT模式、XA模式。 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: https://gitee.com/ShowLuu/LuCloud - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2025-03-19 - **Last Updated**: 2025-03-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 一、概述 ## (一)、功能特点 - SpringCloud-Alibaba版本,集成常见的分布式解决方案,集群负载均衡、分布式事务、分布式锁等等,也有日志模块,按照规则输出各个模块应用的日志,ELK解析。后面逐渐完善。 - springboot 2.3.2.RELEASE、spring-cloud Hoxton.SR8、spring-cloud-alibaba2.2.5.RELEASE、nacos1.4.1、sentinel1.8.0、seata1.4.2 - 脚手架包含nacos集群,nginx搭建负载均衡、共享配置与优先级配置、openfeign服务调用降级、gateway动态配置与自定义过滤器、高可用调测 - sentinel集群,规则的持久化、与nacos数据的双向同步、流控规则限流、热点参数规则限流、网关限流,高可用调测,限流资源的灵活配置与url的模糊匹配 - seata集群,支持AT模式、XA模式 - 分布式链路跟踪 zipkin - 按照个人的理解,改了许多和配置,现已在实际项目中使用 ## (二)、FAQ ### 1、如何从SpringCloud1.0升级过来? ### 2、各种集群方案 ### 3、分布式事务的集中模式之前应该这么选择? ### 4、报错信息,如何解决? ### 5、seata整合mycat问题 - [参考](https://blog.csdn.net/wddddddsd/article/details/114872039) # 二、用户文档 ## (一)、nacos ### 1、服务端-单机 - Mysql持久化配置: - 单机启动模式: ./bin/startup.sh -m standalone ### 2、服务端-[集群](https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html) #### (1)、相关命令 ```shell 使用内置数据源:sh startup.sh -p embedded 使用外置数据源:sh startup.sh ``` #### (2)、conf配置 - ```shell 本地 10.16.50.244:8848 10.16.50.244:8849 10.16.50.244:8850 后台端口(选举): 10.16.50.244:7848 10.16.50.244:7849 10.16.50.244:7850 dev环境集群 172.16.92.42:8849 172.16.92.43:8849 172.16.92.45:8849 ``` #### (3)、nginx配置 ## (二)、sentinel ### 1、控制台管理平台dashboard1.8.0 #### (1)、默认配置 - 默认启动端口:8080 - ```shell -Dserver.port=8480 # 指定控制台的端口为8480 -Dcsp.sentinel.dashboard.server=localhost:8480 # 指定要被哪个控制台监控(这里指定的是自己监控自己) -Dproject.name=lu-cloud-sentinel-dashboard # 指定实例名称(名称会在控制台左侧以菜单显示) -Dsentinel.dashboard.auth.username=sentinel # 设置登录的帐号为:sentinel -Dsentinel.dashboard.auth.password=111111 # 设置登录的密码为:123456 ``` #### (2)、默认启动参数 - ```yaml logging.file=/Users/zhanglu/Desktop/lu/workspace/dev_workspace/idea/框架/脚手架/LuCloud/lu-cloud-logs/alibaba-sentinel/dashoard-logs sentinel.nacos.serverAddr=127.0.0.1:8848 sentinel.nacos.namespace=87f37a16-727e-47ec-829c-03db30e0bf6f sentinel.nacos.groudId=LU_CLOUD_SENTINEL_GROUP sentinel.nacos.dataIdPostfix=-sentinel-flow.json ``` #### (3)、自定义启动参数 - ```shell local java -jar -Dserver.port=8080 -Dsentinel.nacos.serverAddr=127.0.0.1:8848 -Dsentinel.nacos.namespace=87f37a16-727e-47ec-829c-03db30e0bf6f -D -Dlogging.file="/Users/zhanglu/Desktop/lu/workspace/dev_workspace/idea/框架/脚手架/LuCloud/lu-cloud-logs/alibaba-sentinel/dashoard-logs" -Dproject.name=lu-cloud-sentinel-dashboard -Dsentinel.dashboard.auth.password=111111 /Users/zhanglu/Desktop/lu/workspace/dev_workspace/idea/框架/脚手架/LuCloud/soft/sentinel1.8.0/LuCloud-sentinel-dashboard.jar ``` ### 2、集群搭建手册 #### (1)、独立模式 #### (2)、嵌入模式 ``` seataOrderService: '{"server":"127.0.0.1:18001","clients":["127.0.0.1:18002","127.0.0.1:18003"],"serverTransport":18000}' seataStorageService: '{"server":"127.0.0.1:18101","clients":["127.0.0.1:18102","127.0.0.1:18103"],"serverTransport":18100}' seataAccountService: '{"server":"127.0.0.1:18201","clients":["127.0.0.1:18202","127.0.0.1:18203"],"serverTransport":18200}' nacosSentinel: '{"server":"127.0.0.1:18301","clients":["127.0.0.1:18302","127.0.0.1:18303"],"serverTransport":18300}' nacosSentinelApi: '{"server":"127.0.0.1:18401","clients":["127.0.0.1:18402","127.0.0.1:18403"],"serverTransport":18400}' ``` ## (三)、seata ### 1、配置 #### (1)、服务端 ##### 1>、生成nacos配置文件 ```shell cd /script/config-center/nacos sh nacos-config.sh -h 127.0.0.1 -p 8848 -g SEATA_GROUP -t c27cd82f-3877-41eb-b1b6-0bc9e4566189 -u nacos -w nacos ``` ##### 2>、服务端启动 ```shell sh seata-server.sh -h 127.0.0.1 -p 10001 -m db -n 1 -e devs 后台启动:nohup xxx & ``` #### (2)、客户端 ##### 1>、maven ``` io.seata seata-spring-boot-starter 1.4.2 com.alibaba.cloud spring-cloud-starter-alibaba-seata io.seata seata-spring-boot-starter io.seata seata-all org.springframework.boot spring-boot-starter-data-redis io.netty netty-handler io.netty netty-common io.netty netty-transport ``` ##### 2>、springboot配置 - [通用配置](http://seata.io/zh-cn/docs/user/configurations.htmll) - ```yaml seata: enabled: true # enable-auto-data-source-proxy: false registry: type: nacos nacos: application: seata-server server-addr: 61.147.13.132:8848 namespace: c27cd82f-3877-41eb-b1b6-0bc9e4566189 group: SEATA_GROUP cluster: default username: password: config: type: nacos nacos: server-addr: 61.147.13.132:8848 namespace: c27cd82f-3877-41eb-b1b6-0bc9e4566189 group: SEATA_GROUP dataId: seataServer.properties username: password: #客户端和服务端在同一个事务组 tx-service-group: rcs_tx_group service: vgroup-mapping: rcs_tx_group: rcs-seata-cluster ``` #### (3)、高可用 ##### 1>、TC的异地多机房容灾(seata集群故障迁移) - client端配置: - ```yaml seata: #客户端和服务端在同一个事务组 tx-service-group: rcs_tx_group service: vgroup-mapping: rcs_tx_group: rcs-seata-cluster #集群故障迁移 ``` - 服务端配置: - ``` registry.conf registry { type = "nacos" nacos { application = "seata-server" serverAddr = "61.147.13.132:8848" group = "SEATA_GROUP" namespace = "c27cd82f-3877-41eb-b1b6-0bc9e4566189" cluster = "rcs-seata-cluster" username = "" password = "" } } config { type = "nacos" nacos { serverAddr = "61.147.13.132:8848" group = "SEATA_GROUP" namespace = "c27cd82f-3877-41eb-b1b6-0bc9e4566189" username = "" password = "" dataId = "seataServer.properties" } } nacos注册中心中的配置 dataId:service.vgroupMapping.rcs_tx_group Group:SEATA_GROUP 值:rcs-seata-cluster #集群故障迁移 ``` - 此时,rcs_tx_group视为以项目为单位(后面可以一个seata集群给多个项目使用,即一个环境多应用接入),rcs-seata-cluster是集群分组名称,当集群A挂了,可以修改`#集群故障迁移`,这样就切换到另一个seata集群了 [参考](http://seata.io/zh-cn/docs/user/txgroup/transaction-group-and-ha.html) ##### 2>、集群部署 - 服务端: - ```shell 本地伪集群: nohup sh seata-server.sh -h 10.16.50.244 -p 10001 -m db -n 1 -e dev & nohup sh seata-server.sh -h 10.16.50.244 -p 10002 -m db -n 2 -e dev & nohup sh seata-server.sh -h 10.16.50.244 -p 10003 -m db -n 3 -e dev & nohup sh seata-server.sh -h 192.168.2.197 -p 10001 -m db -n 1 -e dev & nohup sh seata-server.sh -h 192.168.2.197 -p 10002 -m db -n 2 -e dev & nohup sh seata-server.sh -h 192.168.2.197 -p 10003 -m db -n 3 -e dev & ps -ef|grep seata | grep -v grep | grep -v deploy | awk '{print $1","$2","$3","$35}' 服务器集群 sh seata-server.sh -h 各应用客户端可以访问的ip -p 8091 -m db -n 1 -e dev sh seata-server.sh -h 各应用客户端可以访问的ip -p 8091 -m db -n 2 -e dev sh seata-server.sh -h 各应用客户端可以访问的ip -p 8091 -m db -n 3 -e dev ``` - 客户端:保持集群分组不变 ## (四)、zipkin ### 1、服务端: - 启动服务端: - 创建数据库,见 `sql/zipkin.sql` - 启动:`java -jar -DSTORAGE_TYPE=mysql -DMYSQL_DB=lu_cloud_zipkin -DMYSQL_HOST=127.0.0.1 -DMYSQL_TCP_PORT=3306 -DMYSQL_USER=root -DMYSQL_PASS=111111 zipkin.jar` - 服务端UI访问:http://127.0.0.1:9411/zipkin ### 2、客户端 - ```txt 第一步:lu-core -> lu-common pom 文件,增加依赖 org.springframework.cloud spring-cloud-starter-sleuth org.springframework.cloud spring-cloud-starter-zipkin 第二步:nacos配置,lu-cloud-local.yml 增加配置 spring: sleuth: sampler: rate: 10 zipkin: base-url: http://127.0.0.1:9411 sender: type: web ``` ### 3、参考 - [zipkin官网](https://zipkin.io/pages/instrumenting.html) - [zipkin持久化](https://github.com/openzipkin/zipkin/tree/master/zipkin-server#in-memory-storage) - [zipkin接口文档](https://zipkin.io/zipkin-api/#/default/post_spans) - [springcloud](https://docs.spring.io/spring-cloud-sleuth/docs/2.2.8.RELEASE/reference/html/) # 三、redis ## (一)、[服务端集群搭建](http://redisdoc.com/topic/cluster-tutorial.html) 1、集群配置 ``` 配置文件 port 7000 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes 服务端启动 ../redis-server/src/redis-server redis.conf 集群配置 ./redis-server/src/redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1 客户端连接 ./redis-server/src/redis-cli -c -p 7000 集群相关信息查看 1.集群状态 cluster info 2.集群节点信息 cluster nodes 3.节点内存、cpu、key数量等信息(每个节点都需查看) ``` # 四、Lu-Cloud ## (一)、模块说明 ### 1、lu-core模块 | 应用名 | 应用服务ip:端口\|说明 | | -------------------------- | :----------------------------------------------------------- | | lu-gateway | 127.0.0.1:8086|127.0.0.1:8087|127.0.0.1:8088 | | lu-common | package com.lu.config自定义配置策略,各个应用都依赖该包,各个应用路径都为com.lu | | lu-log-spring-boot-starter | 按照规则生成日志,以便ELK采集分析。支持注解和Java代码显示调用两种方式 | ### 2、lu-learning模块(仅供参考的模块,本地伪集群) #### (1)、中间件服务端说明 | 服务名称 | 说明 | 端口使用 | | -------------- | ------------------------------------------------------------ | -------- | | nacos服务端 | 注册中心、配置中心,集群需要搭建nginx,代理8848端口。可以实现配置的动态更新,注意,有些配置例如数据源配置等需要并不是想象中的那么简单,需要编码来实现配置动态更新。这里对服务发现做了优化,实现了,一个服务端,多个客户端去连接,且各个客户端项目相互隔离,参考:lu-core模块,lu-common应用,com.alibaba.cloud.nacos.registry.NacosServiceRegistry | 8848 | | sentinel控制台 | 各个应用接口访问实时监控,以及流控规则的配置,已经改了dashboard源码,可以实现双向同步,数据的持久化到nacos中,这里对官方的配置按个人理解做了优化,简化了配置,参考:lu-core模块,lu-common应用,com.lu.config.sentinel.LuCloudClusterInitFunc | 8080 | | seata服务端 | 实现了异地容灾,在线集群切换迁移等。集群情况下,启动服务端-h后面的ip需要各个客户端能访问。 | 8091 | | | | | #### (2)、nacos、sentinel学习调测 | 应用名 | 应用服务ip:端口--->Sentinel独立模式传输端口 | Sentinel集群后台端口 | | ------------------------ | :----------------------------------------------------------- | -------------------- | | lu-nacos-sentinel | 127.0.0.1:8301--->18301|127.0.0.1:8302--->18302|127.0.0.1:8303--->18303 | 18300 | | lu-nacos-sentinel-api | 127.0.0.1:8401--->18401|127.0.0.1:8402--->18402|127.0.0.1:8403--->18403 | 18400 | | lu-nacos-sentinel-common | feign接口定义 | | #### (3)、seata学习调测 | 应用名 | 应用服务ip:端口--->Sentinel独立模式传输端口|说明 | Sentinel集群后台端口 | | ------------------------ | :----------------------------------------------------------- | -------------------- | | lu-seata-api | seataTM角色,全局调用订单仓储账户服务127.0.0.1:8501 | | | lu-seata-common | feign接口定义 | | | lu-seata-order-service | 127.0.0.1:8001--->18001|127.0.0.1:8002--->18002|127.0.0.1:8003--->18003 | 18000 | | lu-seata-storage-service | 127.0.0.1:8101--->18101|127.0.0.1:8102--->18102|127.0.0.1:8103--->18103 | 18100 | | lu-seate-account-service | 127.0.0.1:8201--->18201|127.0.0.1:8202--->18202|127.0.0.1:8203--->18203 | 18200 | #### (4)、调测相关 ```shell nohup java -jar -Xmx100m -Xms100m -Dserver.port=8301 -Dlu.cloud.sentinel.transport.port=18301 -Dspring.profiles.active=local -Dspring.cloud.sentinel.log.dir=/lu/LuBoot/lu-cloud-logs -Dlu.cloud.default.server-addr=192.168.2.197:8848 -Dlu.cloud.sentinel.transport.dashboard=192.168.2.197:8080 lu-nacos-sentinel-1.0.0.jar & SELECT * FROM lu_cloud.t_order; SELECT * FROM lu_cloud.t_storage; SELECT * FROM lu_cloud.t_account; SELECT * FROM lu_cloud.undo_log; SELECT * FROM lu_cloud_seata.global_table; SELECT * FROM lu_cloud_seata.branch_table; SELECT * FROM lu_cloud_seata.lock_table; show processlist; select * from information_schema.innodb_trx; SELECT * from information_schema.processlist WHERE id = 984739; show full processlist; #XA模式运用不当容易锁表,排查语句 SELECT t1.OBJECT_SCHEMA, t1.OBJECT_NAME, t1.LOCK_TYPE, t1.LOCK_STATUS, t2.PROCESSLIST_ID, t2.PROCESSLIST_USER, t2.PROCESSLIST_HOST, t2.PROCESSLIST_DB, t2.PROCESSLIST_COMMAND, t2.PROCESSLIST_STATE, t2.PROCESSLIST_INFO FROM `performance_schema`.metadata_locks t1, `performance_schema`.threads t2 WHERE t1.owner_thread_id = t2.thread_id AND t1.OBJECT_SCHEMA = 'lu_cloud' AND t1.OBJECT_NAME = 't_order'; kill 594; 接口,都是GET请求: ##网关、nacos、sentinel调测 http://localhost:8301/user/test01 http://localhost:8086/provider/test/test01 http://127.0.0.1:8086/provider/test/test02/1 ##seata调测 http://localhost:8001/order/branchType http://localhost:8001/order/list http://localhost:8501/test/pay ``` #### (5)、分布式锁 | 应用名 | 应用服务ip:端口 | | ------------------- | :-------------- | | lu-distributed-lock | 127.0.0.1:8601 | #### (6)、shardingsphere | 应用名 | 应用服务ip:端口 | | ----------------- | :-------------- | | lu-shardingsphere | 127.0.0.1:8701 | ## (二)、环境部署 ### 1、local开发环境 #### (1)、配置 - Nacos-server-addr:127.0.0.1:8848 - Nacos-命名空间:87f37a16-727e-47ec-829c-03db30e0bf6f - Sentinel-控制台:127.0.0.1:8080 #### (2)、各个模块