文章目录
1 Ribbon概述
1.1 是什么
Spring Cloud Ribbon 是基于Netflix Ribbon实现的一套客户端
负载均衡
的工具。
简单说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置如连接超时,重试等。简单的说,就是在配置文件中列出Load Blancer后面所有的机器,Ribbon会自动帮助你基于某种规则(简单轮询,随机连接等)去连接这些机器,我们很容易使用Ribbon提供的负载均衡算法。
1.2 能干啥:负载均衡
什么是负载均衡
简单来说就是将用户的请求平摊到多个服务上,从而达到系统的高可用。常见的负载均衡有软件有nginx,LVS,硬件F5
Ribbon本地负载均衡客户端和nginx服务端负载均衡区别
- nginx是服务端负载均衡,客户端所有请求都会交给nginx,由nginx实现转发请求,即负载均衡由服务端实现的。既请求由 nginx 服务器端进行转发。
- Ribbon 是从 注册中心服务器端上获取服务注册信息列表,缓存到JVM本地,然后在本地实现RPC远程服务调用
应用场景的区别
Nginx 适合于服务器端实现负载均衡 比如 Tomcat ,Ribbon 适合与在微服务中 RPC 远程调用实现本地服务负载均衡,比如 Dubbo、SpringCloud 中都是采用本地负载均衡。
集中式负载均衡和进程内的负载均衡
- 集中式:在服务的消费方和提供方之间使用独立的负载均衡设施(可以是硬件,比如F5,也可以是软件,比如nginx),由该设施负责把访问请求通过某种策略转发至服务的提供方。
- 进程内:将负载均衡集成到消费方,消费方从注册中心获知有哪些地址可用,然后自己再从这些地址中选择一个合适的地址。RIbbon就是属于进程内的负载均衡,他只是一个类库,集成到消费方的进程中,消费方通过它来获取服务提供方的地址。
Ribbon工作时分两步
- 先选择注册中心Server(比如Eureka Server),优先选择同一个区域内负载较少的Server
- 在根据配置的负载均衡策略,从注册中心获取到服务注册列表中选择一个服务地址。
1.3 其他说明
新版已经集成了Ribbon
新版的引入springCloud的服务发现,已经自动集成了Ribbon,比如zookeeper
这也就是之前我们根本没有引入Ribbon的依赖,已经可以使用@LoadBlance注解
RestTemplate使用
可参考:这里不多介绍
RestTemplate使用
2 Ribbon负载均衡策略
2.1 Ribbon负载均衡策略有哪些
com.netflix.loadbalancer.IRule
这个接口就定义了负载均衡策略的实现规范。
public interface IRule{
/*
* choose one alive server from lb.allServers or
* lb.upServers according to key
*
* @return choosen Server object. NULL is returned if none
* server is available
*/
public Server choose(Object key);
public void setLoadBalancer(ILoadBalancer lb);
public ILoadBalancer getLoadBalancer();
}
常用的策略:
com.netflix.loadbalancer.RoundRobinRule
: 轮询策略com.netflix.loadbalancer.RandomRule
:随机策略com.netflix.loadbalancer.RetryRule
:先按照RoundRobinRule策略获取服务,如果获取失败则在指定时间内会进行重试com.netflix.loadbalancer.WeightedResponseTimeRule
:对轮询策略的扩展,响应速度越快的实例选择权重越大,越容易被选中com.netflix.loadbalancer.BestAvailableRule
: 会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量小的服务。com.netflix.loadbalancer.AvailabilityFilteringRule
: 先过滤掉故障实例,在选择并发小的实例com.netflix.loadbalancer.ZoneAvoidanceRule
: 默认规则,复合判断Server所在区域的性能和Server的可用性选择服务器
2.2 如何替换
这里我们演示一下如何更换为随机规则。
- 在消费者订单服务中增加Ribbon轮询规则配置
注意:关于轮询规则配置类不能放到@ComponentScan注解所扫描到的包及其子包,否则这个类就会被所有的Ribbon客户端所共享,达不到特殊化定制的目的
package study.wyy.ribbon.config;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author by wyaoyao
* @Description
* @Date 2020/12/15 4:23 下午
*/
@Configuration
public class RibbonConfig {
@Bean
public IRule iRule(){
return new RandomRule();
}
}
- 在消费者订单服务的启动类增加
@RibbonClients
package study.wyy.cloud.order;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
import org.springframework.cloud.netflix.ribbon.RibbonClients;
import study.wyy.ribbon.config.RibbonConfig;
/**
* @author by wyaoyao
* @Description
* @Date 2020/10/28 8:55 下午
*/
@SpringBootApplication
@EnableEurekaClient
@RibbonClients({
@RibbonClient(name = "cloud-payment-service",configuration = RibbonConfig.class)
})
public class OrderApp {
public static void main(String[] args) {
SpringApplication.run(OrderApp.class,args);
}
}