Java使用OpenFeign管理多個(gè)第三方服務(wù)調(diào)用
背景
最近開發(fā)了一個(gè)統(tǒng)一調(diào)度類的項(xiàng)目,需要依賴多個(gè)第三方服務(wù),這些服務(wù)都提供了HTTP接口供我調(diào)用。
組件架構(gòu)
服務(wù)多、接口多,如何進(jìn)行第三方服務(wù)管理和調(diào)用就成了問(wèn)題。
常用的服務(wù)間調(diào)用往往采用zk、Eureka等注冊(cè)中心進(jìn)行服務(wù)管理(SpringBoot常使用SpringCloud)。OpenFeign也是SpringCloud的解決方案之一。我們單獨(dú)使用OpenFeign, 無(wú)需對(duì)原有第三方服務(wù)進(jìn)行改動(dòng),本服務(wù)開發(fā)時(shí)的引入也很輕量。
下面給出我的用法。
應(yīng)用
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相關(guān)引入是為了解決ContentType為application/x-www-form-urlencoded和multipart/form-data的編碼問(wèn)題。
配置和服務(wù)聲明
第三方服務(wù)的地址通過(guò)配置來(lái)注入。
服務(wù)地址配置
ThirdpartServiceConfig.java
@Data @Component @ConfigurationProperties(prefix = "thirdpart-service") public class ThirdpartServiceConfig { private String serviceA; private String serviceB; private String serviceC; }
服務(wù)配置(超時(shí)時(shí)間配置等也可以寫在這里) application.yaml
thirdpart-service: serviceA: http://****:***/ serviceB: http://****:***/ serviceC: http://****:***/
第三方服務(wù)配置
因?yàn)槁暶鞣椒ㄒ恢拢允÷粤硕鄠€(gè)第三方聲明。 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()); } }
接口聲明和使用
完成了服務(wù)的聲明和服務(wù)的配置之后,就可以進(jìn)行服務(wù)接口的聲明了。具體聲明方法可以參看OpenFeign文檔:# 翻譯: Spring Cloud Feign使用文檔
下面給出使用示例:
GET請(qǐng)求(feign可直接將返回的結(jié)果反序列化為本服務(wù)中定義的POJO)
@RequestLine("GET testGet?a={a}&b=") ServiceResp testGet(@Param("a") String a,@Param("b")String b);
GET 下載使用feign.Response接收請(qǐng)求結(jié)果
@RequestLine("GET export?exportId={exportId}") Response exportFromServiceA(@Param("exportId")String exportId);
@Resource private ServiceAClient serviceAClient ; // 導(dǎo)出方法 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("導(dǎo)出發(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ù)會(huì)被序列化為String,所以若第三方接口參數(shù)的值為POJO(或Map),可能會(huì)出錯(cuò)。
- 對(duì)于POJO參數(shù),若第三方參數(shù)名含有Java中不合法的屬性字符(如 ”-“,”#“,”.“等),可使用注解進(jìn)行序列化時(shí)的轉(zhuǎn)化。由于聲明Feign Client時(shí)使用的encoder是Gson,所以使用如下注解:
@SerializedName(value="aaa-bbb") private String aaaBbb;
如果使用的是其他序列化工具,改為對(duì)應(yīng)的注解即可。
小結(jié)
使用聲明式的第三方和接口寫法,基本覆蓋了請(qǐng)求第三方接口的需求,也易于拓展和管理。
我計(jì)劃在后續(xù)添加統(tǒng)一的鑒權(quán)、日志打印和異常捕獲處理功能,使依賴組件引入的風(fēng)險(xiǎn)更為可控。OpenFeign幫我們實(shí)現(xiàn)了服務(wù)聲明、接口聲明、HTTP請(qǐng)求發(fā)送和結(jié)果處理等邏輯,在項(xiàng)目需要調(diào)用多個(gè)第三方服務(wù)時(shí)可以使用。
到此這篇關(guān)于Java使用OpenFeign管理多個(gè)第三方服務(wù)調(diào)用的文章就介紹到這了,更多相關(guān)Java 第三方服務(wù)調(diào)用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java書店系統(tǒng)畢業(yè)設(shè)計(jì) 用戶模塊(2)
這篇文章主要介紹了java書店系統(tǒng)畢業(yè)設(shè)計(jì),第二步系統(tǒng)總體設(shè)計(jì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10java中如何判斷JSONObject是否存在某個(gè)Key
這篇文章主要介紹了java中如何判斷JSONObject是否存在某個(gè)Key,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07Java接口方法默認(rèn)靜態(tài)實(shí)現(xiàn)代碼實(shí)例
這篇文章主要介紹了Java接口方法默認(rèn)靜態(tài)實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06SpringBoot3.2.2整合MyBatis-Plus3.5.5依賴不兼容的問(wèn)題解決
這篇文章給大家介紹了Spring Boot 3.2.2整合MyBatis-Plus 3.5.5依賴不兼容問(wèn)題,文中通過(guò)代碼示例和圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-01-01java 中序列化NotSerializableException問(wèn)題解決辦法
這篇文章主要介紹了java 中序列化NotSerializableException問(wèn)題解決辦法的相關(guān)資料,這里對(duì)序列化問(wèn)題進(jìn)行描述說(shuō)明,并提供解決辦法,希望能幫助到大家,需要的朋友可以參考下2017-08-08