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

當前位置:首頁 > 科技  > 軟件

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

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

goN28資訊網——每日最新資訊28at.com

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

Sentinel是什么

Sentinel是阿里巴巴開源的一款微服務流量控制組件。是面向分布式、多語言異構化服務架構的流量治理組件,主要以流量為切入點,從流量路由、流量控制、流量整形、熔斷降級、系統自適應過載保護、熱點流量防護等多個維度來幫助開發者保障微服務的穩定性。goN28資訊網——每日最新資訊28at.com

OpenFeign調用

我們先看一下,沒有整合Sentinel,OpenFeign調用異常時,是怎樣的情況。假定存在兩個服務,order和user,然后再order服務中,通過feign調用user中的接口。goN28資訊網——每日最新資訊28at.com

公共組件中定義接口:goN28資訊網——每日最新資訊28at.com

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

user服務中實現接口:goN28資訊網——每日最新資訊28at.com

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

order服務中調用user服務中的接口:goN28資訊網——每日最新資訊28at.com

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

利用postman訪問order服務。goN28資訊網——每日最新資訊28at.com

goN28資訊網——每日最新資訊28at.com

返回接口:goN28資訊網——每日最新資訊28at.com

goN28資訊網——每日最新資訊28at.com

可以看到,這樣的返回值,是非常不友好的,對于項目而言,不管接口成功與否,都應有統一的返回,如:code,message。goN28資訊網——每日最新資訊28at.com

OpenFeign整合Sentinel

引入依賴:goN28資訊網——每日最新資訊28at.com

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

啟用OpenFeign整合Sentinel的自動配置。熔斷是在consumer端實現的,所以在consumer端的application.yaml配置文件中添加如下配置。goN28資訊網——每日最新資訊28at.com

feign:  sentinel:    enabled: true

定義一個容錯的處理類,當調用遠程接口失敗或超時時,會調用對應接口的容錯邏輯。goN28資訊網——每日最新資訊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屬性。goN28資訊網——每日最新資訊28at.com

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

再次調用接口。goN28資訊網——每日最新資訊28at.com

goN28資訊網——每日最新資訊28at.com

可以發現,服務異常后,會進行降級處理,返回統一定義的異常。goN28資訊網——每日最新資訊28at.com

全局異常封裝分析

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

要想解決這個問題,需要先了解sentinel中fallback的機制。前面提到,要使用sentinel需要配置文件中指定feign.sentinel.enabled=true。看到SentinelFeignAutoConfiguration的代碼實現,我想大家也就明天這樣配置的原因了。goN28資訊網——每日最新資訊28at.com

goN28資訊網——每日最新資訊28at.com

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

接下來看 SentinelFeign.builder 里面的實現:goN28資訊網——每日最新資訊28at.com

build方法中重新實現了super.invocationHandlerFactory方法,也就是動態代理工廠,構建的是InvocationHandler對象。goN28資訊網——每日最新資訊28at.com

build中會獲取Feign Client中的信息,比如fallback,fallbackFactory等,然后創建一個SentinelInvocationHandler,SentinelInvocationHandler繼承了InvocationHandler。goN28資訊網——每日最新資訊28at.com

goN28資訊網——每日最新資訊28at.com

SentinelInvocationHandler中的invoke方法里面進行熔斷限流的處理。goN28資訊網——每日最新資訊28at.com

goN28資訊網——每日最新資訊28at.com

從這段代碼我就可以看出,在沒有配置fallback時,并沒有向SentinelInvocationHandler構造方法中傳入FallbackFactory。這樣的話我們就有了思路:goN28資訊網——每日最新資訊28at.com

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

打造自己的sentinel腳手架

接下來,我們沿著sentinel的思路,編寫一個屬于自己的小小腳手架,實現統一的兜底方法。goN28資訊網——每日最新資訊28at.com

定義全局的fallback處理器。goN28資訊網——每日最新資訊28at.com

goN28資訊網——每日最新資訊28at.com

