日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

OpenFeign整合Sentinel,由淺入深,搭建屬于自己的腳手架

來源: 責(zé)編: 時(shí)間:2023-11-22 09:15:08 705觀看
導(dǎo)讀本文由淺人深,帶你了解如何在項(xiàng)目中整合OpenFeign與Sentinel,分析Sentinel源碼,并打造自己的Sentinel腳手架。Sentinel是什么Sentinel是阿里巴巴開源的一款微服務(wù)流量控制組件。是面向分布式、多語言異構(gòu)化服務(wù)架構(gòu)的流

25N28資訊網(wǎng)——每日最新資訊28at.com

本文由淺人深,帶你了解如何在項(xiàng)目中整合OpenFeign與Sentinel,分析Sentinel源碼,并打造自己的Sentinel腳手架。25N28資訊網(wǎng)——每日最新資訊28at.com

Sentinel是什么

Sentinel是阿里巴巴開源的一款微服務(wù)流量控制組件。是面向分布式、多語言異構(gòu)化服務(wù)架構(gòu)的流量治理組件,主要以流量為切入點(diǎn),從流量路由、流量控制、流量整形、熔斷降級、系統(tǒng)自適應(yīng)過載保護(hù)、熱點(diǎn)流量防護(hù)等多個(gè)維度來幫助開發(fā)者保障微服務(wù)的穩(wěn)定性。25N28資訊網(wǎng)——每日最新資訊28at.com

OpenFeign調(diào)用

我們先看一下,沒有整合Sentinel,OpenFeign調(diào)用異常時(shí),是怎樣的情況。假定存在兩個(gè)服務(wù),order和user,然后再order服務(wù)中,通過feign調(diào)用user中的接口。25N28資訊網(wǎng)——每日最新資訊28at.com

公共組件中定義接口:25N28資訊網(wǎng)——每日最新資訊28at.com

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

user服務(wù)中實(shí)現(xiàn)接口:25N28資訊網(wǎng)——每日最新資訊28at.com

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

order服務(wù)中調(diào)用user服務(wù)中的接口:25N28資訊網(wǎng)——每日最新資訊28at.com

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

利用postman訪問order服務(wù)。25N28資訊網(wǎng)——每日最新資訊28at.com

25N28資訊網(wǎng)——每日最新資訊28at.com

返回接口:25N28資訊網(wǎng)——每日最新資訊28at.com

25N28資訊網(wǎng)——每日最新資訊28at.com

可以看到,這樣的返回值,是非常不友好的,對于項(xiàng)目而言,不管接口成功與否,都應(yīng)有統(tǒng)一的返回,如:code,message。25N28資訊網(wǎng)——每日最新資訊28at.com

OpenFeign整合Sentinel

引入依賴:25N28資訊網(wǎng)——每日最新資訊28at.com

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

啟用OpenFeign整合Sentinel的自動配置。熔斷是在consumer端實(shí)現(xiàn)的,所以在consumer端的application.yaml配置文件中添加如下配置。25N28資訊網(wǎng)——每日最新資訊28at.com

feign:  sentinel:    enabled: true

定義一個(gè)容錯(cuò)的處理類,當(dāng)調(diào)用遠(yuǎn)程接口失敗或超時(shí)時(shí),會調(diào)用對應(yīng)接口的容錯(cuò)邏輯。25N28資訊網(wǎng)——每日最新資訊28at.com

public class UserApiFallback implements UserApi {    @Override    public ResponseResult getUserInfo() {        return new ResponseResult("503","用戶服務(wù)異常");    }}@Componentpublic class UserApiFallbackFactory implements FallbackFactory<UserApi> {    @Override    public UserApi create(Throwable cause) {        return new UserApiFallback();    }}

@FeignClient 注解上增加 fallbackFactory屬性。25N28資訊網(wǎng)——每日最新資訊28at.com

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

再次調(diào)用接口。25N28資訊網(wǎng)——每日最新資訊28at.com

25N28資訊網(wǎng)——每日最新資訊28at.com

可以發(fā)現(xiàn),服務(wù)異常后,會進(jìn)行降級處理,返回統(tǒng)一定義的異常。25N28資訊網(wǎng)——每日最新資訊28at.com

全局異常封裝分析

上述代碼,增加了異常處理邏輯,但存在一個(gè)問題,就是每次都要為其設(shè)置fallbackFactory參數(shù)。導(dǎo)致項(xiàng)目中會多出很多冗余代碼。那我們能不能有一個(gè)自己定制化的默認(rèn)Fallback去處理這些相同的事情呢?25N28資訊網(wǎng)——每日最新資訊28at.com

