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,歡迎大家關注
