文章目录
版本1:原始loadBalancerClient方案版本2:ribbon-loadbalancer方案版本3:openfeign方案(即**方案2+openfeign版本**)
本文描述了Spring Cloud微服务中,各个服务间调用的负载均衡方案的升级历史,目前市场通用的是openfeign方案。
版本1:原始loadBalancerClient方案
1、引入负载均衡组件
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();
}
版本2:ribbon-loadbalancer方案
1、引入组件
2、如何使用
添加了负载均衡的RestTemplate
@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);
}
}
版本3:openfeign方案(即方案2+openfeign版本)
该方案是目前市场流行度较高的方案,用接口+@FeignClient注解方式。
1、引入组件
openfeign 会间接引入@LoadBalance注解及负载均衡功能。
2、如何使用
远程接口
@FeignClient(name = "nacos-provider")
public interface EchoService {
@GetMapping(value = "/echo/{str}")
String echo(@PathVariable("str") String str);
}
添加了负载均衡的RestTemplate
@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
精彩内容
发表评论