Sentinel 是阿里巴巴开源的一款断路器实现
点这个连接直接下载1.3.0版:https://github.com/alibaba/Sentinel/releases/download/1.3.0/sentinel-dashboard-1.3.0-en.jar
或者进入https://github.com/alibaba/Sentinel/wiki/Dashboard 页面的标题2.1Download the dashboard
(sentinel中文文档地址:https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D )
(sentinel-dashboard.jar官方使用:https://github.com/alibaba/Sentinel/wiki/Dashboard)
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -
Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
默认用户,密码都是sentinel,(参考https://github.com/alibaba/Sentinel/wiki/%E6%8E%A7%E5%88%B6%E5%8F%B0#%E9%89%B4%E6%9D%83 对用户密码配置)
默认情况下Sentinel 会在客户端首次调用的时候进行初始化,开始向控制台发送心跳包。也可以配置sentinel.eager=true ,取消Sentinel控制台懒加载(懒加载:只有访问该微服务才会在sentinel控制台监控到)。
非springcloud程序需要引入:
<dependency>
<groupId>com.alibaba.cspgroupId>
<artifactId>sentinel-transport-simple-httpartifactId>
dependency>
springclou程序引入:
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-alibaba-dependencies artifactId>
#注意这个版本,要和springcloud相关
<version>2.1.0.RELEASEversion>
<type>pomtype>
<scope>importscope>
dependency>
ps: spring-cloud-alibaba和spring-cloud有版本问题,需要配置对应的版本(https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E)
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-sentinel artifactId>
dependency>
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8080
非必需:
【这部分配置可在控制台进行配置 http://localhost:8080】
也可在resources/application.yml进行配置+ resources/json文件
application.yml配置文件添加如下配置
#通过文件读取限流规则
spring.cloud.sentinel.datasource.ds1.file.file=classpath: flowrule.json
spring.cloud.sentinel.datasource.ds1.file.data-type=json
spring.cloud.sentinel.datasource.ds1.file.rule-type=flow
然后在resources目录下创建flowrule.json文件
[
{
"resource": "orderFindById",
"controlBehavior": 0,
"count": 1,
"grade": 1,
"limitApp": "default",
"strategy": 0
}
]
json文件配置的各参数对应的意思:
resource:资源名,即限流规则的作用对象
count: 限流阈值
grade: 限流阈值类型(QPS 或并发线程数)
limitApp: 流控针对的调用来源,若为 default 则不区分调用来源
strategy: 调用关系限流策略
controlBehavior: 流量控制效果(直接拒绝、Warm Up、匀速排队)
更多可查看 RuleConstant.java类
/* Controller方法添加SentinelResource注解
* blockHandler 指定熔断降级方法,
* fallback 指定触发异常执行的降级方法
*/
@GetMapping("/buy/{id}")
@SentinelResource(value="order",blockHandler = "orderblockHandler" ,fallback= "orderfallback" )
public Product order(@PathVariable Long id) {
return restTemplate.getForObject("http://shop-serviceproduct/product/1", Product.class);
}
//触发熔断的降级方法
public Product orderblockHandler(Long id) {
Product product = new Product();
product.setId(-1l);
product.setProductName("触发熔断降级方法");
return product;
}
//触发异常执行的降级方法
public Product orderfallback(Long id) {
Product product = new Product();
product.setId(-1l);
product.setProductName("触发抛出异常方法");
return product;
}
与Hystrix不同的是,Sentinel对抛出异常和熔断降级做了更加细致的区分,通过blockHandler 指定熔断降级方法,通过fallback 指定触发异常执行的降级方法。
public class RestOrderApplication {
/**
*
* 资源名:
* httpmethod:schema://host:port/path :协议、主机、端口和路径
* httpmethod:schema://host:port :协议、主机和端口
*
* @SentinelRestTemplate:
* 异常降级
* fallback : 降级方法
* fallbackClass : 降级配置类
* 限流熔断
* blockHandler
* blockHandlerClass
*/
@LoadBalanced
@Bean
@SentinelRestTemplate(fallbackClass = ExceptionUtils. class ,fallback = "handleFallback", blockHandler = "handleBlock",blockHandlerClass = ExceptionUtils.class)
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(RestOrderApplication.class,args);
}
}
定义的方法有要求:
- 静态方法
- 返回值: SentinelClientHttpResponse
- 参数 : request , byte[] , clientRquestExcetion , blockException
public class ExceptionUtils {
/**
* 静态方法
* 返回值: SentinelClientHttpResponse
* 参数 : request , byte[] , clientRquestExcetion , blockException
*/
//限流熔断业务逻辑
public static SentinelClientHttpResponse handleBlock(HttpRequest request, byte[] body, ClientHttpRequestExecution execution, BlockException ex) {
Product product = new Product();
product.setProductName("限流熔断");
return new SentinelClientHttpResponse (JSON.toJSONString(product) );
}
//异常降级业务逻辑
public static SentinelClientHttpResponse handleFallback(HttpRequest request, byte[] body,
ClientHttpRequestExecution execution, BlockException ex) {
return new SentinelClientHttpResponse("def");
}
}
c.对Feign的支持
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-sentinelartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-openfeignartifactId>
dependency>
feign:
sentinel:
enabled: true
和使用Hystrix的方式基本一致,需要配置FeignClient接口以及通过fallback 指定熔断降级方法
//指定需要调用的微服务名称
@FeignClient(name="shop-service-product",fallback =
ProductFeginClientCallBack.class)
public interface ProductFeginClient {
//调用的请求路径
@RequestMapping(value = "/product/{id}",method = RequestMethod.GET)
public Product findById(@PathVariable("id") Long id);
}
/**
* 实现自定义的ProductFeginClient接口
* 在接口实现类中编写熔断降级方法
*/
@Component
public class ProductFeginClientCallBack implements ProductFeginClient {
/**
* 降级方法
*/
public Product findById(Long id) {
Product product = new Product();
product.setId(-1l);
product.setProductName("熔断:触发降级方法");
return product;
}
}
Feign 对应的接口中的资源名策略定义:
httpmethod:protocol://requesturl
// httpmethod就是GET或者POST这些
@FeignClient 注解中的所有属性,Sentinel 都做了兼容。
ProductFeginClient 接口中方法findById 对应的资源名为GET:http://shop-serviceproduct/product/{str}。
@SentinelResource注解的参数
项目源码:https://gitee.com/hxmkd/spring-cloud/tree/master/study_springcloud6_sentinel