文章目录

版本1:原始loadBalancerClient方案版本2:ribbon-loadbalancer方案版本3:openfeign方案(即**方案2+openfeign版本**)

本文描述了Spring Cloud微服务中,各个服务间调用的负载均衡方案的升级历史,目前市场通用的是openfeign方案。

版本1:原始loadBalancerClient方案

1、引入负载均衡组件

org.springframework.cloud

spring-cloud-loadbalancer

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、引入组件

com.netflix.ribbon

ribbon-loadbalancer

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注解及负载均衡功能。

org.springframework.cloud

spring-cloud-starter-openfeign

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

精彩内容

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: