成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

Spring Cloud Feign 自定義配置(重試、攔截與錯誤碼處理) 代碼實踐

瀏覽:143日期:2023-08-19 14:55:19

基于 spring-boot-starter-parent 2.1.9.RELEASE, spring-cloud-openfeign 2.1.3.RELEASE

引子

Feign 是一個聲明式、模板化的HTTP客戶端,簡化了系統發起Http請求。創建它時,只需要創建一個接口,然后加上FeignClient注解,使用它時,就像調用本地方法一樣,作為開發者的我們完全感知不到這是在調用遠程的方法,也感知不到背后發起了HTTP請求:

/** * @author axin * @suammry xx 客戶端 */@FeignClient(value = 'xxClient',url = '${xx.host:www.axin.com}')public interface DemoClient { @PostMapping(value = '/xxx/url', headers = 'Content-Type=application/json'}) yourResponse requestHTTP(@RequestBody JSONObject param);}

上述的代碼就是一個定義一個Feign HTTP 客戶端,在其他類中只需要 @Autowired DemoClient,就可以像調用本地方法一樣發起HTTP請求。

介紹就到這,接下來進入主題,因為 FeignClient 將發起HTTP請求與解析返回報文都做了包裝,如果你的業務場景需要定制一些調用機制,比如:

我想在發起請求響應超時失敗時自動重試 —— 自定義重試機制 我想單獨對某些異常的HTTP狀態碼特殊處理 —— 自定義ErrorDecoder 服務端接口需要驗證簽名,所以我方在發起請求時要生成簽名然后傳過去 —— 定義 Fegin 攔截器

基于此,本文就以上述3個需求場景為例來介紹如何自定義 FeignClient 的配置

FeignClient的默認配置類

Feign Client 默認的配置類為 FeignClientsConfiguration, 這個類在 spring-cloud-netflix-core 的 jar 包下。

默認注入了很多 Feign 相關的配置Bean,包括FeignRetryer、 FeignLoggerFactory 和 FormattingConversionService 等。另外,Decoder、Encoder和 Contract 這3個類在沒有Bean被注入的情況下,會自動注入默認配置的 Bean,即ResponseEntity Decoder、SpringEncoder 和 SpringMvcContract。

如果你不知道如何自己定義配置時,不放點進去看看人家默認配置是如何實現的。這里就不曬源碼了。

FeignClient 注解參數

每個注解參數都做了注釋,詳情請見下方源碼:

@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface FeignClient {/** * 指定FeignClient的名稱,如果項目使用了Ribbon,name屬性會作為微服務的名稱,用于服務發現 */@AliasFor('name')String value() default '';@DeprecatedString serviceId() default '';@AliasFor('value')String name() default '';/** * Sets the <code>@Qualifier</code> value for the feign client. * 這個bean在應用上下文中的名字為接口的全限定名,你也可以使用 @FeignClient 注解中的 qualifier 屬性給bean指定一個別名 */String qualifier() default '';/** * url地址 */String url() default '';/** * 當發生404錯誤,如果該字段為true,會調用decoder進行解碼,否則拋出FeignException */boolean decode404() default false;/** * 指定FeignClient 的配置類,優先級最高,默認的配置類為 FeignClientsConfiguration類 */Class<?>[] configuration() default {};/** * 配置熔斷器的處理類 */Class<?> fallback() default void.class;/** * 工廠類,用于生產fallback類示例,通過這個屬性我們可以實現每個接口通用的容錯邏輯,減少重復代碼 */Class<?> fallbackFactory() default void.class;/** * 定義統一的路徑前綴 */String path() default '';/** * Whether to mark the feign proxy as a primary bean. Defaults to true. */boolean primary() default true;}

自定義Feign配置類

在 Spring Cloud 中,你可以通過 @FeignClient 注解聲明額外的配置(比 FeignClientsConfiguration 級別高)去控制feign客戶端,以一開始的feign接口為例:

/** * @author axin * @suammry xx 客戶端 */@FeignClient(value = 'xxClient',url = '${xx.host:www.axin.com}',configuration = MyConfiguration.class)public interface DemoClient { @PostMapping(value = '/xxx/url', headers = 'Content-Type=application/json'}) yourResponse requestHTTP(@RequestBody JSONObject param);}

在上面這個示例中,feign客戶端在MyConfiguration中的配置將會覆蓋FeignClientsConfiguration中的配置。

要注意的是: MyConfiguration不需要使用@Configuration注解。如果加上了,它將全局生效。

Retryer-重試機制的自定義

