欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

springcloud之FeignClient使用詳解

 更新時(shí)間:2024年12月31日 15:16:22   作者:Aikes902  
Feign是一種聲明式、模板化的HTTP客戶端,可以簡(jiǎn)化微服務(wù)之間的遠(yuǎn)程過(guò)程調(diào)用,通過(guò)Feign,開(kāi)發(fā)者可以像調(diào)用本地方法一樣調(diào)用遠(yuǎn)程服務(wù),而無(wú)需感知這是一個(gè)HTTP請(qǐng)求,引入Feign后,微服務(wù)之間的調(diào)用流程更加簡(jiǎn)化,結(jié)合Ribbon實(shí)現(xiàn)了路由負(fù)載、超時(shí)熔斷等功能

前言

在微服務(wù)項(xiàng)目中會(huì)存在多個(gè)微服務(wù)之間互相調(diào)用的情況,如何高效便捷的進(jìn)行遠(yuǎn)程過(guò)程調(diào)用便成為新的議論話題。spring-cloud中提供的feign方式可以有效解決該問(wèn)題。

Feign是一種聲明式、模板化的HTTP客戶端。在Spring Cloud中使用Feign, 我們可以做到使用HTTP請(qǐng)求遠(yuǎn)程服務(wù)時(shí)能與調(diào)用本地方法一樣的編碼體驗(yàn),開(kāi)發(fā)者完全感知不到這是遠(yuǎn)程方法,更感知不到這是個(gè)HTTP請(qǐng)求。

如下testMicroServiceAccess方法便是feignClient調(diào)用,但是外部看起來(lái)和普通方法無(wú)二。

業(yè)務(wù)場(chǎng)景

假設(shè)同一個(gè)注冊(cè)中心上有兩個(gè)微服務(wù):A和B,為完成某個(gè)業(yè)務(wù)功能,B微服務(wù)需要調(diào)用A微服務(wù)中的某個(gè)方法邏輯獲取返回結(jié)果,并且二者是不能作為jar互相依賴的,按照傳統(tǒng)方式只能如下處理:

請(qǐng)求——>外部網(wǎng)關(guān)——>應(yīng)用層——>內(nèi)部網(wǎng)關(guān)——>B微服務(wù)——>外部網(wǎng)關(guān)——>應(yīng)用層——>內(nèi)部網(wǎng)關(guān)——>A微服務(wù)——>結(jié)束

即便是拆掉外部網(wǎng)關(guān)和應(yīng)用層,也需要通過(guò)內(nèi)部網(wǎng)關(guān)中轉(zhuǎn)才能訪問(wèn)到A微服務(wù),況且還要考慮超時(shí)熔斷、路由負(fù)載等問(wèn)題。

引入feign后簡(jiǎn)化流程,并且其結(jié)合ribbon實(shí)現(xiàn)路由負(fù)載超時(shí)熔斷等措施,具體流程如下:

請(qǐng)求——>外部網(wǎng)關(guān)——>應(yīng)用層——>內(nèi)部網(wǎng)關(guān)——>B微服務(wù)——>feignClient——>A微服務(wù)——>結(jié)束

架構(gòu)說(shuō)明

按照上述業(yè)務(wù)假設(shè)進(jìn)行架構(gòu)說(shuō)明:

1、為保持系統(tǒng)良好的可擴(kuò)展性,降低模塊耦合度,新建A-FeignClient模塊,用于提供feign接口和相關(guān)實(shí)體類。后期作為jar文件推送到Maven私服中,供A、B微服務(wù)各自引用。

2、A微服務(wù)中僅需要在啟動(dòng)類上增加開(kāi)啟feign的注解,可以考慮增加A-FeignClient依賴,這樣三個(gè)模塊使用同一份實(shí)體類,保證一致性。

3、B微服務(wù)中增加A-FeignClient模塊的依賴,編寫客戶端調(diào)用代碼。

調(diào)用邏輯

