OpenFeign配置及基本原理


一、OpenFeign基本原理

1.聲明式通信

Spring Cloud除了提供編程式調用之外,還提供了一種基於接口和注解的“聲明式調用”方式

2.工作原理

image-20210122162416172

裝配原理:

  1. SpringBoot工程啟動,通過@EnableFeignClients掃描所有@FeignClient對應的接口
  2. Feign框架的FeignClientFacotoryBean 為接口產生Proxy實例,並通過Spring容器注入到調用者

調用原理:

  1. 調用者通過OpenFeign接口調用某個方法,由Proxy實例轉發至FeignFrameWork框架的InvocationHandler 對象
  2. 該 Handler 完成后續的 HTTP 轉換, 發送, 接收, 翻譯HTTP響應等工作

二、項目引入整合

1.引入依賴

        <!-- openfeign -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>3.1.1</version>
        </dependency>
        <!-- 負載均衡 新版本springboot棄用,這里手動引入 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>

2.啟動類增加注解

@EnableFeignClients

@EnableFeignClients
public class DemoServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoServiceApplication.class, args);
    }

}

3.定義feign客戶端

@FeignClient注解含義

  • value :注冊的微服務名稱
  • path:微服務地址
  • fallbackFactory :發生異常時執行代碼
  • 此方法可以調用/account-service/address/createAddress接口
@FeignClient(value = "hld-account-service", path = "/account-service", fallbackFactory = AddressFeignClientFallback.class)
public interface AddressFeignClient {
    /**
     * 添加常用地址信息
     *
     * @param request 常用地址請求對象
     * @return 返回添加結果數據
     **/
    @ApiOperation("添加常用地址信息")
    @PostMapping("/address/createAddress")
    DataResult<Long> createAddress(@RequestBody AddressRequest request);
}

GetMapping需要在feign中在參數上使用@RequestParam參數

4.異常執行代碼

@Component//類自動實例化,當服務接口不可用時,進入到熔斷器fallback的邏輯處理中,此時檢查不到對應的實例,將無法使用
public class AddressFeignClientFallback implements AddressFeignClient{
 @Override
            public DataResult<Long> updateAddress(AddressRequest request) {
				System.out.println("發生異常了!!");
                return null;
            }
}

三、其他

多個@FeignClient注解類 value設置為同一個服務解決方案

  • 配置文件增加
spring:
  main:
    ## @FeignClient(value = "服務名r") 設置可以有多個類存在相同的FeignClient 中的value值
    allow-bean-definition-overriding: true


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM