文章目录
介绍
Sentinel是阿里巴巴开源的一款断路由实现。
特征:
丰富的应用场景:Sentinel承接了阿里巴巴近10年的双十一大促流量的核心场景,例如:秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等
完备的实时监控:Sentinel同时提供实时的监控功能,您可以在控制台中看到接入应用的单台机器秒级数据,甚至500台以下规模的集群汇总运行情况
广泛的开源生态:Sentinel提供开箱即用的与其他开源框架/库的整合模块,例如与SpringCloud、Dubbo、gRPC的整合。您只需要引入相应的依赖并运行简单的配置即可快速地接入Sentinel。
完善的SPI扩展点:Sentinel提供简单易用、完善的SPI扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
Sentinel可以简单的分为Sentinel核心库和Dashboard。核心库不依赖Dashboard,但是结合Dashboard可以取得最好的效果。
使用Sentinel来进行熔断保护,主要分为几个步骤:
1.定义资源
2.定义规则
3.检验规则是否生效
资源:可以是任何东西,一个服务,服务里的方法,甚至是一段代码。
规则:Sentinel支持以下几种规则:流量控制规则、熔断降级规则、系统保护规则、来源访问控制规则和热点参数规则。Sentinel的所有规则都可以在内存动态地查询及修改,修改之后立即生效
Sentinel中的管理控制台
下载启动控制台
(1)获取Sentinel控制台
下载地址:https://github.com/alibaba/Sentinel/releases,找到xxxxx
点击下载就好
(2)启动
java -Deserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.7.1.jar
注意后面的文件名称。
启动控制台后进入:localhost:8080/
访问的用户名/密码:sentinel/sentinel
将所有的服务交给控制台管理
客户端接入Sentinel管理控制台
在客户端(需要管理微服务上)引入坐标
- 在父工程中引入版本信息:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
- 在子工程中引入
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
在客户端配置启动参数
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8080 #sentinel控制台的请求地址
结果就是可以在控制台中看到管理信息(注意,sentinel使用了懒加载模式(默认),需要你进行访问过这个微服务,它才会显示出来):
Sentinel资源保护
/**
* @SentinelResource
* blockHandler:声明熔断时调用的降级方法
* fallback:抛出异常所执行的降级方法
* value:自定义的资源名称
* */
@SentinelResource(blockHandler = "getProductBlockHandler",fallback = "getProductFallback")
@RequestMapping(value = "/get/{id}",method = RequestMethod.GET)
public String get(@PathVariable Long id){
return restTemplate.getForObject("http://product-service/product/getProduct/"+id,String.class);
}
//sentinel降级方法
/**
* sentinel
* 熔断执行的降级方法
* 抛出异常执行的降级方法
* */
public String getProductFallback(Long id){
return "抛出了异常执行的降级方法";
}
public String getProductBlockHandler(Long id){
return "触发了熔断的降级方法";
}
上面用了 @SentinelResource这个注解进行了熔断保护,另外,还指定了两个降级方法,@SentinelResource还有其他的属性可以设置,可以自行百度。
熔断设置
我们上面并没有对产生熔断的值进行设置,那么这个值应该在哪里设置呢?
在sentinel的后台管理界面就可以设置
在这里就可以进行很多的设置,另外左边栏的那些也可以设置
持久化配置实例:限流规则设置
如果只是手动在控制台中配置,则会出现sentinel重启导致数据丢失的问题,所以,最好能在每个微服务中自行配置规则。
- 配置文件
spring:
cloud:
sentinel:
datasource:
ds1:
file:
file: classpath: flowrule.json
data-type: json
rule-type: flow
著名配置文件的位置,我这里放在与application.yml的同级目录下
- 创建一个json文件
[
{
"resource":"getProduct",
"controlBehavior":0,
"count":1,
"grade":1,
"limitApp":"default",
"strategy":0
}
]
各个参数的含义:
resource:资源名,即限流规则的作用对象(这个即为@SentinelResource的value值或者默认值)
count:限流阈值
grade:限流阈值类型(QPS或并发线程数)
limitApp:流控针对的调用来源,若为default则不区分调用来源
strategy:调用关系限流策略
controlBehavior:流量控制效果(直接拒绝、Warm Up、匀速排队)
对RestTemplate的支持(配置一个公用的降级方法)
在上面说到的设置熔断保护的方法中,每个资源都要设置@SentinelResource,而且给每个资源配置一个降级方法,就显得太麻烦了,因此,sentinel还提供了对RestTemplate的支持
- 在构造RestTemplate的时候加上注解@SentinelRestTemplate
/***
* sentinel支持对restTemplate的服务调用使用sentinel方法,在构造RestTemplate
* 对象的时候,只需要加载@SentinelRestTemplate即可
*
* 资源名:
* httpmethod:schema:/host:post/path:协议、主机、端口和路径
* httpmethod:schema:host:port:协议、主机和端口
*
* @SentinelRestTemplate
* 异常降级:
* fallback:降级方法
* fallbackClass:降级配置类
* 限流熔断:
* blockHandler
* blockHandlerClass:
* */
@Bean
@LoadBalanced
@SentinelRestTemplate(fallback = "handleFallBack",fallbackClass = SentinelFallback.class,
blockHandler = "handleBlock",blockHandlerClass = SentinelFallback.class)
public RestTemplate restTemplate(){
return new RestTemplate();
}
- 降级类
public class SentinelFallback {
/**
* 静态方法
* 返回值:SentinelClientHttpResponse
* 参数:request,byte[],clientHttpRequestExecution,blockException
* 注意:SentinelClientHttpResponse传入的返回值应该和Controller方法中返回的返回值一致,即最好所有的接口统一返回值
* */
//限流降级方法
public static SentinelClientHttpResponse handleBlock(HttpRequest request, byte[] body, ClientHttpRequestExecution clientHttpRequestExecution, BlockException blockException){
return new SentinelClientHttpResponse("限流熔断降级");
}
//异常降级方法
public static SentinelClientHttpResponse handleFallBack(HttpRequest request, byte[] body, ClientHttpRequestExecution clientHttpRequestExecution, BlockException blockException){
return new SentinelClientHttpResponse("异常熔断降级");
}
}
然后在后台控制页面进行设置就可以了
对Feign的支持
- 引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
- 开启sentinel支持
feign:
sentinel:
enabled: true #开启sentinel的支持
- 配置FeignClient
/**
* 声明需要调用的微服务名称
* @FeignClient
* name:服务提供者的名称
* */
@FeignClient(name="product-service",fallback = ProductFeignClientCallBack.class)
public interface ProductFeignClient {
/**
* 配置需要调用的接口
* */
@RequestMapping(value = "/product/{id}",method = RequestMethod.GET)
String getProduct(@PathVariable("id") Long id);
}
- 配置熔断方法
@Component
public class ProductFeignClientCallBack implements ProductFeignClient {
@Override
public String getProduct(Long id) {
return "抱歉,出错了";
}
}