上文说了使用 consul做服务注册中心,实现服务注册与发现使用 consul 实现服务注册与发现

我们仅仅说了单机版(也就是单客户端,单服务端),本文介绍一下多服务端集群搭建。

其实consul的,服务集群搭建很简单,只需要在多建一台一摸一样的微服务项目即可(端口不同)。

一、搭建consul多服务版集群

在这里插入图片描述
我们按照8006的项目在建一个一模一样的项目8007。

application.yml,端口不同,服务名称spring.application.name一模一样。

#端口号 不同
server:
  port: 8007
#服务名称 相同
spring:
  application:
    name: consul-provider-payment

####配置consul注册中心
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        service-name: ${spring.application.name}

分别启动 8006,8007项目:
在这里插入图片描述
可以看到我们的consul-provider-payment服务下面有两个实例,点开看下:一个8007,一个8006
在这里插入图片描述

客户端80代码不需要改变,测试一下:
在这里插入图片描述

在这里插入图片描述
刷新一次变一次,因为我们默认使用的,负载均衡策略是轮询,依次调用。

二、使用Ribbon改变负载均衡策略

1. 什么是ribbon

Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用。Spring Cloud Ribbon虽然只是一个工具类框架,它不像服务注册中心、配置中心、API网关那样需要独立部署,但是它几乎存在于每一个Spring Cloud构建的微服务和基础设施中。因为微服务间的调用,API网关的请求转发等内容,实际上都是通过Ribbon来实现的,包括后续我们将要介绍的Feign,它也是基于Ribbon实现的工具。所以,对Spring Cloud Ribbon的理解和使用,对于我们使用Spring Cloud来构建微服务非常重要。

2.ribbon的作用

Ribbon其实就是一个软负载均衡的客户端组件,他可以和其他所需请求的客户端结合使用,可以结合eureka,zookeeper,consul的做种服务注册组件。

3.ribbon的核心组件IRule

IRule:根据特定算法从服务列表中选取一个要访问的服务。

  1. com.netflix.loadbalancer.RoundRobinRule 轮询
  2. com.netflix.loadbalancer.RandomRule 随机
  3. com.netflix.loadbalancer.RetryRule 先按照RoundRobinRule的策略获取服务,如果获取服务失败则在指定时间内会进行重试
  4. WeightedResponseTimeRule 对RoundRobinRule的扩展,响应速度越快的实例选择权重越大,越容易被选择
  5. BestAvailableRule 会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务
  6. AvailabilityFilteringRule 先过滤掉故障实例,再选择并发较小的实例
  7. ZoneAvoidanceRule 默认规则,复合判断server所在区域的性能和server的可用性选择服务器
4.改变ribbon的负载均衡算法

ribbon默认的负载均衡算法是:轮询。
如果我们想要换一种负载均衡算法,甚至是自定义一中算法都是可以的。

我们刚才在上面已经搭建好了8007的微服务,现在我们有一个客户端,两个微服务,我们要使它的负载均衡算法变成随机应该怎么操作?

1.首先,在主启动类的上一级目录创建一个myrule包,用于存放我们的rule配置。在这里插入图片描述
2. 创建一个MyRuleConfig 类,并new 一个新的IRule 实例Bean。

package com.cpown.myrule;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 创建新的ruleBean
 * create by c-pown on
 */
@Configuration
public class MyRuleConfig {
    @Bean
    public IRule iRule(){
        return new RandomRule();
    }
}

3.在主启动类添加 @RibbonClient注解 指定我们需要应用自定义负载均衡算法的微服务名称,以及算法类class;
在这里插入图片描述
启动项目即可应用了。

最后:ribbon的算法其实并不复杂,比如轮询:就是记录请求的次数,以及拥有的实例个数,
通过 取模算法,获得每次请求所对应的微服务实例序号即可。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