写在最前
项目 GitHub 地址 mingyue-springcloud-learning 【mingyue-springcloud-sentinel】
阅读推荐
版本声明
spring-boot: 2.7.5
spring-cloud: 2021.0.5
spring-cloud-alibaba: 2021.0.4.0
sentinel: 1.8.0
Sentinel 简介
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。 Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
特征:
- 丰富的应用场景: Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、实时熔断下游不可用应用等。
- 完备的实时监控: Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
- 广泛的开源生态: Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
- 完善的 SPI 扩展点: Sentinel 提供简单易用、完善的 SPI 扩展点。您可以通过实现扩展点,快速的定制逻辑。例如定制规则管理、适配数据源等。
Docker 快速搭建 Sentinel
启动
docker run --name sentinel -d -p 8858:8858 -d bladex/sentinel-dashboard:1.8.0
登录
http://Sentinel机器的IP:8858
用户名 | 密码 |
---|---|
sentinel | sentinel |
整合 Sentinel
1.引入依赖
<!-- sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
2.添加配置
spring:
cloud:
sentinel:
eager: true
transport:
port: 8858
# sentinel dashboard 地址
dashboard: 127.0.0.1:8858
3.编码测试
@SentinelResource 注解用来标识资源是否被限流、降级。上述例子上该注解的属性 ‘hello’ 表示资源名。
@SentinelResource 还提供了其它额外的属性如
blockHandler
,blockHandlerClass
,fallback
用于表示限流或降级的操作,更多内容可以参考 Sentinel注解支持。
package com.csp.mingyue.sentinel.controller;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author Strive
*/
@RestController
public class TestController {
/**
* @SentinelResource 注解用来标识资源是否被限流、降级。上述例子上该注解的属性 'hello' 表示资源名。还提供了其它额外的属性如
* blockHandler,blockHandlerClass,fallback 用于表示限流或降级的操作
*
*/
@GetMapping(value = "/hello")
@SentinelResource(value = "hello", fallback = "helloError")
public String hello() {
return "Hello Sentinel";
}
public String helloError() {
return "Hello Sentinel, Error! ";
}
}
4.启动项目
先访问 Sentinel,此时可以看到应用已经注册上!
调用一次接口,再访问 Sentinel
curl --location --request GET 'http://127.0.0.1:8300/hello' \
--header 'User-Agent: apifox/1.0.0 (https://www.apifox.cn)' \
--header 'Accept: */*' \
--header 'Host: 127.0.0.1:8300' \
--header 'Connection: keep-alive'
恭喜你,你的应用成功接入 Sentinel
访问路径限流
1.配置路径限流
阈值类型
- QPS(Query Per Second):每秒请求数,就是说服务器在一秒的时间内处理了多少个请求。
- 线程数:当调用该api的线程数达到阈值的时候,进行限流。
- 单机阈值:控制请求阈值数量
流控模式
直接:api达到限流条件时,直接限流。
关联:当关联的资源达到阈值时就限流自己。A接口与B接口关联,当B接口到达阈值,让A接口限流起到保护B接口的作用。 例如支付接口与下单接口,当支付接口到达阈值,让下单接口限流,起到保护支付接口的作用。
链路:只记录指定链路上的流量(指定资源入口资源进来的流量,如果达到阈值,就进行限流)。
流控效果
快速失败:是默认的流量控制方式,当QPS超过任意规则的阈值后,新的请求就会被立即拒绝,拒绝方式为抛出FlowException。这种方式适用于对系统处理能力确切已知的情况下,比如通过压测确定了系统的准确水位时。
Warm up:即预热/冷启动方式。当系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过”冷启动”,让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮。
排队等候:会严格控制请求通过的间隔时间,也即是让请求以均匀的速度通过,对应的是漏桶算法。
QPS的值是1,快速失败。
2.请求接口测试
curl --location --request GET 'http://127.0.0.1:8300/hello' \
--header 'User-Agent: apifox/1.0.0 (https://www.apifox.cn)' \
--header 'Accept: */*' \
--header 'Host: 127.0.0.1:8300' \
--header 'Connection: keep-alive'
连续请求两次后,接口已经被 Sentinel 限制访问,直接快速失败了
Blocked by Sentinel (flow limiting)
服务资源限流
先移除对访问路径限流
1.配置资源限流
2.请求接口测试
curl --location --request GET 'http://127.0.0.1:8300/hello' \
--header 'User-Agent: apifox/1.0.0 (https://www.apifox.cn)' \
--header 'Accept: */*' \
--header 'Host: 127.0.0.1:8300' \
--header 'Connection: keep-alive'
连续请求两次后,接口请求进入了降级方法 helloError(),实现了服务降级!!!
Hello Sentinel, Error!
Tips
Sentinel 只介绍介绍很小的一部分功能,Sentinel 可玩性很高,功能远远不止这些,授人以鱼不如授人以渔
:
Sentinel 很易用,在接入完成后可以自己探索里面的功能,当然还是推荐先浏览一遍文档比较好。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/78310.html