/** * @author axin * @summary fegin 客戶端的自定義配置 */public class MyConfiguration { /** * 自定義重試機制 * @return */ @Bean public Retryer feignRetryer() { //fegin提供的默認實現,最大請求次數為5,初始間隔時間為100ms,下次間隔時間1.5倍遞增,重試間最大間隔時間為1s, return new Retryer.Default(); }}

ErrorDecoder-錯誤解碼器的自定義

當feign調用返回HTTP報文時,會觸發這個方法,方法內可以獲得HTTP狀態碼,可以用來定制一些處理邏輯等等。

/** * @author axin * @summary fegin 客戶端的自定義配置 */@Slf4jpublic class MyConfiguration { /** * 自定義重試機制 * @return */ @Bean public Retryer feignRetryer() { //最大請求次數為5,初始間隔時間為100ms,下次間隔時間1.5倍遞增,重試間最大間隔時間為1s, return new Retryer.Default(); } @Bean public ErrorDecoder feignError() { return (key, response) -> { if (response.status() == 400) {log.error('請求xxx服務400參數錯誤,返回:{}', response.body()); } if (response.status() == 409) {log.error('請求xxx服務409異常,返回:{}', response.body()); } if (response.status() == 404) {log.error('請求xxx服務404異常,返回:{}', response.body()); } // 其他異常交給Default去解碼處理 // 這里使用單例即可,Default不用每次都去new return new ErrorDecoder.Default().decode(key, response); }; }}

采用了lambda的寫法,response變量是Response類型,通過status()方法可以拿到返回的HTTP狀態碼,body()可以獲得到響應報文。

Feign攔截器實踐

攔截器在請求發出之前執行,在攔截器代碼里可以修改請求參數,header等等,如果你有簽名生成的需求,可以放在攔截器中來實現

/** * @author axin * @summary fegin 客戶端的自定義配置 */@Slf4jpublic class MyConfiguration { /** * 自定義重試機制 * @return */ @Bean public Retryer feignRetryer() { //最大請求次數為5,初始間隔時間為100ms,下次間隔時間1.5倍遞增,重試間最大間隔時間為1s, return new Retryer.Default(); } @Bean public ErrorDecoder feignError() { return (key, response) -> { if (response.status() == 400) {log.error('請求xxx服務400參數錯誤,返回:{}', response.body()); } if (response.status() == 409) {log.error('請求xxx服務409異常,返回:{}', response.body()); } if (response.status() == 404) {log.error('請求xxx服務404異常,返回:{}', response.body()); } // 其他異常交給Default去解碼處理 // 這里使用單例即可,Default不用每次都去new return new ErrorDecoder.Default().decode(key, response); }; } /** * fegin 攔截器 * @return */ @Bean public RequestInterceptor cameraSign() { return template -> { // 如果是get請求 if (template.method().equals(Request.HttpMethod.GET.name())) {//獲取到get請求的參數Map<String, Collection<String>> queries = template.queries(); } //如果是Post請求 if (template.method().equals(Request.HttpMethod.POST.name())) {//獲得請求bodyString body = template.requestBody().asString();JSONPObject request = JSON.parseObject(body, JSONPObject.class); } //Do what you want... 例如生成接口簽名 String sign = '根據請求參數生成的簽名'; //放入url?之后 template.query('sign', sign); //放入請求body中 String newBody = '原有body' + sign; template.body(Request.Body.encoded(newBody.getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8)); }; }}

可以看到代碼中給了如何獲取請求參數和修改請求參數的示例。

總結

小結一下,對于開頭提出的場景:

我想在發起請求響應超時失敗時自動重試 —— 自定義重試機制 我想單獨對某些異常的HTTP狀態碼特殊處理 —— 自定義ErrorDecoder 服務端接口需要驗證簽名,所以我方在發起請求時要生成簽名然后傳過去 —— 定義 Fegin 攔截器

給出了自定義 feign 配置的方式實現的樣例代碼,希望對你有用,如果有更好的方式簡化HTTP請求,歡迎留言分享~

參考鏈接

重新定義Spring Cloud實戰

Spring Cloud Netflix官方文檔

總結

到此這篇關于Spring Cloud Feign 自定義配置(重試、攔截與錯誤碼處理) 實踐的文章就介紹到這了,更多相關Spring Cloud Feign 自定義配置內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
极品少妇一区二区| 亚洲午夜精品福利| 精品91在线| 26uuu欧美| 国产精品一区二区在线观看不卡 | 成人国产视频在线观看 | 国产精品三级在线观看| av福利精品导航| 日韩欧美一卡二卡| 精品一区二区三区在线播放视频| 色婷婷综合久久久中文一区二区| 亚洲亚洲人成综合网络| 国产午夜精品在线| 一区二区三区91| 亚洲综合国产| 亚洲一区免费视频| 国产精品欧美久久| 亚洲一区二区黄色| 亚洲欧美春色| 亚洲国产精品一区二区久久| 999亚洲国产精| 亚洲精品日日夜夜| 国产偷国产偷亚洲高清97cao| 亚洲色图欧洲色图婷婷| 黄色工厂这里只有精品| 国产精品天天看| 一区精品在线| 亚洲精品欧美专区| 一本不卡影院| 亚洲图片有声小说| 媚黑女一区二区| 午夜私人影院久久久久| 色吧成人激情小说| 欧美aaaaaa午夜精品| 欧美精品一二三四| 不卡av在线网| 久久婷婷国产综合国色天香 | 日韩理论片一区二区| 国内精品久久久久久久影视麻豆 | 国产一本一道久久香蕉| 4438亚洲最大| 丰满放荡岳乱妇91ww| 久久久美女毛片| 欧美日韩精品不卡| 亚洲欧美另类久久久精品| 国产日韩欧美三级| 美国av一区二区| 欧美一卡2卡3卡4卡| 色综合中文字幕| 成人午夜电影小说| 久久综合一区二区| 午夜精品视频| 亚洲女子a中天字幕| 另类亚洲自拍| 久久精品国产在热久久| 欧美一级生活片| 99精品视频在线观看| 日本一区二区三区dvd视频在线| 亚洲成人自拍视频| 香蕉久久夜色精品国产使用方法| 欧美三级电影在线看| 成人精品一区二区三区四区| 国产日韩欧美精品在线| 亚洲黄色毛片| 麻豆91在线观看| 精品区一区二区| 欧美福利电影在线观看| 一区二区三区四区av| 在线观看一区日韩| 成人av网站在线观看免费| 国产精品久久久久四虎| 久久精品日产第一区二区| 国产精品一区二区在线观看不卡| 国产日产欧美精品一区二区三区| 国产嫩草一区二区三区在线观看 | 水野朝阳av一区二区三区| 欧美蜜桃一区二区三区| 91麻豆国产自产在线观看| 亚洲综合清纯丝袜自拍| 欧美在线观看一区二区| 色综合一区二区| 偷拍日韩校园综合在线| 日韩精品一区二区在线| 99精品国产一区二区青青牛奶| 久久国产精品露脸对白| 日本一区二区三区四区在线视频 | 99久久99久久综合| 一区二区三区精品视频在线| 欧美日韩亚洲综合一区| 欧美日韩ab| 青草国产精品久久久久久| 精品国产伦一区二区三区观看体验| 黄色国产精品一区二区三区| 久久成人免费电影| 亚洲国产岛国毛片在线| 91国产免费观看| 欧美在线国产| 日日夜夜精品视频免费| 国产日本亚洲高清| 久久青青草原一区二区| 99久久亚洲一区二区三区青草 | 本田岬高潮一区二区三区| 亚洲一区二区高清| 久久综合久久鬼色| 色综合久久99| 99精品视频在线观看| 亚洲福利一区二区三区| 精品99999| 色欧美日韩亚洲| 欧美在线日韩| 日本不卡的三区四区五区| 国产精品久久精品日日| 欧美日韩日日骚| 日韩亚洲在线| 91亚洲精品久久久蜜桃网站 | 中文字幕精品—区二区四季| 色八戒一区二区三区| 色综合色狠狠天天综合色| 青青草原综合久久大伊人精品优势| 国产精品色在线观看| 69久久夜色精品国产69蝌蚪网| 国产亚洲一区在线播放| 欧美精品福利| 国产成人综合亚洲91猫咪| 午夜精品福利在线| 国产精品天天摸av网| 7777精品伊人久久久大香线蕉最新版| 一本一本久久| 欧美不卡三区| 国产91丝袜在线观看| 青青草国产成人av片免费| 亚洲男女一区二区三区| 久久久精品欧美丰满| 色诱亚洲精品久久久久久| 亚洲成人在线视频网站| 成人av动漫网站| 久久国产精品99久久人人澡| 亚洲一二三级电影| 国产精品不卡在线观看| 精品久久久三级丝袜| 欧美日韩成人激情| 久久精品一区二区三区中文字幕| 亚洲国产高清一区| 欧美国产综合| 成人精品小蝌蚪| 国产一区二区毛片| 日本欧美一区二区| 一区二区在线观看视频| 久久久精品欧美丰满| 日韩欧美高清在线| 在线播放欧美女士性生活| 色香蕉成人二区免费| 欧美亚洲一区二区三区| 精品1区2区| 黄色成人精品网站| 欧美成熟视频| 91麻豆精品秘密| 91香蕉视频污| www.亚洲免费av| 粉嫩蜜臀av国产精品网站| 黄色成人免费在线| 久久91精品久久久久久秒播| 日韩av一二三| 亚洲电影一区二区三区| 亚洲精品国产高清久久伦理二区| 国产精品伦理一区二区| 国产欧美一区二区三区鸳鸯浴 | 日韩理论片中文av| 专区另类欧美日韩| 国产精品国产自产拍在线| 中文字幕乱码一区二区免费| 国产亚洲成av人在线观看导航| 精品久久久久久无| 欧美一区二区私人影院日本| 欧美高清精品3d| 精品视频在线看| 精品视频在线免费| 精品污污网站免费看| 欧美日韩国产免费一区二区| 欧美三级资源在线| 91精品欧美一区二区三区综合在 | 久久成人免费电影| 免费三级欧美电影| 看片的网站亚洲| 国产美女在线精品| 国产美女视频一区| 不卡的电影网站| 欧美日韩岛国| 99精品视频免费观看视频| 国产精品一区二区在线观看| 可以免费看不卡的av网站| 91国产福利在线| 337p亚洲精品色噜噜| 欧美一级片在线| 精品国产电影一区二区| 久久久久久一二三区| 中文字幕免费不卡在线| 18欧美亚洲精品| 亚洲欧美一区二区三区极速播放 | 欧美激情五月|