Ribbon简介
Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用。Spring Cloud Ribbon虽然只是一个工具类框架,它不像服务注册中心、配置中心、API网关那样需要独立部署,但是它几乎存在于每一个Spring Cloud构建的微服务和基础设施中。因为微服务间的调用,API网关的请求转发等内容,实际上都是通过Ribbon来实现的,包括后续我们将要介绍的Feign,它也是基于Ribbon实现的工具。所以,对Spring Cloud Ribbon的理解和使用,对于我们使用Spring Cloud来构建微服务非常重要。
客户端负载均衡
负载均衡在系统架构中是一个非常重要,并且是不得不去实施的内容。因为负载均衡是对系统的高可用、网络压力的缓解和处理能力扩容的重要手段之一。我们通常所说的负载均衡都指的是服务端负载均衡,其中分为硬件负载均衡和软件负载均衡。硬件负载均衡主要通过在服务器节点之间按照专门用于负载均衡的设备,比如F5等;而软件负载均衡则是通过在服务器上安装一些用于负载均衡功能或模块等软件来完成请求分发工作,比如Nginx等。不论采用硬件负载均衡还是软件负载均衡,只要是服务端都能以类似下图的架构方式构建起来:
IRule接口分析:
public interface IRule {
com.netflix.loadbalancer.Server choose(java.lang.Object o);
void setLoadBalancer(com.netflix.loadbalancer.ILoadBalancer iLoadBalancer);
com.netflix.loadbalancer.ILoadBalancer getLoadBalancer();
}
Ribbon中已经实现了IRule接口的类:这些类都是Ribbon中的负载均衡算法,抽象类除外。
IRule接口中有两个类型值得注意:Server和ILoadBalancer。Server封装了是注册进Eureka的微服务信息,也就代表注册进Eureka的微服务。而ILoadBalancer是一个接口,用来获取注册进Eureka的全部或部分或某个微服务信息,如下:
public interface ILoadBalancer {
void addServers(List<Server> var1);
Server chooseServer(Object var1);
void markServerDown(Server var1);
/** @deprecated */
@Deprecated
List<Server> getServerList(boolean var1);
List<Server> getReachableServers();
List<Server> getAllServers();
}
自定义Ribbon负载均衡
注意:这个自定义配置类不能放在@ComponentScan所扫描的当前包下以及子包下,否则我们自定义配置类被所有的Ribbon客户端所共享,达不到特殊化定制的目的。
@Configuration
public class MyIRule {
@Bean
public IRule myRibbonIRule(){
//定义为随机
return new RandomRule();
}
}
在主程序中添加
@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name = "CLOUD-PAYMENT-SERVICE",configuration = MyIRule.class)
public class Order9001 {
public static void main(String[] args) {
SpringApplication.run(Order9001.class,args);
}
}
在RestTemplate中添加
@Configuration
public class ApplicationConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
结果:每次访问都会在服务提供者中进行随机挑选进行连接
总结:
Ribbon负载均衡有多种策略,可根据实际需求进行筛选;