8.3 客户端负载均衡
当从 Consul、Eureka 或其他服务发现服务器发现服务时,DiscoveryClient 会发出一个可用的 ServiceInstance 列表。
默认情况下,Micronaut 会使用该列表中的服务器自动执行轮循客户端负载均衡。这与重试通知相结合,为你的微服务基础设施增加了额外的弹性。
负载均衡由 LoadBalancer 接口处理,该接口有一个 LoadBalancer.select() 方法,该方法会返回一个会发出一个服务实例的 Publisher
。
之所以要返回 Publisher,是因为选择 ServiceInstance 的过程可能会导致网络操作,这取决于所采用的服务发现策略。
LoaderBalancer 接口的默认实现是 DiscoveryClientRoundRobinLoadBalancer。你可以用另一种实现来替换这种策略,以定制 Micronaut 中客户端负载均衡的处理方式,因为有许多不同的方法来优化负载均衡。
例如,你可能希望在特定区域的服务之间实现负载均衡,或者在总体响应时间最佳的服务器之间实现负载均衡。
要替换 LoaderBalancer,可定义一个 Bean 来替换 DiscoveryClientLoadBalancerFactory。
事实上,这正是 Netflix Ribbon 支持所要做的,将在下一节中介绍。
8.3.1 Netflix Ribbon 支持
使用 CLI
如果使用 Micronaut CLI 创建项目,请使用 netflix-ribbon
特性在项目中配置 Netflix Ribbon:
$ mn create-app my-app --features netflix-ribbon
Netflix Ribbon 是 Netflix 使用的进程间通信库,支持可定制的负载平衡策略。
如果你的应用程序需要更灵活地执行客户端负载平衡,你可以使用 Micronaut 的 Netflix Ribbon 支持。
要在应用程序中添加 Ribbon 支持,请在构建时添加 netflix-ribbon
配置:
- Gradle
- Maven
implementation("io.micronaut.netflix:micronaut-netflix-ribbon")
<dependency>
<groupId>io.micronaut.netflix</groupId>
<artifactId>micronaut-netflix-ribbon</artifactId>
</dependency>
LoadBalancer 实现现在将是 RibbonLoadBalancer 实例。
Ribbon 的配置选项可以使用配置中的 ribbon
命名空间来设置。例如,在配置文件(如 application.yml
)中:
配置 Ribbon
- Properties
- Yaml
- Toml
- Groovy
- Hoon
- JSON
ribbon.VipAddress=test
ribbon.ServerListRefreshInterval=2000
ribbon:
VipAddress: test
ServerListRefreshInterval: 2000
[ribbon]
VipAddress="test"
ServerListRefreshInterval=2000
ribbon {
VipAddress = "test"
ServerListRefreshInterval = 2000
}
{
ribbon {
VipAddress = "test"
ServerListRefreshInterval = 2000
}
}
{
"ribbon": {
"VipAddress": "test",
"ServerListRefreshInterval": 2000
}
}
每个被发现的客户端还可以在 ribbon.clients
下进行配置。例如,给定一个 @Client(id="hello-world")
,你就可以用它来配置功能区设置:
每个客户端的功能区设置
- Properties
- Yaml
- Toml
- Groovy
- Hoon
- JSON
ribbon.clients.hello-world.VipAddress=test
ribbon.clients.hello-world.ServerListRefreshInterval=2000
ribbon:
clients:
hello-world:
VipAddress: test
ServerListRefreshInterval: 2000
[ribbon]
[ribbon.clients]
[ribbon.clients.hello-world]
VipAddress="test"
ServerListRefreshInterval=2000
ribbon {
clients {
helloWorld {
VipAddress = "test"
ServerListRefreshInterval = 2000
}
}
}
{
ribbon {
clients {
hello-world {
VipAddress = "test"
ServerListRefreshInterval = 2000
}
}
}
}
{
"ribbon": {
"clients": {
"hello-world": {
"VipAddress": "test",
"ServerListRefreshInterval": 2000
}
}
}
}
默认情况下,Micronaut 会为每个将 Ribbon 与 Micronaut 的 DiscoveryClient 集成的客户端注册一个 DiscoveryClientServerList。