Ribbon实现负载均衡

房东的猫 提交于 2020-01-19 07:12:48

上篇《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的调用。

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!