1、简介
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服务客户端定义的方式。
2、导入jar包
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <!--由于feign整合了ribbon的负载均衡,所以需要引入ribbon的依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> <version>2.1.1.RELEASE</version> </dependency> <!--需要从eureka拉取服务--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-netflix-eureka-client</artifactId> <version>2.1.1.RELEASE</version> </dependency>
3、启动类添加注解支持
@EnableFeignClients
4、客户端编写
//定义接口 package com.sun.client; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; @FeignClient(value = "user-service") //声明这是feign的客户端 public interface UserFeignClient { @GetMapping("user") public String getUser(); } 注释: 这是一个接口,Feign会通过动态代理,帮我们生成实现类。这点跟mybatis的mapper很像 @FeignClient,声明这是一个Feign客户端,类似@Mapper注解。同时通过value属性指定服务名称 接口中的定义方法,完全采用SpringMVC的注解,Feign会根据注解帮我们生成URL,并访问获取结果 改造原来的调用逻辑,不再调用UserDao: //实现调用 @Autowired private UserFeignClient userFeignClient; @GetMapping("feign") public Object feign(){ return userFeignClient.getUser(); }
5、feign自动实现负载均衡
6、feign的重试
#feign的重试与ribbon的配置相同,只要添加相应的配置即可。 client: ribbon: MaxAutoRetries: 1 #配置首台服务器重试1次 MaxAutoRetriesNextServer: 2#配置其他服务器重试两次 ConnectTimeout: 500 #链接超时时间 ReadTimeout: 2000 #请求处理时间 OkToRetryOnAllOperations: true #每个操作都开启重试机制
7、feign与hystrix的集成配置熔断机制
a、 添加熔断配置
feign: hystrix: enabled: true #允许熔断
b、添加熔断处理类
//实现 UserFeignClient接口 @Component public class UserFeignClientImpl implements UserFeignClient { @Override public String getUser() { return "访问人数过多"; } }
c、实现调用
@FeignClient(value = "user-service",fallback = UserFeignClientImpl.class) //声明这是feign的客户端 fallback 哪个出现访问延迟 就调用哪个方法的实现返回处理结果 public interface UserFeignClient { //接口定义 @GetMapping("user") public String getUser(); } //调用 @Autowired private UserFeignClient userFeignClient; @GetMapping("feign") public Object feign(){ return userFeignClient.getUser(); }