上篇《Eureka的微服务之间调用》我们使用到Ribbon,但是因为得微服务只有一个提供者和一个消费者,所以,要想了解Ribbon是如何实现负载均衡得,我们需要再增加一个提供者。接下来,让我们来试试。
Ribbon实现负载均衡
Ribbon是Netflix发布得负载均衡器。它有助于控制HTTP和TCP客户端的行为。Ribbon流程:Ribbon配置服务提供者地址后,当消费者进行请求的时候(请求的地址一般为服务名),Ribbon会根据该服务名匹配提供者的地址,基于某种负载均衡的算法,自动的帮助消费者请求提供者服务。
准备两个提供者,一个消费者。上篇中的一个提供者复制出来一份,更改下端口,服务名不更改。其他一模一样。为了方便测试,我们再消费者服务增加一个接口,具体如下:
@RestController
@RequestMapping("consume")
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private LoadBalancerClient loadBalancerClient;
@PostMapping("api")
public String getPrice() {
return restTemplate.postForEntity("http://eurekaClientTest-provider/api/getPrice", "eurekaClientTest-consumer", String.class).getBody();
}
@PostMapping("getServerName")
public String getName() {
ServiceInstance choose = loadBalancerClient.choose("eurekaClientTest-provider");
return "获取服务名:" + choose.getServiceId() + "~" +choose.getHost() + ":" +choose.getPort();
}
}
启动EurekaServer,再启动者三个服务。
访问Server地址:
这个时候我们可以看到三个服务都已经都注册到了Server,并且提供者有两个服务。
接下来,我们调用下新增接口,这里我做了一个处理,因为需要多次访问才能看出来负载均衡,所以我将Consumer的Controller层进行修改:
@RestController
@RequestMapping("consume")
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private LoadBalancerClient loadBalancerClient;
//log collect
private List<String> resultLogs = new ArrayList<>();
@PostMapping("api")
public String getPrice() {
return restTemplate.postForEntity("http://eurekaClientTest-provider/api/getPrice", "eurekaClientTest-consumer", String.class).getBody();
}
@PostMapping("getServerName")
public Object getName() {
ServiceInstance choose = loadBalancerClient.choose("eurekaClientTest-provider");
resultLogs.add("获取服务名:" + choose.getServiceId() + "~" +choose.getHost() + ":" +choose.getPort());//
if (resultLogs.size() == 5) {
return resultLogs;
}
return "获取服务名:" + choose.getServiceId() + "~" +choose.getHost() + ":" +choose.getPort();
}
}
访问五次之后,打印记录的所有日志;
结果可知,负载均衡已经实现。
Ribbon的功能还不止于此,而且也不一定需要关联Eureka,Ribbon的负载均衡规则也有很多种,读者有兴趣可以去拜读一下;当然了如果只想实现负载均衡却不关联Eureka,也很简单。只需要将依赖的Eureka去掉,然后再配置文件里面配置一下Ribbon的servers。配置如下:
spring: application: name: eurekaClientTest-consumer eurekaClientTest-provider: ribbon: listOfServers: localhost:8081,localhost:8082 server: port: 8083
重新启动,也可以看到负载均衡的实现。
总结一下:
1,负载均衡可以减少单个服务被大量请求的压力;
2,Eureka整合Ribbon,可以通过设置的服务名称进行解析实现消费者请求,方便。
但是我们却没有好好仔细对参数的设定,现在我们只有一个参数传递,如果多个参数呢?非常之多参数呢,那我们传递URL的时候岂不是难以维护,那如果URL也很复杂呢?接下来我们进行下一种方式进行API的调用。
来源:CSDN
作者:wp136470
链接:https://blog.csdn.net/wp136470/article/details/103757370