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