Feign是Netflix开发的一个轻量级Restflu的HTTP服务客户端(用它来发起请求,远程调用的),是以接口注解的方式调用Http请求,而不用像Java中通过封装HTTP请求报文的方式直接调用,Feign被广泛应用再Spring Cloud的解决方案中。
类似于Dubbo,服务消费者拿到服务提供者的接口,然后像调用本地接口方法一样去调用,实际发出的是远程的请求。
本质:封装了Http调用流程,更符合面向接口化编程习惯,类似于Dubbo的服务调用
一、Feign配置应用
在效果上:
Feign = RestTemplate + Ribbon + Hystrix
1、消费者工程应用
- 引入Feign依赖
1 2 3 4
| <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
|
- 启动类添加注解
1 2 3 4 5 6 7 8
| @SpringBootApplication @EnableDiscoveryClient @EnableFeignClients public class AutodeliverFeignApplication8092 { public static void main(String[] args) { SpringApplication.run(AutodeliverFeignApplication8092.class,args); } }
|
注意:此时去掉Hystrix熔断支持注解,@EnableCircuitBreaker
即可包括引⼊的依赖,因为Feign会⾃动引⼊
- 常见feign接口
1 2 3 4 5 6
| @FeignClient(name = "sc-service-resume") public interface ResumeClientFeign {
@RequestMapping(value = "/resume/openstate/{userId}",method= RequestMethod.GET) public Integer findResumeOpenState(@PathVariable(value ="userId") Long userId); }
|
- 使用feign接口
1 2 3 4 5 6 7 8
| @Autowired ResumeClientFeign resumeClientFeign;
Integer resumeOpenState = resumeClientFeign.findResumeOpenState(15451321L); System.out.println("resumeOpenState = " + resumeOpenState);
|
2、Feign对负载均衡的支持
Feign本身已经集成了Ribbon依赖和自动配置,我们不需要额外引入依赖,可以通过ribbon.xx来进行全局配置,也可以通过服务名.ribbon.xx来对指定服务进行细节配置
- Feign默认请求处理时长1s,可自定义Feign超时设置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| sc-service-resume: ribbon: ConnectTimeout: 2000 ReadTimeout: 3000 OkToRetryOnAllOperations: true MaxAutoRetries: 0 MaxAutoRetriesNextServer: 0 NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule
|
3、Feign对熔断器的支持
开启Feign对熔断器的支持
超时时长
- Feign的超时时长就是上面Ribbon的超时时长设置
- Hystrix超时设置(就按照之前Hystri设置方式就OK)
超时时长,熔断的时候就是根据这两个时间的最小值来进行的,即处理时长超过了最短的那个超时时间了就熔断进行回退降级逻辑
1 2 3 4 5 6 7 8 9 10 11 12
| feign: hystrix: enabled: false hystrix: command: default: execution: isolation: thread: timeoutInMilliseconds: 15000
|
编写回退逻辑
- 编写降级逻辑 类 UserInfoFallbackService 实现 feign接口,添加注解@Comment能被扫描到,实现接口方法
- 类添加 fallback = UserInfoFallbackService.class 关联回退处理类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| @FeignClient(name = "sc-service-resume",fallback = ReusmeFailBackService.class,path = "/resume") public interface ResumeClientFeign {
@RequestMapping(value = "/openstate/{userId}",method= RequestMethod.GET) public Integer findResumeOpenState(@PathVariable(value ="userId") Long userId); }
@Component class ReusmeFailBackService implements ResumeClientFeign{ @Override public Integer findResumeOpenState(Long userId) { return -1; } }
|