在 SpringBoot/SpringCloud 中使用 Sentinel
1. Sentinel 是什么?
Sentinel的官方标题是:分布式系统的流量防卫兵。
-
GitHub
https://github.com/alibaba/Sentinel
https://github.com/alibaba/spring-cloud-alibaba/wiki/Sentinel -
wiki
https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D
1.1 Sentinel 同类竞品
- Hystrix
- resilience4j
1.2 Sentinel 的主要特性:
1.3 为什么用Sentinel?
-
Hystrix 已经停止维护了
-
以 SpringCloud Gateway 为例,如果需要同时实现 限流与熔断 那么需要使用 RequestRateLimter 与 Hystrix 才能实现,现在直接用 Sentinel 就能完成这些工作了。
-
除了 限流 与 熔断, Sentinel 还提供了一个完善的 Dashborad , 规则配置, 热点限流,削峰填谷。。。
1.3 Sentinel 基本概念
-
资源
-
资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容,
例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码
。在接下来的文档中,我们都会用资源来描述代码块。 -
只要通过 Sentinel API 定义的代码,就是资源,能够被 Sentinel 保护起来。大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源。
-
-
规则
围绕资源的实时状态设定的规则,
可以包括流量控制规则、熔断降级规则以及系统保护规则
。所有规则可以动态实
2. 在SpringCloud 中使用 Sentinel
2.1 Sentinel核心库的使用
- 依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>
2.1.1 @SentinelResource 在SpringBoot中的使用
- Sentinel 在实际使用中建议遵循下面的思路
- 定义资源
- 定义规则
- 触发规则
-
代码如下
@SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(ServiceApplication.class, args); } }
@Service public class TestService { @SentinelResource(value = "sayHello") public String sayHello(String name) { return "Hello, " + name; } }
@RestController public class TestController { @Autowired private TestService service; @GetMapping(value = "/hello/{name}") public String apiHello(@PathVariable String name) { return service.sayHello(name); } }
-
测试效果
-
在 Sentinel 控制台给 /hello/{name} 接口,添加一个流控规则。
* 其实也支持在Java代码中配置流控规则,但是不够灵活
-
然后想办法触发流控规则, 此时会发现客户端会报错
* Response code: 429 too many request * body : Blocked by Sentinel (flow limiting)
-
-
@SentinelResource 注解介绍
-
@SentinelResource 注解用来标识资源是否被限流、降级
。上述例子上该注解的属性 sayHello 表示资源名。- @SentinelResource 注解用于上报需要被流控的资源,以及配置相应的流控策略,熔断策略。 被这个@SentinelResource 修饰的方法,他的调用链会上传到 Sentinel 控制台,我们可以直接在控制台针对这个调用链来进行相应的 流控 ,降级,热点,授权等配置。
-
@SentinelResource 还提供了其它额外的属性如 blockHandler,blockHandlerClass,fallback 用于表示限流或降级的操作(注意有方法签名要求),更多内容可以参考 Sentinel 注解支持文档。
-
若不配置 blockHandler、fallback 等函数,则被流控降级时方法会直接抛出对应的 BlockException;若方法未定义 throws BlockException 则会被 JVM 包装一层 UndeclaredThrowableException。
-
注:
-
在实际使用中,我们其实不用给每个方法或者接口去定义 @SentinelResource ,因为可以在Sentinel 控制台中动态的去给系统中每一个接口或者请求路径中的方法配置流控,降级规则。
-
一般推荐将 @SentinelResource 注解加到服务实现上,而在 Web 层直接使用 Spring Cloud Alibaba 自带的 Web 埋点适配。Sentinel Web 适配同样支持配置自定义流控处理逻辑,参考 相关文档。
-
以上例子都是在 Web Servlet 环境下使用的。Sentinel 目前已经支持 Spring WebFlux,需要配合 spring-boot-starter-webflux 依赖触发 sentinel-starter 中 WebFlux 相关的自动化配置。
-
-
2.2 Sentinel 控制台的使用
https://github.com/alibaba/Sentinel/tree/master/sentinel-dashboard
-
获取控制台
-
您可以从 release 页面 下载最新版本的控制台 jar 包。
-
您也可以从最新版本的源码自行构建 Sentinel 控制台:
下载 控制台 工程
使用以下命令将代码打包成一个 fat jar: mvn clean package
-
-
启动控制台
-
注意:启动 Sentinel 控制台需要 JDK 版本为 1.8 及以上版本。
-
使用如下命令启动控制台:
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
-
上述启动参数的含义
-
其中 -Dserver.port=8080 用于指定 Sentinel 控制台端口为 8080。
-
Dcsp.sentinel.dashboard.server=localhost:8080 向 Sentinel 接入端指定控制台的地址
-
-Dproject.name=sentinel-dashboard 向 Sentinel 指定应用名称,比如上面对应的应用名称就为 sentinel-dashboard
-
全部的配置项可以参考 启动配置项文档。
-
-
-
从 Sentinel 1.6.0 起,Sentinel 控制台引入基本的登录功能,默认用户名和密码都是 sentinel。可以参考 鉴权模块文档 配置用户名和密码。
注:若您的应用为 Spring Boot 或 Spring Cloud 应用,您可以通过 Spring 配置文件来指定配置,详情请参考 Spring Cloud Alibaba Sentinel 文档。
-
-
-
在SpringBoot / SpringCloud 中连接Sentinel 控制台
-
配置控制台的地址
spring: cloud: sentinel: # Sentinel 控制台连接配置 transport: # 本地与控制台交互的端口号 port: 8719 # 控制台地址 dashboard: localhost:8080
-
spring.cloud.sentinel.transport.dashboard 为控制台的地址
-
这里的 spring.cloud.sentinel.transport.port 端口配置会在应用对应的机器上启动一个 Http Server,该 Server 会与 Sentinel 控制台做交互。
-
比如 Sentinel 控制台添加了一个限流规则,会把规则数据 push 给这个 Http Server 接收,Http Server 再将规则注册到 Sentinel 中。
- 若不配置则默认为 8719 ,默认 8719 端口被占用以后会自动选择下一个端口,直到有可用的端口为止。选择端口时间会比较长,本地如果起多个应用建议自己设置端口。
-
-
3. 总结
-
上文简单介绍了Sentinel在SpringCloud中的基本使用方法,以及Sentinel控制台的安装,启动脚本。
-
在实际使用中我们可能还需要学习下面这些功能点:
- Sentinel 结合 Feign 代替 Hystrix
- Sentinel 结合 Nacos 实现流控规则的持久化以及动态刷新
- 网关限流 – 如何在SpringCloud Gateway 中使用 Sentinel
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/15266.html