1、A-FeignClient

  • a、在A-FeignClient中增加接口,通過(guò)spring注解標(biāo)識(shí)其提供服務(wù)的真正接口路徑。
  • b、@FeignClient注解中name值目標(biāo)微服務(wù)名,contextId用于標(biāo)識(shí)FeignClient名。
  • c、方法名上的postmapping用于標(biāo)識(shí)該方法需要轉(zhuǎn)發(fā)的接口路徑。下圖代碼示例中意思即:調(diào)用該方法后會(huì)代理到A微服務(wù)的/demoServer/testMicroServiceAccess接口中。
  • d、通過(guò)實(shí)現(xiàn)該接口的方式新建一個(gè)類,可以用于feign調(diào)用失敗后的容錯(cuò)處理。
package com.demo.DemoFeignClient;

/**
 * 微服務(wù)之間調(diào)用的核心接口     Aikes
 * 注解@FeignClient中contextID參數(shù)用于標(biāo)識(shí)client,防止多個(gè)接口共用同一個(gè)目標(biāo)FeignClient沖突
 */
@FeignClient(name = "A-server" ,contextId = "DemoFeignClient", fallback = DemoFeignClientFallback.class )
public interface DemoFeignClient{

    @PostMapping("/demoServer/testMicroServiceAccess")
    public ApiResponse<String> testMicroServiceAccess(@RequestBody ServerAccessRequest<DemoPo> cServerAccessRequest);
}

/**
 * 增加訪問(wèn)失敗時(shí)的處理邏輯
 */
@Component
class DemoFeignClientFallback implements DemoFeignClient{

    @Override
    public ApiResponse<String> testMicroServiceAccess(ServerAccessRequest<DemoPo> cServerAccessRequest) {
        ApiResponse<String> tApiResponse = new ApiResponse<>();
        tApiResponse.setStatus(ApiResponse.BUSY);
        return tApiResponse;
    }
}

2、A微服務(wù)

作為服務(wù)提供方,只需要正常編寫業(yè)務(wù)邏輯即可,重點(diǎn)需要考慮請(qǐng)求入?yún)⒌膶?shí)體類把控,建議引用A-FeignClient中,保證一致性。

package com.demo.DemoFeignServerController;

/**
 * 服務(wù)提供方    Aikes
 */
@Controller
@RequestMapping("demoServer")
@RestController
@Slf4j
public class DemoFeignServerController {

    @PostMapping("/testMicroServiceAccess")
    public ApiResponse<String> testMicroServiceAccess(@RequestBody ServerAccessRequest<DemoPo> cServerAccessRequest) {
        log.info(cServerAccessRequest.toString());
        log.info("This is FeignServerController");
        ApiResponse<String> tApiResponse = new ApiResponse<String>();
        tApiResponse.setStatus(ApiResponse.SUCCESS);
        tApiResponse.setStatusText(ApiResponse.SUCCESS_TEXT);
        tApiResponse.setData(cServerAccessRequest.getData().getDemoName());
        return tApiResponse;
    }
}

3、B微服務(wù)

作為服務(wù)消費(fèi)方,在核心邏輯處理中,通過(guò)調(diào)用引入的A-FeignClient模塊的接口,由feign負(fù)責(zé)代理轉(zhuǎn)發(fā)到A微服務(wù),實(shí)現(xiàn)調(diào)用A微服務(wù)的相關(guān)邏輯。

package com.demo.DemoFeignClientController;

/**
 * 服務(wù)消費(fèi)方    Aikes
 */
public class DemoFeignClientController {

    @Autowired
    private DemoFeignClient mDemoFeignClient;

    public void doService() {
        //TODO 業(yè)務(wù)處理
        ApiResponse<String> tApiResponse = this.testFeign();//調(diào)用 A微服務(wù) 處理邏輯
        //TODO 處理返回結(jié)果
    }

    public ApiResponse<String> testFeign() {
        ServerAccessRequest<DemoPo> tServerAccessRequest = new ServerAccessRequest<DemoPo>();
        tServerAccessRequest.setBusinessNo("TEST001");
        return mDemoFeignClient.testMicroServiceAccess(tServerAccessRequest);
    }
}

小結(jié)

