Search code examples
javaspring-bootconfigurationspring-cloudribbon

Configuring RoundRobinLoadBalancer for unit tests


Since Ribbon client side load balancer is in maintenance mode, I migrated to RoundRobinLoadBalancer by setting spring.cloud.loadbalancer.ribbon.enabled to false. With Ribbon for client tests I used to do

@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()));
  }
}

Whats the equivalent the code above for RoundRobinLoadBalancer?


Solution

  • I recently did the same switch away from Ribbon. One of the Spring guides has an example of how to configure a custom ServiceInstanceListSupplier: https://spring.io/guides/gs/spring-cloud-loadbalancer/#_load_balance_across_server_instances

    For your case this would probably look something like this:

    @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)));
      }
    }
    

    Notice that I am using empty strings as the instanceId and serviceId. That is probably not the best practice, but works fine in my case.