随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel是阿里巴巴开源的分布式系统的流量防卫组件,Sentinel 把流量作为切入点,从流量控制,熔断降级,系统负载保护等多个维度保护服务的稳定性。
Sentinel 具有以下特征:
丰富的应用场景: Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、实时熔断下游不可用应用等。
完备的实时监控: Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
广泛的开源生态: Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
完善的 SPI 扩展点: Sentinel 提供简单易用、完善的 SPI 扩展点。您可以通过实现扩展点,快速的定制逻辑。例如定制规则管理、适配数据源等。
Sentinel 的主要特性:
|
Sentinel |
Hystrix |
resilience4j |
---|---|---|---|
隔离策略 |
信号量隔离(并发控制) |
线程池隔离/信号量隔离 |
信号量隔离 |
熔断降级策略 |
基于慢调用比例、异常比例、异常数 |
基于异常比例 |
基于异常比例、响应时间 |
实时统计实现 |
滑动窗口(LeapArray) |
滑动窗口(基于 RxJava) |
Ring Bit Buffer |
动态规则配置 |
支持近十种动态数据源 |
支持多种数据源 |
有限支持 |
扩展性 |
多个扩展点 |
插件的形式 |
接口的形式 |
基于注解的支持 |
支持 |
支持 |
支持 |
单机限流 |
基于 QPS,支持基于调用关系的限流 |
有限的支持 |
Rate Limiter |
集群流控 |
支持 |
不支持 |
不支持 |
流量整形 |
支持预热模式与匀速排队控制效果 |
不支持 |
简单的 Rate Limiter 模式 |
系统自适应保护 |
支持 |
不支持 |
不支持 |
热点识别/防护 |
支持 |
不支持 |
不支持 |
多语言支持 |
Java/Go/C++ |
Java |
Java |
Service Mesh 支持 |
支持 Envoy/Istio |
不支持 |
不支持 |
控制台 |
提供开箱即用的控制台,可配置规则、实时监控、机器发现等 |
简单的监控查看 |
不提供控制台,可对接其它监控系统 |
本文以Spring Cloud为例,其他框架对接如dubbo请参考Github:spring-cloud-alibabae的examples教程。
首先,修改 pom.xml 文件,引入 Sentinel starter。
com.alibaba.cloud
spring-cloud-starter-alibaba-sentinel
下面这个例子就是一个最简单的使用 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);
}
}
@SentinelResource 注解用来标识资源是否被限流、降级。上述例子上该注解的属性 sayHello 表示资源名。
@SentinelResource 还提供了其它额外的属性如 blockHandler,blockHandlerClass,fallback 用于表示限流或降级的操作(注意有方法签名要求),更多内容可以参考 Sentinel 注解支持文档。若不配置 blockHandler、fallback 等函数,则被流控降级时方法会直接抛出对应的 BlockException;若方法未定义 throws BlockException 则会被 JVM 包装一层 UndeclaredThrowableException。
注:一般推荐将 @SentinelResource 注解加到服务实现上,而在 Web 层直接使用 Spring Cloud Alibaba 自带的 Web 埋点适配。Sentinel Web 适配同样支持配置自定义流控处理逻辑,参考 相关文档。
以上例子都是在 Web Servlet 环境下使用的。Sentinel 目前已经支持 Spring WebFlux,需要配合 spring-boot-starter-webflux 依赖触发 sentinel-starter 中 WebFlux 相关的自动化配置。
Sentinel 适配了 Feign 组件。如果想使用,除了引入 spring-cloud-starter-alibaba-sentinel 的依赖外还需要 2 个步骤:
配置文件打开 Sentinel 对 Feign 的支持:feign.sentinel.enabled=true
加入 spring-cloud-starter-openfeign 依赖使 Sentinel starter 中的自动化配置类生效:
org.springframework.cloud
spring-cloud-starter-openfeign
这是一个 FeignClient 的简单使用示例:
@FeignClient(name = "service-provider", fallback = EchoServiceFallback.class, configuration = FeignConfiguration.class)
public interface EchoService {
@RequestMapping(value = "/echo/{str}", method = RequestMethod.GET)
String echo(@PathVariable("str") String str);
}
class FeignConfiguration {
@Bean
public EchoServiceFallback echoServiceFallback() {
return new EchoServiceFallback();
}
}
class EchoServiceFallback implements EchoService {
@Override
public String echo(@PathVariable("str") String str) {
return "echo fallback";
}
}
Feign 对应的接口中的资源名策略定义:httpmethod:protocol://requesturl。@FeignClient注解中的所有属性,Sentinel 都做了兼容。
其他服务调用适配支持请参考:https://github.com/alibaba/Sentinel/wiki/%E4%B8%BB%E6%B5%81%E6%A1%86%E6%9E%B6%E7%9A%84%E9%80%82%E9%85%8D
Sentinel 控制台提供一个轻量级的控制台,它提供机器发现、单机资源实时监控、集群资源汇总,以及规则管理的功能。您只需要对应用进行简单的配置,就可以使用这些功能。
注意: 集群资源汇总仅支持 500 台以下的应用集群,有大概 1 - 2 秒的延时。
开启该功能需要3个步骤:
获取控制台
您可以从 release 页面 下载最新版本的控制台 jar 包。
您也可以从最新版本的源码自行构建 Sentinel 控制台:
下载 控制台 工程
使用以下命令将代码打包成一个 fat jar: mvn clean package
启动控制台
Sentinel 控制台是一个标准的 Spring Boot 应用,以 Spring Boot 的方式运行 jar 包即可。
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
如若8080端口冲突,可使用 -Dserver.port=新端口进行设置。
引入JAR包
客户端需要引入 Transport 模块来与 Sentinel 控制台进行通信。您可以通过 pom.xml引入 JAR 包:
如已引入spring-cloud-starter-openfeign则默认依赖。
com.alibaba.csp
sentinel-transport-simple-http
x.y.z
配置控制台信息
application.yml
spring:
cloud:
sentinel:
transport:
port: 8719
dashboard: localhost:8080
这里的 spring.cloud.sentinel.transport.port 端口配置会在应用对应的机器上启动一个 Http Server,该 Server 会与 Sentinel 控制台做交互。比如 Sentinel 控制台添加了一个限流规则,会把规则数据 push 给这个 Http Server 接收,Http Server 再将规则注册到 Sentinel 中。默认是8719,有冲突会尝试向后探测。
更多 Sentinel 控制台的使用及问题参考: Sentinel 控制台文档 以及 Sentinel FAQ
确保客户端有访问量,Sentinel会在客户端首次调用的时候进行初始化,开始向控制台发送心跳包。
通过控制台查看机器列表和健康情况
后续补充sentinel整合spring gateway,以及集群功能...
spring-cloud-alibaba
alibaba/Sentinel
官网