littlehow-sentinel接入指南

写在前面

对sentinel接入不了解的可以看上一篇关于sentinel接入指南的文章:

CSDN地址

掘金地址

项目背景

当一个项目涵盖功能特别多,所有功能糅合在一起时,每次的更新维护或新需求的支撑可能会变得异常艰难;
所以在这时候就需要考虑将系统拆分为不同功能的多个服务系统;具体如何拆分此处就不多做说明;但是拆分的系统间
是有一些依赖关系的,也就是说拆分后将会多出系统间的调用。所以时下比较流行的rpc将是系统拆分后依赖调用的不二选择,
当前比较流行的rpc框架有阿里的dubbo和spring-cloud,还有一些如thrift这样的rpc也还算活跃。littlehow-sentinel就是为
spring-cloud集成做准备的(关于spring-cloud网上有太多文章介绍)。

feign相关文章

feign项目地址

深入理解feign-01

深入理解feign-02

使用littlehow-sentinel的目的

服务间的调用有出现很多单系统不会出现的问题,诸如系统间数据一致性如何保证啊、服务依赖关系管理啊等等;

littlehow-sentinel-feign主要解决的问题就是服务异常时降级、高峰调用限流

如何使用littlehow-sentinel

首先项目必须是springboot,JDK1.8

littlehow-sentinel地址:

littlehow-sentinel地址

sentinel集成

maven依赖(自己搭建的maven私服,依赖仅供参考)

<dependency>
    <groupId>com.littlehow</groupId>
    <artifactId>littlehow-sentinel</artifactId>
    <version>1.0.0</version>
</dependency>

sentinel-feign参考和复制地址

  • 源地址:https://github.com/alibaba/spring-cloud-alibaba/tree/master/alibaba-sentinel-spring-cloud/src/main/java/com/alibaba/cloud/sentinel/feign

项目如需要支持littlehow-sentinel,需要配置以下内容

#是否启用littlehow-sentinel
feign.sentinel.enabled=true

#该项不配置的情况下默认为(1,10,0.4#2,10,20)
#如果想要配置为默认不降级则配置为以下形式即可
#feign.sentinel.degrade =
#配置格式如:grade,timeWindow,count#grade,timeWindow,count
#同一个规则属性用,隔开,多个规则用#隔开
#grade参考com.alibaba.csp.sentinel.slots.block.RuleConstant下
#  DEGRADE_GRADE_RT:平均响应时长(ms)
#  DEGRADE_GRADE_EXCEPTION_RATIO:异常率, 例:0.4表示异常数/通过数>0.4将降级;
#  DEGRADE_GRADE_EXCEPTION_COUNT:异常数
#timeWindow:单位s,10表示10秒的时间窗口内,上面的grade统计值都在10秒窗口内计算;
#count:为double值,根据grade配置适合的数字即可
#feign.sentinel.degrade = 1,10,0.4#2,10,20

#默认为false,表示是否除了业务异常,其余所有异常都进行fallback处理
#false情况下,降级只有DegradeException,限流只有FlowException会fallback
#true情况下,只有BizException不会fallback,其余异常将全部fallback
#feign.sentinel.fallback.all = false

项目中feign没有写fallback的情况下可以配置默认全局fallback返回

系统默认返回fallback,

限流和熔断都将抛出SentinelException异常

SentinelException拥有getCode和getMessage方法,用于获取异常码和异常信息

所以需要在全局异常处理器中处理该异常

  • 熔断降级:异常码和异常信息为(“degrade exception"和"666001”)

  • 限流:异常码和异常信息为(“too many requests"和"666002”)

支持外部定义fallback

接口实现

  • 熔断降级需要实现:GlobalDegradeFallback接口
  • 限流需要实现:GlobalFlowFallback接口

生效

接受spring容器管理即可(也就是可以基于@Component一族或者@Bean注解即可)

注解使用

所有基于注解的限流、熔断、降级都在调用端生效;

Flow注解
  • grade为限流方式:FLOW_GRADE_QPS=1表示基于QPS限流,FLOW_GRADE_THREAD=0表示基于线程数限流
  • count为限流阈值:表示QPS或者线程数达到该值则进行限流
