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());
}
推荐阅读