在前面的學習中,我們使用了Ribbon的負載均衡功能,大大簡化了遠程調用時的代碼:
String user = this.restTemplate.getForObject("http://service-provider/user/" + id, String.class);
如果就學到這裏,你可能以後需要編寫類似的大量重複代碼,格式基本相同,無非參數不一樣。有沒有更優雅的方式,來對這些代碼再次優化呢?
這就是我們接下來要學的Feign的功能了。
簡介
Feign可以把Rest的請求進行隱藏,僞裝成類似SpringMVC的Controller一樣。你不用再自己拼接url,拼接參數等等操作,一切都交給Feign去做。
項目主頁:https://github.com/OpenFeign/feign
快速入門
改造bubbletg-consumer工程
導入依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
開啓Feign功能
我們在啓動類上,添加註解,開啓Feign功能
@SpringCloudApplication
@EnableFeignClients // 開啓feign客戶端
public class ServiceConsumerApplication {
//@Bean
//@LoadBalanced
//public RestTemplate restTemplate() {
// return new RestTemplate();
//}
public static void main(String[] args) {
SpringApplication.run(ServiceConsumerApplication.class, args);
}
}
刪除RestTemplate**:feign已經自動集成了Ribbon負載均衡的RestTemplate。所以,此處不需要再註冊RestTemplate。
Feign的客戶端
在bubbletg-consumer工程中,添加UserClient接口:
/**
* @author www.bubbletg.cn * BubbleTg
* @version 1.0
* @date 2019/8/24 9:17
*/
@FeignClient(value = "service-provider") // 標註該類是一個feign接口
public interface UserClient {
@GetMapping("user/{id}")
User queryUserById(@PathVariable("id") Long id);
}
- 首先這是一個接口,Feign會通過動態代理,幫我們生成實現類。這點跟mybatis的mapper很像
@FeignClient
,聲明這是一個Feign客戶端,類似@Mapper
註解。同時通過value
屬性指定服務名稱- 接口中的定義方法,完全採用SpringMVC的註解,Feign會根據註解幫我們生成URL,並訪問獲取結果
改造原來的調用邏輯,調用UserClient接口:
@Controller
@RequestMapping("consumer/user")
public class UserController {
@Autowired
private UserClient userClient;
@GetMapping
@ResponseBody
public User queryUserById(@RequestParam("id") Long id){
User user = this.userClient.queryUserById(id);
return user;
}
}
測試
負載均衡
Feign中本身已經集成了Ribbon依賴和自動配置:
因此我們不需要額外引入依賴,也不需要再註冊RestTemplate
對象。
Hystrix支持
Feign默認也有對Hystrix的集成:
只不過,默認情況下是關閉的。我們需要通過下面的參數來開啓:(在bubbletg-consumer工程添加配置內容)
feign:
hystrix:
enabled: true # 開啓Feign的熔斷功能
1)首先,我們要定義一個類UserClientFallback,實現剛纔編寫的UserClient,作爲fallback的處理類
@Component
public class UserClientFallback implements UserClient {
@Override
public User queryUserById(Long id) {
User user = new User();
user.setUsername("服務器繁忙,請稍後再試!UserClientFallback-----");
return user;
}
}
2)然後在UserFeignClient中,指定剛纔編寫的實現類
@FeignClient(value = "service-provider", fallback = UserClientFallback.class) // 標註該類是一個feign接口
public interface UserClient {
@GetMapping("user/{id}")
User queryUserById(@PathVariable("id") Long id);
}
重啓測試:
請求壓縮(瞭解)
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 # 設置觸發壓縮的大小下限
注:上面的數據類型、壓縮大小下限均爲默認值。