Spring Cloud 微服务架构学习记录与示例

一、认识Ribbon

首先咱们需要认识下负载均衡,一般分为服务器端负载和客户端负载均衡。

  服务器端负载均衡:比如Nginx、F5,请求达到服务器后由负载均衡根据算法将请求转发到目标服务器进行处理。

  客户端负载均衡:比如Ribbon,服务消费者会获取一个服务器地址列表,调用前根据负载均衡的算法进行选择某个服务器,然后进行调用。

Ribbon是Netfix发布的负载均衡,Eureka一般配合Ribbon进行使用,Ribbon利用从Eureka注册中心中获取服务列表,根据一定的算法进行负载调用,还有Feign组件已使用Ribbon。

spring boot 负载均衡yml配置 spring cloud 负载均衡策略_客户端

Ribbon客户端组件提供一系列完善的配置选项,比如连接超时、重试、重试算法等。Ribbon内置可插拔、可定制的负载均衡组件。下面是用到的一些负载均衡策略:

  • 简单轮询负载均衡
  • 加权响应时间负载均衡
  • 区域感知轮询负载均衡
  • 随机负载均衡

二、Ribbon应用

要将Ribbon包含在您的项目中,请使用起始者,其组ID为org.springframework.cloud,工件ID为spring-cloud-starter-netflix-ribbon。需要注意的是在引入Eureka客户端之后就存在Ribbon依赖,不需要单独进行添加。检测依赖如下所示。

spring boot 负载均衡yml配置 spring cloud 负载均衡策略_客户端_02

    2、Ribbon的使用需要在RestTemplate上添加对应注解@LoadBalanced即可

/**
     * 注⼊RestTemplate
     * LoadBalanced开启ribbon
     * @return
     */
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }

  3、调用的时候即指定服务名称就行,不需要指定ip+端口,如下所示:

spring boot 负载均衡yml配置 spring cloud 负载均衡策略_负载均衡_03

  4、修改负载均衡策略

#针对的被调⽤⽅微服务名称,不加就是全局⽣效
city-service-resume:
     ribbon:
         #负载策略调整        
         NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

 全局生效配置如下

ribbon:
    #负载策略调整        
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

 

 三、Ribbon底层原理。

Ribbon主要实现逻辑是基于RestTemplates上添加了一个拦截器,进行拦截处理。

Spring Cloud 实现负载均衡通过在RestTemplates增加@LoadBalanced注解,将Rest请求交给Ribben去管理。

Ribben的配置类LoadBalanceAutoConfiguration主要实现的功能:

    1、创建了一个LoadBalanceInterceptor的Bean,用于实现对客户端发起的请求就行拦,是实现客户端的负载均衡。

    2、创建了一个LoadBalanceCustomizer的Bean  用于给RestTemplate增加LoadBalanceInterceptor拦截器。

    3、维护了一个被@LoadBalance注释的RestTemplate的对象列表,并在这里进行初始化,通过调用LoadBalanceCustomizer的实例来给需要客户端负载均衡的TestTemplate增加LoadBalanceInterceptor拦截器。

    4、LoadBalanceInterceptor拦截去会根据传入的ServiceID去获取具体的实例,拦截去实现的各个方法,

      addServices :向负载均衡器维护的列表中添加服务实例,添加服务的时候会将新加入的实例和之前的所有实例加入List中

      chooseServices:通过Rule(线性轮训、按权重负载、按流量负载)和 Ping来选择具体的服务实例启动的ping的定时任务默10秒

      markServiecsDowe:标示异常的服务实例

      getReachableService:获取当前正常的服务实例

      getAllServices:获取所有维护的服务实例

      5.Ribben 的服务实例由Eureka的服务发现来获取,Ribben会将Eureka中注册章的服务转换成自己的服务实例信息。(请求了Eureka的获取服务列表)

      6.Ribben 的服务更新器主要通过DynamicServiceListLoadBalancer 来实现

      7.Ribben实服务实例和真实地址之间转换的原理,从Netfix的service中获取host和port 如果service中的host和port中的地址和真实地中中的一直则直接返回真实地址,如果不一致则使用service中的host和port结合真实地址中的相关参数,拼接成新的地址。

*负载均衡的策略实现