springcloud 课程学习笔记 3

1. Nacos

  • 注册发现中心
  • 支持ap/cp切换

Nacos安装

  1. 安装 官网下载安装包解压即可 修改startup.sh中start mode = standalone启动
  2. 测试:访问 http://localhost:8848/nacos/ 账号密码nacos 登陆成功即可

创建服务提供者

  1. 建模 cloudalibaba-provider-payment9001/9002
  2. 导包 spring-cloud-starter-alibaba-nacos-discovery
  3. 改yml:注册到nacos 8848
  4. 写controller

创建消费者 cloudalibaba-consumer-nacos-order83

  1. 建模,改yml,写配置,加controller
  2. 注意:需要在配置类ApplicationContextConfig 加@LoadBalanced 否则报错;有可能使用FQ软件会报错!!

创建config模块

  1. 建模 cloudalibaba-config-nacos-client3377 可替代eureka springcloud-config/bus功能
    1. 配置yml和bootstrap两个配置文件;需手动增加bootstrap依赖
    2. 在nacos服务器后台上增加 nacos-config-client-dev.yaml
    3. 运行测试 访问 http://localhost:3377/config/info; 支持动态刷新配置文件
  2. 分类配置
    1. namespace区分部署环境,默认public,主要用来隔离不同开发环境,开发、测试、生产环境
    2. group;可以把不同微服务划分到一个组;默认组为DEFAULT_GROUP
    3. service: 一个service可以包含多个集群;默认cluster是default;cluster指定微服务的虚拟分区,如不同地方的机房
    4. 测试:通过修改application.yml中的开发环境配置,可实现下载对应的配置文件信息
      1. 可在配置服务器上定义多个命名空间、分组;两个yml文件中的文件名和路径组合要和服务器一起,否则启动时注入config.info报错
  3. 集群和持久化
    1. nacos自带继承的是derby嵌入式数据库,临时数据都存在此。集群配置服务器下,无法同步配置数据
    2. 切换到mysql数据库
      1. 找到nacos安装目录下config文件夹中nacos-sql.sql文件,执行此内脚本建立对应数据库表
      2. 找到同目录下application.properties文件,配置数据源,内置注释代码,自定义即可;
      3. 重启nacos服务,再登陆即可新增配置,并写入mysql
    3. 模拟生产环境,推荐使用linux
      • 需要1各nginx虚拟ip和3各nacos注册中心、1个mysql
        1. 准备工作
          • 数据库建表--> 和上面第2步相同
          • nacos 安装,见上
          • nginx安装 : brew安装 测试 http://localhost:8080/
        2. 配置
          • nacos集群配置: 改写cluster.config 增加三份映射 192.168.27.177:3333/4444/5555
            1. 不能FQ;
            2. 减少启动文件中java虚拟机的堆内存大小;sudo vim startup.sh /
              • heap size: -Xms128g -Xmx512g 在此设置下可同时启动三个
          • nginx集群配置
            • /usr/local/etc/nginx/nginx.conf 中增加3处更改,增加nacos节点: 注释为cluster for nacos
            • nginx测试 http://192.168.27.177:1111/nacos/#/login
            • 问题: nacos节点闪退 导致9002注册不成功!!

