SpringCloud 2020.0.4 系列之 Feign

追風人聊Java發表於2021-10-26

1. 概述

老話說的好:任何問題都有不止一種的解決方法,當前的問題沒有解決,只是還沒有發現解決方法,而並不是無解。

 

言歸正傳,之前我們聊了 SpringCloud 的服務治理元件 Eureka,今天我們來聊聊服務間的通訊元件 Feign。

閒話不多說,直接上程式碼。

 

2. my-eureka-client 工程中增加Service方法

2.1 概述

在 my-eureka-client 工程中,建立 Service 方法,然後新增一個 my-feign 服務使用 Feign 元件遠端呼叫這個方法。

關於 my-eureka-client 的搭建,可參見我的上一篇文章《SpringCloud 2020.0.4 系列之Eureka》(https://www.cnblogs.com/w84422/p/15449221.html)。

 

2.2 增加介面 EurekaClientService

@RequestMapping("/api")
public interface EurekaClientService {

    @PostMapping("/hello")
    String hello(@RequestParam(required = false) String name,
                  @RequestParam(required = false) Integer age);
}

注意:由於此 Service 方法,我們需要提供給其他服務遠端呼叫,因此需要使用 @RequestMapping 指定他的請求資源路徑。

 

2.3 增加實現類 EurekaClientServiceImpl 

@RestController
public class EurekaClientServiceImpl implements EurekaClientService{

    @Value("${server.port}")
    private String port;

    @Override
    public String hello(String name, Integer age) {

        System.out.println("-------------- my-eureka-client service---------------");

        System.out.println(name);
        System.out.println(age);
        System.out.println(port);

        System.out.println("-------------- my-eureka-client service---------------");

        return port;
    }
}

注意:由於此 Service 方法,我們需要提供給其他服務遠端呼叫,因此這裡不能再用 @Service 註解了,而要使用 @RestController 註解,將其作為 Rest 介面暴露出去。

 

3. my-feign 工程的搭建

3.1 主要依賴

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- 健康檢查 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

 

3.2 主要配置及 Feign 超時策略配置

spring:
  application:
    name: my-feign
server:
  port: 37000
eureka:
  client:
    service-url:
      defaultZone: http://zhuifengren1:35000/eureka/,http://zhuifengren2:35001/eureka/    # Eureka Server的地址
    healthcheck:
      enabled: true    # 開啟健康檢查, 依賴於 spring-boot-starter-actuator
  instance:
    lease-renewal-interval-in-seconds: 5      # 發出續約指令的間隔,預設30秒
    lease-expiration-duration-in-seconds: 30  # 租期到期時間,預設90秒


# feign 配置
feign:
  client:
    config:
      # 全域性配置
      default:
        connectTimeout: 1000   # 連線超時時間,單位ms
        readTimeout: 3000      # 獲取Response響應超時時間,單位ms

      # 針對 my-eureka-client 的 feign 配置,優先順序高於全域性配置
      my-eureka-client:
        connectTimeout: 300   # 連線超時時間,單位ms
        readTimeout: 2000     # 獲取Response響應超時時間,單位ms

 

3.3 Feign 重試策略配置

增加 FeignConfigure 類

@Configuration
public class FeignConfigure {

    @Bean
    public Retryer feignRetryer(){

        // 第一個引數:重試的時間間隔,單位毫秒,每次會增加1.5倍,但會小於等於最大間隔
        // 第二個引數:發起當前請求的最大時間間隔,單位毫秒
        // 第三個引數:重試次數,包括第一次呼叫,每次重試可能會請求不同服務節點
        return new Retryer.Default(100, 1000, 3);
    }
}

 

3.4 增加 Feign 介面 

@FeignClient("my-eureka-client")  // value 為被呼叫服務的名稱
@RequestMapping("/api")
public interface EurekaClientService {

    @PostMapping("/hello")
    String hello(@RequestParam(required = false) String name,
                  @RequestParam(required = false) Integer age);
}

此介面可以由呼叫方根據實際情況編寫。也可由被呼叫方將Service介面層剝離為單獨的模組提供,呼叫方依賴即可。

 

3.5 將 Feign 介面類注入到呼叫方的 Controller 類或 Service 類中

    @Autowired
    private EurekaClientService eurekaClientService;

    public String hello(String name, Integer age) {
        System.out.println("------------ my-feign service ------------");
        return eurekaClientService.hello(name, age);
    }

 

3.6 啟動類增加 @EnableFeignClients 註解

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class MyFeignApplication {

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

 

3.7 啟動服務

先啟動 Eureka Server,再啟動 my-eureka-client,最後啟動 my-feign。

 

4. 綜述

今天聊了一下 Feign 的相關知識,希望可以對大家的工作有所幫助。

歡迎幫忙點贊、評論、轉發、加關注 :)

關注追風人聊Java,每天更新Java乾貨。

 

5. 個人公眾號

追風人聊Java,歡迎大家關注

相關文章