参考:
介绍 · alibaba/Sentinel Wiki (github.com)
Sentinel · alibaba/spring-cloud-alibaba Wiki · GitHub
公司项目一直以来都是用Hystrix来做熔断,最近架构部要求换成Sentinel,用了一段时间之后发现Sentinel确实很强大,在此介绍Feign如何整合Sentinel在项目中如何实现熔断和降级。
Hystrix和Sentinel异同
| 功能 | Sentinel | Hystrix |
|---|---|---|
| 隔离策略 | 信号量隔离 | 线程池隔离/信号量隔离 |
| 熔断降级策略 | 基于响应时间或失败比率 | 基于失败比率 |
| 实时指标实现 | 滑动窗口 | 滑动窗口(基于 RxJava) |
| 规则配置 | 支持多种数据源 | 支持多种数据源 |
| 扩展性 | 多个扩展点 | 插件的形式 |
| 基于注解的支持 | 支持 | 支持 |
| 限流 | 基于 QPS,支持基于调用关系的限流 | 不支持 |
| 流量整形 | 支持慢启动、匀速器模式 | 不支持 |
| 系统负载保护 | 支持 | 不支持 |
| 控制台 | 开箱即用,可配置规则、查看秒级监控、机器发现等 | 不完善 |
| 常见框架的适配 | Servlet、Spring Cloud、Dubbo、gRPC | Servlet、Spring Cloud Netflix |
可见,除了熔断的实现方式以外,Hystrix和Sentinel最大的区别就是Sentinel提供了控制台,可以在界面上对接口的限流策略进行调控,而且Sentinel的生态也是偏向于阿里系
Sentinel熔断降级处理
sentinel适配了fiegn的熔断处理,如果想使用sentinel方式的熔断,只需要引入sentinel依赖,在yml配置文件上添加些许配置即可,代码上可以不作任何改动,相当方便
- pom文件添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
- yml文件添加配置
feign:
sentinel:
enabled: true
- 代码上保持Hystrix的写法即可,这里换成fallbackFactory也可以
@FeignClient(name = "service-provider", fallback = EchoServiceFallback.class)
public interface EchoService {
@RequestMapping(value = "/echo/{str}", method = RequestMethod.GET)
String echo(@PathVariable("str") String str);
}
@Service
class EchoServiceFallback implements EchoService {
@Override
public String echo(@PathVariable("str") String str) {
return "echo fallback";
}
}
Sentinel控制台的安装和使用
sentinel控制台跟nacos一样,需要单独安装部署,源码下载地址: github.com/alibaba/Sen…
下载完之后通过maven命令打包:
mvn clean package
之后切换到以下目录:sentinel-dashboard\target,运行命令启动jar包,端口可按需修改
java -Dserver.port=8090 -Dcsp.sentinel.dashboard.server=localhost:8090 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
启动完成后访问http://localhost:8090/#/dashboard/home ,默认的账号密码都是sentinel