goN28資訊網——每日最新資訊28at.com

定義一個全局的FallbackFactory。goN28資訊網——每日最新資訊28at.com

goN28資訊網——每日最新資訊28at.com

重新實現spring-cloud-starter-alibaba-sentinel下的SentinelFeign。goN28資訊網——每日最新資訊28at.com

goN28資訊網——每日最新資訊28at.com

注入我們的SentinelFeign Bean。goN28資訊網——每日最新資訊28at.com

goN28資訊網——每日最新資訊28at.com

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

goN28資訊網——每日最新資訊28at.com

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

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

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 六個開發者必知必會的Git命令

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

標簽:
  • 熱門焦點
  • 把LangChain跑起來的三個方法

    使用LangChain開發LLM應用時,需要機器進行GLM部署,好多同學第一步就被勸退了,那么如何繞過這個步驟先學習LLM模型的應用,對Langchain進行快速上手?本片講解3個把LangChain跑起來
  • 一個注解實現接口冪等,這樣才優雅!

    場景碼猿慢病云管理系統中其實高并發的場景不是很多,沒有必要每個接口都去考慮并發高的場景,比如添加住院患者的這個接口,具體的業務代碼就不貼了,業務偽代碼如下:圖片上述代碼有
  • 共享單車的故事講到哪了?

    來源丨海克財經與共享充電寶相差不多,共享單車已很久沒有被國內熱點新聞關照到了。除了一再漲價和用戶直呼用不起了。近日多家媒體再發報道稱,成都、天津、鄭州等地多個共享單
  • 品牌洞察丨服務本地,美團直播成效幾何?

    來源:17PR7月11日,美團App首頁推薦位出現&ldquo;美團直播&rdquo;的固定入口。在直播聚合頁面,外賣&ldquo;神槍手&rdquo;直播間、美團旅行直播間、美團買菜直播間等均已上線,同時
  • ESG的面子與里子

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之三伏大幕拉起,各地高溫預警不絕,但處于厄爾尼諾大&ldquo;烤&rdquo;之下的除了眾生,還有各大企業發布的ESG報告。ESG是&ldquo;環境保
  • 郭明錤稱華為和江淮汽車合作開發問界MPV,定價100萬左右、計劃明年量產

    8 月 1 日消息,郭明錤今天在 Medium 平臺發布博文,稱華為正在和江淮汽車合作,開發售價在 100 萬元的問界 MPV,預計在 2024 年第 2 季度量產,銷量目標為
  • 自研Exynos回歸!三星Galaxy S24系列將提供Exynos和驍龍雙版本

    年初,全新的三星Galaxy S23系列發布,包含Galaxy S23、Galaxy S23+和Galaxy S23 Ultra三個版本,全系搭載超頻版驍龍8 Gen 2,雖同樣采用臺積電4nm工藝制
  • iQOO 11S新品發布會

    iQOO將在7月4日19:00舉行新品發布會,推出杭州亞運會電競賽事官方用機iQOO 11S。
  • 2299元起!iQOO Pad開啟預售:性能最強天璣平板

    5月23日,iQOO如期舉行了新品發布會,除了首發安卓最強旗艦處理器的iQOO Neo8系列新機外,還在發布會上推出了旗下首款平板電腦——iQOO Pad,其搭載了天璣
Top 主站蜘蛛池模板: 香格里拉县| 麟游县| 稻城县| 福安市| 高尔夫| 江川县| 屏东市| 沭阳县| 郧西县| 延庆县| 天台县| 临海市| 托克托县| 田阳县| 屏山县| 东安县| 五河县| 北京市| 陆川县| 舟山市| 林芝县| 凤台县| 惠水县| 盘锦市| 同仁县| 芜湖县| 吴堡县| 铁力市| 仪陇县| 隆化县| 桐柏县| 江都市| 自治县| 专栏| 宁都县| 永川市| 固原市| 霍山县| 上犹县| 杭州市| 扎兰屯市|