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

springcloud之FeignClient使用詳解

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

前言

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

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

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

業(yè)務(wù)場景

假設(shè)同一個注冊中心上有兩個微服務(wù):A和B,為完成某個業(yè)務(wù)功能,B微服務(wù)需要調(diào)用A微服務(wù)中的某個方法邏輯獲取返回結(jié)果,并且二者是不能作為jar互相依賴的,按照傳統(tǒ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)用層,也需要通過內(nèi)部網(wǎng)關(guān)中轉(zhuǎn)才能訪問到A微服務(wù),況且還要考慮超時熔斷、路由負載等問題。

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

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

架構(gòu)說明

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

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

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

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

調(diào)用邏輯

1、A-FeignClient

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

/**
 * 微服務(wù)之間調(diào)用的核心接口     Aikes
 * 注解@FeignClient中contextID參數(shù)用于標識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微服務(wù)

作為服務(wù)提供方,只需要正常編寫業(yè)務(wù)邏輯即可,重點需要考慮請求入?yún)⒌膶嶓w類把控,建議引用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ù)消費方,在核心邏輯處理中,通過調(diào)用引入的A-FeignClient模塊的接口,由feign負責代理轉(zhuǎn)發(fā)到A微服務(wù),實現(xiàn)調(diào)用A微服務(wù)的相關(guān)邏輯。

package com.demo.DemoFeignClientController;

/**
 * 服務(wù)消費方    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é)

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

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

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

相關(guān)文章

  • 基于Java實現(xiàn)根據(jù)周次生成數(shù)據(jù)的工具類

    基于Java實現(xiàn)根據(jù)周次生成數(shù)據(jù)的工具類

    這篇文章主要為大家詳細介紹了一個基于Java的周次生成工具,用于根據(jù)指定的年份和周次類型(自然周或財務(wù)周)生成連續(xù)的周次列表數(shù)據(jù),希望對大家有所幫助
    2025-08-08
  • javap命令的使用技巧

    javap命令的使用技巧

    本篇文章給大家分享了關(guān)于JAVA中關(guān)于javap命令的使用技巧以及相關(guān)代碼分享,有需要的朋友參考學習下。
    2018-05-05
  • Mybatis?SQL數(shù)量限制插件的實現(xiàn)

    Mybatis?SQL數(shù)量限制插件的實現(xiàn)

    本文介紹了一種應(yīng)對大數(shù)據(jù)查詢風險的Mybatis插件,通過配置限制查詢結(jié)果數(shù)量,并支持動態(tài)調(diào)整和特殊接口繞過,具有一定的參考價值,感興趣的可以了解一下
    2025-07-07
  • java使用短信設(shè)備發(fā)送sms短信的示例(java發(fā)送短信)

    java使用短信設(shè)備發(fā)送sms短信的示例(java發(fā)送短信)

    這篇文章主要介紹了java使用短信設(shè)備發(fā)送sms短信的示例(java發(fā)送短信),需要的朋友可以參考下
    2014-04-04
  • springmvc配置線程池Executor做多線程并發(fā)操作的代碼實例

    springmvc配置線程池Executor做多線程并發(fā)操作的代碼實例

    今天小編就為大家分享一篇關(guān)于springmvc配置線程池Executor做多線程并發(fā)操作的代碼實例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Spring加載配置和讀取多個Properties文件的講解

    Spring加載配置和讀取多個Properties文件的講解

    今天小編就為大家分享一篇關(guān)于Spring加載配置和讀取多個Properties文件的講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Java中JSR303的基本使用詳情

    Java中JSR303的基本使用詳情

    這篇文章主要介紹了Java中JSR303的基本使用詳情,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • Java?枚舉的常用技巧匯總

    Java?枚舉的常用技巧匯總

    在Java中,枚舉類型是一種特殊的數(shù)據(jù)類型,允許定義一組固定的常量,默認情況下,toString方法返回枚舉常量的名稱,本文提供了一個完整的代碼示例,展示了如何在Java中通過重寫枚舉的toString方法來展示枚舉實例的字段信息,感興趣的朋友一起看看吧
    2025-01-01
  • MyBatisX代碼自動生成的實現(xiàn)示例

    MyBatisX代碼自動生成的實現(xiàn)示例

    本文主要介紹了MyBatisX代碼自動生成的實現(xiàn)示例, 文中通過圖文示例介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-05-05
  • SpringBoot項目中@RestControllerAdvice全局異常失效問題的解決

    SpringBoot項目中@RestControllerAdvice全局異常失效問題的解決

    @RestController注解是一個用于定義RESTful Web服務(wù)的控制器的特殊注解,它是@Controller和@ResponseBody注解的結(jié)合體,意味著你不需要在每個處理請求的方法上都添加@ResponseBody,本文給大家介紹了解決SpringBoot項目中@RestControllerAdvice全局異常失效問題
    2024-11-11

最新評論

东城区| 苏尼特左旗| 叶城县| 内黄县| 龙川县| 连州市| 上思县| 永州市| 遂川县| 宜阳县| 三明市| 济南市| 南乐县| 柳林县| 镇坪县| 兴义市| 丹巴县| 乐清市| 泉州市| 克拉玛依市| 新竹县| 苏州市| 渭源县| 龙州县| 海盐县| 孟连| 云梦县| 卓资县| 离岛区| 武城县| 霍城县| 商城县| 于田县| 铁力市| 钦州市| 玉树县| 长汀县| 茂名市| 同心县| 壶关县| 菏泽市|