springcloud 课程学习笔记 3
1. Nacos
- 注册发现中心
- 支持ap/cp切换
Nacos安装
- 安装 官网下载安装包解压即可 修改startup.sh中start mode = standalone启动
- 测试:访问 http://localhost:8848/nacos/ 账号密码nacos 登陆成功即可
创建服务提供者
- 建模 cloudalibaba-provider-payment9001/9002
- 导包 spring-cloud-starter-alibaba-nacos-discovery
- 改yml:注册到nacos 8848
- 写controller
创建消费者 cloudalibaba-consumer-nacos-order83
- 建模,改yml,写配置,加controller
- 注意:需要在配置类ApplicationContextConfig 加@LoadBalanced 否则报错;有可能使用FQ软件会报错!!
创建config模块
- 建模 cloudalibaba-config-nacos-client3377 可替代eureka springcloud-config/bus功能
- 配置yml和bootstrap两个配置文件;需手动增加bootstrap依赖
- 在nacos服务器后台上增加 nacos-config-client-dev.yaml
- 运行测试 访问 http://localhost:3377/config/info; 支持动态刷新配置文件
- 分类配置
- namespace区分部署环境,默认public,主要用来隔离不同开发环境,开发、测试、生产环境
- group;可以把不同微服务划分到一个组;默认组为DEFAULT_GROUP
- service: 一个service可以包含多个集群;默认cluster是default;cluster指定微服务的虚拟分区,如不同地方的机房
- 测试:通过修改application.yml中的开发环境配置,可实现下载对应的配置文件信息
- 可在配置服务器上定义多个命名空间、分组;两个yml文件中的文件名和路径组合要和服务器一起,否则启动时注入config.info报错
- 集群和持久化
- nacos自带继承的是derby嵌入式数据库,临时数据都存在此。集群配置服务器下,无法同步配置数据
- 切换到mysql数据库
- 找到nacos安装目录下config文件夹中nacos-sql.sql文件,执行此内脚本建立对应数据库表
- 找到同目录下application.properties文件,配置数据源,内置注释代码,自定义即可;
- 重启nacos服务,再登陆即可新增配置,并写入mysql
- 模拟生产环境,推荐使用linux
- 需要1各nginx虚拟ip和3各nacos注册中心、1个mysql
- 准备工作
- 数据库建表--> 和上面第2步相同
- nacos 安装,见上
- nginx安装 : brew安装 测试 http://localhost:8080/
- 配置
- nacos集群配置: 改写cluster.config 增加三份映射 192.168.27.177:3333/4444/5555
- 不能FQ;
- 减少启动文件中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注册不成功!!
- nacos集群配置: 改写cluster.config 增加三份映射 192.168.27.177:3333/4444/5555
- 准备工作
- 需要1各nginx虚拟ip和3各nacos注册中心、1个mysql
2. sentinel 熔断限流框架 -- 类似hystrix
- 安装控制台程序
- 从官网下载jar包
- java -jar xxx.jar 启动时保证8080端口不被占用
- 测试 :http://localhost:8080/#/login 因为要注册到nacos,所以此时切换为单机版,集群测试节点有闪退
- 建模 cloudalibaba-sentinel-service8401
- pom中增加sentinel相关包
- yml中要注册到nacos和sentinel
- 写限流测试controller
- 启动测试 访问8401接口,sentinel中即可监控和设置流控等;监控中需要提前访问一次接口刷新下才能显示
- sentinel流控、降级等功能
- 流控:见官网解释
- 降级:满足一定条件时熔断
- 热点限流 : 针对热点关键词限流
- 在controller中增加兜底方法
- 通过热点规则中的参数例外项来设置 热点词拥有额外大的访问量阀值
- 注意:此兜底方法只负责兜底配置中出现的异常条件;不负责兜底接口中的异常,即运行出错不管
- 系统自适应限流:对应用入口流量进行控制
- 按资源名称设置流控 资源名即是接口上方@SentinelResource中的value值
- @SentinelResource 可设置资源名称 和接口的自定义兜底方法;但不支持private方法
- 按访问地址设置流控: 资源名也可以是@GetMapping中的地址
- 自定义兜底方法逻辑类,解决兜底方法与业务代码耦合,代码膨胀的问题
- 自定义一个global处理兜底方法类CustomerBlockHandler
- 在controller中@SentinelResource中参数增加兜底类和对应兜底方法两个参数,即可实现跳转
- 三个核心api
- SphU 定义资源
- Tracer 定义统计
- ContextUtil 定义上下文
- 整合
- 建模
- cloudalibaba-provider-payment9003
- cloudalibaba-provider-payment9004
- cloudalibaba-consumer-nacos-order84
- 测试 http://localhost:84/consumer/fallback/1-3-4-5
- 与Ribbon整合
- @SentinelResource中增加参数fallback = "handlerFallback" ;对运行异常兜底
- @SentinelResource中增加参数blockHandler = "blockHandler" ;对sentinel配置违规异常兜底
- 两个都配,sentinel配置违规还是违规管
- exceptionsToIgnore:此设置的错误不再降级,直接报错,走error page
- 与feign整合,一般消费侧,此处为 cloudalibaba-consumer-nacos-order84
- 导feign依赖3个、改yml增加sentinel对feign支持、主启动开启feign客户端、
- 使用ribbon实现调用服务端 -- 通过RestTemplate调用
- 使用feign调用 -- 需要增加调用接口和 统一兜底方法类 PaymentFallbackService
- 与Ribbon整合
- 建模
- 持久化
- 基于cloudalibaba-sentinel-service8401改造
- 实现:访问8401后,sentinel就能监控,此时流控配置自动写入nacos;只要nacos配置不删除,就会一直保存,不受8401重启影响
- 步骤:
- 导包 sentinel-datasource-nacos
- yml中添加数据源 -- 写入nacos
- 在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 是否集群 - 测试: 当访问http://localhost:8401/ratelimit/byUrl 时,nacos中json串配置自动导入到sentinel,并生效
- 基于cloudalibaba-sentinel-service8401改造
3. Seata 解决分布式事务问题 --》 全局数据一致性问题
- 术语
- 全局唯一事务ID
- 三组件
- Transaction Coordinator: TC 协调全局事务的提交或回滚
- Transaction Manager: TM 控制全局事务的边界,负责开启全局事务,并最终发起全局事务的提交或回滚的决议
- Resource Manager: RM 控制分支事务
- 使用@GlobalTransaction在业务方法上 @Transaction 是本地的
- 安装
- 官网下载seata,解压
- 修改conf目录下file.conf: service / store模块
- 自定义事务组名称 新版没找到
- 日志存储模式 db
- 数据库连接信息 修改用户名和密码,库名称为seata; 注意mysql的driver是 .cj.
- 创建数据库seata
- 修改registry.conf 改为绑定nacos;确认端口地址和用户名、密码
- 案例结构:
- 3个服务组成事务 order -> storage -> account -> order
- 下订单 -- 减库存 -- 扣款 -- 订单成功
- 建模 seata-order-service2001;导包
- yml + 2个conf
- domain + dao + mapper sql语句和数据库字段映射
- service
- 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
- 在调用开始的地方开启全局事务
浙公网安备 33010602011771号