在上一篇笔记当中,已经成功使用了服务注册和发现。但是所有微服务还是处於单点的状态,我们也应该对微服务进行负载均衡,这是相当有必要的。SpringCloud 提供了Ribbon负载均衡器。它可以有助于控制HTTP和TCP客户端的访问行为。为Ribbon配置服务提供者地址后,Ribbon就可以基于负载均衡算法进行负载均衡。Ribbon默认提供了很多种负载均衡算法,轮询、随机等。Ribbon也可以使用自定义的负载均衡算法。
在SpringCloud中,当Ribbon于Eureka 配合使用时,Ribbon可以自动从Eureka Server 获得服务提供者的地址列表,并基于特定的负载均衡算法,请求其中一个服务提供者。
一、整合Ribbon到微服务
如果你的微服务在MAVEN上已经整合了eureka,就不需要添加ribbon的依赖配置了。如果你想单独使用ribbon你可以添加如下的maven依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-ribbon</artifactId> </dependency>
事实上非常简单,我们只需要在RestTemplate的bean当中,添加@LoadBalanced annotation即可:
@Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); }
然后然后开始测试,我们需要启动超过两个用户服务系统,从而观察会选择哪个节点。笔者已经启动了两个用户服务节点
我们在商品服务系统的测试controller当中,添加如下代码测试是否存在负载均衡:
@Autowired private LoadBalancerClient loadBalancerClient; @GetMapping("/testInstance") public String testInstance() { ServiceInstance serviceInstance = this.loadBalancerClient.choose("tony-mall-provider-user"); String hostAndPort = serviceInstance.getHost() + ":" + serviceInstance.getPort() + "[id:" + serviceInstance.getServiceId() + "]"; return hostAndPort; }在几次测试当中发现是轮询的(只是估计):
192.168.28.100:8801[id:tony-mall-provider-user]
192.168.28.100:8801[id:tony-mall-provider-user]
在多次调用微服务的接口也是一样,发现每次调用SQL的服务器都是不同的,从而发现已经实现了负载均衡。
二、Ribbon的配置
从Spring Cloud Netfilx 1.2.0开始 已经提供使用配置方式定义Ribbon:
配置前缀为服务名称,如用户服务的名称就为:tony-mall-provider-user
例如:
tony-mall-provider-user.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule事实上笔者目前的参考书上对配置部分讲解还是相对模糊,后续笔者将会继续参考其他书籍和官网文档,将会基础补充这一部分。
Ribbon可以脱离Eureka单独使用,但是这里我就不作演示了。