前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OpenFeign整合Sentinel实现熔断降级

OpenFeign整合Sentinel实现熔断降级

作者头像
吴就业
发布2020-07-13 14:27:47
2.4K0
发布2020-07-13 14:27:47
举报
文章被收录于专栏:Java艺术Java艺术Java艺术

常用于实现熔断降级的框架有HystrixSentinel,我们常说的Spring Cloud项目说的其实是Spring Cloud NetflixHystrix以及前面学习过的Ribbon都是Netflix系的家族成员,所以使用Hystrix可以非常简单的与当前项目中使用到的OpenFeignRibbon整合,但笔者并没有选择Hystrix,而是选择阿里系的Sentinel

为什么选择Sentinel而不是Hystrix?从接入简单考虑可能选择Hystrix是不错的选择,但笔者对Hystrix比较陌生,陌生到只听过名字。笔记在去年做的Dubbo项目中使用过Sentinel,所以对Sentinel很熟悉,并且看过它的一点底层源码,例如,如何统计当前时间窗口的QPS、计算并发使用的线程数等。所以笔者选择的是自己熟悉的。

SentinelHystrix谁更好?由于不了解Hystrix,所以这个问题笔者回答不了,但合适最重要,能够达到目的,并且不会消耗应用资源,不影响性就可以。并不是不愿意去学Hystrix,只是觉得没有必要,学一个这种框架从入门到熟悉部分源码也就两三天时间。使用Sentinel有一个好处,文档是中文的,使用文档介绍的也比较齐全,对入门较友好。

OpenFeign整合Sentinel实现熔断降级

按照惯性,本篇先介绍如何将SentinelOpenFeign整合使用,并且熔断降级策略使用动态配置,将配置存储在配置中心。

sck-demo项目源码地址:sck-demo (这是一个使用Spring Cloud Kubernetes搭建的微服务demo工程,可翻阅往期文章学习Spring Cloud Kubernetes的使用以及源码分析)。

Sentinel官方使用文档:https://github.com/alibaba/Sentinel/wiki/%E7%86%94%E6%96%AD%E9%99%8D%E7%BA%A7

引入依赖

借助spring-cloud-starter-alibaba-sentinel实现与OpenFeign整合,下一篇分析完源码之后,我们也可以自己实现一个spring-cloud-starter-kubernetes-sentinel(滑稽)。

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

引入该依赖也会将sentinel-core以及sentinel-datasource-extension引入,实际上实现熔断降级我们只需要这两个jar包就够了,当然,前提是自己实现与OpenFeign的整合。而spring-cloud-starter-alibaba-sentinel提供了SentinelOpenFeign整合使用的实现。

启用OpenFeign整合Sentinel的自动配置

熔断是在consumer端实现的,所以在consumer端的application.yaml配置文件中添加如下配置。

feign:
  sentinel:
    enabled: true

自己实现动态数据源,接入配置中心

通过继承AbstractDataSource实现自定义数据源,降级规则以什么格式存储由你来定,由于sck-demo项目使用KubernetesConfigMap资源存储动态配置,所以笔者选择使用yaml格式配置降级规则。

创建用于装载降级规则配置的PropertiesDegradeRuleProps,代码如下。

自定义降级规则数据源DegradeRuleDataSource实现代码如下。

动态数据源只是接口,实现了动态数据源并不意味着Sentinel会帮你实现初始化加载或者更新降级规则。所以我们在Bean的初始化方法中初始化加载一次降级规则,并实现ApplicationListener接口监听RefreshScopeRefreshedEvent动态配置刷新事件,当配置改变时,重新加载降级规则。

让降级规则生效只需要调用DegradeRuleManagerloadRules方法,让Sentinel更新降级规则DegradeRule。如果不配置任何降级规则,则不会对任何资源降级,但Sentinel依然会统计每个资源的时间窗口数据。

编写自动配置类

编写自动配置类SentinelAutoConfiguration,当feign.sentinel.enabled开启时,也就是启动OpenFeign整合Sentinel的自动配置时,再将数据源注册到Spring容器中。最好将数据源写在一个组件模块中,实现代码共用。

resources目录下创建一个META-INF目录,添加spring.factories文件,在文件中添加如下内容。

本地测试

本地测试不使用配置中心,直接在application-[activeProfile].yaml文件中添加降级规则,例如。

测试例子配置两个熔断降级规则,resource资源名称配置格式为:(请求方式)+":"+资源url。以资源POST:http://localhost:8080/v1/demo1为例,该资源配置使用的降级规则为DEGRADE_GRADE_EXCEPTION_COUNT(对于值为2),总数为10,时间窗口为1秒,最新请求数5。意思是,如果当前时间窗口内(1秒内)调用资源的总数大于5,并且出现异常总数大于10时,接下来的请求将触发熔断,直到下个时间周期到来重新计算。

笔者去年抄过Sentinel的时间窗口请求数据统计的源码,通过修改实现通用QPS统计工具包qps-helperGithub下载地址:qps-helper。感兴趣可以看下。

给@FeignClient注解配置异常回调

最后给接口上的@FeignClient注解配置fallback属性,配置降级处理。fallback属性要求配置一个类,该类必须实现相同的接口。

ServiceDegradeFallback类中处理降级逻辑,例如,响应一个状态码告知服务降级接口调用失败。

我们还需要将该ServiceDegradeFallback注册到FeignClinet环境隔离的容器中。编写配置类SentinelFeignConfig,将SentinelFeignConfig添加到@FeignClient注解的configuration属性。

SentinelFeignConfig中注册ServiceDegradeFallback

当满足熔断条件时,Sentinel会抛出一个DegradeException异常,如果配置了fallback,那么Sentinel会从Bean工厂中根据取fallback属性配置的类型取一个Bean调用相同的方法。

但有一点不足的地方,我们在ServiceDegradeFallback中无法获取异常的类型,无法判断是否是熔断降级,只能把所有情况都当初熔断降级处理。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-07-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java艺术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引入依赖
  • 启用OpenFeign整合Sentinel的自动配置
  • 自己实现动态数据源,接入配置中心
  • 编写自动配置类
  • 本地测试
  • 给@FeignClient注解配置异常回调
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档