# spring-cloud-demo
**Repository Path**: 85024610/spring-cloud-demo
## Basic Information
- **Project Name**: spring-cloud-demo
- **Description**: 一个SpringCloud demo项目
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 10
- **Forks**: 3
- **Created**: 2017-07-03
- **Last Updated**: 2025-09-02
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
* [项目要求](#项目要求)
* [service-luna](#service-luna)
* [service-job](#service-job)
* [service-xxl-job](#service-xxl-job)
* [service-elastic-job](#service-elastic-job)
* [service-dynamic-job](#service-dynamic-job)
* [service-mq](#service-mq)
* [service-rocketmq](#service-rocketmq)
* [service-kafka](#service-kafka)
* [service-rabbitmq](#service-rabbitmq)
* [service-miya](#service-miya)
* [service-k8s](#service-k8s)
* [service-k8s-consumer](#service-k8s-consumer)
* [service-k8s-provider](#service-k8s-provider)
* [service-k8s-gateway](#service-k8s-gateway)
* [service-k8s-xxl-job-executor](#service-k8s-xxl-job-executor)
* [service-gateway](#service-gateway)
* [service-apisix](#service-apisix)
* [service-springcloud-gateway](#service-springcloud-gateway)
* [service-shardingsphere-5](#service-shardingsphere-5)
* [service-nosql](#service-nosql)
* [service-redis](#service-redis)
* [graylog 日志系统](#graylog-日志系统)
* [skywalking](#skywalking)
* [定时任务](#定时任务)
* [XXL-JOB](#xxl-job)
* [Elastic-Job-Lite-UI](#elastic-job-lite-ui)
* [service-tx(事务)](#service-tx事务)
* [service-tx-local](#service-tx-local)
* [service-tx-seata](#service-tx-seata)
* [nacos](#nacos)
* [canal](#canal)
* [Sentinel](#sentinel)
* [Sentinel-dashboard](#sentinel-dashboard)
* [Sentinel 集群流控服务](#sentinel-集群流控服务)
* [SEATA](#seata)
* [RocketMQ 服务启动](#rocketmq-服务启动)
* [RabbitMQ](#rabbitmq)
* [Kubernetes](#kubernetes)
* [minikube](#minikube)
* [Istio](#istio)
* [MySQL](#mysql)
* [APISIX网关](#apisix网关)
* [uid 服务](#uid-服务)
## 项目要求
* 操作系统: windows 10或之后版本
* 开启Hyper-V (只要开启wsl2,新版的docker desktop不需要Hyper-V)
* [开启wsl2](https://learn.microsoft.com/zh-cn/windows/wsl/basic-commands#install)
* 安装linux子系统(推荐Ubuntu 22.04)
* 安装 docker-desktop for windows(版本必须4.27.1)
* 创建自定义docker网络:docker network create customize-network
* docker-desktop已经包含docker-compose
* 内存:推荐16G或以上(minikube和istio同时运行需要16G内存)
* JDK:Java 21+
## service-luna
* 业务代码:http://localhost:8763/started/hi?name=forezp
* 启动参数:
* 添加 VM Option:--add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/sun.reflect.annotation=ALL-UNNAMED
* 功能:
* 使用nacos作为服务注册中心和配置中心
* 使用阿里的Sentinel做服务流控和熔断降级
* 启动命令添加skywalking探针,java -javaagent:x:\xxx\skywalking-agent\skywalking-agent.jar --SW_AGENT_NAME=应用名(必须英文) -jar your_application.jar
注意:8.5.0以上的版本,请加上--SW_AGENT_NAME设置服务名,否则会使用skywalking的默认值
* Junit注解使用JunitAnnotaionTest.java
* controller目录下功能
* ApisixControler 测试apisix的功能,其中提供接口给apisix做鉴权测试使用
* ValidateController 校验请求参数
* SkywalkingController 配合skywalking功能调试
* RequestHeaderController 请求头某个属性值JSON转换成对象
* DateConvertController 请求参数日期转换
* FilterAndInterceptor 验证请求经过过滤器和拦截器执行顺序
* function目录下是介绍Java和第三方jar包的使用
* 算法
* Kafka 时间轮算法
* 快速排序算法
* 二分查找算法
* 日志对接graylog
* retrofit http客户端使用
* Java线程相关测试
* 使用shardingsphere实现分库规则 (搭建shardingsphere proxy服务,可以将分库聚合成一个库,通过工具方便查询)
* 分片策略所在的路径 com.demo.function.shardingsphere.config
* 强制分片AOP com.demo.function.shardingsphere.aop.ShardingStrageyAop
* 强制分片注解 com.demo.function.shardingsphere.annotation.ShardingStrategy
* spring功能使用
* WebFlux提供WebClient
* OpenFeign
* OpenFeign拦截
* 熔断降级(使用阿里sentinel做熔断降级处理)
* Loadbalancer灰度负载均衡器,被调用的服务需要走灰度,在nacos的元数据添加gray: true
* 类:
* com.demo.config.GrayLoadBalancerConfig (自定义)
* com.demo.config.SpringHintLoadBalancerConfiguration (Spring Loadbalancer提供)
* orika类型转换配置
* caffeine 使用
* caffeine的Cache,LoadingCache,AsyncCache使用
* excel
* easyexcel
* 新增通用读取excel工具类
* filter
* 防止SQL注入过滤器
* 防止XSS攻击过滤器
* mybatis
* pagehelper
* 分页使用
* mybatisplus
* 根据id批量更新
* 批量插入
* utils 工具类
* 生成树形结构集合
* HTTP Interface
* 使用RestClient和WebClient进行远程调用,并且测试异步调用
* shiro权限控制
* wiremock
* 实现对第三方接口进行mock,对新增mock接口只需要在resources/wiremock/mappings/目录下*.json文件修改即可
* 服务启动时自动启动wiremock服务,服务启动通过注解@AutoConfigureWireMock,相关配置在application.yaml
* 支持响应变量返回数据,参考:MiyaClient_requestMapping.json。注意里面response的json,使用响应变量必须添加:"transformers": ["response-template"]
* 使用说明:
* wiremock 请求解析:https://blog.csdn.net/qq_36963950/article/details/123774212
* wiremock 响应解析:https://zhuanlan.zhihu.com/p/646503463
* 注意:使用延迟初始化,只需要启动以下服务:
* [MySQL](#MySQL)
* [nacos](#nacos)
* 可选启动服务:
* [sentinel-dashboard](#sentinel-dashboard)
* [apisix网关](#apisix网关)
* [service-springcloud-gateway](#service-springcloud-gateway)
* Sentinel规则持久化(nacos)
* 流控规则
* resource:资源名,即限流规则的作用对象
* limitApp:流控针对的调用来源,若为 default 则不区分调用来源
* grade:限流阈值类型(QPS 或并发线程数);0代表根据并发数量来限流,1代表根据QPS来进行流量控制
* count:限流阈值
* strategy:调用关系限流策略
* controlBehavior:流量控制效果(直接拒绝、Warm Up、匀速排队)
* clusterMode:是否为集群模式
```
[
{
"resource": "/started/hi",
"limitApp": "default",
"grade": 1,
"count": 1,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
}
]
```
* 熔断规则
* count:触发熔断规则阀值
* grade:熔断策略;0-代表慢调用比例,1-代表异常比例,2-代表异常数
* limitApp:调用来源,若为 default 则不区分调用来源
* minRequestAmount:最小请求数
* resource:资源名,即熔断规则的作用对象
* slowRatioThreshold:比例阈值,当grade=0,slowRatioThreshold才生效
* statIntervalMs:统计时长
* timeWindow:熔断时长(单位:秒)
```
[
{
"count":100,
"grade":0,
"limitApp":"default",
"minRequestAmount":2,
"resource":"GET:http://service-miya/processLongTime",
"slowRatioThreshold":1,
"statIntervalMs":1000,
"timeWindow":10
}
]
```
* 部署到docker的创建容器命令:docker run -p 8763:8763 --name service-luna --link nacos --network customize-network service-luna:latest
## service-job
* 主要调度任务框架功能介绍
### service-xxl-job
* 功能:
* 简单任务调度
* 多个执行器的分片任务
* 分片任务配置说明:单机部署多个执行器时,需要在启动参数VM options中添加:-Dserver.port="tomcat端口" -Dxxl.job.executor.port="执行器端口"
### service-elastic-job
* 功能:
* 简单任务调度,单机多分片执行任务
* 数据流任务
### service-dynamic-job
* 功能:
* 动态添加/删除定时任务
## service-mq
* 主要是mq功能模块功能介绍
### service-rocketmq
* 常规功能使用
* 使用RocketMQ订阅canal得到的数据库日志解析
* 自定义注解@MqConsumer,该注解是方法级别使用。该注解具备@RocketMQMessageListener是一样功能,而且不用为每个主题定义一个类
* 设计思路:
* 定义注解MqConsumer
* 实现BeanPostProcessor接口,在Spring完成对象实例化之后,执行BeanPostProcessor接口实现类,筛选容器里使用MqConsumer的Bean
* 为每一个使用MqConsumer注解的方法注册一个container的Bean
* container内部创建一个consumer,监听的topic和tag来自MqConsumer注解
* 因为container实现SmartLifecycle接口,在Spring容器的Bean创建完成并且初始化完毕执行start方法,启动consumer监听borker的topic
* 类:
* RocketMqListenerContainerConfig 拦截使用注解MqConsumer,并且创建container
* RocketMqListenerContainer 负责创建consumer和启动关闭consumer
* 消息自动重发,确保消费端能把消息消费成功
* 设计思路:
* 生产者发送消息时,把回调key和回调tag设置在message的properties,随消息一起发送
* 消费者定义回调主题,消费成功根据回调主题发送消息,消息体和tag从消息的properties获取回调key和回调tag
* 生产者定义一个消费者消费回调消息,更新表flag者
* 定时任务扫描表flag=0 and retry_num < 5的数据,重新发送
* 类:
* RocketCallbackConfig 定义消费者处理回调消息和生产者重新发消息
* RocketMqConfigPropertites 处理回调消息的消费者配置
* ServiceSharding 根据nacos获取服务实例数量再计算机器的分片值,根据分片获取指定重发数据再次重发消息
* 流程图:

### service-kafka
* Kafka使用
* 常用功能使用
* 消费者多线程消费,批量拉取消息消费
* 类:
* 配置类:com.demo.kafka.config.KafkaConfig.kafkaListenerContainerFactory
* 消费者:com.demo.kafka.consumer.KafkaConsumerListener.listenerTopic2
### service-rabbitmq
* rabbitmq使用
* 常用功能使用
* 延迟消息使用
* 需要到官网下载插件:rabbitmq_delayed_message_exchange
* 插件放到/config/dockerfile/rabbitmq目录下,执行dockerfile生成镜像,启动容器
* 连接多个RabbitMQ服务器
* RabbitMQMultiServerConfig配置连接多个RabbitMQ服务器
## service-miya
* 提供接口给service-luna服务调用
## service-k8s
### service-k8s-consumer
* 使用k8s服务发现功能,configmap作为配置中心
* 通过openFeign调用其他服务
* 通过[Istio](#Istio)实现流量控制
* 通过[Istio](#Istio)实现jwt授权认证、跨域请求认证失败返回access-control-allow-origin(Istio 1.14之后版本支持)
* 类:
* com.demo.k8s.controller.OauthController
* 配置s文件:
* /k8s_config/service-k8s-istio-jwt.yaml
* 通过[Istio](#Istio)实现重写url再转发
* 注意:
* 项目依赖k8s环境,必须部署k8s。开发推荐搭建本地[minikube](#minikube)
* 项目通过maven package生成jar包后自动脚本(build镜像,重启pod等等)。如果在windows下使用idea执行maven package命令,必须使用管理员运行idea
* 动态刷新配置,需要使用Spring Cloud Kubernetes Configuration Watcher服务实现,官网:https://docs.spring.io/spring-cloud-kubernetes/docs/2.0.4/reference/html/#spring-cloud-kubernetes-configuration-watcher
* 本地开发需要调用k8s集群里的服务,需要使用ktConnect才能直接访问k8s集群内网。KtConnect官网:https://alibaba.github.io/kt-connect/#/。以下是使用KtConnect本地调用k8s集群服务
* 执行命令: ktctl -n default(命名空间) connect --dnsMode hosts (必须以管理员模式运行)
* 在idea配置环境变量 KUBERNETES_SERVICE_HOST=service_ip; KUBERNETES_SERVICE_PORT=service_port
### service-k8s-provider
* 提供接口给service-k8s服务调用
* 注意:
* 项目通过maven package生成jar包后自动脚本(build镜像,重启pod等等)。如果在windows下使用idea执行maven package命令,必须使用管理员运行idea
### service-k8s-gateway
* 整合k8s服务注册和服务发现功能,提供转发功能(依赖[service-k8s](#service-k8s))
* 整合k8s + istio,提供转发时并且使用istio做流量控制,根据规则转发到不同版本的服务(依赖[service-k8s-provider](#service-k8s-provider))
* 注意:
* 项目通过maven package生成jar包后自动脚本(build镜像,重启pod等等)。如果在windows下使用idea执行maven package命令,必须使用管理员运行idea
### service-k8s-xxl-job-executor
* 整合xxl-job,实现定时任务功能
## service-gateway
### service-apisix
* 自定义apisix插件(*目前apisix java插件修改请求body是无法传递给上游服务*)
* 开发调试:
* 项目必须在linux环境下开发调试,因为apisix使用sidecar方式加载插件,apisix与插件通信底层使用unix domain socket协议 ([Unix domain Socket详解](https://zhuanlan.zhihu.com/p/493855698))
* 如果apisix部署在容器上,自定义插件部署在宿主机上。插件每次启动,apisix也必须重新部署。
* JDK必须使用11或更新的版本
* apisix容器部署配置在 /config/docker-compose/apisix/apisix-java-plugin(开发调试模式的部署)
* 在项目service-apisix的config目录,是运行模式的部署
### service-springcloud-gateway
* 使用springcloud gateway作为网关,实现统一路由方式
* 功能:
* 接入阿里Sentinel实现网关流控,配合Sentinel-dashboard使用时,启动命令必须添加启动参数Dcsp.sentinel.app.type=1,这样才能sentinel dashboard显示网关api分组配置。
并且从nacos获取api管理、限流、降级规则
* api管理
* apiName: API 名称
* ip:下发给sentinel客户端的ip
* port:下发给sentinel客户端的端口
* predicateItems.matchStrategy:匹配模式,0-精确,1-前缀,2-正则
* predicateItems.pattern:匹配串,既请求url。
```
[
{
"apiName": "service-luna",
"app": "service-gateway",
"gmtCreate": 1673134572355,
"gmtModified": 1673135210475,
"id": 1,
"ip": "192.168.0.70",
"port": 8720,
"predicateItems": [
{
"matchStrategy": 0,
"pattern": "/service-luna/started/hi"
}
]
}
]
```
* 限流规则
* burst:应对突发请求时额外允许的请求数目。
* controlBehavior:流量整形的控制效果,同限流规则的 controlBehavior 字段,目前支持快速失败和匀速排队两种模式,默认是快速失败。
* count:限流阈值
* grade:限流指标维度,同限流规则的 grade 字段。0代表根据并发数量来限流,1代表根据QPS来进行流量控制
* interval:统计时间窗口,单位是秒,默认是 1 秒。对应界面网关流控规则是间隔选项
* intervalUnit:统计时间窗口时间单位。0-秒,1-分,2-时,3-天
* ip:下发给sentinel客户端的ip
* port:下发给sentinel客户端的端口
* resource:资源名称,可以是网关中的 route 名称或者用户自定义的 API 分组名称。
* resourceMode:规则是针对 API Gateway 的 route(RESOURCE_MODE_ROUTE_ID)还是用户在 Sentinel 中定义的 API 分组(RESOURCE_MODE_CUSTOM_API_NAME),默认是 route。0-route,1-API分组
```
[
{
"app": "service-gateway",
"burst": 0,
"controlBehavior": 0,
"count": 1.0,
"gmtCreate": 1673136008860,
"gmtModified": 1673136187695,
"grade": 1,
"id": 2,
"interval": 10,
"intervalUnit": 0,
"ip": "192.168.0.70",
"port": 8720,
"resource": "service-luna",
"resourceMode": 1
}
]
```
* 新服务上线自动添加路由规则,实现功能在com.example.servicegateway.route.rule
* 流程图:

* 灰度负载均衡器,实现全链路灰度调用
* 类:
* com.example.servicegateway.config.GrayLoadBalancerConfig (自定义)
* com.example.servicegateway.config.SpringHintLoadBalancerConfiguration (Spring Loadbalancer提供)
* 部署到docker的创建容器命令:docker run -p 8764:8764 --name service-springcloud-gateway --network customize-network --link nacos service-springcloud-gateway:latest
## service-shardingsphere-5
* 使用shardingsphere实现数据分片策略
* 分片策略:
* 强制分片:
* 强制指定执行sql数据库,类:com.demo.shardingsphere5.service.impl.ForceHintUserServiceImpl
* 解析sql字段的值,指定数据库,类:com.demo.shardingsphere5.service.impl.HintInLineUserServiceImpl
* 读写分离:
* 类:com.demo.shardingsphere5.service.impl.ReadWriteStaticUserServiceImpl
* 分表:
* 解析sql字段的值,指定查询的表,类:com.demo.shardingsphere5.service.impl.UserShardingServiceImpl
## service-nosql
### service-redis
* 功能
* redis使用
* 实现注解方式添加锁,底层使用redisson加锁和释放锁
* redisson加锁
* redisTemplate批量添加数据测试
* SpringBoot Cache使用
* 使用spring cache,缓存实现方案用到redis。并且增加注解实现失效时间,配置类:RedisConfig。自定义RedisCacheManager。
* 容器部署
* docker run --name redis -p 6379:6379 -d redis:7.0.5
* 集群部署
* 在容器内部署集群,docker-compose配置文件在/config/docker-compose/redis目录下。
## graylog 日志系统
* Graylog 是一个开源的日志聚合、分析、审计、展现和预警工具。对于功能上来说,和 ELK 类似,但又比 ELK 要简单很多。依靠着更加简洁,高效,部署使用简单的优势很快受到许多人的青睐。当然,在扩展性上面确实没有比 ELK 好,但是其有商业版本可以选择
* 容器部署:
* 下载镜像:
* docker pull mongo:4
* docker pull elasticsearch:7.12.1
* docker pull graylog/graylog:4.0
* 启动容器:
* docker run --name mongo -d mongo:4
* docker run --name elasticsearch -e "http.host=0.0.0.0" -e "discovery.type=single-node" -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" -e http.cors.allow-origin="*" -e http.cors.enabled=true -d -p 9200:9200 elasticsearch:7.12.1
* 安装ik分词插件
* 进入elasticsearch容器终端
* 执行命令(多试几次,经常出现连接被拒绝):./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.1/elasticsearch-analysis-ik-7.12.1.zip
* docker run --name graylog --link mongo --link elasticsearch -p 9000:9000 -p 12201:12201/udp -p 1514:1514 -p 5555:5555/udp -e GRAYLOG_HTTP_EXTERNAL_URI="http://127.0.0.1:9000/" -e GRAYLOG_ROOT_TIMEZONE="Asia/Shanghai" -d graylog/graylog:4.0
* graylog email配置
* docker run --name graylog --link mongo --link elasticsearch -p 9000:9000 -p 12201:12201/udp -p 1514:1514 -p 5555:5555/udp -e GRAYLOG_HTTP_EXTERNAL_URI="http://127.0.0.1:9000/" -e GRAYLOG_ROOT_TIMEZONE="Asia/Shanghai" -e GRAYLOG_TRANSPORT_EMAIL_ENABLED=true -e GRAYLOG_TRANSPORT_EMAIL_HOSTNAME=mail.example.com -e GRAYLOG_TRANSPORT_EMAIL_PORT=587 -e GRAYLOG_TRANSPORT_EMAIL_USE_AUTH=true -e GRAYLOG_TRANSPORT_EMAIL_USE_TLS=true -e GRAYLOG_TRANSPORT_EMAIL_AUTH_USERNAME=you@example.com -e GRAYLOG_TRANSPORT_EMAIL_AUTH_PASSWORD=密码 -d graylog/graylog:4.0
* graylog端口9000,1514是使用TCP协议,端口12201,5555是使用UDP协议
* 参考文档:
* [Installing Graylog » Docker](https://docs.graylog.org/en/3.3/pages/installation/docker.html)
* [docker部署graylog使用教程](https://www.cnblogs.com/jonnyan/p/12566994.html)
## skywalking
* SkyWalking 是观察性分析平台和应用性能管理系统。提供分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案
* 部署:
* 物理机:
* 在bin目录下执行startup.bat或startup.sh即可启动服务,执行startup.bat之后会启动如下两个服务
* Skywalking-Collector:追踪信息收集器,通过 gRPC/Http 收集客户端的采集信息 ,Http默认端口 12800,gRPC默认端口 11800。
* Skywalking-Webapp:管理平台页面 默认端口 8080,登录信息 admin/admin
* skywalking所在目录名称不能有空格
* 基于8.5.0版本部署
* 容器:
* 在config/docker-compose目录下执行命令:
* 部署:docker-compose -p service-group -f skywalking.yml up
* 容器销毁:docker-compose -p service-group -f skywalking.yml down
* 容器停止:docker-compose -p service-group -f skywalking.yml stop
* 启动完之后,在ES容器执行命令安装ik分词器插件
* 配置文件:https://skywalking.apache.org/docs/main/next/en/setup/backend/configuration-vocabulary/
* Agent使用,Skywalking 采用 Java 探针技术,对客户端应用程序没有任何代码侵入,使用起来简单方便,当然其具体实现就是需要针对不同的框架及服务提供探针插件。使用命令:
* 版本:8.12.0
* java -javaagent:G:\github\incubator-skywalking\skywalking-agent\skywalking-agent.jar --SW_AGENT_NAME=应用名(必须英文) -jar your_application.jar
* 参数说明:
* --SW_AGENT_NAME 定义服务名称,在skywalking ui显示对应服务(8.5.0不添加此参数,默认显示Your_Application。在6.x不需要配置,直接显示spring.application.name的值)
* idea在run/debug configurations -> Add VM options 填写:-javaagent:G:\github\incubator-skywalking\skywalking-agent\skywalking-agent.jar -SW_AGENT_NAME=应用名(必须英文)
* Agent过滤URL,在SkyWalking的追踪信息页面不再显示(参考:https://www.jianshu.com/p/4bd310850dd0)
* skywalking日志
* Skywalking的traceId与日志组件(log4j,logback,elk等)的集成,以logback为例,只要在日志配置xml中增加以下配置,则在打印日志的时候,自动把当前上下文中的traceId加入到日志中去,SkyWalking默认traceId占位符是%tid
```
%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %tid - %msg%n
```
* 日志上报skywalking配置(skywalking grpc 日志收集 8.4.0版本开始支持)
```
%d{yyyy-MM-dd HH:mm:ss.SSS} [%tid] [%thread] %-5level %logger{36} -%msg%n
```
* 日志插件配置,详细配置参考文档:https://skywalking.apache.org/docs/main/v8.5.0/en/setup/service-agent/java-agent/readme/
```
// 配置文件路径:agent\config\agent.config
plugin.toolkit.log.grpc.reporter.server_host=${SW_GRPC_LOG_SERVER_HOST:127.0.0.1}
plugin.toolkit.log.grpc.reporter.server_port=${SW_GRPC_LOG_SERVER_PORT:11800}
plugin.toolkit.log.grpc.reporter.max_message_size=${SW_GRPC_LOG_MAX_MESSAGE_SIZE:10485760}
plugin.toolkit.log.grpc.reporter.upstream_timeout=${SW_GRPC_LOG_GRPC_UPSTREAM_TIMEOUT:30}
```
* filebeat和kafka上传日志
* 注意: 版本9.2.0,有bug
* 日志有中文skywalking出现异常,因为kafka的Bytes对象toString方法中文转成16进制,导致转换JSON报错
* 异常的类:org.apache.skywalking.oap.server.analyzer.agent.kafka.provider.handler.JsonLogHandler#parseConsumerRecord
* 修复插件包在/plugin/kafka-fetcher-plugin-9.2.0.jar
* docker-compose -p service-group -f skywalking-log-collector.yml up
* 在windows使用docker要注意: 将/config/filebeat.yml和/plugin/kafka-fetcher-plugin-9.2.0.jar 复制到linux目录下。在linux环境执行上面docker-compose命令。如果在windows执行上面docker-compose命令会报错
* 在config/docker-compose目录下执行命令:docker-compose -p service-group -f skywalking-log-collector.yml up
* skywalking告警
* skywalking告警支持本地配置和动态配置
* 本地配置:在/config/alarm-settings.yml配置告警规则
* 动态配置(基于nacos):
* 修改/config/application.yml的configuration.selector值,指定nacos作为配置中心
* 在nacos新建dataId=alarm.default.alarm-settings,group=skywalking,配置内容跟/config/alarm-settings.yml一样的格式
* 动态规则优先级高于本地规则
* 基于docker动态配置(nacos):
* docker-compose -p service-group -f skywalking-log-collector.yml up
* 告警配置
```
rules:
# 规则名称,在告警信息中显示的唯一名称,必须以_rule结尾
service_resp_time_rule:
# 服务响应时间
metrics-name: service_resp_time
# [Optional] Default, match all services in this metrics
# include-names:
# - GET:/skywalking/pref in luna
# 阈值
threshold: 100
# 操作符,支持>, >=, <, <=, =。
op: ">"
# 多久告警规则需要被检查一下,时间单位:分钟
period: 1
# 在一个周期窗口中,如果按Op计算超过阈值的次数达到Count,则发送告警。
count: 1
# 发送的通知消息。可以使用变量,{name} 会解析成规则名称。
message: "响应时间超过100毫秒告警"
webhooks:
# SkyWalking的告警消息会通过 HTTP 请求进行发送,请求方法为 POST,Content-Type 为 application/json
# 容器调用宿主服务,域名必须是host.docker.internal
- http://host.docker.internal:8763/skywalking/alarm/
```
* 告警规则key含义
* metrics-name:取值可以在skywalking ui每个指标的编辑(“...”图标)下可以查看,对应中文名称叫指标。实体类型是该指标适用的范围
* include-names:包含在此规则之内的实体名称列表,实例名称规则
* 端点:{端点名称} in {服务名称},例如: GET:/skywalking/pref in luna
* 告警文档:
* https://skywalking.apache.org/docs/main/next/en/setup/backend/dynamic-config/
* https://skywalking.apache.org/docs/main/next/en/setup/backend/backend-alarm/
* https://skywalking.apache.org/docs/main/next/en/setup/backend/dynamic-config-nacos/
* skywalking 子线程与主线程输出相同trace id (版本9.2.0的apm-jdk-threading-plugin默认在plugins文件夹下)
* 在skywalking-agent.jar目录找到 bootstrap-plugins 文件夹
* bootstrap-plugins/apm-jdk-threading-plugin-8.8.0.jar 复制到 plugins 文件夹下
* config/agent.config的plugin.jdkthreading.threading_class_prefixes配置包含实现多线程类的包路径,
例如:plugin.jdkthreading.threading_class_prefixes=com.demo
目前不支持java 8 CompletableFuture输出trace id
## 定时任务
### XXL-JOB
* XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展
* 容器部署:
* 版本:3.0.0
* 启动容器:docker run -e PARAMS="--spring.datasource.url=jdbc:mysql://mysql:3306/xxl_job?Unicode=true&characterEncoding=UTF-8 --spring.datasource.username=root --spring.datasource.password=123456" -p 8080:8080 -p 9090:9090 -p 9999:9999 -v /tmp:/data/applogs --link mysql --network customize-network --name xxl-job-admin xuxueli/xxl-job-admin:3.0.0
* 访问地址:http://localhost:8080/xxl-job-admin
* 先部署服务
* [MySQL](#MySQL)
### Elastic-Job-Lite-UI
* Elastic-Job是一个分布式任务调度平台,具有弹性调度、资源管控、以及作业治理的功能
* 容器部署:
* 版本:3.0.2
* 在config/docker-compose/elastic-job-lite-ui目录下执行命令:
* 执行docker-compose up
* 先部署服务
* [MySQL](#MySQL)
## service-tx(事务)
### service-tx-local
* 测试spring本地声明式事务
### service-tx-seata
* Seata是一款开源的分布式事务解决方案,在微服务架构下提供高性能和简单易用的分布式事务服务。
* 功能
* AT模式分两个阶段:
* 一阶段,本地事务准备提交时,向seata服务获取该记录的全局锁,如果获取到锁,则提交本地事务,否则回滚事务。注意:此时本地事务已提交,数据的锁在seata服务管理。
* 二阶段,异步提交事务,释放全局锁。异常则回滚事务。回滚数据记录在undo_log表,undo_log表记录数据修改前和修改后的数据。
* XA模式分两个阶段:
* 一阶段,SQL执行后,分支事务处于阻塞阶段,收到commit或rollback,前必须阻塞等待。导致事务资源长时间得不到释放,锁定周期长,而且在应用层上面无法干预,性能差。
* 二阶段,提交本地事务或回滚,释放锁。
* TCC模式
* 一阶段:try阶段,预定操作资源(Prepare) 这一阶段所以执行的方法便是被 @TwoPhaseBusinessAction 所修饰的方法。本地执行TCC事务,必须在接口加上LocalTCC注解才能使用TCC模式。而被调用的第三方服务则不需要添加LocalTCC注解
* 二阶段:分别有confirm阶段和cancel阶段,confirm只要执行业务commit。cacel则执行事务回滚。
* seata容器部署配置在 /config/docker-compose/seata
* 先部署服务
* [nacos](#nacos)
* [mysql](#mysql)
* 执行配置:在nacos配置列表导入配置,配置文件在service-tx-seata/nacos_config/center/nacos_config_export.zip。seataServer.properties是压缩包里的配置文件
* seata tcc相关文章
* https://juejin.cn/post/7487846902660939810
## service-graalvm
* GraalVM是一个开源的JVM编译器,可以编译为字节码、机器码和Native Code。
* 通过graalvm编译,使sprintboot项目生成native docker镜像
* 生成native docker镜像步骤
* 启动docker,并且IDEA连接上docker
* 在IDEA的sidebar的Maven的Profiles选中native
* 使用idea开发工具,执行spring-boot:build-image。如果网络较好,编译过程能连接docker仓库和github下载相关文件。在这一步就完成编译和镜像的生成。网络不好,则继续走下一步。
* 下载bellsoft的jdk。如使用java 21版本,通过此链接下载:https://github.com/bell-sw/LibericaNIK/releases/download/23.1.7+1-21.0.7+9/bellsoft-liberica-vm-core-openjdk21.0.7+9-23.1.7+1-linux-amd64.tar.gz
* 注意:如果不是使用java 21版本。可以通过在编译时看到通过github下载的bellsoft jdk版本,将此版本下载
* 在config/docker-compose/httpd的docker-compose.yml配置文件,修改volumes参数,将为bellsoft jdk挂载到httpd容器。提供在编译时下载bellsoft jdk的链接
* 执行config/docker-compose/httpd/docker-compose.yml,启动httpd容器。
* 修改[42b988836bbe59da1b6703ca6ce9dfa9b49ef3f4437f89c161bd5b63eb0005b9](service-graalvm/platform/bindings/maven/42b988836bbe59da1b6703ca6ce9dfa9b49ef3f4437f89c161bd5b63eb0005b9)文件的url,能从httpd下载bellsoft jdk
* 注意:42b988836bbe59da1b6703ca6ce9dfa9b49ef3f4437f89c161bd5b63eb0005b9文件名是通过[buildpack.toml](https://github.com/paketo-buildpacks/bellsoft-liberica/blob/main/buildpack.toml)找到bellsoft对应的jdk或jre的sha256值
* 修改service-graalvm的pom.xml。将[maven](service-graalvm/platform/bindings/maven)目录的完整路径替换到pom的build-》plugins-》plugin-》configuration-》image-》bindings-》bingding的“:”前
* 再执行spring-boot:build-image
## nacos
* 服务注册中心和配置中心使用nacos
* 官网:https://nacos.io/zh-cn/index.html
* 容器部署:https://hub.docker.com/r/nacos/nacos-server
* 版本:2.3.2
* 下载镜像:docker pull nacos/nacos-server:v2.3.2
* 启动容器:docker run --name nacos --network customize-network -e MODE=standalone -p 8848:8848 -p 9848:9848 -d nacos/nacos-server:v2.3.2
* 集群部署
* 在config/docker-compose/nacos目录下执行命令:
* 部署:docker-compose -p nacos-cluster -f nacos-cluster.yml up
* 如果是第一次部署,mysql启动完,先创建schema=nacos,然后执行目录下的nacos_db.sql的语句,再次重启nacos服务
## canal
* 基于数据库增量日志解析,提供增量数据订阅&消费
* 测试时修改配置文件
* conf\canal.properties
```
// 默认值example,server上部署的instance列表,需要在canal.properties目录下建立同名的目录
canal.destinations = example,example2
```
* conf\example\instance.properties
```
// 数据库地址
canal.instance.master.address=192.168.1.20:3306
// username/password,数据库的用户名和密码
canal.instance.dbUsername = canal
canal.instance.dbPassword = canal
// 默认topic,动态topic规则匹配不到往默认topic投递消息
canal.mq.topic=ds
// 动态topic规则配置
canal.mq.dynamicTopic=.*\\..*
```
* canal配置:https://github.com/alibaba/canal/wiki/Canal-Kafka-RocketMQ-QuickStart
## Sentinel
* Sentinel 提供一个轻量级的开源控制台,它提供机器发现以及健康情况管理、监控(单机和集群),规则管理和推送的功能
* [网关限流介绍](https://github.com/alibaba/Sentinel/wiki/%E7%BD%91%E5%85%B3%E9%99%90%E6%B5%81#%E7%BD%91%E5%85%B3%E6%B5%81%E6%8E%A7%E6%8E%A7%E5%88%B6%E5%8F%B0)
* 启动命令:java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
* Sentinel 1.7.2之前版本,如果在网关限流必须配置SPI机制加载GatewaySlotChainBuilder才能在网关限流,配置如下:
* 在resources新建目录META-INF.services
* 新建文件,文件名com.alibaba.csp.sentinel.slotchain.SlotChainBuilder
* SlotChainBuilder文件内容:com.alibaba.csp.sentinel.adapter.gateway.common.slot.GatewaySlotChainBuilder
* Sentinel 1.7.2开始不需要SPI配置
## Sentinel-dashboard
* 修改sentinel控制台,将配置规则推送到nacos,使规则持久化
* 修改代码 (基于sentinel控制台 1.8.3)
* GatewayApiController API管理持久化
* GatewayFlowRuleController 流控规则持久化
* DegradeController 降级规则持久化
* FlowControllerV2 集群流控规程持久化
* 新增类型 (基于sentinel控制台 1.8.3)
* com.alibaba.csp.sentinel.dashboard.config.NacosConfig
* com.alibaba.csp.sentinel.dashboard.rule.GatewayDegradeRuleNacosProvider
* com.alibaba.csp.sentinel.dashboard.rule.GatewayDegradeRuleNacosPublisher
* com.alibaba.csp.sentinel.dashboard.rule.GatewayFlowRuleNacosProvider
* com.alibaba.csp.sentinel.dashboard.rule.GatewayFlowRuleNacosPublisher
* com.alibaba.csp.sentinel.dashboard.rule.GatewayApiRuleNacosProvider
* com.alibaba.csp.sentinel.dashboard.rule.GatewayApiRuleNacosPublisher
* com.alibaba.csp.sentinel.dashboard.rule.ClusterAssignRuleNacosPublisher
* com.alibaba.csp.sentinel.dashboard.rule.ClusterServerNamespaceSetNacosProvider
* com.alibaba.csp.sentinel.dashboard.rule.ClusterServerNamespaceSetNacosPublisher
* com.alibaba.csp.sentinel.dashboard.rule.FlowRuleNacosProvider
* com.alibaba.csp.sentinel.dashboard.rule.FlowRuleNacosPublisher
* com.alibaba.csp.sentinel.dashboard.rule.NacosConfigUtil
* 容器部署:
* 使用容器部署,没有将规则持久化
* docker run --name sentinel -d -p 8858:8858 -p 8719:8719 -d dreamkaylee/sentinel-dashboard:1.8.6
## Sentinel 集群流控服务
* 应用名:service-sentinel-server
* 独立模式,采用独立应用部署
* 嵌入模式,嵌入Web应用,可以启动多个实例分别作为 Token Server 和 Token Client。本Demo采用嵌入模式开发,独立模式部署运行,不嵌入到其他应用服务里
## SEATA
* Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。
* server端配置
* file.conf配置存储模式
* registry.conf配置注册类型
* client端配置
* nacos新建配置,dataId为seataServer.properties,
* 配置内容参考:https://github.com/seata/seata/tree/develop/script/config-center 的config.txt
* 参数说明:https://seata.io/zh-cn/docs/user/configurations.html
## RocketMQ 服务启动
* 官网:http://rocketmq.apache.org/docs/quick-start/
* 容器部署
* 单机部署
* 在config/docker-compose/rocketmq/standalone目录下执行命令:
* 如果在windows执行docker-compose,必须修改broker.conf配置文件里的brokerIP1为vEthernet (WSL)网卡的ip。因为应用从nameServer获取broker的ip,然后根据ip连接broker。如果不配置WSL网卡ip,则使用容器的ip,是无法通过宿主机连接到容器的broker
* 执行docker-compose up
## RabbitMQ
* 容器部署
* docker run -d --name rabbitmq -p 15672:15672 -p 5672:5672 rabbitmq:3.11.11-management
* 插件安装,通过该地址 https://www.rabbitmq.com/community-plugins.html 可以了解RabbitMQ官方的插件。如果在docker镜像集成插件,修改/config/dockerfile/rabbitmq目录下的dockerfile文件,下载的插件和dockerfile文件必须在同一目录下
* 构建镜像命令:docker build -t rabbitmq:3.11.11-management-plus .
* 运行:docker run -d --name rabbitmq -p 15672:15672 -p 5672:5672 rabbitmq:3.11.11-management-plus
* 限制RabbitMQ内存大小:docker run -d --memory 256m --memory-swap 256m --name rabbitmq -p 15672:15672 -p 5672:5672 rabbitmq:3.11.11-management
* 查看容器内存使用率:docker stats
* 集群部署
* 在config/docker-compose/rabbitmq/cluster目录下执行命令:
* 部署:docker-compose up
* 必须在linux环境执行上面的命令,windows环境无法把文件copy到容器内
* 策略设置
* 镜像队列策略:rabbitmqctl set_policy -p "/" mirror_mode "^mirror" '{"ha-mode":"all","ha-sync-mode":"automatic"}' (队列名必须以mirror开头才能开启镜像队列)
## Kubernetes
### minikube
* Minikube是由Kubernetes社区维护的单机版的Kubernetes集群,支持Kubernetes的大部分功能,从基础的
容器编排管理,到高级特性如负载均衡、Ingress,权限控制。适合作为Kubernetes入门,或开发测试环境使用
* Minikube官方网站:https://minikube.sigs.k8s.io/docs/start/
* k8s概念介绍:
* Pod:是所有业务类型的基础,也是K8S管理的最小单位级,它是一个或多个容器的组合。所有容器都被同一安排和调度。
* Service:是一种抽象,它定义了一组Pods的逻辑集合和一个用于访问它们的策略,有的时候被称之为微服务。Service的目标Pod集合通常是由Label Selector来决定的
* Ingress:是对集群中服务(Service)的外部访问进行管理的API对象,典型的访问方式是 HTTP和HTTPS。同时可以提供负载均衡、SSL 和基于名称的虚拟托管
* ConfigMap:是用于保存配置数据的键值对,可以用来保存单个属性,也可以保存配置文件
* Secret:为Pod提供密码、Token、私钥等敏感数据
* Service Account:是指由Kubernetes API管理的账号,用于为Pod之中的服务进程在访问Kubernetes API时提供身份标识,通常要绑定于特定的命名空间,并且附带着一组存储为Secret的用于访问API Server的凭据。
* Role:是一组权限的集合,例如Role可以包含列出Pod权限及列出Deployment权限,Role用于给某个NameSpace中的资源进行鉴权。
* RoleBinding:在同一命名空间内将Service Account与Role绑定一起
* Minikube设置
* Minikube使用版本是v1.25.2 (1.26.0在windows 11执行minikube start会创建集群失败)
* Minikube部署Istio时,minikube start时必须至少分配6G内存(基于windows 10部署),否则minikube的api server会突然stop
* kubectl命令:安装完Minikube是没有kubectl,要执行minikube kubectl -- get po -A命令才会下载kubectl。就散下载完毕,在命令窗口也无法执行。
官方文档介绍执行该命令function kubectl { minikube kubectl -- $args }后可以执行kubectl,但是有个缺点,只要电脑重启,kubectl又执行不了。又要执行function的命令。
一劳永逸的方法是将kubectl加入系统path的环境变量里,kubectl存放的位置在C:\Users\当前用户名\.minikube\cache\windows\amd64\kubectl的版本
* Minikube dashboard启动失败处理
* dashboard镜像是从国外下载,下载速度很慢或被墙了。要进行特殊处理,处理方法如下:
* 命令:kubectl get pods -A。查看镜像状态,状态列出现ImagePullBackOff或者ErrImagePull,说明镜像下载失败
* 命令:kubectl describe pod dashboard-metrics-scraper-5d59dccf9b-2k4sh(镜像名称) -n kubernetes-dashboard。查看失败具体原因。出现Failed to pull image,大概率被墙了。
* 命令:minikube ssh。进入minikube容器,通过其他镜像源下载镜像。
* 命令:docker pull registry.cn-hangzhou.aliyuncs.com(镜像源,不用带上http)/google_containers/metrics-scraper:v1.0.8。通过docker pull临时指定镜像源下载dashboard相关镜像
* 命令:docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-scraper:v1.0.8 metrics-scraper:v1.0.8 docker.io/kubernetesui/metrics-scraper:v1.0.8。修改镜像名称
* 重新执行命令:minikube dashboard。如果发现还是不能运行,则继续进行下列操作
* 将镜像名称中的 @sha256 摘要替换为纯标签格式(问题在这)
* 命令:kubectl edit deployment dashboard-metrics-scraper -n kubernetes-dashboard。镜像名有@sha256后缀删除。同理其他拉取失败镜像也是这样处理
* 处理方法:https://blog.csdn.net/frankpath/article/details/146046149
* minikube addons enable ingress 插件启动失败处理
* ingress使用阿里云镜像也无法下载。要进行特殊处理,处理方法如下:
* 命令:kubectl get pods -A。查看镜像状态,状态列出现ImagePullBackOff或者ErrImagePull,说明镜像下载失败
* 命令:kubectl describe pod ingress-nginx-controller-xxxx(pod名称) -n ingress-nginx。查看失败具体原因。出现Failed to pull image,大概率被墙了。
* 命令:minikube ssh。进入minikube容器,通过其他镜像源下载镜像。
* 命令:docker pull docker.1ms.run/k8sgcrioingressnginx/kube-webhook-certgen:v1.4.4。下载kube-webhook-certgen镜像
* 命令:docker pull docker.1ms.run/bitnami/nginx-ingress-controller:1.11.3。下载nginx-ingress-controller镜像
* 命令:docker tag docker.1ms.run/k8sgcrioingressnginx/kube-webhook-certgen:v1.4.4 registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.4.4。修改镜像名称
* 命令:docker tag docker.1ms.run/bitnami/nginx-ingress-controller:1.11.3 registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.11.3。修改镜像名称
* 重新执行命令:minikube addons enable ingress。如果发现还是不能运行,则继续进行下列操作
* 将镜像名称中的 @sha256 摘要替换为纯标签格式(问题在这)
* 命令:kubectl edit deployment ingress-nginx-admission-create-bxqmh(pod名称) -n ingress-nginx。镜像名有@sha256后缀删除。同理其他ingress pod拉取失败镜像也是这样处理
* 运行成功后,在dashboard中查看ingress-nginx命名空间下的Deployment的ingress-nginx-controller,删除镜像中的@sha256摘要
* Minikube常用命令
```
// 启动minikube
// 使用hyper-v驱动程序,使用docker-desktop驱动会有部分功能不支持
// 可能被墙了,无法更新资源。使用国内镜像,国内镜像是阿里云提供。
minikube start --driver=hyperv --image-mirror-country='cn' --kubernetes-version=v1.23.8
// 配置ingress(默认是Nginx)
minikube addons list
minikube addons enable ingress
// 查看配置信息(例如:Pod,Service,Ingress)
minikube kubectl -- explain
```
### Istio
* Istio一个完全开源的服务网格,作为透明的一层接入到现有的分布式应用程序里。它也是一个平台,拥有可以集成任何日志、遥测和策略系统的 API 接口。
Istio负载均衡、服务间的身份验证、监控等方法,Istio 可以轻松地创建一个已经部署了服务的网络,而服务的代码只需很少更改甚至无需更改。通过在整个
环境中部署一个特殊的 sidecar 代理为服务添加 Istio 的支持,而代理会拦截微服务之间的所有网络通信,使用其控制平面的功能来配置和管理 Istio。
官网:https://istio.io/latest/zh/docs/
* Istio部署(基于Minikube):
* 使用Istio版本:1.14.1
* 将Istio的bin目录下的istioctl客户端添加到环境变量
* 安装Istio: istioctl install --set profile=demo -y
* 给命名空间添加标签,指示 Istio 在部署应用的时候,自动注入 Envoy 边车代理:kubectl label namespace default istio-injection=enabled
* 调整 sidecar 注入顺序。不调整顺序,业务启动时需要调用其它服务(比如从配置中心拉取配置)就会出现调用失败,调用失败的原因是 envoy 还没
就绪(envoy也需要从控制面拉取配置,需要一点时间),导致业务发出的流量无法被处理
* 修改 istio 的 configmap 全局配置:
```
kubectl -n istio-system edit cm istio
```
* 在 defaultConfig 下加入 holdApplicationUntilProxyStarts: true
```
apiVersion: v1
data:
mesh: |-
defaultConfig:
holdApplicationUntilProxyStarts: true
meshNetworks: 'networks: {}'
kind: ConfigMap
```
* 安装 Kiali 和其他插件:
```
kubectl apply -f samples/addons
kubectl rollout status deployment/kiali -n istio-system
```
* 访问 Kiali 仪表板:istioctl dashboard kiali
* Istio Bookinfo示例部署
* 部署 Bookinfo 示例应用:kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
* 部署 Istio 入站网关,提供对外开放应用程序:kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
* 判断Kubernetes集群环境是否支持外部负载均衡:kubectl get svc istio-ingressgateway -n istio-system。如果 EXTERNAL-IP 的值
为 (或者一直是 状态), 则你的环境则没有提供可作为入站流量网关的外部负载均衡。在这个情况下,只能用服务(Service)的
节点端口访问网关。
* 获取Ingress端口(在windows必须使用git bash执行命令):
kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}
* 获取Ingress host命令:minikube ip
* 验证外部访问:http://ingress_host:ingress_port/productpage
* 安装 Kiali 和其他插件:
```
kubectl apply -f samples/addons
kubectl rollout status deployment/kiali -n istio-system
```
* 访问 Kiali 仪表板:istioctl dashboard kiali
* 基于用户身份的路由:kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml
* 删除路由规则,并销毁应用的 Pod
* samples/bookinfo/platform/kube/cleanup.sh (在windows必须使用git bash执行命令)
* Istio与SpringCloud对比
| 对比项 | Istio | SpringCloud |
|-------|---------------|----------------------------------------------------------------|
| 灰度上线 | 配置路由规则和虚拟服务实现 | 修改代码实现(spring-cloud-starter-loadbalancer > 3.0.2和nacos) |
| 负载均衡 | 配置路由规则和虚拟服务实现 | 引入spring-cloud-starter-loadbalancer SDK(使用默认负载均衡算法),其他算法需要代码实现 |
| 安全策略 | Istio认证和授权 | 使用Spring Security实现认证,鉴权 |
| 限流熔断 | 配置路由规则和虚拟服务实现 | 使用Sentinel或Hystrix |
| 访问白名单 | JWT授权认证 | SpringCloud Gateway和Spring Security配合使用 |
| 微服务路由 | 配置路由规则和虚拟服务实现 | SpringCloud Gateway |
## MySQL
* 容器部署:https://hub.docker.com/_/mysql?tab=description
* 下载镜像:docker pull mysql:8.0.36
* 启动容器:docker run --name mysql --network customize-network -v F:\docker\volumes\mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql:8.0.36 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
## APISIX网关
* Apache APISIX 是一个动态、实时、高性能的云原生 API 网关,提供了负载均衡、动态上游、灰度发布、服务熔断、身份认证、可观测性等丰富的流量管理功能。
* 容器相关部署文档:/config/docker-compose/apisix
* apisix-java-plugin:apisix使用自定义java插件
* apisix-nacos:apisix整合nacos,使用服务发现功能对上游服务配置路由等功能
* apisix-skywalking: 整合skywalking,将请求日志和请求链接上传到skywalking
## uid 服务
* 应用名:service-uid
* 全局唯一ID生成服务,使用snowflake算法生成ID
* 实现通过不能命名空间实现ID隔离,不同命名空间可能产生同一个ID
* 压力测试方法:
* com.demo.uid.service.SnowFlakeServiceTest.testParallelNextId