Nacos
Nacos就是替代 注册中心【Eureka】 和 配置中心【Config】
支持AP和CP,可以切换
了解即可
下载和运行
下载版本(找自己想要的版本):Tags · alibaba/nacos · GitHub
本地有良好的 Java8 + Maven环境
解压安装包,直接运行
bin
目录下的startup.cmd
命令运行成功后直接访问:
http://localhost:8848/nacos
默认用户名/密码为nacos
创建服务提供方
新建模块,端口使用10004
父项目引入依赖
本项目引入依赖,把自己注册到Nacos
application.yml
主启动类
再新建一个模块,端口使用10006,变成集群
创建服务消费方
新建模块,端口使用80
引入依赖,把自己注册到Nacos
yml
配置类
nacos集成了ribbon,支持负载均衡
自己配置负载均衡算法
主启动类
Controller
配置中心实例
每个微服务模块可以拉取配置中心的配置,统一使用、更改
在Nacos Server加入配置
进入Nacos Server,加入配置(文件后缀必须是.yaml)
创建Nacos配置客户端模块
新建模块,端口使用50000
引入依赖
springboot中配置文件的加载是存在优先顺序的,bootstrap优先级高于application
application.yml
bootstrap.yml
服务注册中心和配置中心可能不是同一个,目前是本机,所以是相同的地址
- nacos 配置客户端/当前的微服务模块, 会根据配置,找到配置中心的数据(配置文件)
- config.server-addr: localhost:8848 可以找到配置中心
- spring.application.name 对应DataId: e-commerce-nacos-config-client 拼接
- 在application.yml: 配置 spring.profiles.active: dev,拼接
- spring.cloud.nacos.config.file-extension 配置文件的扩展名:yaml,拼接
- 小结: 根据配置 就是 到 localhost:8848 下的 e-commerce-nacos-config-dev.yaml获取配置信息/数据
- 规则就是: ${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}来定位配置中心的 Data ID
主启动类
Controller
1. client 会拉取nacos server 的 e-commerce-nacos-config-client-dev.yaml 数据
2. @Value("${config.ip}") 会将 config.ip 赋给 configIp
3. 这里${config.ip} 不能乱写,要有依据,否则项目启动不了
Nacos分类配置(实现配置隔离)
DataID方案
只需要把配置中心模块的application.yml的active修改成test就能读取数据
Group方案
Namespace方案
以开发dev环境为例
先找namespace,再找group,再根据DataID规则进行查找
总结
Sentinel
分布式系统的流量防卫兵,保护你的微服务
Sentinel以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
绿色方框就是Sentinel可以完成的功能
控制台
下载控制台 jar 包并在本地启动 下载地址:https://github.com/alibaba/Sentinel/releases
以sentinel‐dashboard‐1.8.0.jar为例
#启动控制台命令
java ‐jar sentinel‐dashboard‐1.8.0.jar
访问 http://localhost:8080/#/login,默认用户名密码: sentinel/sentinel
默认端口是8080,可以修改端口
监控微服务
在10004模块引入依赖
修改yml
关于transport.port
1、端口配置会在被监控的微服务对应主机上启动 Http Server
2、该 Http Server 会与 Sentinel 控制台交互
3、比如sentinel控制台添加了一个限流规则,会把规则数据push给这个Http Server接收,Http Server再将这个规则注册到Sentinel中
简单地讲:transport.port指定被监控的微服务应用于sentinel控制台交互的端口默认端口是8719,如果被占用了,会依次+1扫描,直到找到一个没有被占用的
细节
流量控制
规则
流量控制实例-QPS
在流控规则菜单,可以看到新增的流控规则
注意
返回什么,在sentinel的资源名就会显示什么,执行完clean才会执行controller真正的方法
流量控制实例-线程数
一个请求对应一个线程
请求之后才会有簇点链路
上一个线程比如0.01s完成,所以销毁了,不会出现限流效果
流量控制实例-关联
当关联的资源达到阈值时,限制自己
使用postman进行测试,在/t2没有结束的时候去访问/t1才能看到异常
流量控制实例-Warm up
coldFactor:冷加载因子
为/t2增加规则
流量控制实例-排队
熔断降级
熔断策略
慢调用比例
异常比例
异常数
熔断降级实例-慢调用比例
熔断降级实例-异常比例
postman测试
熔断降级实例-异常数
热点规则
热点参数限流,对接口中的某一个参数限流
1.@SentinelResource : 指定sentinel限流资源
2.value = "news" 表示sentinel限流资源 名称,由程序员指定
3. blockHandler = "newsBlockHandler": 当出现限流时,由newsBlockHandler方法进行处理
独立设置热点 id=10 的 QPS 阈值 ( 即添加例外 )在热点参数限流规则,点击编辑访问localhsot:10004/news?id=100&type=教育,现在就是个例外
注意
系统规则
在系统稳定的前提下,保持系统的吞吐量
入口QPS
簇点链路出现,才能新增系统规则,也就是要先请求资源
@SentinelResource
自定义全局限流处理类
在handler包下创建处理类
Controller层
fallback
三种情况:1、正常访问 2、限流 3、异常,现在把2和3都交给fallback处理
也可以再加上限流规则
exceptionsToIgnore
希望某个异常用系统默认的方式执行
接入Sentinel的方式
代码方式
硬编码,侵入性强,不推荐
注解方式
侵入性低,前面用过,推荐
@SentinelResource
注解支持 · alibaba/Sentinel Wiki
注解方式埋点不支持 private 方法。
可以把方法看成一个埋点,如果(Controller层的方法 或 限流处理类的方法)是private,@SentinelResource就不会起作用
OpenFeign+Sentinel对远程调用熔断降级
当前微服务基础环境
还没有使用Sentinel
服务消费者整合OpenFeign
引入依赖
Service层接口
1. 远程调用方式是 get
2. 远程调用的url 为 http://member-service-nacos-provider/member/get/{id}
3. member-service-nacos-provider是nacos注册中心服务名
4. openfeign会根据负载均衡算法来决定调用的是 10004/10006,默认是轮询算法
5. openfeign是通过接口方式调用服务
Controller层
主启动类
服务消费者整合Sentinel
引入依赖
yml
对远程调用熔断降级
OpenFeign默认超时时间是1秒,如果10004的对应的API让他休眠2s
出现异常,一定是Service层的接口方法出现问题,需要实现这个接口,并在接口加上fallback
yml
注意
规则持久化
持久化方案
Nacos Server配置中心-规则持久化实例
将规则全都放在Nacos中配置,然后consumer模块获取规则,再push到Sentinel
1、在 Nacos Server 配置中心增加 Sentinel 客户端/微服务模块 的流控规则
2、引入依赖、配置yml,根据dataId,push给Sentinel
注意
演示了流控规则
其他的规则rule-type:degrade,system,param-flow
规则种类-官方文档
Seata
安装和配置
Seata下载
1、修改conf\file.conf文件
2、创建seata数据库
3、创建表,sql脚本在\conf\db_store.sql
4、修改seata的\conf\registry.conf,配置注册中心nacos server
Seata分布式事务-应用实例
创建服务
- 仓储服务:对给定的商品扣除仓储数量。
- 订单服务:根据采购需求创建订单。
- 帐户服务:从用户帐户中扣除余额。
order_micro_service(对应order数据库)
account_micro_service(对应account数据库)
storage_micro_service(对应storage数据库)
为3个业务数据库创建回滚日志表undo_log
回滚日志表在Seata的conf\db_undo_log.sql
storage-micro-service-10010
参考10004模块
配置文件
引入依赖
application.yml
datasource指定对应的数据库名
file.cof
从seata的 \conf\file.conf 拷贝进行修改
registry.conf
从seata的 \conf\registry.conf 拷贝进行修改
配置类
常规配置 Mybatis 和 dao关联
DataSourceProxy 是引入的 io.seata.rm.datasource
主启动类
需要取消数据源的自动配置,而是使用seata 代理数据源, DataSourceProxy
account-micro-service-10012
参考10010
配置文件:
引入依赖,直接拷贝
application.yml,修改端口号,微服务名,数据库名
file.conf,registry.conf直接拷贝
配置类:
直接拷贝
主启动类
order-micro-service-10008
参考10010
配置文件:
引入依赖,直接拷贝
application.yml,修改端口号,微服务名,数据库名
file.conf,registry.conf直接拷贝
配置类:
直接拷贝
1. 我们的前端如果是以json格式来发送添加信息Order, 那么我们需要使用@RequestBody
才能将数据封装到对应的bean, 同时保证http的请求头的 content-type是对应
2. 如果前端是以表单形式提交了,则不需要使用@RequestBody, 才会进行对象参数封装, 同时保证http的请求头的content-type是对应
主启动类
报错解决
模拟超时异常
控制save方法
1. @GlobalTransactional : 分布式全局事务控制 io.seata.spring.annotation包
2. name = "hspedu-save-order" 名称,程序员自己指定,保证唯一即可
3. rollbackFor = Exception.class 指定发送什么异常就回滚, 这里我们指定的是Exception.class,即只要发生了异常就回滚
Seata工作机制
TM就是事务的发起者(在save方法标注@GlobalTransactional),注册到TC