要想解決這個(gè)問題,需要先了解sentinel中fallback的機(jī)制。前面提到,要使用sentinel需要配置文件中指定feign.sentinel.enabled=true。看到SentinelFeignAutoConfiguration的代碼實(shí)現(xiàn),我想大家也就明天這樣配置的原因了。25N28資訊網(wǎng)——每日最新資訊28at.com

25N28資訊網(wǎng)——每日最新資訊28at.com

@ConditionalOnProperty 中 feign.sentinel.enabled 起了決定性作用,這也就是為什么我們需要在配置文件中指定 feign.sentinel.enabled=true。25N28資訊網(wǎng)——每日最新資訊28at.com

接下來看 SentinelFeign.builder 里面的實(shí)現(xiàn):25N28資訊網(wǎng)——每日最新資訊28at.com

build方法中重新實(shí)現(xiàn)了super.invocationHandlerFactory方法,也就是動態(tài)代理工廠,構(gòu)建的是InvocationHandler對象。25N28資訊網(wǎng)——每日最新資訊28at.com

build中會獲取Feign Client中的信息,比如fallback,fallbackFactory等,然后創(chuàng)建一個(gè)SentinelInvocationHandler,SentinelInvocationHandler繼承了InvocationHandler。25N28資訊網(wǎng)——每日最新資訊28at.com

25N28資訊網(wǎng)——每日最新資訊28at.com

SentinelInvocationHandler中的invoke方法里面進(jìn)行熔斷限流的處理。25N28資訊網(wǎng)——每日最新資訊28at.com

25N28資訊網(wǎng)——每日最新資訊28at.com

從這段代碼我就可以看出,在沒有配置fallback時(shí),并沒有向SentinelInvocationHandler構(gòu)造方法中傳入FallbackFactory。這樣的話我們就有了思路:25N28資訊網(wǎng)——每日最新資訊28at.com

  • 編寫公共FallbackFactory
  • 改寫SentinelFeign使得fallbackFactory為void.class時(shí),我們傳入自己的公共FallbackFactory實(shí)例。

打造自己的sentinel腳手架

接下來,我們沿著sentinel的思路,編寫一個(gè)屬于自己的小小腳手架,實(shí)現(xiàn)統(tǒng)一的兜底方法。25N28資訊網(wǎng)——每日最新資訊28at.com

定義全局的fallback處理器。25N28資訊網(wǎng)——每日最新資訊28at.com

25N28資訊網(wǎng)——每日最新資訊28at.com

25N28資訊網(wǎng)——每日最新資訊28at.com

定義一個(gè)全局的FallbackFactory。25N28資訊網(wǎng)——每日最新資訊28at.com

25N28資訊網(wǎng)——每日最新資訊28at.com

重新實(shí)現(xiàn)spring-cloud-starter-alibaba-sentinel下的SentinelFeign。25N28資訊網(wǎng)——每日最新資訊28at.com

25N28資訊網(wǎng)——每日最新資訊28at.com

注入我們的SentinelFeign Bean。25N28資訊網(wǎng)——每日最新資訊28at.com

25N28資訊網(wǎng)——每日最新資訊28at.com

注:這里使用AutoConfigureBefore注解,要想該注解生效,必須把自定義的配置類變成自動配置類。25N28資訊網(wǎng)——每日最新資訊28at.com

25N28資訊網(wǎng)——每日最新資訊28at.com

這樣,以后只要定義基本屬性@FeignClient,不需要再配置fallBackFactory,就可以完成統(tǒng)一的兜底方法了。25N28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-33376-0.htmlOpenFeign整合Sentinel,由淺入深,搭建屬于自己的腳手架

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 六個(gè)開發(fā)者必知必會的Git命令

下一篇: 戴爾回應(yīng)“供應(yīng)鏈將撤離中國”等傳聞:均系謠言

標(biāo)簽:
  • 熱門焦點(diǎn)
Top 主站蜘蛛池模板: 福贡县| 霍州市| 东乌珠穆沁旗| 河南省| 从江县| 甘洛县| 昆山市| 大英县| 从化市| 乐山市| 青海省| 确山县| 任丘市| 左贡县| 淅川县| 文化| 前郭尔| 克什克腾旗| 英吉沙县| 阿拉善左旗| 南投市| 左权县| 满城县| 神农架林区| 区。| 远安县| 鄄城县| 孟津县| 阿克陶县| 尼木县| 余庆县| 济南市| 迁西县| 东阳市| 屏山县| 富源县| 会宁县| 桓仁| 瑞安市| 永定县| 平原县|