Spring Boot Ribbon 测试

344 阅读1分钟

依赖:

<dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
      <version>2.2.3.RELEASE</version>
</dependency>

1,在IDEA开发一个Spring Boot项目,可以根据不同的端口启动多个Spring Boot项目做集群,

在配置文件中配置server.port 启动,访问 http://localhost:8080/sayHello

同一个项目创建第二个节点 然后启动,访问 http://localhost:8083/sayHello

2,做Ribbon客户端项目test-user

application.properties文件内容如下:

spring.application.name=test-user

test-user.ribbon.listOfServers=\
  localhost:8080,localhost:8083

UserController类

/**
 * LoadBalancerClient 写法
 */
@RestController
public class UserController {

    @Autowired
    RestTemplate restTemplate;

    @Autowired
    LoadBalancerClient loadBalancerClient;

    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder){
        return restTemplateBuilder.build();
    }

    @GetMapping("/testSayHelloByLoadBalancerClient")
    public String find(){

        ServiceInstance serviceInstance = loadBalancerClient.choose("test-user");
        String url = String.format("http://%s:%s",serviceInstance.getHost(),serviceInstance.getPort() + "/sayHello");
        System.out.println("====>" + url);
        return restTemplate.getForObject(url,String.class);

    }

}

项目启动,不断访问:http://localhost:8081/testSayHelloByLoadBalancerClient 控制台如下: 默认采用的是轮询的算法进行负载均衡的

上述代码改进写法:

/**
 * 使用@LoadBalanced 注解方式
 */
@RestController
public class UserController {

    @Autowired
    RestTemplate restTemplate;
    
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder){
        return restTemplateBuilder.build();
    }

    @GetMapping("/testSayHelloByLoadBalanced")
    public String find(){

        return restTemplate.getForObject("http://test-user/sayHello",String.class);

    }
}

执行效果同上。