Spring Cloud系列(6):Spring Cloud Ribbon

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客户端负载均衡

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值