第二代 Spring Cloud 核心组件
- Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
- Sentinel:把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
一 Nacos服务注册、配置中心
1.1 引入依赖
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--SCA -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
1.2 服务方依赖变更
- 如果存在eureka-client依赖,要剔除。增加nacos客户端依赖。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
1.3 服务方修改配置文件
Spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 #nacos server 地址
- 防控控制台:http://127.0.0.1:8848/nacos/index.html
- 保护阈值:多数不可用,达到保护阈值、全部提供给消费者、防止服务整体雪崩。
1.4 Nacos 数据模型(领域模型)
- Namespace + Group + Service :锁定服务
- Namespace + Group + DataId :锁定配置文件
1.5 微服务中开启 Nacos 配置管理
- 引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
-
通过 Namespace + Group + dataId 来锁定配置文件,Namespace不指定就默认public,Group不 指定就默认 DEFAULT_GROUP
-
dataid完整格式:
${prefix}-${spring.profile.active}.${file-extension}
- prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix 来配置。
- spring.profile.active 即为当前环境对应的 profile
- file-exetension 为配置内容的数据格式。
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848 #nacos server 地址
file-extension: yaml
# 加载多个dataId配置文件
ext-config[0]:
data-id: page1.yaml
refresh: true #开启扩展dataId的动态刷新
二 SCA Sentinel 分布式系统的流量防卫兵
-
jar包运行
-
引入依赖
<!--sentinel 核心环境 依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
- 暴露端点、删除原有的hystrix配置,删除 原有OpenFeign的降级配置
Spring:
#解决bean重复注册问题
main:
allow-bean-definition-overriding: true
cloud:
nacos:
sentinel:
transport:
dashboard: 127.0.0.1:8080
port: 8719
- 上述配置之后,启动静态化微服务,使用 Sentinel 监控静态化微服务
2.1 Sentinel 流量规则模块
-
资源名:默认请求路径
-
针对来源:Sentinel可以针对调用者进行限流,填写微服务名称,默认default(不区分来源)
-
阈值类型/单机阈值:
- QPS:(每秒钟请求数量)当调用该资源的QPS达到阈值时进行限流
- 线程数:当调用该资源的线程数达到阈值的时候进行限流。
-
是否集群:是否集群限流
-
流控模式:
-
直接:资源调用达到限流条件时,直接限流
-
关联:关联的资源调用达到阈值时候限流自己 (A调B,B快顶不住了,A限流)
-
链路:只记录指定链路上的流量(调用链:A–>B–C,D–>E–>C;指定从B来的计算流量)
-
-
流控效果:
-
快速失败:直接失败,抛出异常
-
Warm Up预热:根据冷加载因子(默认3)的值,从阈值/冷加载因子,经过预热时长,才达到设置的 QPS阈值 排队等待:匀速排队,让请求匀速通过,阈值类型必须设置为QPS,否则无效。
请求开启,10S内的阈值为3,10S后恢复到10(缓存)
-
流控效果之排队等待:很多流量过来了,并不是直接拒绝请求,而是请求进行排队,一个一个匀速通过(处理),请求能 等就等着被处理,不能等(等待时间>超时时间)就会被拒绝。
例如,QPS 配置为 5,则代表请求每 200 ms 才能通过一个,多出的请求将排队等待通过。超时时 间代表最大排队时间,超出最大排队时间的请求将会直接被拒绝。排队等待模式下,QPS 设置值不要超 过 1000(请求间隔 1 ms)。
-
2.2 Sentinel 降级规则模块
- Sentinel不会像Hystrix那样放过一个请求尝试自我修复,就是明明确确按照时间窗口来,熔断触发 后,时间窗口内拒绝请求,时间窗口后就恢复。
RT(平均响应时间 )
- 当 1s 内持续进入 >=5 个请求,平均响应时间超过阈值(以 ms 为单位),那么在接下的时间 窗口(以 s 为单位)之内,对这个方法的调用都会自动地熔断(抛出 DegradeException)。注意 Sentinel 默认统计的 RT 上限是 4900 ms,超出此阈值的都会算作 4900 ms,若需要变更此上限可 以通过启动配置项 -Dcsp.sentinel.statistic.max.rt=xxx 来配置。
异常比例:
- 当资源的每秒请求量 >= 5,并且每秒异常总数占通过量的比值超过阈值之后,资源进入降级状态, 即在接下的时间窗口(以 s 为单位)之内,对这个方法的调用都会自动地返回。异常比率的阈值范围是 [0.0, 1.0] ,代表 0% - 100%。
异常数:
- 当资源近 1 分钟的异常数目超过阈值之后会进行熔断。注意由于统计时间窗口是分钟级别的,若 timeWindow 小于 60s,则结束熔断状态后仍可能再进入熔断状态,时间窗口 >= 60s。
阈值范围是 [0.0, 1.0] ,代表 0% - 100%。
异常数:
- 当资源近 1 分钟的异常数目超过阈值之后会进行熔断。注意由于统计时间窗口是分钟级别的,若 timeWindow 小于 60s,则结束熔断状态后仍可能再进入熔断状态,时间窗口 >= 60s。