sentinel+springboot+zookeeper,通过dashboard实现熔断(修改dashboard源码)

本文深入探讨了Sentinel的熔断机制,包括其工作原理、配置方法及实践案例。详细解析了熔断的三种触发条件:响应时间、异常比例和异常数,以及时间窗口的概念。通过代码示例展示了如何在Spring Cloud项目中集成Sentinel的熔断功能。

熔断功能紧接上一篇限流功能:

https://blog.youkuaiyun.com/zero_no1/article/details/104050089

好像有帖子说sentinel成为springcloud推荐的熔断,在调研限流的基础上有进行了熔断的调研,略微有些坑,搜了半天文章发现大家都是一样的,只实现了对限流的集成,看了下官方的源码,官方的源码只实现了对限流功能在zookeeper等可配置化的功能,并没有对熔断降级、热点这些的实现。其他文章无处借鉴.....没有办法,只好参照限流的动态配置以及结合熔断降级自己写了。以下内容均为原创哦~

首先看下熔断降级提供的三个方式

分别为RT,异常比例,异常数

RT为接口的响应时间,1秒钟同时有5个请求超过这个响应时间,则进行熔断

异常比例为一秒钟访问的接口数量,以及接口异常比例对应总访问量的比例

异常数即为一秒钟异常的个数

时间窗口即是在触发熔断时会持续的时间,举个栗子:触发熔断后,会在接下10秒内直接熔断,然后效果消失,如果在此触发熔断,会在持续10秒,以此类推

在这里直接贴出配置的json

[
  {
    "resource": "/action/test/test3",//访问的资源地址
    "count": 500,//访问的个数,此处是一个double值,若grade=1,则是0.1~1.0之间的一个值,0和2时则为毫秒
    "grade": 0,//0:RT 1:异常比例 2:异常数
    "timeWindow": 10 //时间窗口,秒为单位
  },
  {
    "resource": "POST:http://test-sentinel-provider/service/test/sentinel",
    "count": 500,
    "grade": 0,
    "timeWindow": 10
  }
]

在第二个json才是我们经常使用的微服务熔断,这个是sentinel支持springcloud的feign功能,需要在配置文件中进行开启,否则无法扫描到,配置如下:

feign:
  sentinel:
    enabled: true

说完配置,直接来说如何进行配置,首先直接说dashboard的配置:

在上一篇使用限流功能时阿里在test方法中提供了对限流功能的样例,那么这里同理,添加一个对服务降级的两个demo

首先打开zookeeperConfigUtil

public class ZookeeperConfigUtil {
    public static final String RULE_ROOT_PATH = "/sentinel_rule_config";

    public static final int RETRY_TIMES = 3;
    public static final int SLEEP_TIME = 1000;

    //之前ruleName不存在,因为只有针对限流的操作,此处需要增加一个路径,让每个项目有限流,熔断不同路径,同理限流需要同样修改
    public static String getPath(String ruleName, String appName) {
        StringBuilder stringBuilder = new StringBuilder(RULE_ROOT_PATH + "/" + ruleName);

        if (StringUtils.isBlank(appName)) {
            return stringBuilder.toString();
        }
        if (appName.startsWith("/")) {
            stringBuilder.append(appName);
        } else {
            stringBuilder.append("/")
                    .append(appName);
        }
        return stringBuilder.toString();
    }
}

zookeeperConfig

@Configuration
public class ZookeeperConfig {

    @Value("${zookeeper.servers}")
    private String zookeeperAddress;

    @Bean
    public Converter<List<FlowRuleEntity>, String> flowRuleEntityEncoder() {
        return JSON::toJSONString;
    }

    @Bean
    public Converter<String, List<FlowRuleEntity>> flowRuleEntityDecoder() {
        return s -> JSON.parseArray(s, FlowRuleEntity.class);
    }
    
    //此处为新增的降级转换类,在这里还是膜拜一下阿里的大神们,虽然没有提供test样例,但是设计模式上的通用上值得我们学习
    @Bean
    public Converter<List<DegradeRuleEntity>, String> degradeRuleEntityEncoder() {
        return JSON::toJSONString;
    }

    @Bean
    public Converter<String, List<DegradeRuleEntity>> degradeRuleEntityDecoder() {
        return s -> JSON.parseArray(s, De
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值