1 Star 0 Fork 3

七號座先生 / spring-cloud-demo

forked from _85024610 / spring-cloud-demo 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

项目要求

  • 操作系统: windows 10或之后版本
    • 开启Hyper-V
    • 开启wsl2
    • 安装linux子系统
  • 安装 docker-desktop for windows(版本必须4.12)
    • 创建自定义docker网络:docker network create customize-network
    • docker-desktop已经包含docker-compose
  • 内存:推荐16G或以上(minikube和istio同时运行需要16G内存)

service-luna

  • 业务代码:http://localhost:8763/hi?name=forezp
  • 功能:
    • 使用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的默认值
    • druid监控,相关配置在com.demo.config.servlet,监控url:http://localhost:8763/druid/login.html 根据方法返回值将纯JSON格式字符串反序列化相应对象
    • Junit注解使用JunitAnnotaionTest.java
    • controller目录下功能
      • 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提供)
      • 数据权限
        • 在方法使用@DataAuth注解,设置数据权限的表和字段
        • 配置文件配置data.auth.headerKey从请求头获取鉴权的值。对应的类:com.demo.function.dataauth.config.DataAuthProperty
        • 通过mybatis拦截器在sql的where条件追加鉴权字段。拦截器实现类:com.demo.function.dataauth.interceptor.DataAuthInterceptor
      • orika类型转换配置
      • caffeine 使用
        • caffeine的Cache,LoadingCache,AsyncCache使用
      • excel
        • easyexcel
          • 新增通用读取excel工具类
      • filter
        • 防止SQL注入过滤器
        • 防止XSS攻击过滤器
      • utils 工具类
        • 生成树形结构集合
  • 注意:使用延迟初始化,只需要启动以下服务:
  • 可选启动服务:
  • 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
        }
      ]

service-job

  • 主要调度任务模块功能介绍
  • 功能:
    • xxl-job
    • ElasticJob-lite
      • 依赖zookeeper
      • 获取镜像并运行zookeeper:docker run --name zookeeper -p 2181:2181 -d zookeeper:3.8.0
    • 动态添加/删除定时任务

service-mq

  • 主要是mq功能模块功能介绍

service-rocketmq

  • 常规功能使用
  • 自定义时间延时队列,不受原来的18个延时Level限制
    • 设计思路:
      • 定义proxy-topic,将发送自定义时间的延时消息统一发送到proxy-topic
      • 将自定义时间计算不同对应18个延时Level
      • 消费者接收延时消息后减去已在延时队列里的时间,重新计算对应的延时Level,再次投入proxy-topic,直到延时时间等于0直接发送到实际的topic
    • 类:
      • DelayProducer 延时消息生产者
      • RocketMQConfig 处理延时消息消费者
  • 使用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

service-kafka

  • Kafka使用
    • 实现延时消息
      • 设计思路:
        • 定义proxy-topic,将发送自定义时间的延时消息统一发送到proxy-topic
        • 设置18个主题proxy-topic,定义每个主题对应不同延时Level
        • 将自定义时间计算不同对应18个延时Level,然后将消息投入到指定主题
        • 通过时间轮获取主题消息是否到达发送时间
        • 消费者接收消息后计算消息发送时间 + 延迟时间是否大于当前时间。
          • 大于等于当前时间,立即投递消息到指定topic
          • 小于当前时间,不消费消息,等待下一次消费
      • 类:
        • KafkaDelayProducer 延时消息生产者
        • KafkaConsumeDelayMsgConfig 处理延迟消息配置类
        • KafkaDelayMsgProcessor 延迟消息处理类
        • KafkaTimerTaskProcessor 延迟消息定时任务处理类

service-miya

  • 提供接口给service-luna服务调用

service-k8s

  • 使用k8s服务发现功能,configmap作为配置中心
  • 通过openFeign调用其他服务
  • 通过Istio实现流量控制
  • 通过Istio实现jwt授权认证、跨域请求认证失败返回access-control-allow-origin(Istio 1.14之后版本支持)
    • 类:
      • com.demo.k8s.controller.OauthController
    • 配置s文件:
      • /k8s_config/service-k8s-istio-jwt.yaml
  • 通过Istio实现重写url再转发
  • 注意:

service-k8s-provider

  • 提供接口给service-k8s服务调用
  • 注意:
    • 项目通过maven package生成jar包后自动脚本(build镜像,重启pod等等)。如果在windows下使用idea执行maven package命令,必须使用管理员运行idea

