为什么要学习Feign
简答 远程调用 不用自己去书写Url
Feign英译为:假装 装作
Feign可以把Rest的请求进行隐藏,伪装成类似SpringMVC的Controller一样。你不用再自己拼接url,拼接参数等等操作,一切都交给Feign去做。
快速入门:
第一步:
导入依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
第二步:
在启动类上加上注释:
@EnableFeignClients // 开启Feign功能
Fegin的客户端:
@FeignClient("user-service")
public interface UserFeignClient {
@GetMapping("/user/{id}")
User queryUserById(@PathVariable("id") Long id);
}
介绍:
一 . 这是个接口 Feign会通过动态代理,帮我们实现类;
二 .@FeignClient,声明这是个Feign客户端类时于@Mapper注解同时通过value属性指定服务名称
三.接口中的自定义方法采用SpringMVC的注解,Feign会根据注解帮我们生成Url,
并访问获取结果
四.调取
@Autowired
private UserFeighClient userFeighClient;
public User queryUserById(Long id){
User user = this.userFeighClient.queryById(id);
return user;
}
Feign中本身已经集成了Ribbon和Hystrix
因此我们不需要额外引入依赖,也不需要再注册RestTemplate
对象。
配置Ribbon:
- 全局配置:对所有服务都生效
ribbon:
ConnectTimeout: 250 # 连接超时时间(ms)
ReadTimeout: 1000 # 通信超时时间(ms)
OkToRetryOnAllOperations: true # 是否对所有操作重试
MaxAutoRetriesNextServer: 1 # 同一服务不同实例的重试次数
MaxAutoRetries: 1 # 同一实例的重试次数
- 局部配置:只对当前服务生效
user-service:
ribbon:
ConnectTimeout: 250 # 连接超时时间(ms)
ReadTimeout: 1000 # 通信超时时间(ms)
OkToRetryOnAllOperations: true # 是否对所有操作重试
MaxAutoRetriesNextServer: 1 # 同一服务不同实例的重试次数
MaxAutoRetries: 1 # 同一实例的重试次数
配置Hystrix:
添加到 消费者的application.yaml中
feign:
hystrix:
enabled: true # 开启Feign的熔断功能
feign中的Fallback配置不像Ribbon中那样简单了。
首先,我们要定义一个类,实现刚才编写的UserFeignClient,作为fallback的处理类
@Component
public class UserFeignClientFallback implements UserFeignClient {
@Override
public User queryUserById(Long id) {
User user = new User();
user.setId(id);
user.setName("用户查询出现异常!");
return user;
}
}
然后在UserFeignClient中,指定刚才编写的实现类
@FeignClient(value = "user-service", fallback = UserFeignClientFallback.class)
public interface UserFeignClient {
@GetMapping("/user/{id}")
User queryUserById(@PathVariable("id") Long id);
}
想要测试熔断是否成功可以将Service生产者关掉 然后再访问页面