SpringCloud Alibaba 七(Sentinel服务熔断与持久化)

在演示这个Sentinel 服务熔断功能之前,我们先讲解一下Sentinel 关键注解@SentinelResource的用法。我们知道在Hystrix 中也有HystrixCommand 注解,通过这个注解我们可以自定义我们的降级规则,而Sentinel的@SentinelResource也是有类似的功能的,我们接下来就通过一些案例演示一下:

按资源名称限流

我们修改我们的项目:
在这里插入图片描述
新建 model 包:
新增Result类:

package com.younger.pcloud.alibaba.model;

public class Result<T> {

    private String message;

    private Integer code;

    private T data;

    public Result(String message, Integer code, T data) {
        this.message = message;
        this.code = code;
        this.data = data;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}

新增 FlowDataLimitController类:

package com.younger.pcloud.alibaba.controller;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.younger.pcloud.alibaba.model.Result;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class FlowDataLimitController {

    @GetMapping("/resourceByName")
    @SentinelResource(value = "resourceByName",blockHandler = "handlerException")
    public Result ResourceByName() {

        return new Result("按照资源名称限流",200,"获取到结果了");
    }


    public Result handlerException(BlockException exception) {
        return new Result("服务繁忙",402,exception.getMessage());
    }

}

启动项目:
在这里插入图片描述

新增流控规则:
在这里插入图片描述
我们在测试一下:
快速点击 : http://localhost:8004/resourceByName
在这里插入图片描述

按资URL地址限流

我们修改FlowDataLimitController类:
新增方法:

    @GetMapping("/resource/ByUrl")
    @SentinelResource(value = "ByUrl",blockHandler = "handlerException")
    public Result ResourceByUrl() {
        return new Result("按照资源名称限流",200,"获取到结果了");
    }

发现问题:重新启动项目,但是我们发现一个问题,当我们再次访问sentinel控制台,发现我们配置的规则都不见了。
在这里插入图片描述
我们访问一下:
在这里插入图片描述
新增流控规则:
在这里插入图片描述
我们快速访问地址: http://localhost:8004/resource/ByUrl
在这里插入图片描述
会返回Sentinel自带的限流处理结果,这个提示也不是很友好。

上面自定义方案的问题:
1、系统默认的,没有体现我们自己的业务要求。
2、 依照现有条件,我们自定义的处理方法又和业务代码耦合在一块,不直观。
3、每个业务方法都添加一个兜底的,那代码膨胀加剧。
4、全局统一的处理方法没有体现。

客户自定义限流处理逻辑

新增 handler 包:
在这里插入图片描述
新增 CustomerBlockHandler 类:

package com.younger.pcloud.alibaba.handler;

import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.younger.pcloud.alibaba.model.Result;

public class CustomerBlockHandler {

    public static Result handleException(BlockException exception) {
        return new Result("自定义限流处理",400,exception.getMessage());
    }
}

注意自定义方法需要static 修饰。

修改FlowDataLimitController类:

    /**
     * 自定义通用的限流处理逻辑,
      blockHandlerClass = CustomerBlockHandler.class
      blockHandler = handleException
     上述配置:找CustomerBlockHandler类里的handleException方法进行兜底处理
      在CustomerBlockHandler 中可以定义很多降级方法,我们只需在blockHandler中指定即可。
     */
    @GetMapping("/resource/ByUrl")
    @SentinelResource(value = "customerBlockHandler",blockHandlerClass = CustomerBlockHandler.class,blockHandler = "handleException")
    public Result ResourceByUrl() {
        return new Result("按照资源名称限流",200,"获取到结果了");
    }
}

我们启动服务:

新增流控规则:
在这里插入图片描述
我们快速访问地址: http://localhost:8004/resource/ByUrl
在这里插入图片描述

服务熔断功能

我们修改我们的项目 80、8001、8002的pom文件:
在这里插入图片描述
新增依赖:

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

修改 NacosMessageConsumerController 类:
在这里插入图片描述
新增方法:

    @RequestMapping("/consumer/fallback/{id}")
    @SentinelResource(value = "fallback",fallback = "handlerFallback")
    public String fallback(@PathVariable Long id) {
       String message =  restTemplate.getForObject(SERVERURL+"/message/provider/nacos",String.class);
        if (id == 0) {
            throw new IllegalArgumentException ("IllegalArgumentException,非法参数异常....");
        }
        return message;
    }

    public String handlerFallback(@PathVariable  Long id,Throwable e) {
        return "调用服务降级";

    }