service-k8s-gateway

  • 整合k8s服务注册和服务发现功能,提供转发功能(依赖service-k8s
  • 整合k8s + istio,提供转发时并且使用istio做流量控制,根据规则转发到不同版本的服务(依赖service-k8s-provider
  • 注意:
    • 项目通过maven package生成jar包后自动脚本(build镜像,重启pod等等)。如果在windows下使用idea执行maven package命令,必须使用管理员运行idea

service-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
    • 灰度负载均衡器,实现全链路灰度调用
      • 类:
        • com.example.servicegateway.config.GrayLoadBalancerConfig (自定义)
        • com.example.servicegateway.config.SpringHintLoadBalancerConfiguration (Spring Loadbalancer提供)
    • 接入oauth2,实现资源管理服务,请求经过网关的接口进行权限校验
      • 类:
        • com.example.servicegateway.authentication.ResourceServerConfig 资源管理服务器配置,配置白名单放行、无权访问和无效token的自定义异常响应
        • com.example.servicegateway.authentication.ResourceServerManager 资源管理鉴权,根据资源管理服务器的配置做鉴权和自定义鉴权业务逻辑
      • 测试文件:
        • com.example.servicegateway目录下

service-auth

  • 使用spring-security-oauth做认证服务。目前支持使用密码和授权码认证授权。
  • 生成jks文件
    • 进入\Java\jdk-11.0.12\bin目录
    • 执行命令:keytool -genkey -alias ffzs-jwt -keyalg RSA -keysize 2048 -keystore ffzs-jwt.jks -validity 3650 -keypass 123456 -storepass 123456
      • keytool参数:
        • -alias:密钥的别名
        • -keyalg:使用的 RSA 算法
        • -keypass:密钥的访问密码
        • -keystore:密钥库文件名,ffzs-jwt.jks保存了生成的证书
        • -storepass:密钥库的访问密码
  • 导出公钥
  • 通过代码生成公钥
    • 提供生成公钥接口,网关第一次解析token时,获取调用接口获取JWT验签公钥。类:com.demo.auth.controller.KeyPairController.getKey
  • 授权模式
    • 密码授权
      • 类:com.demo.auth.controller.UsernamePasswordController
    • 授权码授权
      • 类:com.demo.auth.controller.AuthorizationCodeController

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-es

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目录下。注意:必须在linux环境下执行

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
      • 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协议

  • 参考文档:

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
      <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
          <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
              <pattern>
                  %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %tid - %msg%n
              </pattern>
          </layout>
      </appender>
    • 日志上报skywalking配置(skywalking grpc 日志收集 8.4.0版本开始支持)
      <appender name="skywalking-grpc-log" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">
          <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
              <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout">
                  <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%tid] [%thread] %-5level %logger{36} -%msg%n</Pattern>
              </layout>
          </encoder>
      </appender>
    • 日志插件配置,详细配置参考文档: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
    • 告警文档:
  • 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是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展

nacos

  • 服务注册中心和配置中心使用nacos
  • 官网:https://nacos.io/zh-cn/index.html
  • 容器部署:https://hub.docker.com/r/nacos/nacos-server
    • 版本:1.4.2
      • 下载镜像:docker pull nacos/nacos-server:1.4.2
      • 启动容器:docker run --name nacos -e MODE=standalone -p 8848:8848 -d nacos/nacos-server:1.4.2
    • 版本:2.2.3
      • 下载镜像:docker pull nacos/nacos-server:v2.2.3
      • 启动容器:docker run --name nacos -e MODE=standalone -p 8848:8848 -p 9848:9848 -d nacos/nacos-server:v2.2.3
  • 集群部署
    • 在config/docker-compose/nacos目录下执行命令:
      • 部署:docker-compose -p nacos-cluster -f nacos-cluster.yml up
      • 如果是第一次部署,mysql启动完执行目录下的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 提供一个轻量级的开源控制台,它提供机器发现以及健康情况管理、监控(单机和集群),规则管理和推送的功能
  • 网关限流介绍
  • 启动命令: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

RocketMQ 服务启动

RocketMQ 控制台

docker run -d --name rocketmq-dashboard --link rocketmq -e "JAVA_OPTS=-Drocketmq.namesrv.addr=docker虚拟网卡ip:9876" -p 8080:8080 -t apacherocketmq/rocketmq-dashboard:latest

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开头才能开启镜像队列)

flowable-ui

  • Flowable是用Java编写的轻量级业务流程引擎。Flowable流程引擎允许您部署BPMN 2.0流程定义(用于定义流程的行业XML标准),创建 流程定义的流程实例,运行查询,访问活动或历史流程实例以及相关数据等等。本节将逐步介绍各种概念和API,通过您可以在自己的开发 机器上进行的实例进行实现。
  • flowable-ui部署:
    • 下载镜像:docker pull flowable/flowable-ui:6.7.2
    • 将MySQL jar包放在Dockerfile同一目录下(Dockerfile了已经放在spring-cloud-deoo/flowable-ui目录下)
    • 修改Dockerfile数据库连接
    • 创建镜像,在Dockerfile目录下执行命令: docker build --tag flowable-ui .
    • 执行动动命令:docker run --name flowable-ui -p 8080:8080 -t flowable-ui:latest
  • flowable-ui使用:

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常用命令
// 启动minikube
// 使用kubernetes-version=1.25版本会出现异常Unable to restart cluster, will reset it: apiserver healthz: apiserver process never appeared
// 可能被墙了,无法更新资源
minikube start --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

uid 服务

  • 应用名:service-uid
  • 全局唯一ID生成服务,使用snowflake算法生成ID
  • 实现通过不能命名空间实现ID隔离,不同命名空间可能产生同一个ID
  • 压力测试方法:
    • com.demo.uid.service.SnowFlakeServiceTest.testParallelNextId

空文件

简介

暂无描述 展开 收起
Java
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
Java
1
https://gitee.com/zouzhigang96/spring-cloud-demo.git
git@gitee.com:zouzhigang96/spring-cloud-demo.git
zouzhigang96
spring-cloud-demo
spring-cloud-demo
master

搜索帮助