阿里限流神器Sentinel夺命连环 17 问?
共 22757字,需浏览 46分钟
·
2021-10-21 08:02
2、什么是sentinel?
丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Apache Dubbo、gRPC、Quarkus 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。同时 Sentinel 提供 Java/Go/C++ 等多语言的原生实现。 完善的 SPI 扩展机制:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。 控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。
3、sentinel和Hystrix有何区别?
4、sentinel版本如何选择?
spring-cloud-alibaba-dependencies
的版本是2.2.1.RELEASE
,因此sentinel版本选择1.7.1
,大家可以根据自己的版本选择对应sentinel的版本,版本对应关系如下图:注意:一定要按照官方推荐的版本适配,否则出现意想不到的BUG追悔莫及.........
5、Sentinel 控制台如何安装?
1.7.1
版本,下载的jar包如下图:当然你可以通过源码构建:mvn clean package
>=1.8
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.7.1.jar
-Dserver.port
:指定启动的端口,默认8080
-Dproject.name
:指定本服务的名称-Dcsp.sentinel.dashboard.server
:指定sentinel控制台的地址,用于将自己注册进入实现监控自己
默认的用户名和密码:sentinel/sentinel
sentinel-dashboard
被监控了,这个服务就是自己。注意:上述参数都是可选的,没必要可以不填。
java -Dsentinel.dashboard.auth.username=admin -Dsentinel.dashboard.auth.password=123 -jar sentinel-dashboard-1.7.1.jar
-Dsentinel.dashboard.auth.username=sentinel
用于指定控制台的登录用户名为sentinel
;-Dsentinel.dashboard.auth.password=123456
用于指定控制台的登录密码为123456
;如果省略这两个参数,默认用户和密码均为sentinel
;-Dserver.servlet.session.timeout=7200
用于指定 Spring Boot 服务端 session 的过期时间,如7200
表示 7200 秒;60m
表示 60 分钟,默认为 30 分钟;
注意:部署多台控制台时,session 默认不会在各实例之间共享,这一块需要自行改造。
6、微服务如何接入sentinel控制台?
1、新建微服务模块注册进入Nacos
server:
port: 9008
spring:
application:
## 指定服务名称,在nacos中的名字
name: sentinel-service
cloud:
nacos:
discovery:
# nacos的服务地址,nacos-server中IP地址:端口号
server-addr: 127.0.0.1:8848
management:
endpoints:
web:
exposure:
## yml文件中存在特殊字符,必须用单引号包含,否则启动报错
include: '*'
源码全部会上传,获取方式看文末!
2、添加依赖
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-sentinelartifactId>
dependency>
以上只贴出了sentinel相关依赖,nacos依赖不再贴了,见源码!
3、添加配置集成控制台
spring:
cloud:
sentinel:
transport:
## 指定控制台的地址,默认端口8080
dashboard: localhost:8080
4、新建一个测试接口
@RestController
@RequestMapping("/sentinel")
public class FlowLimitController {
@GetMapping("/test")
public String test(){
return "接收到一条消息--------";
}
}
5、启动微服务
http://localhost:9008/sentinel/test
,此时查看sentinel控制台,将会看见sentinel-service这个服务已经被监控了,如下图:spring:
sentinel:
# 取消控制台懒加载,项目启动即连接Sentinel
eager: true
7、流量控制如何配置?
QPS:每秒请求数,即在不断向服务器发送请求的情况下,服务器每秒能够处理的请求数量。
并发线程数:指的是施压机施加的同时请求的线程数量。
resource:资源名,即限流规则的作用对象。 count: 限流阈值 grade:限流阈值类型(1:QPS 0:并发线程数),默认值QPS limitApp:流控针对的调用来源,若为 default
则不区分调用来源,默认值defaultstrategy:判断的根据是资源自身**(0),还是根据其它关联资源 (1),还是根据链路入口(2)**,默认值根据资源本身。 controlBehavior: 流控效果(直接拒绝(0) / 排队等待(2) / 预热冷启动(1)),默认值直接拒绝。
com.alibaba.csp.sentinel.slots.block.flow.FlowRule
,各元素如下图:注意:各个元素的取值以及默认值一定要记住,后续配置将会用到。
1、三种流控效果
controlBehavior
,分别如下:快速失败
FlowException
。warm up
注意:这一效果只针对QPS流控,并发线程数流控不支持。
com.alibaba.csp.sentinel.slots.block.flow.controller.WarmUpController
。算法中有一个冷却因子 coldFactor
,默认值是3,即请求 QPS 从threshold(阈值) / 3
开始,经预热时长逐渐升至设定的 QPS 阈值。
具体算法原理请看:https://github.com/alibaba/Sentinel/wiki/%E9%99%90%E6%B5%81---%E5%86%B7%E5%90%AF%E5%8A%A8
排队等待
com.alibaba.csp.sentinel.slots.block.flow.controller.RateLimiterController
注意:这一效果只针对QPS流控,并发线程数流控不支持。
这种方式适合用于请求以突刺状来到,这个时候我们不希望一下子把所有的请求都通过,这样可能会把系统压垮;同时我们也期待系统以稳定的速度,逐步处理这些请求,以起到“削峰填谷”的效果,而不是拒绝所有请求。
具体算法原理请看:https://github.com/alibaba/Sentinel/wiki/%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6-%E5%8C%80%E9%80%9F%E6%8E%92%E9%98%9F%E6%A8%A1%E5%BC%8F
2、三种流控模式
strategy
,分别如下:直接拒绝:接口达到限流条件时,直接限流 关联:当关联的资源达到阈值时,就限流自己 链路:只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就可以限流)
直接拒绝
FlowException
。上面的几个例子都是配置了直接拒绝这个模式,这里不再详细介绍。关联
简而言之:A关联B,一旦B达到阈值,则A被限流
@RestController
@RequestMapping("/sentinel")
public class FlowLimitController {
/**
* 下单接口
* @return
*/
@GetMapping("/order")
public String order() {
return "下单成功..........";
}
/**
* 支付接口
* @return
*/
@GetMapping("/pay")
public String pay() {
return "支付成功..........";
}
}
/sentinel/pay
这个资源,但是真正被限流则是/sentinel/order
。/sentinel/pay
达到阈值,然后在请求/sentinel/order
。/sentinel/pay
发出请求,然后浏览器请求/sentinel/order
,结果如下图:3、两种统计类型
8、降级规则如何配置?
股票市场的熔断,当价格触发到了熔点之后,会暂停交易一段时间,或者交易可以继续进行,但是报价会限制在一定的范围。 电压过高导致保险丝触发熔断保护
服务提供者不可用(硬件故障、程序bug、网络故障、用户请求量较大) 重试导致的流量过大 服务调用者使用同步调用,产生大量的等待线程占用系统资源,一旦线程资源被耗尽,调用者提供的服务也会变成不可用状态
com.alibaba.csp.sentinel.slots.block.degrade.DegradeRule
。三种熔断策略
平均响应时间 ( DEGRADE_GRADE_RT
):当 1s 内持续进入 5 个请求,对应时刻的平均响应时间(秒级)均超过阈值(count
,以 ms 为单位),那么在接下的时间窗口(DegradeRule
中的timeWindow
,以 s 为单位)之内,对这个方法的调用都会自动地熔断(抛出DegradeException
)。注意 Sentinel 默认统计的 RT 上限是 4900 ms,超出此阈值的都会算作 4900 ms,若需要变更此上限可以通过启动配置项-Dcsp.sentinel.statistic.max.rt=xxx
来配置。异常比例 ( DEGRADE_GRADE_EXCEPTION_RATIO
):当资源的每秒请求量 >= 5,并且每秒异常总数占通过量的比值超过阈值(DegradeRule
中的count
)之后,资源进入降级状态,即在接下的时间窗口(DegradeRule
中的timeWindow
,以 s 为单位)之内,对这个方法的调用都会自动地返回。异常比率的阈值范围是[0.0, 1.0]
,代表 0% - 100%。异常数 ( DEGRADE_GRADE_EXCEPTION_COUNT
):当资源近 1 分钟的异常数目超过阈值之后会进行熔断。注意由于统计时间窗口是分钟级别的,若timeWindow
小于 60s,则结束熔断状态后仍可能再进入熔断状态。
@RestController
@RequestMapping("/sentinel/provider")
@Slf4j
public class FlowLimitController {
@GetMapping("/test")
public String test() throws InterruptedException {
//休眠3秒钟
Thread.sleep(3000);
log.info("收到一条消息----test");
return "接收到一条消息--------";
}
}
注意:这里熔断后直接返回默认的信息,后面会介绍如何定制熔断返回信息。
9、热点参数如何限流?
Top K
数据并对其进行限流。官方文档:https://github.com/alibaba/Sentinel/wiki/%E7%83%AD%E7%82%B9%E5%8F%82%E6%95%B0%E9%99%90%E6%B5%81
com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRule
这个类中,各种属性含义如下图:1、创建一个资源
@SentinelResource
这个注解定义一个资源,这个注解后续将会详细介绍,先忽略,代码如下:@Service
@Slf4j
public class FlowServiceImpl implements FlowService {
/**
* @SentinelResource的value属性指定了资源名,一定要唯一
* blockHandler属性指定了兜底方法
*/
@Override
@SentinelResource(value = "OrderQuery",blockHandler = "handlerQuery")
public String query(String p1, String p2) {
log.info("查询商品,p1:{},p2:{}",p1,p2);
return "查询商品:success";
}
/**
* 对应得兜底方法,一旦被限流将会调用这个方法来处理
*/
public String handlerQuery(@RequestParam(value = "p1",required = false) String p1,
@RequestParam(value = "p2",required = false)String p2,
BlockException exception){
log.info("查询商品,p1:{},p2:{}",p1,p2);
return "查询商品:熔断了......";
}
}
如果query这个接口没有被限流则返回:查询商品:success 如果query这个接口被限流了,则进入了兜底方法 handlerQuery
方法,返回:查询商品:熔断了......
2、创建controller接口
@RestController
@RequestMapping("/sentinel/provider")
@Slf4j
public class FlowLimitController {
@Autowired
private FlowService flowService;
@GetMapping("/order/query")
public String query(@RequestParam(value = "p1",required = false) String p1, @RequestParam(value = "p2",required = false)String p2){
return flowService.query(p1,p2);
}
}
p1
、p2
。3、添加热点参数限流规则
热点规则->新增热点限流规则
,添加如下图规则:OrderQuery
这个资源中的第0个参数QPS超过1秒1次将会被限流。这里参数索引是从0开始,第0个就是对应接口中的p1
这个参数。注意:对于热点参数限流,只有包含指定索引的参数请求才会被限流,否则不影响。
p1=100
这个请求QPS放宽到1秒请求100次以上才会被限流。以上源码在sentinel-openfeign-provider9009这个模块中,文末有源码获取方式。
10、系统自适应如何限流?
Load 自适应(仅对 Linux/Unix-like 机器生效):系统的 load1 作为启发指标,进行自适应系统保护。当系统 load1 超过设定的启发值,且系统当前的并发线程数超过估算的系统容量时才会触发系统保护(BBR 阶段)。系统容量由系统的 maxQps * minRt
估算得出。设定参考值一般是CPU cores * 2.5
。CPU usage(1.5.0+ 版本):当系统 CPU 使用率超过阈值即触发系统保护(取值范围 0.0-1.0),比较灵敏。 平均 RT:当单台机器上所有入口流量的平均 RT 达到阈值即触发系统保护,单位是毫秒。 并发线程数:当单台机器上所有入口流量的并发线程数达到阈值即触发系统保护。 入口 QPS:当单台机器上所有入口流量的 QPS 达到阈值即触发系统保护。
官方文档:https://github.com/alibaba/Sentinel/wiki/%E7%B3%BB%E7%BB%9F%E8%87%AA%E9%80%82%E5%BA%94%E9%99%90%E6%B5%81
11、如何自定义限流返回的异常信息?
Blocked by Sentinel (flow limiting)
,这个是Sentinel默认的异常信息。@SentinelResource
,这个在上文也是提到过,这个注解中有两个关于限流兜底方法的属性,如下:blockHandler: 对应处理 BlockException
的函数名称。blockHandler 函数访问范围需要是public
,返回类型需要与原方法相匹配,参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为BlockException
。blockHandler 函数默认需要和原方法在同一个类中。blockHandlerClass:指定 blockHandlerClass
为对应的类的Class
对象,注意对应的函数必需为static
函数,否则无法解析。
官方文档:https://github.com/alibaba/Sentinel/wiki/%E6%B3%A8%E8%A7%A3%E6%94%AF%E6%8C%81
@SentinelResource
注解自定义一个限流异常返回信息,先自定义一个资源,指定兜底方法为handler
,代码如下:QueryOrder
新增一个限流规则,如下图:@SentinelResource
提供一个属性blockHandlerClass
,完美的解决了这一个问题,能够将兜底方法单独放在一个类中,下面来介绍一下。CommonHandler
来放置兜底方法,代码如下:@SentinelResource
注解中指定blockHandlerClass为上面的类,blockHandler指定兜底方法名,代码如下:上述源码在sentinel-openfeign-provider9009这个模块中,源码获取方式见文末。
12、如何对异常进行降级处理?
@SentinelResource
注解,其中相关的几个属性如下:fallback:fallback 函数名称,可选项,用于在抛出异常的时候提供 fallback 处理逻辑。fallback 函数可以针对所有类型的异常(除了 exceptionsToIgnore
里面排除掉的异常类型)进行处理。fallback 函数签名和位置要求:返回值类型必须与原函数返回值类型一致; 方法参数列表需要和原函数一致,或者可以额外多一个 Throwable
类型的参数用于接收对应的异常。fallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 fallbackClass
为对应的类的Class
对象fallbackClass:指定对应的类的 Class
对象,注意对应的函数必需为 static 函数,否则无法解析。defaultFallback(since 1.6.0):默认的 fallback 函数名称,可选项,通常用于通用的 fallback 逻辑(即可以用于很多服务或方法)。默认 fallback 函数可以针对所有类型的异常(除了 exceptionsToIgnore
里面排除掉的异常类型)进行处理。若同时配置了 fallback 和 defaultFallback,则只有 fallback 会生效。defaultFallback 函数签名要求:返回值类型必须与原函数返回值类型一致; 方法参数列表需要为空,或者可以额外多一个 Throwable
类型的参数用于接收对应的异常。defaultFallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 fallbackClass
为对应的类的Class
对象,注意对应的函数必需为 static 函数,否则无法解析。exceptionsToIgnore(since 1.6.0):用于指定哪些异常被排除掉,不会计入异常统计中,也不会进入 fallback 逻辑中,而是会原样抛出。
defaultFallback
支持在类级别进行配置。注:1.6.0 之前的版本 fallback 函数只针对降级异常( DegradeException
)进行处理,不能针对业务异常进行处理。
官方文档:https://github.com/alibaba/Sentinel/wiki/%E6%B3%A8%E8%A7%A3%E6%94%AF%E6%8C%81
1/0
异常,代码如下:fallback
指定异常降级的兜底方法,此时业务方法改造如下:fallbackClass
属性指定单独一个类处理异常降级,降低了代码的耦合度,fallback
属性指定了降级兜底的方法,代码如下:defaultFallback
这个属性了,指定默认的降级兜底方法,此时的业务方法变成如下代码:defaultFallback
属性指定了默认的降级兜底方法,这个方法代码如下:结论:若 blockHandler 和 fallback 都进行了配置,则被限流降级而抛出 BlockException
时只会进入blockHandler
处理逻辑。若未配置blockHandler
、fallback
和defaultFallback
,则被限流降级时会将BlockException
直接抛出。
createOrder
这个业务接口改造一下,同时指定blockHandler和fallback,代码如下:createOrder
这个资源配置降级规则:60秒内如果出现2个以上的异常直接限流,如下图:fallback
指定的方法中(并未达到限流的异常数阈值),两次之后就被限流了,进入了blockHandler
方法中,效果如下图:上述源码在sentinel-openfeign-provider9009这个模块中,源码获取方式见文末。
13、sentinel的黑白名单如何设置?
com.alibaba.csp.sentinel.slots.block.authority.AuthorityRule
,几个属性如下:resource
:资源名,即限流规则的作用对象。limitApp
:对应的黑名单/白名单,不同 origin 用,
分隔,如appA,appB
。strategy
:限制模式,AUTHORITY_WHITE
为白名单模式,AUTHORITY_BLACK
为黑名单模式,默认为白名单模式。
官方文档:https://github.com/alibaba/Sentinel/wiki/%E9%BB%91%E7%99%BD%E5%90%8D%E5%8D%95%E6%8E%A7%E5%88%B6
RequestOriginParser
,我们可以实现这个接口根据自己业务的规则解析出请求来源名称。127.0.0.1
设置为黑名单,如下图:上述源码在sentinel-openfeign-provider9009这个模块中,源码获取方式见文末。
14、限流规则如何持久化?
Push
模式,下面陈某就Push模式介绍一下持久化限流规则。这里使用Nacos作为配置中心。1、添加依赖
<dependency>
<groupId>com.alibaba.cspgroupId>
<artifactId>sentinel-datasource-nacosartifactId>
dependency>
2、配置文件中配置相关信息
application.yml
配置文件中添加如下配置:spring:
cloud:
sentinel:
## nacos持久化配置
datasource:
## 配置流控规则,名字任意
ds-flow:
nacos:
## nacos的地址
server-addr: 127.0.0.1:8848
## 配置ID
dataId: ${spring.application.name}-flow
## 配置分组,默认是DEFAULT_GROUP
groupId: DEFAULT_GROUP
## 配置存储的格式
data-type: json
## rule-type设置对应得规则类型,总共七大类型,在com.alibaba.cloud.sentinel.datasource.RuleType这个枚举类中有体现
rule-type: flow
## 配置降级规则,名字任意
ds-degrade:
nacos:
## nacos的地址
server-addr: 127.0.0.1:8848
## 配置ID
dataId: ${spring.application.name}-degrade
## 配置分组,默认是DEFAULT_GROUP
groupId: DEFAULT_GROUP
## 配置存储的格式
data-type: json
## rule-type设置对应得规则类型,总共七大类型,在com.alibaba.cloud.sentinel.datasource.RuleType这个枚举类中有体现
rule-type: degrade
spring.cloud.sentinel.datasource
下可以配置多个规则,陈某这里只配置了限流和降级规则,其他规则自己尝试配一下,不同规则通过rule-type
区分,其取值都在com.alibaba.cloud.sentinel.datasource.RuleType
这个枚举类中,对应着sentinel中的几大统计规则。3、在Nacos添加对应的规则配置
上述源码在sentinel-openfeign-provider9009这个模块中,源码获取方式见文末。
4、JSON中到底怎么写?
com.alibaba.csp.sentinel.slots.block.flow.FlowRule
,JOSN中各个属性也是来源于这个类。[
{
// 资源名
"resource": "/test",
// 针对来源,若为 default 则不区分调用来源
"limitApp": "default",
// 限流阈值类型(1:QPS;0:并发线程数)
"grade": 1,
// 阈值
"count": 1,
// 是否是集群模式
"clusterMode": false,
// 流控效果(0:快速失败;1:Warm Up(预热模式);2:排队等待)
"controlBehavior": 0,
// 流控模式(0:直接;1:关联;2:链路)
"strategy": 0,
// 预热时间(秒,预热模式需要此参数)
"warmUpPeriodSec": 10,
// 超时时间(排队等待模式需要此参数)
"maxQueueingTimeMs": 500,
// 关联资源、入口资源(关联、链路模式)
"refResource": "rrr"
}
]
[
{
// 资源名
"resource": "/test1",
"limitApp": "default",
// 熔断策略(0:慢调用比例,1:异常比率,2:异常计数)
"grade": 0,
// 最大RT、比例阈值、异常数
"count": 200,
// 慢调用比例阈值,仅慢调用比例模式有效(1.8.0 引入)
"slowRatioThreshold": 0.2,
// 最小请求数
"minRequestAmount": 5,
// 当单位统计时长(类中默认1000)
"statIntervalMs": 1000,
// 熔断时长
"timeWindow": 10
}
]
[
{
// 资源名
"resource": "/test1",
// 限流模式(QPS 模式,不可更改)
"grade": 1,
// 参数索引
"paramIdx": 0,
// 单机阈值
"count": 13,
// 统计窗口时长
"durationInSec": 6,
// 是否集群 默认false
"clusterMode": 默认false,
//
"burstCount": 0,
// 集群模式配置
"clusterConfig": {
//
"fallbackToLocalWhenFail": true,
//
"flowId": 2,
//
"sampleCount": 10,
//
"thresholdType": 0,
//
"windowIntervalMs": 1000
},
// 流控效果(支持快速失败和匀速排队模式)
"controlBehavior": 0,
//
"limitApp": "default",
//
"maxQueueingTimeMs": 0,
// 高级选项
"paramFlowItemList": [
{
// 参数类型
"classType": "int",
// 限流阈值
"count": 222,
// 参数值
"object": "2"
}
]
}
]
不需要删除参数
[
{
// RT
"avgRt": 1,
// CPU 使用率
"highestCpuUsage": -1,
// LOAD
"highestSystemLoad": -1,
// 线程数
"maxThread": -1,
// 入口 QPS
"qps": -1
}
]
[
{
// 资源名
"resource": "sentinel_spring_web_context",
// 流控应用
"limitApp": "/test",
// 授权类型(0代表白名单;1代表黑名单。)
"strategy": 0
}
]
官方文档:https://github.com/alibaba/Sentinel/wiki/%E5%9C%A8%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E4%B8%AD%E4%BD%BF%E7%94%A8-Sentinel
15、限流规则如何推送到Nacos进行持久化?
流控规则源码修改
test
,因此我们需要去掉这个,如下:
<dependency>
<groupId>com.alibaba.cspgroupId>
<artifactId>sentinel-datasource-nacosartifactId>
dependency>
如果你集成的zookeeper或者apollo,则把相应的依赖也要修改。
com.alibaba.csp.sentinel.dashboard.rule
这个包下,如下图:com.alibaba.csp.sentinel.dashboard.controller.v2.FlowControllerV2
这个是sentinel提供的demo,只需要将其中的代码全部覆盖到com.alibaba.csp.sentinel.dashboard.controller.FlowControllerV1
中。修改RequestMapping中的请求url为 /v1/flow
修改 ruleProvider
、rulePublisher
的依赖,修改后的代码如下:
@Autowired
//使用nacos的依赖
@Qualifier("flowRuleNacosProvider")
private DynamicRuleProvider> ruleProvider;
@Autowired
//使用nacos的依赖
@Qualifier("flowRuleNacosPublisher")
private DynamicRulePublisher> rulePublisher;
com.alibaba.csp.sentinel.dashboard.rule.nacos.NacosConfigUtil
这个工具类中对应的是限流规则在nacos中的一些配置项,有groupId
、dataId
...对应的配置如下:com.alibaba.csp.sentinel.dashboard.rule.nacos.NacosConfig
这个类中有个方法如下图:mvn clean install -DskipTests=true -pl sentinel-dashboard -am
其他规则修改也很简单,照葫芦画瓢,这里就不再详细说了,后面会单独出一篇文章详细说一下。
16、集群流控如何做?
对于微服务要想保证高可用,必须是集群,假设有100个集群,那么想要设置流控规则,是不是每个微服务都要设置一遍?维护成本太高了 单体流控还会造成流量不均匀的问题,出现总流控阈值没有达到某些微服务已经被限流了,这个是非常糟糕的问题,因此实际生产中对于集群不推荐单体流控。
Token Client:集群流控客户端,用于向所属 Token Server 通信请求 token。集群限流服务端会返回给客户端结果,决定是否限流。 Token Server:即集群流控服务端,处理来自 Token Client 的请求,根据配置的集群规则判断是否应该发放 token(是否允许通过)。
独立模式(Alone):即作为独立的 token server 进程启动,独立部署,隔离性好,但是需要额外的部署操作。独立模式适合作为 Global Rate Limiter 给集群提供流控服务。 嵌入模式(Embedded):即作为内置的 token server 与服务在同一进程中启动。在此模式下,集群中各个实例都是对等的,token server 和 client 可以随时进行转变,因此无需单独部署,灵活性比较好。但是隔离性不佳,需要限制 token server 的总 QPS,防止影响应用本身。嵌入模式适合某个应用集群内部的流控。
sentinel-openfeign-provider9009
这个模块作为演示,直接启动三个集群,端口分别为9009
、9011
、9013
,如下图:官方文档:https://github.com/alibaba/Sentinel/wiki/%E9%9B%86%E7%BE%A4%E6%B5%81%E6%8E%A7
17、网关限流如何配置?
官方文档:https://github.com/alibaba/Sentinel/wiki/%E7%BD%91%E5%85%B3%E9%99%90%E6%B5%81
18、整合openFeign如何实现熔断降级?
有道无术,术可成;有术无道,止于术
欢迎大家关注Java之道公众号
好文章,我在看❤️