SpringCloud Sentinel 熔断器

前言

Sentinel 是阿里巴巴开源的一款断路器实现,以流量为切入点,从流量控 制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

控制台下载启动

获取 Sentinel 控制台

您可以从官方网站中下载最新版本的控制台 jar 包.下载地址如下: Github Download Addr

启动

使用如下命令启动控制台:

java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.6.3.jar
启动 Sentinel 控制台需要 JDK 版本为 1.8 及以上版本。

客户端接入控制台

引入依赖

客户端需要引入 Transport 模块来与 Sentinel 控制台进行通信。可以通过 pom.xml 引入 依赖:

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-transport-simple-http</artifactId>
</dependency>

配置启动参数

在工程的application.yml中添加Sentinel 控制台配置信息

spring
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8080 #sentinel的请求路径

通用服务熔断保护

父工程引入alibaba实现的SpringCloud

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>2.1.0.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

在子工程中引入sentinel

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

配置熔断降级方法

在需要被保护的方法上使用@SentinelResource注解进行熔断配置。与Hystrix不同的是,Sentinel对抛 出异常和熔断降级做了更加细致的区分,通过 blockHandler 指定熔断降级方法,通过 fallback 指定 触发异常执行的降级方法。

@RestController
@RequestMapping("/order")
public class OrderController {

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping(value = "/buy/{id}", method = RequestMethod.GET)
    @SentinelResource(fallback = "orderfallback", blockHandler = "orderblockHandler")
    public Product order(@PathVariable Long id) {
        return restTemplate.getForObject("http://shop-service-product/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;
    }

}

Rest实现服务熔断

Spring Cloud Alibaba Sentinel 支持对 RestTemplate 的服务调用使用 Sentinel 进行保护,在构造 RestTemplate bean的时候需要加上 @SentinelRestTemplate 注解。

@Bean
@LoadBalanced
@SentinelRestTemplate(fallback = "handleFallback", fallbackClass = ExceptionUtil.class, blockHandler = "handleBlock", blockHandlerClass = ExceptionUtil.class)
public RestTemplate getRestTemplate() {
    return new RestTemplate();
}

blockHandler 或 fallback 属性对应的方法必须是对应 blockHandlerClass 或 fallbackClass 属性中的静态方法。

public class ExceptionUtil {

    public static SentinelClientHttpResponse handleBlock(HttpRequest request, byte[] body, ClientHttpRequestExecution execution, BlockException ex) {
        System.err.println("Oops: " + ex.getClass().getCanonicalName());
        return new SentinelClientHttpResponse("限流熔断降级");
    }

    public static SentinelClientHttpResponse handleFallback(HttpRequest request, byte[] body, ClientHttpRequestExecution execution, BlockException ex) {
        System.err.println("fallback: " + ex.getClass().getCanonicalName());
        return new SentinelClientHttpResponse("异常熔断降级");
    }
    
}

Feign实现服务熔断

Sentinel 适配了 Feign 组件。如果想使用,除了引入 sentinel -starter 的依赖外,还需要在配置文件打开 sentinel 对 feign 的支持: feign.sentinel.enabled=true,加入 openfeign starter 依赖使 sentinel starter 中的自动化配置类生效

引入依赖

<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支持

在工程的application.yml中添加sentinel 对 feign 的支持

feign:
  sentinel:
    enabled: true

配置FeignClient

和使用Hystrix的方式基本一致,需要配置FeignClient接口以及通过 fallback 指定熔断降级方法

//指定需要调用的微服务名称
@FeignClient(name = "shop-service-product",fallback = ProductFeginClientCallBack.class)
public interface ProductFeignClient {

    //调用的请求路径
    @RequestMapping(value = "/product/{id}", method = RequestMethod.GET)
    public Product findById(@PathVariable("id") Long id);

}

配置熔断方法

@Component
public class ProductFeginClientCallBack implements ProductFeignClient {
    
    @Override
    public Product findById(Long id) {
        Product product = new Product();
        product.setId(-1L);
        product.setProductName("熔断:触发降级方法");
        return product;
    }
}

本地默认配置加载

在sentinel控制台设置的规则,重启以后就会失效,我们可以在本地配置默认的限流规则
一条限流规则主要由以下几个因素组成

  • resource:资源名,即限流规则的作用对象
  • count: 限流阈值
  • grade: 限流阈值类型(QPS 或并发线程数)
  • limitApp: 流控针对的调用来源,若为 default 则不区分调用来源
  • strategy: 调用关系限流策略
  • controlBehavior: 流量控制效果(直接拒绝、Warm Up、匀速排队)

YML配置修改

spring
  cloud:
    sentinel:
      datasource:
        ds1:
          file:
            file: classpath:flowrule.json 
            data-type: json
            rule-type: flow

flowrule.json

在resources目录中添加flowrule.json文件,文件中配置如下

[
  {
    "resource": "GET:http://shop-service-product/product/{id}",
    "controlBehavior": 0,
    "count": 1,
    "grade": 1,
    "limitApp": "default",
    "strategy": 0
  }
]

添加新评论

评论列表