美文网首页Java
Alibaba Sentinel 熔断

Alibaba Sentinel 熔断

作者: TZX_0710 | 来源:发表于2020-09-07 11:36 被阅读0次

    何为熔断?

    服务熔断的作用类似于我们家用的保险丝,当某服务出现不可用或响应超时的情况时,为了防止整个系统出现雪崩,
    暂时停止对该服务的调用。
      服务降级是从整个系统的负荷情况出发和考虑的,对某些负荷会比较高的情况,为了预防某些功能(业务场景)出现
    负荷过载或者响应慢的情况,在其内部暂时舍弃对一些非核心的接口和数据的请求,而直接返回一个提前准备好的fallback
    (退路)错误处理信息。这样,虽然提供的是一个有损的服务,但却保证了整个系统的稳定性和可用性。
    SpringCloud中提供Hystirx服务熔断组件 SpringCloudAlibaba当中则采用Sentinel给服务加上限流熔断功能,防止异常情况拖垮应用服务。

    熔断配置

    Sentinel中的熔断降级有3个级别

    1. RT(平均响应时间)当资源的平均响应时间超过阈值之后,资源进入淮降级状态。接下来如果持续进入5个请求,它们的RT都持续超过这个阈值,那么接下来的时间窗口之内,对这个方法的调用会自动抛出DegradeException 异常。再下一个时间窗口到来时,会接着再放5个请求。
    2. 异常比例 当资源的每秒异常占总数的通过两比值超过阈值之后,资源进行降级状态,即在接下来的时间窗口之内,对这个方法的调用都会自动地抛出DegradeException异常。
    3. 异常数 当资源1分钟的异常数目超过阈值之后会进行熔断。

    1.需要使用的server模块添加依赖

            <!--Sentinel-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
            </dependency>
    

    配置sentinel的服务端地址依赖

    spring:
      application:
        name: server-provider
      cloud:
        nacos:
          discovery:
            server-addr: 192.168.174.135:8848
        sentinel:
          transport:
            #sentinel服务端地址
            dashboard: 192.168.174.135:8849
            #取消延迟加载
          eager: true
    

    在server-provider使用Sentinel进行测试

    @RestController
        public class ConsumerController {
            @GetMapping("/hello")
            @SentinelResource(value = "getByCode")
            public String hello() {
                return "hello World";
            }
        }
    

    打开sentinel界面查看


    sentinel

    可以查看到已经把服务注册到sentinel控制台当中去了,右边进行手动可以设置该接口的阈值,包括降级等。


    流控

    可以设置参数为2 然后快速请求接口 然后进行测试 查看效果


    阈值测试
    对于返回的注解我们可以采用自定义返回信息
    @SentinelResource(value = "hello",blockHandler = "handlerException")
    
    
     @GetMapping("/hello")
            @SentinelResource(value = "hello", blockHandler = "handleException")
            public String hello() {
                return "hello World";
            }
            //自定义异常的返返回值和参数要跟目标方法一样
            public String handleException(BlockException exception) {
                return "达到阈值了,不要再访问了!";
            }
    
    自定义返回参数

    持久化

    因为sentinel的注册信息都存放在内存当中,所以重启之后会丢失数据。可以使用nacos中心持久化数据

    1. 引入配置pom依赖
     <!--引入nacos配置文件-->
            <dependency>
                <groupId>com.alibaba.csp</groupId>
                <artifactId>sentinel-datasource-nacos</artifactId>
            </dependency>
    
    2. 编写配置文件
    spring:
      application:
        name: server-provider
      cloud:
        nacos:
          discovery:
            server-addr: 192.168.174.135:8848
        sentinel:
          transport:
            #sentinel服务端地址
            dashboard: 192.168.174.135:8849
          eager: true
          datasource:
            ds:
              nacos:
                server-addr: 192.168.174.135:8848 #nacos的地址
                data-id: ${spring.application.name}-sentinel#nacos的data-id
                group-id: DEFAULT_GROUP#分组名称
                rule-type: flow
    
    3. 在nacos中建立配置文件
    nacos配置中心
    nacos新增配置
    配置熔断详情配置

    resources:资源名称
    limitapp:流控针对的调用来源 default不区分
    grade:限流阈值的类型 0表示根据并发数量 1表示根据QPS来进行流量控制
    count: 限流阈值
    strategy:调用关系限流策略
    controlBehavior:流量控制效果(直接拒绝、Warm Up、匀速排队)
    clusterMode:是否为集群模式

    相关文章

      网友评论

        本文标题:Alibaba Sentinel 熔断

        本文链接:https://www.haomeiwen.com/subject/aswvsktx.html