九、基于Ribbon实现负载均衡
在ribbon入门篇我们已经简单的实现了负载均衡策略,那么负载均衡策略在ribbon上是如何实现的呢?下面我们一起来探究一下吧!
9.1 负载均衡概述
什么是负载均衡?
在网站搭建时,如果单节点的web服务性能和可靠性都无法达到要求,或者是在使用外网服务时,经常担心被人攻击,一不小心就会有打开外网端口的情况,通常这个时候加入负载均衡就能有效解决服务问题。
负载均衡是一种基础的网络服务,其原理是通过运行在前面的负载均衡服务,按照指定的负载均衡算法,将流量分配到后端服务集群上,从而为系统提供并行扩展的能力。
负载均衡的应用场景包括流量包、转发规则以及后端服务,由于该服务有内外网个例、健康检查等功能,能够有效提供系统的安全性和可用性。
小贴士:
Ribbon是客户端负载均衡工具!所以应该配置在客户端!!
9.2 客户端负载均衡与服务端负载均衡
-
服务端负载均衡
先发送请求到负载均衡服务器或者软件,然后通过负载均衡算法,在多个服务器之间选择一个进行访问。即在服务器端就进行负载均衡算法分配。
-
客户端负载均衡
客户端会有一个服务器地址列表,在发送请求前通过负载均衡算法选择一个服务器,然后进行访问,这是客户端端在均衡。即在客户端就进行负载均衡算法分配。
9.3 负载均衡策略
Ribbon内置了多种负载均衡策略,内部负责复杂均衡的顶级接口为:com.netflix.loadbalancer.IRule,实现方式有以下几种:
- com.netflix.loadbalancer.RoundRobinRule :以轮询的方式进行负载均衡。
- com.netflix.loadbalancer.RandomRule :随机策略
- com.netflix.loadbalancer.RetryRule :重试策略。
- com.netflix.loadbalancer.WeightedResponseTimeRule :权重策略。会计算每个服务的权重,越高的被调用的可能性越大。
- com.netflix.loadbalancer.BestAvailableRule :最佳策略。遍历所有的服务实例,过滤掉故障实例,并返回请求数最小的实例返回。
- com.netflix.loadbalancer.AvailabilityFilteringRule :可用过滤策略。过滤掉故障和请求数超过阈值的服务实例,再从剩下的实力中轮询调用。
在消费者方application.yml配置文件中修改负载均衡策略:
##需要调用的微服务名称
ebuy-product:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #负载均衡策略
策略选择:
1、如果每个机器配置一样,则建议不修改策略(推荐);
2、如果部分机器配置强,则可以改为WeightedResponseTimeRule。
9.4 Ribbon中的关键组件
- ServerList:可以响应客户端的特定服务的服务器列表。
- ServerListFilter:可以动态获得的具有所需特征的候选服务器列表的过滤器。
- ServerListUpdater:用于执行动态服务器列表更新。
- Rule:负载均衡策略,用于确定从服务器列表返回哪个服务器。
- Ping:客户端用于快速检查服务器当时是否处于活动状态。
- LoadBalancer:负载均衡器,负责负载均衡调度的管理。
9.5 @LoadBalanced注解
使用Ribbon完成客户端复杂均衡往往是从一个注解开始的:
/**
* 配置RestTemplate交给spring管理
* 基于Ribbon的服务调用与负载均衡
* @return
*/
@Bean
@LoadBalanced
public RestTemplate restTemplate()
{
return new RestTemplate();
}
通过注解可以知道@LoadBalanced注解是用来给RestTemplate做标记,方便我们对RestTemplate添加一个LoadBalanceClient,以实现客户端负载均衡。
当然,除了已有的负载均衡策略之外,还可以自定义负载均衡算法,但需要注意的是:
自定义的Ribbon算法类不能放在主启动类所在的包及子包下,否则会被全局应用到Ribbon服务中。 应该把自定义算法类放在另外新建的包下,且这个类应该是为【配置类】即加上注解@Configuration。