依赖:
<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);
}
}
执行效果同上。