我们在 web-api-demo 和 dubbo-provider 两个应用的 pom 文件添加 adapter 依赖,这样两个应用的 Dubbo consumer/provider 接口就可以自动被 Sentinel 统计。
对于 Spring Cloud Gateway、Zuul 1.x 等网关,我们还需要在上面 SCA 依赖的基础上额外引入 spring-cloud-alibaba-sentinel-gateway
依赖:
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId> </dependency>
这个依赖会自动为网关添加 Sentinel 相关的配置,从而可以让 API gateway 自动接入 Sentinel。我们在 demo-gateway 应用的 pom 文件里面添加这个依赖,这样我们的 gateway 应用就可以接入 Sentinel 了。
引入依赖之后,我们只需要进行简单的配置即可快速接入 Sentinel 控制台。我们可以在 application.properties
文件里面配置应用名和连接控制台的地址,以 web-api-demo 为例:
spring.application.name=foo-web spring.cloud.sentinel.transport.dashboard=localhost:8080
其中 spring.application.name
相信大家都比较熟悉了,这里 Spring Cloud Alibaba Sentinel 会自动提取这个值作为接入应用的 appName。同时我们通过 spring.cloud.sentinel.transport.dashboard
来配置要连接的控制台地址和端口。
完成以上的配置后,我们可以依次启动 dubbo-provider、web-api-demo 和 demo-gateway 应用,并通过网关入口访问 localhost:8090/demo/time
获取当前时间。触发服务后,我们稍后可以在 Sentinel 控制台看到我们的三个应用,可以在监控页面看到访问信息,代表接入成功。
我们可以在每个应用的簇点链路页面看到当前应用的一些埋点调用,比如 Web 应用可以看到 Web URL 和 Dubbo consumer 调用:
流控规则
下面我们来配一条最简单的流控规则。在 Dubbo provider 端,我们进入簇点链路页面,针对
com.alibaba.csp.sentinel.demo.dubbo.FooService:getCurrentTime(boolean)
这个服务调用配置限流规则(需要有过访问量才能看到)。我们配一条 QPS 为 1 的流控规则,这代表针对该服务方法的调用每秒钟不能超过 1 次,超出会直接拒绝。
点击“新增”按钮,成功添加规则。我们可以在浏览器反复请求 localhost:8090/demo/time
(频率不要太慢),可以看到会出现限流异常信息(Dubbo provider 默认的限流处理逻辑是抛出异常,该异常信息由 Dubbo 直接返回,并由 Spring 展示为默认 error 页面):
同时我们也可以在“实时监控”页面看到实时的访问量和拒绝量:
我们同样也可以在 Web API 处配置限流规则,观察效果。Spring Web 默认的限流处理逻辑是返回默认的提示信息(Blocked by Sentinel),状态码为 429。在后面的章节我们会介绍如何自定义流控处理逻辑。
了解了限流的基本用法,大家可能想问:生产环境我需要针对每个接口都去配置流控规则吗?阈值不会配怎么办?其实,限流降级的配置是需要结合容量规划、依赖梳理来做的。我们可以借助 JMeter 或 阿里云 PTS 等压测工具对我们的服务进行全链路压测,了解每个服务的最大承受能力,来确定核心接口的最大容量并作为 QPS 阈值。
网关流控规则
Sentinel 对 API Gateway 流控的场景进行了定制,支持针对网关的路由(如上面 gateway 定义的 foo-service-route)或自定义的 API 分组进行流控,支持针对请求属性(如某个 header)进行流控。用户可以在 Sentinel 控制台 自定义 API 分组,可以看做是一些 URL 匹配的组合。比如我们可以定义一个 API 叫 my_api,请求 path 模式为 /foo/**
和 /baz/**
的都归到 my_api 这个 API 分组下面。限流的时候可以针对这个自定义的 API 分组维度进行限流。
下面我们在控制台针对 gateway 配置一条网关流控规则。我们可以看到 API Gateway 的控制台页面与普通应用的页面有一些差异,这些就是针对网关场景的定制。Sentinel 网关流控规则支持提取某个 route 的请求属性,包括 remote IP、header、URL 参数、cookie 等,支持自动统计其中的热点值并分别进行限制,也支持针对某个具体值进行限制(比如给某个 uid 限量)。
我们给 foo-service-route 这个路由配一条针对请求属性的网关流控规则。这条规则会针对 URL 参数中提取出来的每个热点 uid 参数分别进行限制,每分钟的请求量最多允许 2 次。
保存规则后,我们可以构造一些向后端服务的请求,携带上不同的 uid 参数(即使没有用到),比如 localhost:8090/demo/time?uid=xxx
。我们可以观察到,每个 uid 的访问每分钟超出两次后会出现限流页面。
关于 Sentinel 网关流控的详细配置指南和实现原理请参考 网关流控文档。
熔断降级规则
熔断降级通常用于自动切断不稳定的服务,防止调用方被拖垮导致级联故障。熔断降级规则通常在调用端,针对弱依赖调用进行配置,在熔断时返回预定义好的 fallback 值,这样可以保证核心链路不被不稳定的旁路影响。
Sentinel 提供以下几种熔断策略:
- 慢调用比例 (SLOW_REQUEST_RATIO):选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs,默认为 1s)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。
- 异常比例 (ERROR_RATIO):当单位统计时长内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是
[0.0, 1.0]
,代表 0% - 100%。 - 异常数 (ERROR_COUNT):当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。