跳到主要内容

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 配置:

implementation("io.micronaut.netflix:micronaut-netflix-ribbon")

LoadBalancer 实现现在将是 RibbonLoadBalancer 实例。

Ribbon 的配置选项可以使用配置中的 ribbon 命名空间来设置。例如,在配置文件(如 application.yml)中:

配置 Ribbon

ribbon.VipAddress=test
ribbon.ServerListRefreshInterval=2000

每个被发现的客户端还可以在 ribbon.clients 下进行配置。例如,给定一个 @Client(id="hello-world"),你就可以用它来配置功能区设置:

每个客户端的功能区设置

ribbon.clients.hello-world.VipAddress=test
ribbon.clients.hello-world.ServerListRefreshInterval=2000

默认情况下,Micronaut 会为每个将 Ribbon 与 Micronaut 的 DiscoveryClient 集成的客户端注册一个 DiscoveryClientServerList

英文链接