Java | 使用OpenFeign管理多個第三方服務調用

背景

最近開發(fā)了一個統(tǒng)一調度類的項目檐什,需要依賴多個第三方服務牵祟,這些服務都提供了HTTP接口供我調用深夯。

組件架構

服務多、接口多诺苹,如何進行第三方服務管理和調用就成了問題咕晋。

常用的服務間調用往往采用zkEureka等注冊中心進行服務管理(SpringBoot常使用SpringCloud)收奔。OpenFeign也是SpringCloud的解決方案之一掌呜。我們單獨使用OpenFeign, 無需對原有第三方服務進行改動坪哄,本服務開發(fā)時的引入也很輕量质蕉。

下面給出我的用法。

應用

maven依賴

引入maven依賴:

       <dependency>
           <groupId>io.github.openfeign</groupId>
           <artifactId>feign-core</artifactId>
           <version>10.2.3</version>
       </dependency>
       <dependency>
           <groupId>io.github.openfeign</groupId>
           <artifactId>feign-gson</artifactId>
           <version>10.2.3</version>
       </dependency>
       <dependency>
           <groupId>io.github.openfeign.form</groupId>
           <artifactId>feign-form</artifactId>
           <version>3.8.0</version>
       </dependency>
       <dependency>
           <groupId>io.github.openfeign.form</groupId>
           <artifactId>feign-form-spring</artifactId>
           <version>3.8.0</version>
       </dependency>

其中翩肌,form相關引入是為了解決ContentTypeapplication/x-www-form-urlencodedmultipart/form-data的編碼問題模暗。

配置和服務聲明

第三方服務的地址通過配置來注入。

服務地址配置

ThirdpartServiceConfig.java

@Data
@Component
@ConfigurationProperties(prefix = "thirdpart-service")
public class ThirdpartServiceConfig {
    private String serviceA;
    private String serviceB;
    private String serviceC;
}

服務配置(超時時間配置等也可以寫在這里)
application.yaml

thirdpart-service:
  serviceA: http://****:***/
  serviceB:  http://****:***/
  serviceC:  http://****:***/

第三方服務配置

因為聲明方法一致念祭,所以省略了多個第三方聲明兑宇。
ThirdPartClientConfig.java

@Configuration
public class ThirdParttClientConfig {

    @Resource
    private ThirdpartServiceConfig thirdpartServiceConfig;

    @Bean
    public ServiceAClient serviceAClient() {
        return Feign.builder()
            .encoder(new FormEncoder(new GsonEncoder()))
            .decoder(new GsonDecoder())
            .target(ServiceAClient.class, thirdpartServiceConfig.getServiceA());
    }
}

接口聲明和使用

完成了服務的聲明和服務的配置之后,就可以進行服務接口的聲明了粱坤。具體聲明方法可以參看OpenFeign文檔:# 翻譯: Spring Cloud Feign使用文檔

下面給出使用示例:

  • GET請求(feign可直接將返回的結果反序列化為本服務中定義的POJO
@RequestLine("GET testGet?a={a}&b=隶糕")
ServiceResp testGet(@Param("a") String a,@Param("b")String b);
  • GET 下載
    使用feign.Response接收請求結果
@RequestLine("GET export?exportId={exportId}")
Response exportFromServiceA(@Param("exportId")String exportId);
@Resource
private ServiceAClient serviceAClient ;

// 導出方法
public void export(exportId) {
    Response serviceResponse = serviceserviceAClient.exportFromServiceA(exportId);
    Response.Body body = serviceResponse.body();
    try(InputStream inputStream = body.asInputStream();
        // 處理獲取到的inputStream
    } catch (IOException e) {
    log.error("導出發(fā)生異常",e);
}
  • POST application/json"
 @RequestLine("POST /save")
 @Headers("Cofntent-Type: application/json")
  ServiceResp saveEntity(EntityPOJO entityPOJO);
  • POST form
 @RequestLine("POST  uqa/repo/qa/batch")
 @Headers("Content-Type:multipart/form-data")
 ServiceResp uploadFile(@Param("id")String id, @Param("batch_file") File file);
  • 注意:除了file類型,其他參數(shù)會被序列化為String站玄,所以若第三方接口參數(shù)的值為POJO(或Map)枚驻,可能會出錯。
  • 對于POJO參數(shù)株旷,若第三方參數(shù)名含有Java中不合法的屬性字符(如 ”-“再登,”#“,”.“等)灾常,可使用注解進行序列化時的轉化霎冯。由于聲明Feign Client時使用的encoder是Gson铃拇,所以使用如下注解:
 @SerializedName(value="aaa-bbb")
 private String aaaBbb;

如果使用的是其他序列化工具钞瀑,改為對應的注解即可。

小結

使用聲明式的第三方和接口寫法慷荔,基本覆蓋了請求第三方接口的需求雕什,也易于拓展和管理。
我計劃在后續(xù)添加統(tǒng)一的鑒權、日志打印和異常捕獲處理功能贷岸,使依賴組件引入的風險更為可控壹士。OpenFeign幫我們實現(xiàn)了服務聲明、接口聲明偿警、HTTP請求發(fā)送和結果處理等邏輯躏救,在項目需要調用多個第三方服務時可以使用。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末螟蒸,一起剝皮案震驚了整個濱河市盒使,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌七嫌,老刑警劉巖少办,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異诵原,居然都是意外死亡英妓,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門绍赛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蔓纠,“玉大人,你說我怎么就攤上這事惹资『馗伲” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵褪测,是天一觀的道長猴誊。 經常有香客問我,道長侮措,這世上最難降的妖魔是什么懈叹? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮分扎,結果婚禮上澄成,老公的妹妹穿的比我還像新娘。我一直安慰自己畏吓,他們只是感情好墨状,可當我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著菲饼,像睡著了一般肾砂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宏悦,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天镐确,我揣著相機與錄音包吝,去河邊找鬼。 笑死源葫,一個胖子當著我的面吹牛诗越,可吹牛的內容都是我干的。 我是一名探鬼主播息堂,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼嚷狞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了荣堰?” 一聲冷哼從身側響起感耙,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎持隧,沒想到半個月后即硼,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡屡拨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年只酥,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片呀狼。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡裂允,死狀恐怖,靈堂內的尸體忽然破棺而出哥艇,到底是詐尸還是另有隱情绝编,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布貌踏,位于F島的核電站十饥,受9級特大地震影響,放射性物質發(fā)生泄漏祖乳。R本人自食惡果不足惜逗堵,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望眷昆。 院中可真熱鬧蜒秤,春花似錦、人聲如沸亚斋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽帅刊。三九已至纸泡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間厚掷,已是汗流浹背弟灼。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留冒黑,地道東北人田绑。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像抡爹,于是被迫代替她去往敵國和親掩驱。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內容