Degrade注解
  • grade为限流方式:上面properties配置项有说明
  • count为限流阈值:不同grade分别表示响应时长毫秒数、异常率、异常数
  • timeWindow为时间窗口:表示在多长的时间内(秒为单位)达到上述配置阈值则进行降级

Rule注解

可以同时配置多个限流和降级

Fallback注解

配合Degrade降级使用,fallback方法必须和原方法参数一致,或则在原方法参数基础下加上最后一个异常Throwable参数

没有使用feign怎么使用限流或降级呢

littlehow-sentinel组件提供普通降级或则限流的接入方案

基于spring容器管理的降级方案

只需要在方法上加上@Rule @Degrade @Flow注解就可自动生效

基于普通类型方案

普通方案代码如下:

public class TestService {
    private static AtomicInteger integer = new AtomicInteger();

    /**
     * 这里主要测试异常降级以及使用自动以fallback
     * @param name
     * @param age
     * @return
     */
    @Degrade
    @Fallback(FallbackService.class)
    public String getHello(String name, Integer age) {
        if (integer.getAndIncrement() % 2 == 0) {
            throw new IllegalArgumentException("这是自己定义的异常哦");
        }
        return "hello " + name + ", 已经" + age + "岁了";
    }

    /**
     * 这里主要测试限流
     * @return
     */
    @Flow(count = 10)
    public String getUUID() {
        return UUID.randomUUID().toString();
    }
}

public class FallbackService {
    private static AtomicInteger integer = new AtomicInteger();
    public String getHello(String name, Integer age, Throwable t) {
        if (integer.getAndIncrement() % 2 == 0) {
            throw new SentinelException("降级fallback处理", "888888");
        }
        return "fallback hello " + name + ",  t = " + t.getClass().getName();
    }
}

public class Run {
    public static void main(String[] args) {
        testFlow();
        testDegrade();
    }

    private static void testFlow() {
        TestService service = SentinelAopUtils.getProxyObject(TestService.class);
        for (int i = 0; i < 15; i++) {
            try {
                System.out.println(service.getUUID());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    private static void testDegrade() {
        TestService service = SentinelAopUtils.getProxyObject(TestService.class);
        for (int i = 0; i < 45; i ++) {
            try {
                System.out.println(service.getHello("littlehow", 18));
            } catch (IllegalArgumentException e) {
                System.out.println("error ------> " + e.getMessage());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

运行Run即可得到降级和限流效果

待完善功能

  • sentinel dashboard更改的持久化与实时同步功能
  • 支持不同的feign使用不同的全局fallback
  • 其他如gateway等的支持
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
spring-cloud-starter-alibaba-sentinel是一款用于微服务架构中实现流量控制、熔断降级、系统负载保护等功能的API库。 首先,它可以实现流量控制,通过设置限流规则,对微服务进行限制,避免大量请求进入服务,导致服务不可用或资源耗尽。可以设置QPS、线程数、并发数等限制条件,对请求进行控制,保障系统的稳定性。 其次,它还支持熔断降级功能。当微服务出现异常或超时时,它会根据预设的熔断规则,将服务降级,避免故障的扩散。可以通过设置异常比例、异常数等规则,对服务进行自动降级,保障系统的可用性。 另外,它还支持系统负载保护功能。通过设置系统负载的阈值,当系统负载超过一定限制时,它会自动出发保护机制,拒绝服务请求,保护系统免受过载的影响。可以设置CPU使用率、内存使用率等指标来判断系统负载情况,保持系统的稳定运行。 此外,spring-cloud-starter-alibaba-sentinel还提供了实时监控、统计和报警功能,可以通过可视化的控制台查看服务的运行状态和性能指标,及时发现问题并进行相应的调整和优化。 总之,spring-cloud-starter-alibaba-sentinel是一款功能强大的API库,可以帮助开发人员在微服务架构中实现流量控制、熔断降级、系统负载保护等功能,确保系统的稳定性和可用性。它可以有效地保护系统不受高流量、异常情况和系统负载的影响,提高系统的弹性和可扩展性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值