Ribbon是什么?
Ribbon是Netflix公司开源的一个负载均衡的项目,它属于上述的第二种,是一个客户端负载均衡器,运行在客户端上。它是一个经过了云端测试的IPC库,可以很好地控制HTTP和TCP客户端的一些行为。 Feign已经默认使用了Ribbon。
- 负载均衡
- 容错
- 多协议(HTTP,TCP,UDP)支持异步和反应模型
- 缓存和批处理
Ribbon的主要组件与工作流程
Ribbon的核心组件(均为接口类型)有以下几个:
ServerList:用于获取地址列表。它既可以是静态的(提供一组固定的地址),也可以是动态的(从注册中心中定期查询地址列表)。
ServerListFilter:仅当使用动态ServerList时使用,用于在原始的服务列表中使用一定策略过虑掉一部分地址。
IRule:选择一个最终的服务地址作为负载均衡结果。选择策略有轮询、根据响应时间加权、断路器(当Hystrix可用时)等。
Ribbon在工作时首选会通过ServerList来获取所有可用的服务列表,然后通过ServerListFilter过虑掉一部分地址,最后在剩下的地址中通过IRule选择出一台服务器作为最终结果。
如何在项目中快速使用Ribbon
第一步:创建服务消费者项目,并引入Ribbon的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
第二步:启动类中添加
@Bean
@LoadBalanced
RestTemplate restTemplate(){
return new RestTemplate();
}
第三步:在需要调用服务提供方信息的地方注入RestTemplate
@Service
public class OrderServiceImpl implements OrderService {
@Autowired
private RestTemplate restTemplate;
@Override
public Object orderInfo() {
Object result = restTemplate.getForObject("http://CONSUMER-SERIVCE/api/v1/consumer/findAll", Object.class);
return result;
}
@Override
public Object checkOrderById(Integer id) {
Object consumerValue = restTemplate.getForObject("http://CONSUMER-SERIVCE/api/v1/consumer/findById?id=" + id, Object.class);
return consumerValue;
}
}
注意:
1.在restTemplate方法中,用serviceId代替真实的Ip地址+端口号,或者域名信息,其中serviceId就是服务提供方在注册中心注册的服务名
2.在使用RestTemplate过程中经常出现的一个错误就是:
使用RestTemplate时报错java.lang.IllegalStateException: No instances available for。。。
解决方案:
查看restTemplate方法中的参数,是否使用了正确的serviceId信息,记住一点和注册中心上的服务名相同就没错!!!
自定义Ribbon负载均衡策略
Ribbon默认的负载均衡策略是轮询,可以根据实际的需求进行修改
参考官网资料:
http://cloud.spring.io/spring-cloud-static/Finchley.RELEASE/single/spring-cloud.html#_customizing_the_ribbon_client_by_setting_properties
在配置文件yml里面,自定义负载均衡策略
#自定义负载均衡策略
product-service:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
Ribbon的理解
推荐阅读地址:
https://www.jianshu.com/p/1c02c1f8c0ff
https://blog.csdn.net/forezp/article/details/74820899