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時自行封裝服務調用客戶端的開發量。
1)引入Feign的依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
2)給主函數加註解
@EnableFeignClients @SpringCloudApplication public class ConsumerApplication { // @Bean // @LoadBalanced //底層用了攔截器,攔截restTemplate 的http請求,使用負載均衡算法處理請求 // public RestTemplate restTemplate() { // return new RestTemplate(); //} public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class); }
3)編寫一個接口,利用SpringMVC的方式,告訴Feign請求的方式,參數,返回值,方法名。
@FeignClient("user-service") public interface UserClient { @GetMapping("user/{id}") User queryById(@PathVariable("id") Integer id); }
4)Controller類
@Autowired private UserClient userClient; @GetMapping("{id}") public User queryById(@PathVariable("id")Integer id){ // String url="http://user-service/user/"+id; // String user=restTemplate.getForObject(url,String.class); return userClient.queryById(id);
OK!
ⅡFeign中使用熔斷
Feign對Hystix支持。
1)開啓熔斷
feign: #hystrix在feign裏默認是關閉的,需要開啓feign的熔斷 hystrix: enabled: true
2)定義一個類實現client接口
public class UserClientFallback implements UserClient {//熔斷接口實現類 @Override public User queryById(Integer id) { User user = new User(); user.setUsername("未知"); return user; } }
在接口中,指定實現類 @FeignClient(value = "user-service",fallback = UserClientFallback.class) public interface UserClient { @GetMapping("user/{id}") User queryById(@PathVariable("id") Integer id); }