2. sentinel 熔断限流框架 -- 类似hystrix

  1. 安装控制台程序
    1. 从官网下载jar包
    2. java -jar xxx.jar 启动时保证8080端口不被占用
    3. 测试 :http://localhost:8080/#/login 因为要注册到nacos,所以此时切换为单机版,集群测试节点有闪退
  2. 建模 cloudalibaba-sentinel-service8401
    1. pom中增加sentinel相关包
    2. yml中要注册到nacos和sentinel
    3. 写限流测试controller
    4. 启动测试 访问8401接口,sentinel中即可监控和设置流控等;监控中需要提前访问一次接口刷新下才能显示
  3. sentinel流控、降级等功能
    1. 流控:见官网解释
    2. 降级:满足一定条件时熔断
    3. 热点限流 : 针对热点关键词限流
      1. 在controller中增加兜底方法
      2. 通过热点规则中的参数例外项来设置 热点词拥有额外大的访问量阀值
      3. 注意:此兜底方法只负责兜底配置中出现的异常条件;不负责兜底接口中的异常,即运行出错不管
    4. 系统自适应限流:对应用入口流量进行控制
    5. 按资源名称设置流控 资源名即是接口上方@SentinelResource中的value值
      1. @SentinelResource 可设置资源名称 和接口的自定义兜底方法;但不支持private方法
    6. 按访问地址设置流控: 资源名也可以是@GetMapping中的地址
    7. 自定义兜底方法逻辑类,解决兜底方法与业务代码耦合,代码膨胀的问题
      1. 自定义一个global处理兜底方法类CustomerBlockHandler
      2. 在controller中@SentinelResource中参数增加兜底类和对应兜底方法两个参数,即可实现跳转
    8. 三个核心api
      1. SphU 定义资源
      2. Tracer 定义统计
      3. ContextUtil 定义上下文
  4. 整合
    1. 建模
      1. cloudalibaba-provider-payment9003
      2. cloudalibaba-provider-payment9004
      3. cloudalibaba-consumer-nacos-order84
    2. 测试 http://localhost:84/consumer/fallback/1-3-4-5
      1. 与Ribbon整合
        1. @SentinelResource中增加参数fallback = "handlerFallback" ;对运行异常兜底
        2. @SentinelResource中增加参数blockHandler = "blockHandler" ;对sentinel配置违规异常兜底
        3. 两个都配,sentinel配置违规还是违规管
        4. exceptionsToIgnore:此设置的错误不再降级,直接报错,走error page
      2. 与feign整合,一般消费侧,此处为 cloudalibaba-consumer-nacos-order84
        1. 导feign依赖3个、改yml增加sentinel对feign支持、主启动开启feign客户端、
        2. 使用ribbon实现调用服务端 -- 通过RestTemplate调用
        3. 使用feign调用 -- 需要增加调用接口和 统一兜底方法类 PaymentFallbackService
  5. 持久化
    1. 基于cloudalibaba-sentinel-service8401改造
      1. 实现:访问8401后,sentinel就能监控,此时流控配置自动写入nacos;只要nacos配置不删除,就会一直保存,不受8401重启影响
      2. 步骤:
        1. 导包 sentinel-datasource-nacos
        2. yml中添加数据源 -- 写入nacos
        3. 在nacos web后台中添加dataID的json串
          "resource":"/rateLimit/byUrl", :资源名称
          "limitApp":"default", 来源应用
          "grade":1, 阀值类型:0 表线程数 1: 表QPS
          "count":1, 单机阀值
          "stragtegy":0, 流控模式 0 直接 1 关联 2 链路
          "controlBehavior":0, 流控效果 0 快速失效 2 warm up 3 排队等待
          "clusterMode":false 是否集群
        4. 测试: 当访问http://localhost:8401/ratelimit/byUrl 时,nacos中json串配置自动导入到sentinel,并生效

3. Seata 解决分布式事务问题 --》 全局数据一致性问题

  1. 术语
    1. 全局唯一事务ID
    2. 三组件
      1. Transaction Coordinator: TC 协调全局事务的提交或回滚
      2. Transaction Manager: TM 控制全局事务的边界,负责开启全局事务,并最终发起全局事务的提交或回滚的决议
      3. Resource Manager: RM 控制分支事务
    3. 使用@GlobalTransaction在业务方法上 @Transaction 是本地的
  2. 安装
    1. 官网下载seata,解压
    2. 修改conf目录下file.conf: service / store模块
      1. 自定义事务组名称 新版没找到
      2. 日志存储模式 db
      3. 数据库连接信息 修改用户名和密码,库名称为seata; 注意mysql的driver是 .cj.
    3. 创建数据库seata
    4. 修改registry.conf 改为绑定nacos;确认端口地址和用户名、密码
    5. 案例结构:
      1. 3个服务组成事务 order -> storage -> account -> order
      2. 下订单 -- 减库存 -- 扣款 -- 订单成功
      3. 建模 seata-order-service2001;导包
      4. yml + 2个conf
      5. domain + dao + mapper sql语句和数据库字段映射
      6. service
      7. config

模块说明

1.1 cloudalibaba-provider-payment9001/9002

  • yml:注册到nacos 8848端口

1.2 cloudalibaba-consumer-nacos-order83

  • yml: 注册到nacos 8848端口、指定要调用的服务端口
  • 通过RestTemplate远程调用,并带负载均衡

1.3 cloudalibaba-config-nacos-client3377

  • 指定配置中心地址
  • 通过bootstrap和application两个yml实现配置文件的定位
  • 涉及nacos配置持久化、集群配置、nginx配置

2.1 cloudalibaba-sentinel-service8401

  • 配置保存到nacos - 持久化改造
  • 自定义兜底方法

2.2 cloudalibaba-provider-payment9003/9004

  • 服务提供者

2.3 cloudalibaba-consumer-nacos-order84

  • 设置服务降级兜底方法
  • 通过openfeign、resttemplate调用服务
  • yml: 激活sentinel对feign支持

3.1 seata-order-service2001

  • 整合数据源druid和mybatis
  • 注册到nacos服务中心
  • openfeign远程调用
  • 配置到nacos
  • 在调用开始的地方开启全局事务

3.2 seata-account-service2003

3.3 seata-storage-service2003

posted @ 2022-02-21 16:49  蓝天可乐  阅读(72)  评论(0)    收藏  举报