1.Feign負載均衡簡介
1.1 Feign是什麼
Feign是一個聲明式WebService客戶端。使用Feign能讓編寫Web Service客戶端更加簡單, 它的使用方法是定義一個接口,然後在上面添加註解,同時也支持JAX-RS標準的註解。Feign也支持可拔插式的編碼器和解碼器。Spring Cloud對Feign進行了封裝,使其支持了Spring MVC標準註解和HttpMessageConverters。Feign可以與Eureka和Ribbon組合使用以支持負載均衡。
Feign作用就是封裝了一個註解,簡化Ribbon的調用代碼,讓代碼更加清晰,方便開發~~
官網解釋:
http://projects.spring.io/spring-cloud/spring-cloud.html#spring-cloud-feign
Feign是一個聲明式的Web服務客戶端,使得編寫Web服務客戶端變得非常容易,
只需要創建一個接口,然後在上面添加註解即可。
參考官網:https://github.com/OpenFeign/feign
1.2 Feign主要作用
Feign旨在使編寫Java Http客戶端變得更容易。
前面在使用Ribbon+RestTemplate
時,利用RestTemplate
對http請求的封裝處理,形成了一套模版化的調用方法。但是在實際開發中,由於對服務依賴的調用可能不止一處,往往一個接口會被多處調用,所以通常都會針對每個微服務自行封裝一些客戶端類來包裝這些依賴服務的調用。所以,Feign在此基礎上做了進一步封裝,由他來幫助我們定義和實現依賴服務接口的定義
。在Feign的實現下,我們只需創建一個接口並使用註解的方式來配置它(以前是Dao接口上面標註Mapper註解,現在是一個微服務接口上面標註一個Feign註解即可),即可完成對服務提供方的接口綁定,簡化了使用Spring cloud Ribbon時,自動封裝服務調用客戶端的開發量。
Feign集成了Ribbon
利用Ribbon維護了springcloud-demo-service的服務列表信息,並且通過輪詢實現了客戶端的負載均衡。而與Ribbon不同的是,通過feign只需要定義服務綁定接口且以聲明式的方法,優雅而簡單的實現了服務調用。
有道詞典的英文解釋:
爲什麼叫僞裝?
Feign可以把Rest的請求進行隱藏,僞裝成類似SpringMVC的Controller一樣。你不用再自己拼接url,拼接參數等等操作,一切都交給Feign去做。
2.快速入門
2.1.導入依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.2.Feign的客戶端
/**
* @author bruceliu
*
* @description Feign客戶端
*/
@FeignClient(value = "SPRINGCLOUD-DEMO-SERVICE")
public interface UserClientService {
@RequestMapping("/all")
public List<User> queryUsers();
}
- 首先這是一個接口,Feign會通過動態代理,幫我們生成實現類。這點跟mybatis的mapper很像
@FeignClient
,聲明這是一個Feign客戶端,類似@Mapper
註解。同時通過value
屬性指定服務名稱- 接口中的定義方法,完全採用SpringMVC的註解,Feign會根據註解幫我們生成URL,並訪問獲取結果
改造原來的調用邏輯UserController:
/**
* @author bruceliu
*
* @description
*/
@RestController
@RequestMapping("consumer")
public class ConsumerController {
@Autowired
private UserClientService userService;
@RequestMapping("/test")
public List<User> consumerTest(){
return userService.queryUsers();
}
}
2.3.開啓Feign功能
我們在啓動類上,添加註解,開啓Feign功能
@SpringBootApplication
@EnableDiscoveryClient // 開啓EurekaClient功能
@EnableFeignClients // 開啓Feign功能
public class SpringcloudDemoConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudDemoConsumerApplication.class, args);
}
}
- 你會發現RestTemplate的註冊被我刪除了。Feign中已經自動集成了Ribbon負載均衡,因此我們不需要自己定義RestTemplate了
2.4.啓動測試:
訪問接口:
正常獲取到了結果。
3.負載均衡
Feign中本身已經集成了Ribbon依賴和自動配置:
因此我們不需要額外引入依賴,也不需要再註冊RestTemplate
對象。
另外,我們可以像上節課中講的那樣去配置Ribbon,可以通過ribbon.xx
來進行全局配置。也可以通過服務名.ribbon.xx
來對指定服務配置:
SPRINGCLOUD-DEMO-SERVICE:
ribbon:
ConnectTimeout: 250 # 連接超時時間(ms)
ReadTimeout: 1000 # 通信超時時間(ms)
OkToRetryOnAllOperations: true # 是否對所有操作重試
MaxAutoRetriesNextServer: 1 # 同一服務不同實例的重試次數
MaxAutoRetries: 1 # 同一實例的重試次數
4.小結
Feign通過接口的方法調用Rest服務(之前是Ribbon+RestTemplate),通過Feign直接找到服務接口,由於在進行服務調用的時候融合了Ribbon技術,所以也支持負載均衡作用。