通過(guò)feign的方式可以降低服務(wù)間調(diào)用的復(fù)雜度,從而提升系統(tǒng)性能。但同時(shí)帶來(lái)的問(wèn)題也需要重點(diǎn)考量:

  • 1、服務(wù)間調(diào)用失敗后的事務(wù)一致性處理,需要結(jié)合各自業(yè)務(wù)場(chǎng)景分析。
  • 2、錯(cuò)綜復(fù)雜的服務(wù)間調(diào)用開(kāi)啟后,相當(dāng)于給系統(tǒng)開(kāi)了后門,需要考慮增加服務(wù)間調(diào)用日志記錄的功能,推薦使用自定義注解+AOP統(tǒng)一處理。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 支付寶APP支付(IOS手機(jī)端+java后臺(tái))版

    支付寶APP支付(IOS手機(jī)端+java后臺(tái))版

    這篇文章主要為大家詳細(xì)介紹了支付寶APP支付(IOS手機(jī)端+java后臺(tái))版,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • Spring之spring-context-indexer依賴詳解

    Spring之spring-context-indexer依賴詳解

    這篇文章主要介紹了Spring之spring-context-indexer依賴詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • java中怎么將多個(gè)音頻文件拼接合成一個(gè)

    java中怎么將多個(gè)音頻文件拼接合成一個(gè)

    在Java中,將多個(gè)音頻文件拼接成一個(gè)通常需要使用一些專門的音頻處理庫(kù),因?yàn)镴ava標(biāo)準(zhǔn)庫(kù)并不直接支持音頻文件的合并,一個(gè)常用的庫(kù)是JAVE2(Java?Audio?Video?Encoder)或JLayer(用于MP3)結(jié)合JavaFX(如果用于簡(jiǎn)單的WAV文件)或其他類似的庫(kù)
    2024-06-06
  • Java編寫程序之輸入一個(gè)數(shù)字實(shí)現(xiàn)該數(shù)字階乘的計(jì)算

    Java編寫程序之輸入一個(gè)數(shù)字實(shí)現(xiàn)該數(shù)字階乘的計(jì)算

    這篇文章主要介紹了Java編寫程序之輸入一個(gè)數(shù)字實(shí)現(xiàn)該數(shù)字階乘的計(jì)算,本文通過(guò)實(shí)例代碼給大家介紹的非常想詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • Java類型通配符應(yīng)用實(shí)戰(zhàn)分析

    Java類型通配符應(yīng)用實(shí)戰(zhàn)分析

    這篇文章主要介紹了Java類型通配符應(yīng)用實(shí)戰(zhàn),簡(jiǎn)單分析了Java類型通配符概念、原理并結(jié)合實(shí)例形式給出了Java類型通配符相關(guān)使用技巧,需要的朋友可以參考下
    2019-07-07
  • SpringBoot簡(jiǎn)單使用SpringData的jdbc和durid

    SpringBoot簡(jiǎn)單使用SpringData的jdbc和durid

    今天給大家?guī)?lái)的是關(guān)于Java的相關(guān)知識(shí),文章圍繞著SpringBoot簡(jiǎn)單使用SpringData的jdbc和durid,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • 使用@Value為靜態(tài)變量導(dǎo)入并使用導(dǎo)入的靜態(tài)變量進(jìn)行初始化方式

    使用@Value為靜態(tài)變量導(dǎo)入并使用導(dǎo)入的靜態(tài)變量進(jìn)行初始化方式

    這篇文章主要介紹了使用@Value為靜態(tài)變量導(dǎo)入并使用導(dǎo)入的靜態(tài)變量進(jìn)行初始化方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Springboot vue導(dǎo)出功能實(shí)現(xiàn)代碼

    Springboot vue導(dǎo)出功能實(shí)現(xiàn)代碼

    這篇文章主要介紹了Springboot vue導(dǎo)出功能實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • springboot 按月分表的實(shí)現(xiàn)方式

    springboot 按月分表的實(shí)現(xiàn)方式

    本文主要介紹了springboot 按月分表的實(shí)現(xiàn)方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Java遞歸運(yùn)行的機(jī)制:遞歸的微觀解讀圖文分析

    Java遞歸運(yùn)行的機(jī)制:遞歸的微觀解讀圖文分析

    這篇文章主要介紹了Java遞歸運(yùn)行的機(jī)制:遞歸的微觀解讀,結(jié)合圖文形式詳細(xì)分析了java遞歸運(yùn)行的原理、機(jī)制與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2020-03-03

最新評(píng)論