目录
前言
在前面的学习中,已经介绍了Eureka,Ribbon和Hystrix,虽然已经大大的减少了远程调用时的代码,但是在以后的应用和学习中还有可能遇到类似的大量的重复的代码,格式上基本没有区别,唯一有不同可能就是参数不同,此时就涉及到了这篇博客的内容了Feign
一、Feign是什么?
feign的英文意思是:假装 、装作、捏造的意思,那么今天介绍的就是Feign如何将Rest的请求进行隐藏,伪装成类似SpringMvc的controller一样,不用自己取拼装url,拼接参数等操作,而是将这些操作都交给Feign去做
二、Feign的入门
1.导依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.Feign的客户端
---->UserClient接口:
@FeignClient("user-service") //括号内的值和生产者(user-service)application.yml中的name一致
public interface UserClient {
@GetMapping("/user/{id}") //这里的返回结果和 url地址一定要和提供方保持一致
User findById(@PathVariable("id") Long id);
}
- Feign通过动态代理,帮助我们生成实现类,和mybatis的mapper很相似
- @FeignClient,声明这是一个Feign客户端,同时通过value指定服务(生产者)的名称
- 接口中的定义方法,完全采用SpringMVC的注解,Feign会根据注解帮助我们生成URL,并访问获取结果
----->改造UserComsumr使用UserClient访问
@RestController
@RequestMapping("consumer")
public class ConsumerController {
@Autowired
private UserClient userClient;
@GetMapping("{id}")
public User findById(@PathVariable("id") Long id){
return userClient.findById(id);
}
}
3. 开启Feign功能
在启动雷伤,添加注解,开启Feign功能:
@SpringCloudApplication
@EnableFeignClients // 开启Feign功能
public class ConsumerDemoApplication {
public static void main(String[] args) {
SpringApplication.run(UserConsumerDemoApplication.class, args);
}
}
当使用Feign功能进行开发的时候,会发现RestTemplate已经用不到可以删除了,Feign中已经自动继承了Ribbon的负载均衡,因此,就不需要在使用TestTemplate了.
4 代码结构
此代码结构可以参考其他博文:https://blog.youkuaiyun.com/weixin_43267344/article/details/109956408
三 Feign对其他技术的支持
1 Hystrix的支持
Feign中的Hystrix支持在默认情况下是关闭的,我们需要在application.yml配置文件中配置参数来开启Hystrix的支持
feign: hystrix: enabled: true # 开启Feign的熔断功能
1. 首先定义一个UserClient的实现类
@Component public class UserClientFallback implements UserClient { @Override public User queryById(Long id) { User user = new User(); user.setId(id); user.setName("用户查询出现异常!"); return user; } }
2 在接口中,指定降级方法类(注意方法名相同)
@FeignClient(value = "user-service", fallback = UserFeignClientFallback.class) public interface UserClient { @GetMapping("/user/{id}") User queryById(@PathVariable("id") Long id); }
2 负载均衡
Feign内置的Ribbon默认设置了请求超时时长,默认是1000ms,我们可以通过手动配置设置修改这个超时时长,并且由于ribbon内部有重试机制,一旦超时,会自动重新发起请求,如果不希望此机制生效,可以添加配置.
ribbon: ReadTimeout: 2000 # 数据通信超时时长 ConnectTimeout: 500 # 连接超时时长 MaxAutoRetries: 0 # 当前服务器的重试次数 MaxAutoRetriesNextServer: 1 # 重试多少次服务 OkToRetryOnAllOperations: false # 是否对所有的请求方式都重试 如果是false代表只对get请求重试
OkToRetryOnAllOperations:由于需要保证数据的幂等性(在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同),由于post,delete,put请求可能多次执行的结果会发生变化,不遵循幂等性,所以,此处只能对get请求能够重试.
另外,Hystix的超时时间应该比重试的总时间要大,如果小则会一直出现请求失败的情况,例如由于两个服务端(端口8080,8081),则需要配置的超时时间应大于{(2000+500)*2}
hystrix: command: default: execution: isolation: thread: timeoutInMilliseconds: 6000 //总的熔断时间