为单元测试配置 RoundRobinLoadBalancer

Configuring RoundRobinLoadBalancer for unit tests

由于 Ribbon 客户端负载均衡器处于维护模式,我通过将 spring.cloud.loadbalancer.ribbon.enabled 设置为 false 迁移到 RoundRobinLoadBalancer。 我曾经使用 Ribbon 进行客户端测试

@Configuration
@Profile("test")
public class ClientTestConfig {
  @Bean
  public StubServer stubServer() {
      return new StubServer().run();
  }

  @Bean
  public ServerList<Server> ribbonServerList() {
      return new StaticServerList<>(new Server("localhost", stubServer().getPort()));
  }
}

以上 RoundRobinLoadBalancer 的等效代码是什么?

我最近也做了同样的事情,不再使用 Ribbon。 Spring 指南之一有一个如何配置自定义 ServiceInstanceListSupplier 的示例: https://spring.io/guides/gs/spring-cloud-loadbalancer/#_load_balance_across_server_instances

对于你的情况,这可能看起来像这样:

@Configuration
@Profile("test")
public class ClientTestConfig {
  @Bean
  public StubServer stubServer() {
      return new StubServer().run();
  }

  @Bean
  ServiceInstanceListSupplier serviceInstanceListSupplier() {
    return new MyServiceInstanceListSupplier(stubServer().getPort());
  }
}

class MyServiceInstanceListSupplier implements ServiceInstanceListSupplier {

  private final Integer port;

  MyServiceInstanceListSupplier(Integer port) {
    this.port = port;
  }

  @Override
  public String getServiceId() {
    return "";
  }

  @Override
  public Flux<List<ServiceInstance>> get() {
    return Flux.just(Arrays.asList(new DefaultServiceInstance("", "", "localhost", port, false)));
  }
}

请注意,我使用空字符串作为 instanceIdserviceId。这可能不是最佳做法,但在我的情况下效果很好。