启动 80、8001、8002测试:
在这里插入图片描述
测试验证:
测试地址: http://localhost:80/consumer/fallback/1
在这里插入图片描述
测试地址: http://localhost:80/consumer/fallback/0
在这里插入图片描述
在这里插入图片描述
这个地方还是可以配置 blockHandler。
在这里插入图片描述
还可以配置 blockHandler 和 fallback。
在这里插入图片描述
若 blockHandler 和 fallback 都进行了配置,则被限流降级而抛出 BlockException 时只会进入 blockHandler 处理逻辑。

我们还可以设置属性 exceptionsToIgnore,这参数表示忽略某个异常,此时就不会对该异常进行降级处理。我们测试一下:
在这里插入图片描述
重新项目80。
测试地址: http://localhost:80/consumer/fallback/0
在这里插入图片描述

Sentinel对Feign的支持

修改80的pom文件:
在这里插入图片描述

<!--SpringCloud openfeign -->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>

修改80的yml文件:
在这里插入图片描述

# 激活Sentinel对Feign的支持
feign:
  sentinel:
    enabled: true

修改 NacosMessageConsumer80 主启动类:
在这里插入图片描述
新增service包:
在这里插入图片描述
新增MessageService类:

package com.younger.pcloud.alibaba.service;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

@FeignClient(value = "nacos-message-provider",fallback = MessageFallback.class)
public interface MessageService {

    @GetMapping("/message/provider/nacos")
    String getMessage();
}

新增MessageFallback类:

package com.younger.pcloud.alibaba.service;

import org.springframework.stereotype.Component;

@Component
public class MessageFallback implements MessageService{

    public String getMessage() {
        return "MessageFallback 服务降级处理....";
    }
}

修改NacosMessageConsumerController类:
新增方法:
在这里插入图片描述

 @RequestMapping("/consumer/getMessage/{id}")
    public String getMessage(@PathVariable Long id) {
        if (id == 0) {
            throw new IllegalArgumentException ("IllegalArgumentException,非法参数异常....");
        }
        return messageService.getMessage();
    }

重新启动80项目:
测试访问: http://localhost:80/consumer/getMessage/1
在这里插入图片描述
我们关闭 8001、8002 服务。

再次访问: http://localhost:80/consumer/getMessage/1
在这里插入图片描述

规则持久化

我们刚才发现一旦我们重启应用,sentinel规则将消失,生产环境需要将配置规则进行持久化。我们需要将限流配置规则持久化进Nacos保存,只要刷新8004某个rest地址,sentinel控制台的流控规则就能看到,只要Nacos里面的配置不删除,针对8004上sentinel上的流控规则持续有效。

我们修改8004 的pom文件:
在这里插入图片描述
新增依赖:

 <!--SpringCloud ailibaba sentinel-datasource-nacos -->
    <dependency>
      <groupId>com.alibaba.csp</groupId>
      <artifactId>sentinel-datasource-nacos</artifactId>
    </dependency>

修改8004的yml文件:
在这里插入图片描述

server:
  port: 8004

spring:
  application:
    name: pcloud-sentinel-service
  cloud:
    nacos:
      discovery:
        #Nacos服务注册中心地址
        server-addr: localhost:8848
    sentinel:
      transport:
        #配置Sentinel dashboard地址
        dashboard: localhost:8080
        #默认8719端口,假如被占用会自动从8719开始依次+1扫描,直至找到未被占用的端口
        port: 8719
      datasource:
        ds1:
          nacos:
            server-addr: localhost:8848
            dataId: pcloud-sentinel-service
            groupId: DEFAULT_GROUP
            data-type: json
            rule-type: flow
management:
  endpoints:
    web:
      exposure:
        include: '*'

在nacos 新增配置:
在这里插入图片描述

[
    {
        "resource": "/resource/ByUrl",  
        "limitApp": "default",
        "grade": 1,
        "count": 1,
        "strategy": 0,
        "controlBehavior": 0,
        "clusterMode": false
    }
]
resource:资源名称;
limitApp:来源应用;
grade:阈值类型,0表示线程数,1表示QPS;
count:单机阈值;
strategy:流控模式,0表示直接,1表示关联,2表示链路;
controlBehavior:流控效果,0表示快速失败,1表示Warm Up,2表示排队等待;
clusterMode:是否集群。

我们重新启动 8004 项目:

访问地址: http://localhost:8004/resource/ByUrl

再次刷新sentinel,发现规则已经有了。
在这里插入图片描述
我们在重新启动项目8004,重新访问地址 http://localhost:8004/resource/ByUrl,在到sentinel控制台发现规则还在。我们把这个sentinel重新启动一下,经过测试发现重新启动刚才配置的规则还是在的,说明我们配置的规则已经持久化了。

最后比较一下各个熔断框架

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

youngerone123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值