1、介紹
Feign是Netflix開發的聲明式、模闆化的HTTP用戶端, Feign可以幫助我們更快捷、優雅地調用HTTP API。
在Spring Cloud中,使用Feign非常簡單——建立一個接口,并在接口上添加一些注解,代碼就完成了。Feign支援多種注解,例如Feign自帶的注解或者JAX-RS注解等。
Spring Cloud對Feign進行了增強,使Feign支援了Spring MVC注解,并整合了Ribbon和Eureka,進而讓Feign的使用更加友善。
Spring Cloud Feign是基于Netflix feign實作,整合了Spring Cloud Ribbon和Spring Cloud Hystrix,除了提供這兩者的強大功能外,還提供了一種聲明式的Web服務用戶端定義的方式。
Spring Cloud Feign幫助我們定義和實作依賴服務接口的定義。在Spring Cloud feign的實作下,隻需要建立一個接口并用注解方式配置它,即可完成服務提供方的接口綁定,簡化了在使用Spring Cloud Ribbon時自行封裝服務調用用戶端的開發量。
Spring Cloud Feign具備可插拔的注解支援,支援Feign注解、JAX-RS注解和Spring MVC的注解。
- 遠端調用 - RestTemplate
- ribbon - @LoadBalanced,配置重試參數
- hystrix
內建工具:
- 遠端調用
- ribbon - 負載均衡、重試
- hystrix - 降級、熔斷
2、Feign 遠端調用
2.1、Feign 提供了聲明式用戶端,隻需要定義一個接口,就可以通過接口做遠端調用。具體調用代碼通過動态代理添加。
// 調用商品服務的遠端調用接口
// 通過注解配置3件事:調用哪個服務,調用什麼路徑,向這個路徑送出什麼參數
@FeignClient(name="item-service")
public interface ItemFeignClient {
@GetMapping("/{orderId}")
JsonResult<List<Item>> getItems(@PathVariable String orderId);
}
2.2、 添加Feign聲明式用戶端
(1) 添加Feign聲明式用戶端
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
(2)啟動類加 @EnableFeignClients
@EnableFeignClients
(3)定義聲明式用戶端接口
eg:
- ItemFeignClient
- UserFeignClient
- OrderFeignClient
(4)添加一個測試用的控制器,使用三個聲明式用戶端接口調用遠端服務
3、Feign 內建 Ribbon:負載均衡、重試
Feign 預設啟用了Ribbon的負載均衡和重試,0配置
預設重試參數:
- MaxAutoRetries=0
- MaxAutoRetriesNextServer=1
- ReadTimeout=1000
重試參數配置
有需要則設定
# 對所有服務都有效
ribbon:
MaxAutoRetries: 1
# 對 item-service 單獨配置,對其他服務無效
item-service:
ribbon:
MaxAutoRetries: 0
4、Feign 內建 Hystrix:降級、熔斷、監控
預設不啟用 Hystrix,Feign不推薦啟用hystrix(後面再分析)
如果有特殊需求要啟用hystrix,首先做基礎配置
1、添加 hystrix 的完整依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
2、添加
@EnableCircuitBreaker
3、yml配置
feign.hystrix.enabled=true
# 啟動Hystrix
# 啟動Hystrix
feign:
hystrix:
enabled: true
4.1、降級
之前:加的是
@HystrixCommand(fallbackMethod=“ . . . ”)
現在:在聲明式用戶端接口的注解中,指定一個降級類
@FeignClient(name="item-service", fallback=降級類.class)
public interface ItemFeignClient {
....
}
降級類要作為聲明式用戶端接口的子類來定義
其實作類要用
@Component
來标注
4.2、熔斷
熔斷會自動觸發:10秒20次請求,50%失敗,執行了降級代碼。
4.3、監控:用 actuator 暴露 hystrix.stream 監控端點
(1)添加actuator 依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
(2)暴露監控端點:m.e.w.e.i=hystrix.stream
# 暴露監控端點
management:
endpoints:
web:
exposure:
include: hystrix.stream
(3)通路測試:http://localhost:3001/actuator/hystrix.stream
(4)通過調用背景服務,産生監控資料
5、總結
