当前位置:首页 > 科技  > 软件

OpenFeign整合Sentinel,由浅入深,搭建属于自己的脚手架

来源: 责编: 时间:2023-11-22 09:15:08 632观看
导读本文由浅人深,带你了解如何在项目中整合OpenFeign与Sentinel,分析Sentinel源码,并打造自己的Sentinel脚手架。Sentinel是什么Sentinel是阿里巴巴开源的一款微服务流量控制组件。是面向分布式、多语言异构化服务架构的流

ud828资讯网——每日最新资讯28at.com

本文由浅人深,带你了解如何在项目中整合OpenFeign与Sentinel,分析Sentinel源码,并打造自己的Sentinel脚手架。ud828资讯网——每日最新资讯28at.com

Sentinel是什么

Sentinel是阿里巴巴开源的一款微服务流量控制组件。是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。ud828资讯网——每日最新资讯28at.com

OpenFeign调用

我们先看一下,没有整合Sentinel,OpenFeign调用异常时,是怎样的情况。假定存在两个服务,order和user,然后再order服务中,通过feign调用user中的接口。ud828资讯网——每日最新资讯28at.com

公共组件中定义接口:ud828资讯网——每日最新资讯28at.com

@FeignClient(name = "xdty-user")public interface UserApi {    @GetMapping("/getUserInfo")    ResponseResult getUserInfo();}

user服务中实现接口:ud828资讯网——每日最新资讯28at.com

public class UserController implements UserApi {    @Override    public ResponseResult getUserInfo() {        int i = 1/0; //模拟异常        return new ResponseResult("200","user info");    }}

order服务中调用user服务中的接口:ud828资讯网——每日最新资讯28at.com

@RestControllerpublic class OrderController implements OrderApi {    @Autowired    private UserApi userApi;    @Override    public ResponseResult getOrderInfo() {        return userApi.getUserInfo();    }}

利用postman访问order服务。ud828资讯网——每日最新资讯28at.com

ud828资讯网——每日最新资讯28at.com

返回接口:ud828资讯网——每日最新资讯28at.com

ud828资讯网——每日最新资讯28at.com

可以看到,这样的返回值,是非常不友好的,对于项目而言,不管接口成功与否,都应有统一的返回,如:code,message。ud828资讯网——每日最新资讯28at.com

OpenFeign整合Sentinel

引入依赖:ud828资讯网——每日最新资讯28at.com

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

启用OpenFeign整合Sentinel的自动配置。熔断是在consumer端实现的,所以在consumer端的application.yaml配置文件中添加如下配置。ud828资讯网——每日最新资讯28at.com

feign:  sentinel:    enabled: true

定义一个容错的处理类,当调用远程接口失败或超时时,会调用对应接口的容错逻辑。ud828资讯网——每日最新资讯28at.com

public class UserApiFallback implements UserApi {    @Override    public ResponseResult getUserInfo() {        return new ResponseResult("503","用户服务异常");    }}@Componentpublic class UserApiFallbackFactory implements FallbackFactory<UserApi> {    @Override    public UserApi create(Throwable cause) {        return new UserApiFallback();    }}

@FeignClient 注解上增加 fallbackFactory属性。ud828资讯网——每日最新资讯28at.com

@FeignClient(name = "xdty-user",fallbackFactory = UserApiFallbackFactory.class)public interface UserApi {    @GetMapping("/getUserInfo")    ResponseResult getUserInfo();}

再次调用接口。ud828资讯网——每日最新资讯28at.com

ud828资讯网——每日最新资讯28at.com

可以发现,服务异常后,会进行降级处理,返回统一定义的异常。ud828资讯网——每日最新资讯28at.com

全局异常封装分析

上述代码,增加了异常处理逻辑,但存在一个问题,就是每次都要为其设置fallbackFactory参数。导致项目中会多出很多冗余代码。那我们能不能有一个自己定制化的默认Fallback去处理这些相同的事情呢?ud828资讯网——每日最新资讯28at.com

要想解决这个问题,需要先了解sentinel中fallback的机制。前面提到,要使用sentinel需要配置文件中指定feign.sentinel.enabled=true。看到SentinelFeignAutoConfiguration的代码实现,我想大家也就明天这样配置的原因了。ud828资讯网——每日最新资讯28at.com

ud828资讯网——每日最新资讯28at.com

@ConditionalOnProperty 中 feign.sentinel.enabled 起了决定性作用,这也就是为什么我们需要在配置文件中指定 feign.sentinel.enabled=true。ud828资讯网——每日最新资讯28at.com

接下来看 SentinelFeign.builder 里面的实现:ud828资讯网——每日最新资讯28at.com

build方法中重新实现了super.invocationHandlerFactory方法,也就是动态代理工厂,构建的是InvocationHandler对象。ud828资讯网——每日最新资讯28at.com

build中会获取Feign Client中的信息,比如fallback,fallbackFactory等,然后创建一个SentinelInvocationHandler,SentinelInvocationHandler继承了InvocationHandler。ud828资讯网——每日最新资讯28at.com

ud828资讯网——每日最新资讯28at.com

SentinelInvocationHandler中的invoke方法里面进行熔断限流的处理。ud828资讯网——每日最新资讯28at.com

ud828资讯网——每日最新资讯28at.com

从这段代码我就可以看出,在没有配置fallback时,并没有向SentinelInvocationHandler构造方法中传入FallbackFactory。这样的话我们就有了思路:ud828资讯网——每日最新资讯28at.com

