本文是Spring Cloud專欄的第七篇文章,瞭解前六篇文章內容有助於更好的理解本文: Spring Cloud第一篇 | Spring Cloud前言及其常用組件介紹概覽 Spring Cloud第二篇 | 使用並認識Eureka註冊中心 Spring Cloud第三篇 | 搭建高可用Eurek ...
本文是Spring Cloud專欄的第七篇文章,瞭解前六篇文章內容有助於更好的理解本文:
一、Feign是什麼
Feign是Netflix公司開發的一個聲明式的REST調用客戶端; Ribbon負載均衡、 Hystrⅸ服務熔斷是我們Spring Cloud中進行微服務開發非常基礎的組件,在使用的過程中我們也發現它們一般都是同時出現的,而且配置也都非常相似,每次開發都有很多相同的代碼,因此Spring Cloud基於Netflix Feign整合了Ribbon和Hystrix兩個組件,讓我們的開發工作變得更加簡單, 就像Spring boot是對Spring+ SpringMVC的簡化, Spring Cloud Feign對Ribbon負載均衡、 Hystrⅸ服務熔斷進行簡化,在其基礎上進行了進一步的封裝,不僅在配置上大大簡化了開發工作,同時還提供了一種聲明式的Web服務客戶端定義方式。使用方式類似Dubbo的使用方式。
二、使用Feign實現消費者
1、創建消費者服務命名為(springcloud-service-feign)
2、添加依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
3、在啟動類上添加註解
@EnableFeignClients
4、聲明服務
定義一個HelloService介面,通過@FeignClient註解來指定服務名稱進而綁定服務,然後在通過Spring MVC中提供的註解來綁定服務提供者的介面,如下:
//使用feign的客戶端註解綁定遠程的名稱,名稱可以是大寫,也可以小寫 @FeignClient(value = "springcloud-service-provider") public interface HelloService { //聲明一個方法,這個方法就是遠程的服務提供者提供的方法 @RequestMapping("/provider/hello") public String hello(); }
5、使用Controller中調用服務,代碼如下
@Autowired private HelloService helloService; @RequestMapping("/hello") public String hello(){ //調用聲明式介面方法,實現對遠程服務的調用 return helloService.hello(); }
6、application.yml配置如下
spring: application: name: springcloud-service-feign server: port: 9091 eureka: client: service-url: defaultZone: http://localhost:8700/eureka #客戶端每隔30秒從Eureka服務上更新一次服務信息 registry-fetch-interval-seconds: 30 #需要將我的服務註冊到eureka上 register-with-eureka: true #需要檢索服務 fetch-registry: true #心跳檢測檢測與續約時間 instance: #告訴服務端,如果我10s之內沒有給你發心跳,就代表我故障了,將我剔除掉,預設90s #Eureka服務端在收到最後一次心跳之後等待的時間上限,單位為秒,超過則剔除(客戶端告訴服務端按照此規則等待自己) lease-expiration-duration-in-seconds: 10 #每隔2s向服務端發送一次心跳,證明自已依然活著,預設30s #Eureka客戶端向服務端發送心跳的時間間隔,單位為秒(客戶端告訴服務端自己會按照該規則) lease-renewal-interval-in-seconds: 2
7、啟動測試,訪問地址http://localhost:9091/feign/hello
三、使用Feign支持的特性
負載均衡:
Spring Cloud提供了Ribbon來實現負載均衡,使用Ribbo直接註入一個RestTemplate對象即可, RestTemplate已經做好了負載均衡的配置在Spring Cloud下,使用 Feign也是直接可以實現負載均衡的,定義一個有@FeignClient註解的介面,然後使用@RequestMappin註解到方法上映射遠程的REST服務,此方法也是做好負責均衡配置的。
服務熔斷:
1、在 application.yml文件開啟hystrix功能
#開啟hystrix熔斷機制 feign: hystrix: enabled: true
2、指定熔斷回調邏輯
@FeignClient(value = "springcloud-service-provider", fallback = MyFallback.class)
@Component public class MyFallback implements HelloService { @Override public String hello() { return "遠程服務不可用,暫時採用本地邏輯代替。。。。。"; } }
3、測試,讓服務提供者超時就行了
如果需要捕獲提供者拋出的異常可以用:
@FeignClient(value = "springcloud-service-provider", fallbackFactory = MyFallbackFactory.class)
@Component public class MyFallbackFactory implements FallbackFactory<HelloService> { @Override public HelloService create(Throwable throwable) { return new HelloService() { @Override public String hello() { return throwable.getMessage(); } }; } }
詳細參考案例源碼:https://gitee.com/coding-farmer/spirngcloud-learn