SpringCloud之遠端呼叫Feign
一.Feign
在上篇文章中,我們使用了Ribbon的負載均衡功能,大大簡化了遠端呼叫時的程式碼:
String baseUrl = "http://user-service/user/";
User user = this.restTemplate.getForObject(baseUrl + id, User.class)
這就是我們接下來要學的Feign的功能了。
1.1.簡介
有道詞典的英文解釋:
為什麼叫偽裝?
Feign可以把Rest的請求進行隱藏,偽裝成類似SpringMVC的Controller一樣。你不用再自己拼接url,拼接引數等等操作,一切都交給Feign去做。
專案主頁:https://github.com/OpenFeign/feign
1.2.快速入門
1.2.1.匯入依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
1.2.2.Feign的客戶端
@FeignClient("user-service")
public interface UserFeignClient {
@GetMapping("/user/{id}")
User queryUserById(@PathVariable("id") Long id);
}
- 首先這是一個介面,Feign會通過動態代理,幫我們生成實現類。
@FeignClient
,宣告這是一個Feign客戶端,類似@Mapper
註解。同時通過value
屬性指定服務名稱- 介面中的定義方法,完全採用SpringMVC的註解,Feign會根據註解幫我們生成URL,並訪問獲取結果
改造原來的呼叫邏輯,修改UserDao:
@Autowired
private UserFeighClient userFeighClient;
@HystrixCommand(fallbackMethod = "queryUserByIdFallback")
public User queryUserById(Long id){
long begin = System.currentTimeMillis();
User user = this.userFeighClient.queryById(id);
long end = System.currentTimeMillis();
System.out.println("用時:"+(begin-end));
return user;
}
1.2.3.開啟Feign功能
我們在啟動類上,添加註解,開啟Feign功能
@SpringBootApplication
@EnableDiscoveryClient
@EnableHystrix
@EnableFeignClients // 開啟Feign功能
public class UserConsumerDemoApplication {
public static void main(String[] args) {
SpringApplication.run(UserConsumerDemoApplication.class, args);
}
}
- 你會發現RestTemplate的註冊被我刪除了。Feign中已經自動集成了Ribbon負載均衡,因此我們不需要自己定義RestTemplate了
1.2.4.啟動測試:
訪問介面:
正常獲取到了結果。
1.3.負載均衡
Feign中本身已經集成了Ribbon依賴和自動配置:
因此我們不需要額外引入依賴,也不需要再註冊RestTemplate
物件。
另外,我們可以像上節課中講的那樣去配置Ribbon,可以通過ribbon.xx
來進行全域性配置。也可以通過服務名.ribbon.xx
來對指定服務配置:
全域性配置:對所有服務都生效
ribbon:
ConnectTimeout: 250 # 連線超時時間(ms)
ReadTimeout: 1000 # 通訊超時時間(ms)
OkToRetryOnAllOperations: true # 是否對所有操作重試
MaxAutoRetriesNextServer: 1 # 同一服務不同例項的重試次數
MaxAutoRetries: 1 # 同一例項的重試次數
區域性配置:只對當前服務生效
user-service:
ribbon:
ConnectTimeout: 250 # 連線超時時間(ms)
ReadTimeout: 1000 # 通訊超時時間(ms)
OkToRetryOnAllOperations: true # 是否對所有操作重試
MaxAutoRetriesNextServer: 1 # 同一服務不同例項的重試次數
MaxAutoRetries: 1 # 同一例項的重試次數
1.4.Hystix支援
Feign預設也有對Hystix的整合:
只不過,預設情況下是關閉的。我們需要通過下面的引數來開啟:
feign:
hystrix:
enabled: true # 開啟Feign的熔斷功能
但是,Feign中的Fallback配置不像Ribbon中那樣簡單了。
1)首先,我們要定義一個類,實現剛才編寫的UserFeignClient,作為fallback的處理類
@Component
public class UserFeignClientFallback implements UserFeignClient {
@Override
public User queryUserById(Long id) {
User user = new User();
user.setId(id);
user.setName("使用者查詢出現異常!");
return user;
}
}
2)然後在UserFeignClient中,指定剛才編寫的實現類
@FeignClient(value = "user-service", fallback = UserFeignClientFallback.class)
public interface UserFeignClient {
@GetMapping("/user/{id}")
User queryUserById(@PathVariable("id") Long id);
}
3)重啟測試:
我們關閉user-service服務,然後在頁面訪問:
1.5.請求壓縮
GZIP壓縮:
Spring Cloud Feign 支援對請求和響應進行GZIP壓縮,以減少通訊過程中的效能損耗。通過下面的引數即可開啟請求與響應的壓縮功能:
feign:
compression:
request:
enabled: true # 開啟請求壓縮
response:
enabled: true # 開啟響應壓縮
同時,我們也可以對請求的資料型別,以及觸發壓縮的大小下限進行設定:
feign:
compression:
request:
enabled: true # 開啟請求壓縮
mime-types: text/html,application/xml,application/json # 設定壓縮的資料型別
min-request-size: 2048 # 設定觸發壓縮的大小下限
注:上面的資料型別、壓縮大小下限均為預設值。
再給大家推薦本人的另外一篇文章:
SpringCloud之閘道器Zuul