亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

springcloud之FeignClient使用詳解

 更新時間:2024年12月31日 15:16:22   作者:Aikes902  
Feign是一種聲明式、模板化的HTTP客戶端,可以簡化微服務之間的遠程過程調用,通過Feign,開發(fā)者可以像調用本地方法一樣調用遠程服務,而無需感知這是一個HTTP請求,引入Feign后,微服務之間的調用流程更加簡化,結合Ribbon實現了路由負載、超時熔斷等功能

前言

在微服務項目中會存在多個微服務之間互相調用的情況,如何高效便捷的進行遠程過程調用便成為新的議論話題。spring-cloud中提供的feign方式可以有效解決該問題。

Feign是一種聲明式、模板化的HTTP客戶端。在Spring Cloud中使用Feign, 我們可以做到使用HTTP請求遠程服務時能與調用本地方法一樣的編碼體驗,開發(fā)者完全感知不到這是遠程方法,更感知不到這是個HTTP請求。

如下testMicroServiceAccess方法便是feignClient調用,但是外部看起來和普通方法無二。

業(yè)務場景

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

請求——>外部網關——>應用層——>內部網關——>B微服務——>外部網關——>應用層——>內部網關——>A微服務——>結束

即便是拆掉外部網關和應用層,也需要通過內部網關中轉才能訪問到A微服務,況且還要考慮超時熔斷、路由負載等問題。

引入feign后簡化流程,并且其結合ribbon實現路由負載超時熔斷等措施,具體流程如下:

請求——>外部網關——>應用層——>內部網關——>B微服務——>feignClient——>A微服務——>結束

架構說明

按照上述業(yè)務假設進行架構說明:

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

2、A微服務中僅需要在啟動類上增加開啟feign的注解,可以考慮增加A-FeignClient依賴,這樣三個模塊使用同一份實體類,保證一致性。

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

調用邏輯

1、A-FeignClient

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

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

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

/**
 * 增加訪問失敗時的處理邏輯
 */
@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微服務

作為服務提供方,只需要正常編寫業(yè)務邏輯即可,重點需要考慮請求入參的實體類把控,建議引用A-FeignClient中,保證一致性。

package com.demo.DemoFeignServerController;

/**
 * 服務提供方    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微服務

作為服務消費方,在核心邏輯處理中,通過調用引入的A-FeignClient模塊的接口,由feign負責代理轉發(fā)到A微服務,實現調用A微服務的相關邏輯。

package com.demo.DemoFeignClientController;

/**
 * 服務消費方    Aikes
 */
public class DemoFeignClientController {

    @Autowired
    private DemoFeignClient mDemoFeignClient;

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

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

小結

通過feign的方式可以降低服務間調用的復雜度,從而提升系統性能。但同時帶來的問題也需要重點考量:

  • 1、服務間調用失敗后的事務一致性處理,需要結合各自業(yè)務場景分析。
  • 2、錯綜復雜的服務間調用開啟后,相當于給系統開了后門,需要考慮增加服務間調用日志記錄的功能,推薦使用自定義注解+AOP統一處理。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • 通過Spring Boot整合Mybatis分析自動配置詳解

    通過Spring Boot整合Mybatis分析自動配置詳解

    這篇文章主要給大家介紹了關于如何通過Spring Boot整合Mybatis分析自動配置的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Spring Boot具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-07-07
  • Java讀取Properties文件的七種方法的總結

    Java讀取Properties文件的七種方法的總結

    這篇文章主要介紹了Java讀取Properties文件的七種方法的總結的相關資料,需要的朋友可以參考下
    2017-07-07
  • SpringBoot+EasyExcel實現自定義復雜樣式導入導出

    SpringBoot+EasyExcel實現自定義復雜樣式導入導出

    這篇文章主要為大家詳細介紹了SpringBoot如何結果EasyExcel實現自定義復雜樣式導入導出功能,文中的示例代碼講解詳細,感興趣的小伙伴可以了解下
    2025-07-07
  • Java如何獲取字符串單詞個數

    Java如何獲取字符串單詞個數

    這篇文章主要介紹了Java如何獲取字符串單詞個數問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 一步步教你把SpringBoot項目打包成Docker鏡像

    一步步教你把SpringBoot項目打包成Docker鏡像

    Docker可以讓開發(fā)者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然后發(fā)布到任何流行的 Linux 機器上,也可以實現虛擬化,下面這篇文章主要給大家介紹了關于SpringBoot項目打包成Docker鏡像的相關資料,需要的朋友可以參考下
    2023-02-02
  • 在Mybatis使用Integer與''進行比較的坑及解決

    在Mybatis使用Integer與''進行比較的坑及解決

    這篇文章主要介紹了在Mybatis使用Integer與''進行比較的坑及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Springboot動態(tài)切換數據源的具體實現與原理分析

    Springboot動態(tài)切換數據源的具體實現與原理分析

    目前有個需求,需要使用不同的數據源,例如某業(yè)務要用A數據源,另一個業(yè)務要用B數據源,所以下面這篇文章主要給大家介紹了關于Springboot動態(tài)切換數據源的具體實現與原理分析,需要的朋友可以參考下
    2021-12-12
  • nacos在mac上部署提示找不到或無法加載主類的解決

    nacos在mac上部署提示找不到或無法加載主類的解決

    這篇文章主要介紹了nacos在mac上部署提示找不到或無法加載主類的解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Java中的AQS框架原理詳解

    Java中的AQS框架原理詳解

    這篇文章主要介紹了Java中的AQS框架原理詳解,AQS核心思想是,如果被請求的共享資源(state)空閑,則將當前請求資源的線程設置為有效的工作線程,并且將共享資源設置為鎖定狀態(tài),需要的朋友可以參考下
    2023-12-12
  • Java的Channel通道之FileChannel類詳解

    Java的Channel通道之FileChannel類詳解

    這篇文章主要介紹了Java的Channel通道之FileChannel類詳解,FileChannel類是Java NIO中的一個重要類,用于在文件中進行讀寫操作,它提供了一種高效的方式來處理大文件和隨機訪問文件的需求,需要的朋友可以參考下
    2023-10-10

最新評論