  • 编写公共FallbackFactory
  • 改写SentinelFeign使得fallbackFactory为void.class时,我们传入自己的公共FallbackFactory实例。

打造自己的sentinel脚手架

接下来,我们沿着sentinel的思路,编写一个属于自己的小小脚手架,实现统一的兜底方法。ud828资讯网——每日最新资讯28at.com

定义全局的fallback处理器。ud828资讯网——每日最新资讯28at.com

ud828资讯网——每日最新资讯28at.com

ud828资讯网——每日最新资讯28at.com

定义一个全局的FallbackFactory。ud828资讯网——每日最新资讯28at.com

ud828资讯网——每日最新资讯28at.com

重新实现spring-cloud-starter-alibaba-sentinel下的SentinelFeign。ud828资讯网——每日最新资讯28at.com

ud828资讯网——每日最新资讯28at.com

注入我们的SentinelFeign Bean。ud828资讯网——每日最新资讯28at.com

ud828资讯网——每日最新资讯28at.com

注:这里使用AutoConfigureBefore注解,要想该注解生效,必须把自定义的配置类变成自动配置类。ud828资讯网——每日最新资讯28at.com

ud828资讯网——每日最新资讯28at.com

这样,以后只要定义基本属性@FeignClient,不需要再配置fallBackFactory,就可以完成统一的兜底方法了。ud828资讯网——每日最新资讯28at.com

本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-33376-0.htmlOpenFeign整合Sentinel,由浅入深,搭建属于自己的脚手架

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 六个开发者必知必会的Git命令

下一篇: 戴尔回应“供应链将撤离中国”等传闻:均系谣言

标签:
  • 热门焦点
  • 影音体验是真的强 简单聊聊iQOO Pad

    影音体验是真的强 简单聊聊iQOO Pad

    大公司的好处就是产品线丰富,非常细分化的东西也能给你做出来,例如早先我们看到了新的vivo Pad2,之后我们又在iQOO Neo8 Pro的发布会上看到了iQOO的首款平板产品iQOO Pad。虽
  • 跑分安卓第一!Redmi K60至尊版8月发布!卢伟冰:目标年度性能之王

    跑分安卓第一!Redmi K60至尊版8月发布!卢伟冰:目标年度性能之王

    8月5日消息,Redmi K60至尊版将于8月发布,在此前举行的战略发布会上,官方该机将搭载搭载天玑9200+处理器,安兔兔V10跑分超177万分,是目前安卓阵营最高的分数
  • 服务存储设计模式:Cache-Aside模式

    服务存储设计模式:Cache-Aside模式

    Cache-Aside模式一种常用的缓存方式,通常是把数据从主存储加载到KV缓存中,加速后续的访问。在存在重复度的场景,Cache-Aside可以提升服务性能,降低底层存储的压力,缺点是缓存和底
  • 之家push系统迭代之路

    之家push系统迭代之路

    前言在这个信息爆炸的互联网时代,能够及时准确获取信息是当今社会要解决的关键问题之一。随着之家用户体量和内容规模的不断增大,传统的靠"主动拉"获取信息的方式已不能满足用
  • 小红书1周涨粉49W+,我总结了小白可以用的N条涨粉笔记

    小红书1周涨粉49W+,我总结了小白可以用的N条涨粉笔记

    作者:黄河懂运营一条性教育视频,被54万人&ldquo;珍藏&rdquo;是什么体验?最近,情感博主@公主是用鲜花做的,火了!仅仅凭借一条视频,光小红书就有超过128万人,为她疯狂点赞!更疯狂的是,这
  • “又被陈思诚骗了”

    “又被陈思诚骗了”

    作者|张思齐 出品|众面(ID:ZhongMian_ZM)如今的国产悬疑电影,成了陈思诚的天下。最近大爆电影《消失的她》票房突破30亿断层夺魁暑期档,陈思诚再度风头无两。你可以说陈思诚的
  • 华为HarmonyOS 4升级计划公布:首批34款机型今日开启公测

    华为HarmonyOS 4升级计划公布:首批34款机型今日开启公测

    8月4日消息,今天下午华为正式发布了HarmonyOS 4系统,在更流畅的前提下,还带来了不少新功能,UI设计也有变化,会让手机焕然一新。华为宣布,首批机型将会在
  •  首发天玑9200+ iQOO Neo8系列发布首销售价2299元起

    首发天玑9200+ iQOO Neo8系列发布首销售价2299元起

    2023年5月23日晚,iQOO Neo8系列正式发布。其中,Neo系列首款Pro之作——iQOO Neo8 Pro强悍登场,限时售价3099元起;价位段最强性能手机iQOO Neo8同期上市
  • 苹果140W USB-C充电器:采用氮化镓技术

    苹果140W USB-C充电器:采用氮化镓技术

    据10 月 30 日 9to5 Mac 消息报道,当苹果推出新的 MacBook Pro 2021 时,该公司还推出了新的 140W USB-C 充电器,附赠在 MacBook Pro 16 英寸机型的盒子里,也支
Top
Baidu
map