1、引入负载均衡组件
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-loadbalancerartifactId>
dependency>
2、使用负载均衡组件
@RestController
public class NacosController{
@Autowired
private LoadBalancerClient loadBalancerClient;
@Autowired
private RestTemplate restTemplate;
@Value("${spring.application.name}")
private String appName;
@GetMapping("/echo/app-name")
public String echoAppName(){
// <1>
ServiceInstance serviceInstance = loadBalancerClient.choose("nacos-provider");
String path = String.format("http://%s:%s/echo/%s",serviceInstance.getHost(),serviceInstance.getPort(),appName);
System.out.println("request path:" +path);
// <2>
return restTemplate.getForObject(path,String.class);
}
}
在代码<1>
处,首先用复杂均衡组件提供的LoadBalancerClient选择出具体是哪一个微服务instance提供服务;然后在代码<2>
处请求具体的instance获取结果。
注意:
1、此时的RestTemplate就是原始的RestTemplate,而没有加@LoadBalance注解,因为负载均衡功能已经由loadBalancerClient完成了。
@Bean public RestTemplate restTemplate(){ return new RestTemplate(); }
1、引入组件
<dependency>
<groupId>com.netflix.ribbongroupId>
<artifactId>ribbon-loadbalancerartifactId>
dependency>
2、如何使用
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
@RestController
public class TestController {
@Autowired
private RestTemplate restTemplate;
@GetMapping(value = "/echo-rest/{str}")
public String rest(@PathVariable String str) {
// 会负载均衡服务名称nacos-provider
return restTemplate.getForObject("http://nacos-provider/echo/" + str, String.class);
}
}
该方案是目前市场流行度较高的方案,用接口+@FeignClient注解方式。
1、引入组件
openfeign 会间接引入@LoadBalance注解及负载均衡功能。
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-openfeignartifactId>
dependency>
2、如何使用
@FeignClient(name = "nacos-provider")
public interface EchoService {
@GetMapping(value = "/echo/{str}")
String echo(@PathVariable("str") String str);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
@RestController
public class TestController {
@Autowired
private RestTemplate restTemplate;
@GetMapping(value = "/echo-rest/{str}")
public String rest(@PathVariable String str) {
// 会负载均衡服务名称nacos-provider
return restTemplate.getForObject("http://nacos-provider/echo/" + str, String.class);
}
}
参考代码:https://gitee.com/firefish985/FireFish/FireFish-Learning/nacos-discovery-consumer