一、Ribbon和Feign两个的区别
Ribbon和Feign都是用于调用其他服务的,不过方式不同。
1、启动类使用的注解不同,Ribbon用的是@RibbonClient,Feign用的是@EnableFeignClients。
2、服务的指定位置不同,Ribbon是在@RibbonClient注解上声明,Feign则是在定义抽象方法的接口中使用@FeignClient声明。
3、调用方式不同,Ribbon需要自己构建http请求,模拟http请求然后使用RestTemplate发送给其他服务,步骤相当繁琐。
Feign则是在Ribbon的基础上进行了一次改进,采用接口的方式,将需要调用的其他服务的方法定义成抽象方法即可,
不需要自己构建http请求。不过要注意的是抽象方法的注解、方法签名要和提供服务的方法完全一致。
二、选择Feign
其实也默认集成了Ribbo!更加思路清晰和方便;采用注解方式进行配置,配置熔断等方式方便;
LoadBalancerFeignClient类
核心方法execute()
参数 Request类
参数 Options类
可以通过调试查看
(1) 模拟商品服务接口响应慢,线程睡眠10秒:
//根据商品ID查找商品信息
@RequestMapping("/find")
public Object find(int id){
//商品如果有问题让它故意睡10秒
try {
TimeUnit.SECONDS.sleep(10);
// TimeUnit.SECONDS.sleep(1); //修改成1s
} catch (InterruptedException e) {
e.printStackTrace();
}
再重新启动访问
发生异常:
那么如何解决呢?
用超时配置 :
将这个配置复制到application.yml中的订单服务,先修改成11s
再重新启动:等待11秒就没有异常了!
(2) 模拟商品服务接口响应慢,线程睡眠1秒:
将配置超时注释掉;就又发生异常!
原因: 默认optons readtimeout是60,但是由于熔断hystrix默认是1秒超时
那么如何解决呢?
将配置超时设置为2秒
再重新启动:无异常哦!
(3)Ribbon默认是“轮询”策略,也就是每一个轮着访问。那么能否修改成“随机”策略?
可以在配置文件中添加:
#自定义负载均衡策略
product-service:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
重新启动;可以查看到是OK的哦!