# 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获取服务实例数量再计算机器的分片值,根据分片获取指定重发数据再次重发消息 * 流程图:
![avatar](https://thumbsnap.com/i/7UmuuPAL.jpg) ### 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 * 流程图:
![avatar](https://thumbsnap.com/i/vU8TR6GX.png) * 灰度负载均衡器,实现全链路灰度调用 * 类: * 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