欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring Cloud系列(6):Spring Cloud Ribbon

程序员文章站 2022-04-30 15:50:11
...

Spring Cloud Ribbon 分布式负载均衡

在第三讲zuul中,讲到请求从第三方过来的时候,会统一请求到一个网关,网关根据一定的策略将请求进行分发,分发的算法有很多种,比如基本的轮询机制,设定分发权重,最近最少原则等。

我们这里主要是讲客户端的负载均衡,就是这里的Ribbon。

ribbon 的使用需要配合zuul 进行使用

典型的配置

zuul:
  host:
    socket-timeout-millis: 40000
    connect-timeout-millis: 40000
  routes:
    aps:
      path: /**
      service-id: aps
    acs:
      path: /**
      service-id: acs
    mer:
      path: /**
      service-id: mer

ribbon:
  eureka:
    enabled: false
  ReadTimeout: 40000
  ConnectTimeout: 40000

ribbon.eureka.enabled = false 表示不使用服务注册中心

ribbon 生成服务列表时,只会保留服务器地址和端口信息。

那配置主要有以下三种方式:

1 配置文件方式

ribbon 客户端的配置方式

aps:
  ribbon:
    listOfServers: http://localhost:8001/
    
acs:
  ribbon:
    listOfServers: http://localhost:8002/
    
mer:
  ribbon:
    listOfServers: http://localhost:8003/

配置文件方式比较简单,适用于客户端列表稳定,不需要定制负载均衡策略的场景。

2 注解方式

spring cloud 也允许我们采用注解配置的方式来定制化客户端,这个时候配置文件中不需要ribbon 的配置。

@Configuration
@RibbonClient(name = "customId", configuration = Configuration.class)
public class Configuration {

}

这个时候,一个名为customId 的客户端将会生成。

class Configuration{

	@Bean
	public IRule ribbonRule() {
		return new BestAvailableRule();
	}

	@Bean
	public IPing ribbonPing() {
		return new PingUrl();
	}

	@Bean
        public ServerList<Server> ribbonServerList(){
            //配置服务列表
            Server[] serveArray = new Server[3];
            serveArray[0] = (new Server("localhost", 9999));

            ServerList<Server> serverServerList = new StaticServerList<>(serveArray);

            return serverServerList;
        }

	@Bean
	public ServerListSubsetFilter serverListFilter() {
		ServerListSubsetFilter filter = new ServerListSubsetFilter();
		return filter;
	}
}

此种方式,通过少许的代码就可以进行负载均衡策略的定制。但是仍旧解决不了动态修改客户端服务列表的问题。

3 动态配置方式

ribbon 在负载均衡中采用某个服务读取客户端 列表信息时,可以通过clienId 获取负载均衡器并改变相关配置信息。

ribbon 的动态刷新机制默认是从配置文件中读取数据,服务列表中的数据会被快速的替换掉。

如果我们能实时改变listOfServers 的值,就可以达到动态刷新客户端服务列表的目的。

这里我们采用 archaius 来实现

archaius 的作用就是动态修改这里的配置

    public static void createRibbonClient(){
        //设置:配置项 (ribbon 会读取此配置)
        //根据 archaius 动态配置的特性 , 服务列表更新时只需重新赋值即可
        ConfigurationManager.getConfigInstance().setProperty
            (CLIENT_ID + ".ribbon.listOfServers", LIST_SERVERS);

        // 获取客户端, 若不存在则创建
        ClientFactory.getNamedClient(CLIENT_ID);

        // 负载均衡服务
        DynamicServerListLoadBalancer serverListLoadBalancer = 
            (DynamicServerListLoadBalancer) ClientFactory.getNamedLoadBalancer(CLIENT_ID);
        
        //根据需求定制化负载属性:
        //轮询方式、 Rule、 Ping 等
        //serverListLoadBalancer.setPing(new PingUrl());

    }

参考:ribbon客户端负载均衡

相关标签: spring cloud ribbon