最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java使用OpenFeign管理多個(gè)第三方服務(wù)調(diào)用

 更新時(shí)間:2021年06月16日 10:53:00   作者:Ygria  
最近開發(fā)了一個(gè)統(tǒng)一調(diào)度類的項(xiàng)目,需要依賴多個(gè)第三方服務(wù),這些服務(wù)都提供了HTTP接口供我調(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ù)間調(diào)用往往采用zk、Eureka等注冊(cè)中心進(jìn)行服務(wù)管理(SpringBoot常使用SpringCloud)。OpenFeign也是SpringCloud的解決方案之一。我們單獨(dú)使用OpenFeign, 無需對(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ù)聲明

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

服務(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面試必備之AQS阻塞隊(duì)列和條件隊(duì)列

    Java面試必備之AQS阻塞隊(duì)列和條件隊(duì)列

    我們大概知道AQS就是一個(gè)框架,把很多功能都給實(shí)現(xiàn)了(比如入隊(duì)規(guī)則,喚醒節(jié)點(diǎn)中的線程等),我們?nèi)绻褂玫脑捴恍枰獙?shí)現(xiàn)其中的一些方法(比如tryAcquire等)就行了!這次主要說說AQS中阻塞隊(duì)列的的入隊(duì)規(guī)則還有條件變量,需要的朋友可以參考下
    2021-06-06
  • Spring?IOC容器Bean注解創(chuàng)建對(duì)象組件掃描

    Spring?IOC容器Bean注解創(chuàng)建對(duì)象組件掃描

    這篇文章主要為大家介紹了Spring?IOC容器Bean注解創(chuàng)建對(duì)象組件掃描,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • IDEA調(diào)試源碼小技巧之辨別抽象類或接口多種實(shí)現(xiàn)類的正確路徑

    IDEA調(diào)試源碼小技巧之辨別抽象類或接口多種實(shí)現(xiàn)類的正確路徑

    這篇文章主要介紹了IDEA調(diào)試源碼小技巧之辨別抽象類或接口多種實(shí)現(xiàn)類的正確路徑,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • 詳解如何在Java中使用阿里云對(duì)象存儲(chǔ)OSS

    詳解如何在Java中使用阿里云對(duì)象存儲(chǔ)OSS

    Java是世界上最流行的編程語言之一,擁有著廣泛的應(yīng)用場(chǎng)景和強(qiáng)大的生態(tài)系統(tǒng),阿里云對(duì)象存儲(chǔ) OSS 是一種企業(yè)級(jí)的云存儲(chǔ)服務(wù),本文將介紹如何在 Java 中使用阿里云對(duì)象存儲(chǔ) OSS,并寫一點(diǎn)相應(yīng)的代碼示例供大家參考
    2023-06-06
  • Spring?Boot?底層原理基礎(chǔ)深度解析

    Spring?Boot?底層原理基礎(chǔ)深度解析

    這篇文章主要介紹了Spring?Boot?底層原理基礎(chǔ),包括底層注解@Configuration,底層注解@Import及底層注解@Conditional的相關(guān)知識(shí),本文結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • 淺談Timer和TimerTask與線程的關(guān)系

    淺談Timer和TimerTask與線程的關(guān)系

    下面小編就為大家?guī)硪黄獪\談Timer和TimerTask與線程的關(guān)系。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-03-03
  • JAVA利用HttpClient進(jìn)行POST請(qǐng)求(HTTPS)實(shí)例

    JAVA利用HttpClient進(jìn)行POST請(qǐng)求(HTTPS)實(shí)例

    下面小編就為大家?guī)硪黄狫AVA利用HttpClient進(jìn)行POST請(qǐng)求(HTTPS)實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起 小編過來看看吧
    2016-11-11
  • Java?8中?Stream小知識(shí)小技巧方法梳理

    Java?8中?Stream小知識(shí)小技巧方法梳理

    這篇文章主要介紹了Java8中Stream小知識(shí)小技巧方法梳理,Stream流和迭代器一樣,它只能夠迭代一次。當(dāng)它遍歷完的時(shí)候,我們就稱它已經(jīng)消費(fèi)完了。如果還想重新執(zhí)行操作,那么就只能從原來的地方再獲取一個(gè)流
    2022-09-09
  • Java中的synchronized?優(yōu)化方法之鎖膨脹機(jī)制

    Java中的synchronized?優(yōu)化方法之鎖膨脹機(jī)制

    這篇文章主要介紹了Java中的synchronized?優(yōu)化方法之鎖膨脹機(jī)制,鎖膨脹機(jī)制是提升?synchronized?性能最有利的方法之一,下面我們就來看看什么事鎖膨脹及鎖膨脹的各種細(xì)節(jié)
    2022-05-05
  • java 基礎(chǔ)知識(shí)之網(wǎng)絡(luò)通信(TCP通信、UDP通信、多播以及NIO)總結(jié)

    java 基礎(chǔ)知識(shí)之網(wǎng)絡(luò)通信(TCP通信、UDP通信、多播以及NIO)總結(jié)

    這篇文章主要介紹了java 基礎(chǔ)知識(shí)之網(wǎng)絡(luò)通信總結(jié)的相關(guān)資料,包括TCP通信、UDP通信、多播以及NIO,需要的朋友可以參考下
    2017-03-03

最新評(píng)論

泉州市| 玉树县| 开封县| 临安市| 乐都县| 德昌县| 喀喇沁旗| 新河县| 灵川县| 齐齐哈尔市| 马尔康县| 皮山县| 嘉祥县| 兴安县| 饶平县| 布尔津县| 靖安县| 凭祥市| 蒲城县| 巍山| 雅江县| 家居| 额尔古纳市| 登封市| 治多县| 老河口市| 井冈山市| 沙坪坝区| 潞城市| 普兰店市| 姜堰市| 衢州市| 库尔勒市| 镇坪县| 色达县| 安图县| 曲阳县| 凤冈县| 鲁山县| 南和县| 武鸣县|