什么是Ribbon
目前主流的负载均衡分为两种:
- 集中式负载均衡 在消费者和服务提供方中间使用独立的代理方式进行负载,比如硬件有F5,软件如nginx
- 客户端根据自己的请求情况做负载均衡,Ribbon 就属于客户端自己做负载均衡
Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端的负载均衡工具,Ribbon客户端组件提供一系列的完善的配置,比如超时、重试等
通过Load Balancer获取到服务提供的所有机器实例,Ribbon会自动基于某种规则(轮询、随机)去调用这些服务.
Ribbon也可以实现我们自己的负载均衡算法
客户端的负载均衡
例如Spring Cloud中的Ribbon,客户端会有一个服务器地址列表,在发送请求前通过负载均衡算法选择一个服务器,然后进行访问,这是客户端负载均衡,也就是在客户端就进行负载均衡算法的分配
详细链接:
www.processon.com/view/link/6…
服务端的负载均衡
例如Nginx,通过Nginx进行负载均衡,先发送请求,然后通过负载均衡算法,在多个服务器之间选择一个进行访问.
即在服务器端再进行负载均衡算法分配
详细链接:
www.processon.com/view/link/6…
常见的负载均衡算法
- 随机 通过随机选择服务进行执行,一般这种方式使用较少
- 轮训 负载均衡默认实现方式,请求来之后排队处理
- 加权轮训 通过对服务器性能的分型,给高配置,低负载的服务器分配更高的权重,均衡各个服务器的压力
- 地址Hash 通过客户端请求的地址的hash值取模映射进行服务器调度.ip hash
- 最小连接数 即使请求均衡了,压力不一定会均衡,最小连接数法就是根据服务器的情况,比如请求积压数等参数,将请求分配到当前压力最小的服务器上.最小活跃数
Ribbon的使用
public class RibbonDemo {
public static void main(String[] args) {
// 服务列表
List<Server> serverList = Lists.newArrayList(
new Server("localhost", 8020),
new Server("localhost", 8021));
// 构建负载实例
ILoadBalancer loadBalancer = LoadBalancerBuilder.newBuilder()
.buildFixedServerListLoadBalancer(serverList);
// 调用 5 次来测试效果
for (int i = 0; i < 5; i++) {
String result = LoadBalancerCommand.<String>builder()
.withLoadBalancer(loadBalancer).build()
.submit(new ServerOperation<String>() {
@Override
public Observable<String> call(Server server) {
String addr = "http://" + server.getHost() + "