日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

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

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

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

引子

Feign 是一個聲明式、模板化的HTTP客戶端,簡化了系統(tǒng)發(fā)起Http請求。創(chuàng)建它時,只需要創(chuàng)建一個接口,然后加上FeignClient注解,使用它時,就像調(diào)用本地方法一樣,作為開發(fā)者的我們完全感知不到這是在調(diào)用遠(yuǎn)程的方法,也感知不到背后發(fā)起了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,就可以像調(diào)用本地方法一樣發(fā)起HTTP請求。

介紹就到這,接下來進(jìn)入主題,因?yàn)?FeignClient 將發(fā)起HTTP請求與解析返回報文都做了包裝,如果你的業(yè)務(wù)場景需要定制一些調(diào)用機(jī)制,比如:

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

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

FeignClient的默認(rèn)配置類

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

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

如果你不知道如何自己定義配置時,不放點(diǎn)進(jìn)去看看人家默認(rèn)配置是如何實(shí)現(xiàn)的。這里就不曬源碼了。

FeignClient 注解參數(shù)

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

@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface FeignClient {/** * 指定FeignClient的名稱,如果項目使用了Ribbon,name屬性會作為微服務(wù)的名稱,用于服務(wù)發(fā)現(xiàn) */@AliasFor('name')String value() default '';@DeprecatedString serviceId() default '';@AliasFor('value')String name() default '';/** * Sets the <code>@Qualifier</code> value for the feign client. * 這個bean在應(yīng)用上下文中的名字為接口的全限定名,你也可以使用 @FeignClient 注解中的 qualifier 屬性給bean指定一個別名 */String qualifier() default '';/** * url地址 */String url() default '';/** * 當(dāng)發(fā)生404錯誤,如果該字段為true,會調(diào)用decoder進(jìn)行解碼,否則拋出FeignException */boolean decode404() default false;/** * 指定FeignClient 的配置類,優(yōu)先級最高,默認(rèn)的配置類為 FeignClientsConfiguration類 */Class<?>[] configuration() default {};/** * 配置熔斷器的處理類 */Class<?> fallback() default void.class;/** * 工廠類,用于生產(chǎn)fallback類示例,通過這個屬性我們可以實(shí)現(xiàn)每個接口通用的容錯邏輯,減少重復(fù)代碼 */Class<?> fallbackFactory() default void.class;/** * 定義統(tǒng)一的路徑前綴 */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-重試機(jī)制的自定義

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

ErrorDecoder-錯誤解碼器的自定義

當(dāng)feign調(diào)用返回HTTP報文時,會觸發(fā)這個方法,方法內(nèi)可以獲得HTTP狀態(tài)碼,可以用來定制一些處理邏輯等等。

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

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

Feign攔截器實(shí)踐

攔截器在請求發(fā)出之前執(zhí)行,在攔截器代碼里可以修改請求參數(shù),header等等,如果你有簽名生成的需求,可以放在攔截器中來實(shí)現(xiàn)

/** * @author axin * @summary fegin 客戶端的自定義配置 */@Slf4jpublic class MyConfiguration { /** * 自定義重試機(jī)制 * @return */ @Bean public Retryer feignRetryer() { //最大請求次數(shù)為5,初始間隔時間為100ms,下次間隔時間1.5倍遞增,重試間最大間隔時間為1s, return new Retryer.Default(); } @Bean public ErrorDecoder feignError() { return (key, response) -> { if (response.status() == 400) {log.error('請求xxx服務(wù)400參數(shù)錯誤,返回:{}', response.body()); } if (response.status() == 409) {log.error('請求xxx服務(wù)409異常,返回:{}', response.body()); } if (response.status() == 404) {log.error('請求xxx服務(wù)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請求的參數(shù)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 = '根據(jù)請求參數(shù)生成的簽名'; //放入url?之后 template.query('sign', sign); //放入請求body中 String newBody = '原有body' + sign; template.body(Request.Body.encoded(newBody.getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8)); }; }}

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

總結(jié)

小結(jié)一下,對于開頭提出的場景:

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

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

參考鏈接

重新定義Spring Cloud實(shí)戰(zhàn)

Spring Cloud Netflix官方文檔

總結(jié)

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

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美国产美女| 久久国内精品自在自线400部| 国产一区一一区高清不卡| 91综合网人人| 怡红院精品视频在线观看极品| 国产一区成人| 国产日韩欧美一区二区三区在线观看 | 国产精品13p| 婷婷中文字幕一区| 日本在线视频一区二区| 精品国产美女a久久9999| 久久精品123| 亚洲日韩视频| 国产精品成久久久久| 99香蕉国产精品偷在线观看 | 蜜臀av一区二区在线免费观看| 亚洲三级在线| 成人午夜亚洲| 91久久久精品国产| 奇米777国产一区国产二区| 最新中文字幕在线播放| 久久电影一区| 麻豆免费精品视频| 精品欧美激情在线观看| 欧美一区激情| 久久久久久久久久久9不雅视频| 蜜桃视频第一区免费观看| 国产乱码精品一区二区亚洲| 亚洲精品**中文毛片| 亚洲精品黄色| 麻豆视频在线观看免费网站黄| 日韩视频一区| 久久99国产精品视频| 欧美精品一线| 久久一区视频| 亚洲一区观看| 麻豆视频观看网址久久| 欧美成人精品| 美腿丝袜亚洲一区| 亚洲一区二区毛片| 神马午夜在线视频| 亚洲精品大全| 91精品精品| 老司机精品视频网| 日韩精品一二三| 日韩电影免费网址| 日韩 欧美一区二区三区| 欧美日韩精品免费观看视完整| 日本aⅴ精品一区二区三区| 久久精品免费一区二区三区| 久久狠狠亚洲综合| 蜜桃久久精品一区二区| se01亚洲视频 | 国产乱人伦丫前精品视频| 日韩视频在线一区二区三区| 神马久久午夜| 麻豆极品一区二区三区| 日韩中文字幕区一区有砖一区 | 美女精品网站| 香蕉成人av| 精品一区二区三区四区五区| 蜜桃一区二区三区在线观看| 国产99久久| 国产va免费精品观看精品视频| 日韩国产在线不卡视频| 国户精品久久久久久久久久久不卡| 麻豆免费精品视频| 国产情侣一区在线| 少妇精品在线| 午夜在线播放视频欧美| 中文字幕系列一区| 成人精品国产亚洲| 久久不见久久见中文字幕免费| 中文字幕日韩高清在线| 成人av二区| 久久久人人人| 日韩国产激情| 91中文字幕精品永久在线| 久久福利在线| 国产亚洲电影| 日韩高清成人在线| 亚洲三级网址| 日韩中文字幕1| 欧美在线综合| 蘑菇福利视频一区播放| 欧美日韩一二三四| 日韩欧美少妇| 在线观看精品| 久久一区二区三区电影| 久久免费黄色| 欧美综合另类| 黑丝美女一区二区| 欧美精品羞羞答答| 欧美午夜精彩| 欧美1区免费| 在线视频亚洲| 久久亚洲电影| 免费人成精品欧美精品| 三级一区在线视频先锋| 亚洲一级淫片| 在线看片日韩| 亚洲精品视频一二三区| 亚洲日韩视频| 91欧美极品| 国产精品久久久久毛片大屁完整版| 国产亚洲精品美女久久| 国产精品综合| 精品国产乱码久久久久久1区2匹| 色一区二区三区四区| 日韩专区精品| 九九综合在线| 三级一区在线视频先锋| 亚洲美女久久| 国产区精品区| 国产 日韩 欧美 综合 一区| 免费观看亚洲| 伊人久久亚洲美女图片| 亚洲欧洲日韩| 欧美国产视频| 韩国久久久久久| 午夜久久美女| 日韩精品视频网| 麻豆精品新av中文字幕| 日韩精品dvd| 亚洲女同一区| 日韩精品乱码av一区二区| 国产激情一区| 久久精品欧美一区| 中文一区一区三区免费在线观| 国产日产精品_国产精品毛片| 久久久91麻豆精品国产一区| 日韩影院二区| 在线观看视频免费一区二区三区| 欧美一区激情| 欧洲一级精品| 亚洲精品福利| 高清日韩中文字幕| 日韩视频一区| 国产精品成人自拍| 成人午夜国产| 亚洲在线久久| 精品欧美视频| 91久久中文| 国产亚洲第一伦理第一区| a国产在线视频| 亚洲欧美网站| 精品免费在线| 久久先锋影音| 成人三级高清视频在线看| 香蕉精品999视频一区二区| 国产精品分类| 亚洲激情偷拍| 精品免费在线| 综合激情在线| 日韩欧美另类一区二区| 日韩国产一区二| 99tv成人| 国产情侣一区在线| 欧美~级网站不卡| 欧美激情在线精品一区二区三区| 亚洲成人av观看| 日本成人一区二区| 啪啪国产精品| 国产欧美69| 欧美日韩国产免费观看视频| 久久激情综合网| 欧美午夜不卡影院在线观看完整版免费| 欧美片第1页综合| 波多野结衣一区| 麻豆久久久久久| 中文字幕日韩高清在线| 蜜桃精品在线| 国产精品v日韩精品v欧美精品网站| 午夜久久tv| 97国产精品| 日韩二区三区在线观看| 免费不卡中文字幕在线| 麻豆国产欧美一区二区三区| 喷白浆一区二区| 日韩精品91| 国产午夜一区| 只有精品亚洲| 午夜av一区| 在线看片国产福利你懂的| 欧美精品国产一区| 麻豆精品网站| 国产精品97| 中文字幕系列一区| 狠狠久久伊人| 欧美亚洲免费| 国产亚洲一区在线| 日韩成人亚洲| 精品一区二区男人吃奶| 日韩毛片网站| 丝袜美腿亚洲一区| 女人av一区| 日韩一区电影| 91一区二区| 久久精品一区二区三区中文字幕| 亚洲精品九九|