# 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)、各个模块