SpringCloud系列(3)---Netfilx-Ribbon

来源:互联网 发布:linux c daemon 编辑:程序博客网 时间:2024/06/05 20:39

在上一篇笔记当中,已经成功使用了服务注册和发现。但是所有微服务还是处于单点的状态,我们也应该对微服务进行负载均衡,这是相当有必要的。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@LoadBalancedpublic RestTemplate restTemplate(){   return new RestTemplate();}

然后然后开始测试,我们需要启动超过两个用户服务系统,从而观察会选择哪个节点。笔者已经启动了两个用户服务节点


我们在商品服务系统的测试controller当中,添加如下代码测试是否存在负载均衡:

@Autowiredprivate 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单独使用,但是这里我就不作演示了。