目录
3.如法炮制,复制nacos_consumer工程,并改为Ribbon_consumer
零、Ribbon是什么
Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。
简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将NetFlix的中间层服务连接在一起。Ribbon的客户端组件提供一系列完整的配置项如:连接超时、重试等等。简单的说,就是在配置文件中列出 LoadBalancer(简称LB:负载均衡)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等等)去连接这些机器。我们也很容易使用Ribbon实现自 定义的负载均衡算法!
一、Nginx和Ribbon的负载均衡有何不同?
通常说的负载均衡一般是nginx用于解决服务器而行使的负载均衡策略。而Ribbon的负载均衡则是指的是客户端的负载均衡策略,即一个Consumer 调用多个相同服务名的Provider,由 Consumer 选择调用哪个 Provider。
二、Ribbon入门小案例
1.Nacos已经集成了ribbon,所以依赖也不用引
之前创建的nacos_provider在这里需要复制两份以上,来模拟多个相同的Provider。具体的工程在我之前的文章中提到做法,可参考一下https://blog.csdn.net/Javashj/article/details/126320154https://blog.csdn.net/Javashj/article/details/126320154
2.这里做一个例子
- 直接复制nacos_provider子Module到父工程下
- 但是复制的只是一个文件夹,并非工程。点击File,选择项目结构
- 之后选择Modules,在点击加号,选择Import导入工程
- 在选择粘贴的工程,点OK。一路确定就可以了。
但是还需要改动一下,觉得繁琐的可以直接创建一个子工程
- 在父工程的pom.xml文件添加子modules,修改一下启动类类名
- 三个复制的Provider的配置文件Application.yml,改成不同的端口号,其他不变
- 修改每个Provider的Service,加上01,02,03
@Service public class UserServiceImpl implements UserService { @Override public User getUserById(Integer id) { return new User(id, "王粪堆-01", 18); } }
3.如法炮制,复制nacos_consumer工程,并改为Ribbon_consumer
- 也可直接创建
- 修改application的应用名application.name,要求见名知意
- 创建一个配置类ConfigBean
@Configuration
public class ConfigBean {
@Bean
/**
* 添加了@LoadBalanced注解之后,Ribbon会给restTemplate请求添加一个拦截器,在拦截器中获取注册中心的所有可用服务,通过获取到的服务信息(ip,port)替换 serviceId 实现负载请求。
*/
@LoadBalanced//开启负载均衡
public RestTemplate restTemplate() {
return new RestTemplate();
}
//随机策略
@Bean
public IRule iRule(){
return new RandomRule();
}
}
修改一下Controller类
@RestController
@RequestMapping(value = "/consumer")
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
private int currentIndex;
@RequestMapping("/getUserById/{id}")
public User getUserByIds(@PathVariable Integer id) {
//不使用ribbon:ip:port
//String serviceUrl = "127.0.0.1:9090";
//使用ribbon:不再使用ip:port的方式,而是改成了serviceId(即Nacos中注册的服务名称)
String serviceUrl = "ribbon-provider";
return restTemplate.getForObject("http://" + serviceUrl +
"/provider/getUserById/" + id, User.class);
}
}
4.测试
开启Mysql,开启Nacos,开启三个Provider,开启ribbon的consumer
输入网址三个输出到浏览器的语句没有任何规律,因为什么呢?
5.负载均衡策略
策略类 | 命名 | 描述 |
---|---|---|
RandomRule | 随机策略 | 随机选择 Server |
RoundRobinRule | 轮询策略 | 按照顺序循环选择 Server |
RetryRule | 重试策略 | 在一个配置时间段内,当选择的 Server 不成功,则一直尝试选择一个可用的 Server |
BestAvailableRule | 最低并发策略 | 逐个考察 Server,如果 Server 的断路器被打开,则忽略,在不被忽略的 Server 中选择并发连接最低的 Server |
AvailabilityFilteringRule | 可用过滤测试 | 过滤掉一直连接失败,并被标记未 circuit tripped(即不可用) 的 Server,过滤掉高并发的 Server |
ResponseTimeWeightedRule | 响应时间加权策略 | 根据 Server 的响应时间分配权重,响应时间越长,权重越低,被选择到的几率就越低 |
ZoneAvoidanceRule | 区域权衡策略 | 综合判断 Server 所在区域的性能和 Server 的可用性轮询选择 Server,并判定一个 AWS Zone 的运行性能是否可用,剔除不可用的 Zone 中的所有 Server |
6.ribbon策略的选择
- 在ribbon的配置类中@Bean注入了一个随机策略,最后的结果就是随机出现,如果不注入任何策略,默认是轮询策略,也就是按顺序出现,刷新一下就是下一个。
- ribbon有好几个策略,具体源码这里不再赘述。
7.ribbon的问题
在本章中,ribbon虽然动态的获得了提供者的IP和端口,并自动进行拼接,返回回来,但是请求路径还需要拼接,还是不太智能,虽然可以通过其ribbon的其他方法也可以做到动态获取路径,但是宗其所有还是没有Feign方便。
下一个将浅练一下: