Spring Cloud Alibaba之 Sentinel

推荐阅读:重磅来袭!微服务的里程碑 , SpringCloudAlibaba电子版教程已问世
Sentinel 介绍随着微服务的流行 , 服务和服务之间的稳定性变得越来越重要 。Sentinel 以流量为切入点 , 从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性 。
Sentinel 具有以下特征:

  • 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景 , 例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、实时熔断下游不可用应用等 。
  • 完备的实时监控:Sentinel 同时提供实时的监控功能 。 您可以在控制台中看到接入应用的单台机器秒级数据 , 甚至 500 台以下规模的集群的汇总运行情况 。
  • 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块 , 例如与 Spring Cloud、Dubbo、gRPC 的整合 。 您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel 。
  • 完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展点 。 您可以通过实现扩展点 , 快速的定制逻辑 。 例如定制规则管理、适配数据源等 。
如何使用 Sentinel如果要在您的项目中引入 Sentinel , 使用 group ID 为 com.alibaba.cloud 和 artifact ID 为 spring-cloud-starter-alibaba-sentinel 的 starter 。
[source,yaml]com.alibaba.cloudspring-cloud-starter-alibaba-sentinel下面这个例子就是一个最简单的使用 Sentinel 的例子:
@SpringBootApplicationpublic class Application {public static void main(String[] args) {SpringApplication.run(ServiceApplication.class, args);}}@RestControllerpublic class TestController {@GetMapping(value = "http://kandian.youth.cn/hello")@SentinelResource("hello")public String hello() {return "Hello Sentinel";}}@SentinelResource 注解用来标识资源是否被限流、降级 。 上述例子上该注解的属性 'hello' 表示资源名 。
@SentinelResource 还提供了其它额外的属性如 blockHandler , blockHandlerClass , fallback 用于表示限流或降级的操作 , 更多内容可以参考 Sentinel注解支持 。
以上例子都是在 WebServlet 环境下使用的 , Sentinel 目前已经支持 WebFlux , 需要配合 spring-boot-starter-webflux 依赖触发 sentinel-starter 中 WebFlux 相关的自动化配置 。
@SpringBootApplicationpublic class Application {public static void main(String[] args) {SpringApplication.run(ServiceApplication.class, args);}}@RestControllerpublic class TestController {@GetMapping("/mono")@SentinelResource("hello")public Mono mono() { return Mono.just("simple string").transform(new SentinelReactorTransformer<>("otherResourceName"));}}Sentinel 控制台Sentinel 控制台提供一个轻量级的控制台 , 它提供机器发现、单机资源实时监控、集群资源汇总 , 以及规则管理的功能 。 您只需要对应用进行简单的配置 , 就可以使用这些功能 。
【Spring Cloud Alibaba之 Sentinel】注意: 集群资源汇总仅支持 500 台以下的应用集群 , 有大概 1 - 2 秒的延时 。
Spring Cloud Alibaba之 Sentinel文章插图
Figure 3. Sentinel Dashboard
开启该功能需要3个步骤:
获取控制台您可以从 release 页面 下载最新版本的控制台 jar 包 。
您也可以从最新版本的源码自行构建 Sentinel 控制台:
  • 下载 控制台 工程
  • 使用以下命令将代码打包成一个 fat jar: mvn clean package
启动控制台Sentinel 控制台是一个标准的 SpringBoot 应用 , 以 SpringBoot 的方式运行 jar 包即可 。
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar如若8080端口冲突 , 可使用 -Dserver.port=新端口 进行设置 。
配置控制台信息spring:cloud:sentinel:transport:port: 8719dashboard: localhost:8080这里的 spring.cloud.sentinel.transport.port 端口配置会在应用对应的机器上启动一个 Http Server , 该 Server 会与 Sentinel 控制台做交互 。 比如 Sentinel 控制台添加了1个限流规则 , 会把规则数据 push 给这个 Http Server 接收 , Http Server 再将规则注册到 Sentinel 中 。
更多 Sentinel 控制台的使用及问题参考: Sentinel控制台
OpenFeign 支持Sentinel 适配了 OpenFeign 组件 。 如果想使用 , 除了引入 sentinel-starter 的依赖外还需要 2 个步骤:
  • 配置文件打开 sentinel 对 feign 的支持:feign.sentinel.enabled=true
  • 加入 openfeign starter 依赖使 sentinel starter 中的自动化配置类生效:
org.springframework.cloud