Spring Cloud 负载均衡器 Ribbon原理及实现

Ribbon简介

分布式系统中,各个微服务会部署多个实例,如何将服务消费者均匀分摊到多个服务提供者实例上,就要使用到负载均衡器

Ribbon 是负载均衡器 ,它提供了很多负载均衡算法,例如轮询、随即等,在配置服务提供者地址后,可以将服务消费者请求均匀的分发

为服务消费者整合Ribbon

添加 Ribbon 依赖库

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-ribbobn</artifactId>
</dependency>

给 RestTemplate 添加 @LoadBalaced 注解,就可整合 RestTemplate 和 Ribbon

@Bean
@LoadBalanced
public RestTemplate restTemplate(){
  return new RestTemplate();
}

修改Controller,请求地址修改为 http://flim-user/user/ ,当 Ribbon 和 Eureka 配合使用时,会自动将虚拟主机名映射成微服务的网络地址,并注入了 LoadBalancerClient 输出当前选择的微服务节点

@RestController
public class MovieController {

  private final Logger log = LoggerFactory.getLogger(MovieController.class);

  @Autowired
  private RestTemplate restTemplate;

  @Autowired
  private LoadBalancerClient loadBalancerClient;

  @GetMapping("/user/{id}")
  public User findById(@PathVariable int id){
    return this.restTemplate.getForObject("http://flim-user/"+id,User.class);
  }

  @GetMapping("/log-instance")
  public void logInstance(){
    ServiceInstance serviceInstance = this.loadBalancerClient.choose("flim-user");
    log.info("{}:{}:{}",serviceInstance.getServiceId(),serviceInstance.getHost(),serviceInstance.getPort());
  }
}

运行测试程序

  1. 启动 Eureka Server
  2. 启动 2 个或更多 flim-user 实例
  3. 启动 flim-consumer
  4. 访问 http://localhost:8761/ 查看微服务 flim-user 是否注册成功
  5. 多次访问 http://localhost:8010/user/1 会返回如下结果

{"id":1,"username":"account1","name":"张三","age":20,"balance":100.00}

多次访问 http://localhost:8010/log-instance 控制台会输出以下信息

可以看到请求会均匀的分布到两个用户微服务上

2017-12-17 20:47:53.975  INFO 12313 --- [nio-8010-exec-2] com.linyuan.controller.MovieController   : flim-user:linyuandembp:8764
2017-12-17 20:47:54.215  INFO 12313 --- [nio-8010-exec-1] com.linyuan.controller.MovieController   : flim-user:linyuandembp:8763
2017-12-17 20:47:54.445  INFO 12313 --- [nio-8010-exec-3] com.linyuan.controller.MovieController   : flim-user:linyuandembp:8764
2017-12-17 20:47:54.690  INFO 12313 --- [nio-8010-exec-4] com.linyuan.controller.MovieController   : flim-user:linyuandembp:8763
2017-12-17 20:47:54.935  INFO 12313 --- [nio-8010-exec-5] com.linyuan.controller.MovieController   : flim-user:linyuandembp:8764

注意 :不能将 restTemplate.getForObject(...) 与 loadBalancerClient.choose(...) 写在同一方法中,因为 rest-Template 实际上就是一个 Ribbon 客户端,本身已经包含“choose”行为

代码方式配置 Ribbon

可以使用Java代码或属性自定义 Ribbon 的配置,Ribbon 默认配置类是 RibbonClientConfiguration,也可以使用一个 POJO 自定义 Ribbon 配置,这种 配置是细粒度的,不同的 Ribbon 客户端可以使用不同的配置

创建 Ribbon 配置类

/**
 * 该类为配置类
 * 不应该被ComponentScan扫描
 */
@Configuration
public class RibbonConfiguration {
  @Bean
  public IRule ribbonRule(){
    //配置负载均衡的规则,更改为随机
    return new RandomRule();
  }
}

使用 @RibbonClient 或 @RibbonClients 注解为服务提供者指定配置类

@SpringBootApplication
@EnableDiscoveryClient
@RibbonClient(name = "flim-user",configuration = RibbonConfiguration.class)
public class FlimConsumerApplication {
  @Bean
  @LoadBalanced
  public RestTemplate restTemplate(){
    return new RestTemplate();
  }
  public static void main(String[] args) {
    SpringApplication.run(FlimConsumerApplication.class, args);
  }
}

访问测试地址 http://localhost:8010/log-instance 可看见请求会随机分布到两微服务上

2017-12-17 21:08:52.769  INFO 12524 --- [nio-8010-exec-7] com.linyuan.controller.MovieController   : flim-user:linyuandembp:8763
2017-12-17 21:08:52.946  INFO 12524 --- [nio-8010-exec-8] com.linyuan.controller.MovieController   : flim-user:linyuandembp:8763
2017-12-17 21:08:53.138  INFO 12524 --- [nio-8010-exec-9] com.linyuan.controller.MovieController   : flim-user:linyuandembp:8763
2017-12-17 21:08:53.319  INFO 12524 --- [io-8010-exec-10] com.linyuan.controller.MovieController   : flim-user:linyuandembp:8764
2017-12-17 21:08:53.511  INFO 12524 --- [nio-8010-exec-1] com.linyuan.controller.MovieController   : flim-user:linyuandembp:8763

注意 :RibbonConfiguration 类不能被 @ComponentScan 扫描到,否则配置信息就会被所有 @RibbonClient 共享,因此如果只想自定义某个 Ribbon 客户端的配置,必须防止被 @ComponentScan 扫描

配置文件方式配置 Ribbon

通过配置文件方式自定义 Ribbon 属性更加方便,配置的前缀是 <clientName>.ribbon.

  1. NFLoadBalancerClassName:配置 ILoadBalancer 的实现类
  2. NFLoadBalancerRuleClassName:配置 IRule 的实现类
  3. NFLoadBalancerPingClassName:配置 IPing 实现类
  4. NIWSServerListClassName:配置 ServerList 的实现类
  5. NIWSServerListFilterClassName:配置 ServerListFilter 的实现类

通过配置文件定义Ribbon配置

flim-user:
 ribbon:
  NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

常用的 Ribbon 全局配置

ribbon:
  ConnectionTimeout: #连接超时时间
  ReadTimeout: #读取超时时间
  OkToRetryOnAllOperatotions: #对所有操作请求都进行重试
  MaxAutoRetriesNextServer: #切换服务器实例的重试次数
  MaxAutoRetries:  #对当前实例的重试次数
  ServerListRefreshInterval:  #刷新服务列表源的间隔时间

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • Spring Cloud Ribbon负载均衡器处理方法
  • Spring Cloud EureKa Ribbon 服务注册发现与调用
  • 浅谈Spring Cloud Ribbon的原理
  • Spring Cloud Ribbon实现客户端负载均衡的示例
  • 详细介绍SpringCloud之Ribbon
  • 详解spring cloud中使用Ribbon实现客户端的软负载均衡
  • spring cloud 之 客户端负载均衡Ribbon深入理解
  • 解决Spring Cloud中Feign/Ribbon第一次请求失败的方法
  • 详解Spring Cloud负载均衡重要组件Ribbon中重要类的用法
(0)

相关推荐

  • 解决Spring Cloud中Feign/Ribbon第一次请求失败的方法

    前言 在Spring Cloud中,Feign和Ribbon在整合了Hystrix后,可能会出现首次调用失败的问题,要如何解决该问题呢? 造成该问题的原因 Hystrix默认的超时时间是1秒,如果超过这个时间尚未响应,将会进入fallback代码.而首次请求往往会比较慢(因为Spring的懒加载机制,要实例化一些类),这个响应时间可能就大于1秒了.知道原因后,我们来总结一下解决放你. 解决方案有三种,以feign为例. 方法一 hystrix.command.default.execution.

  • 浅谈Spring Cloud Ribbon的原理

    Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起.Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等.简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随即连接等)去连接这些机器.我们也很容易使用Ribbon实现自定义的负载均衡算法. 说起负载均衡一般都会想到服务端的负载均衡,常用产品包括LBS硬件或云服务.Nginx等,都是

  • Spring Cloud EureKa Ribbon 服务注册发现与调用

    概述 用一个简单的例子演示Spring Cloud中EureKa和Ribbon的基本用法. 版本和环境 IDEA Spring Boot 1.5.·0 JDK 1.8 Maven 3 构建eureka server 在Spring Cloud,可以使用eureka来管理微服务,微服务可以注册到eureka中. 首先可以用IDEA的Spring Initialzr 来创建eureka server注册中心. 修改application.properties文件,添加如下内容 spring.appl

  • 详解spring cloud中使用Ribbon实现客户端的软负载均衡

    开篇 本例是在springboot整合H2内存数据库,实现单元测试与数据库无关性和使用RestTemplate消费spring boot的Restful服务两个示例的基础上改造而来 在使用RestTemplate来消费spring boot的Restful服务示例中,我们提到,调用spring boot服务的时候,需要将服务的URL写死或者是写在配置文件中,但这两种方式,无论哪一种,一旦ip地址发生了变化,都需要改动程序,并重新部署服务,使用Ribbon的时候,可以有效的避免这个问题. 前言:

  • 详解Spring Cloud负载均衡重要组件Ribbon中重要类的用法

    Ribbon是Spring Cloud Netflix全家桶中负责负载均衡的组件,它是一组类库的集合.通过Ribbon,程序员能在不涉及到具体实现细节的基础上"透明"地用到负载均衡,而不必在项目里过多地编写实现负载均衡的代码. 比如,在某个包含Eureka和Ribbon的集群中,某个服务(可以理解成一个jar包)被部署在多台服务器上,当多个服务使用者同时调用该服务时,这些并发的请求能被用一种合理的策略转发到各台服务器上. 事实上,在使用Spring Cloud的其它各种组件时,我们都能

  • spring cloud 之 客户端负载均衡Ribbon深入理解

    一.负载均衡 负载均衡(Load Balance): 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽.增加吞吐量.加强网络数据处理能力.提高网络的灵活性和可用性.其意思就是分摊到多个操作单元上进行执行,例如Web服务器.FTP服务器.企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务. 1.服务端负载均衡:客户端请求到负载均衡服务器,负载均衡服务器根据自身的算法将该请求转给某台真正提供业务的服务器,该服务器将响应数据给负载均衡服务器,负载均衡服务器最

  • Spring Cloud Ribbon实现客户端负载均衡的示例

    前面我们已经完成了注册中心和服务提供者两个基础组件.本文就介绍使用Spring Cloud Ribbon在客户端负载均衡的调用服务. 对于大型应用系统负载均衡(LB:Load Balancing)是首要被解决一个问题.在微服务之前LB方案主要是集中式负载均衡方案,在服务消费者和服务提供者之间又一个独立的LB,LB通常是专门的硬件,如F5,或者是基于软件的,如VS.HAproxy等.LB上有所有服务的地址映射表,当服务消费者调用某个目标服务时,它先向LB发起请求,由LB以某种策略(比如:Round

  • 详细介绍SpringCloud之Ribbon

    一:Ribbon是什么? Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起.Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等.简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随即连接等)去连接这些机器.我们也很容易使用Ribbon实现自定义的负载均衡算法. 二:LB方案分类 目前主流的LB方案可分成两类:一种是集中式LB,

  • Spring Cloud Ribbon负载均衡器处理方法

    接下来撸一撸负载均衡器的内部,看看是如何获取服务实例,获取以后做了哪些处理,处理后又是如何选取服务实例的. 分成三个部分来撸: 配置 获取服务 选择服务 配置 在上一篇<撸一撸Spring Cloud Ribbon的原理>的配置部分可以看到默认的负载均衡器是ZoneAwareLoadBalancer. 看一看配置类. 位置: spring-cloud-netflix-core-1.3.5.RELEASE.jar org.springframework.cloud.netflix.ribbon

  • Spring Cloud 负载均衡器 Ribbon原理及实现

    Ribbon简介 分布式系统中,各个微服务会部署多个实例,如何将服务消费者均匀分摊到多个服务提供者实例上,就要使用到负载均衡器 Ribbon 是负载均衡器 ,它提供了很多负载均衡算法,例如轮询.随即等,在配置服务提供者地址后,可以将服务消费者请求均匀的分发 为服务消费者整合Ribbon 添加 Ribbon 依赖库 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spri

  • Spring Cloud调用Ribbon的步骤

    一.简介 1. 是什么 Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具. 简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法和服务调用. 官方文档 目前已进入维护状态,以后可以通过Open Feign作为替代方案 负载均衡+RestTemplate,实现负载均衡调用 2. 负载均衡 负载均衡(Load Balance,LB),即将用户的请求平摊到多个服务上,从而达到系统的高可用(HA) 负载均衡分为

  • spring cloud整合ribbon问题及解决方案

    SpringCloud 整合ribbon的时候出现了这个问题 java.lang.IllegalStateException: No instances available for localhost at org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.execute(RibbonLoadBalancerClient.java:89) ~[spring-cloud-netflix-ribbon-2.0.2.RE

  • spring cloud 集成 ribbon负载均衡的实例代码

    本文比较简单集成ribbon,如需要更详细,请查看我的更多博客内容. 首先创建两个服务提供者 服务一,集成的nacos注册中心,这块随便写一个同名接口 端口配置8301 服务二,同名接口内容修改,其他跟上一个服务一大体内容一致 端口配置成8302 创建服务消费者 RibbonConfig.java package com.example.nacosribbonconsumers.config; import com.netflix.loadbalancer.IRule; import com.n

  • 详解Spring cloud使用Ribbon进行Restful请求

    写在前面 本文由markdown格式写成,为本人第一次这么写,排版可能会有点乱,还望各位海涵.  主要写的是使用Ribbon进行Restful请求,测试各个方法的使用,代码冗余较高,比较适合初学者,介意轻喷谢谢. 前提 一个可用的Eureka注册中心(文中以之前博客中双节点注册中心,不重要) 一个连接到这个注册中心的服务提供者 一个ribbon的消费者 注意:文中使用@GetMapping.@PostMapping.@PutMapping.@DeleteMapping等注解需要升级 spring

  • spring cloud eureka注册原理-注册失败填坑笔记

    目录 写在前面 Eureka Client注册过程分析 遗留问题 写在前面 我们知道Eureka分为两部分,Eureka Server和Eureka Client.Eureka Server充当注册中心的角色,Eureka Client相对于Eureka Server来说是客户端,需要将自身信息注册到注册中心. 本文主要介绍的就是在Eureka Client注册到Eureka Server时RetryableClientQuarantineRefreshPercentage参数的使用技巧. Eu

  • Spring Cloud Ribbon实现客户端负载均衡的方法

    简介 我们继续以之前博客的代码为基础,增加Ribbon组件来提供客户端负载均衡.负载均衡是实现高并发.高性能.可伸缩服务的重要组成部分,它可以把请求分散到一个集群中不同的服务器中,以减轻每个服务器的负担.客户端负载均衡是运行在客户端程序中的,如我们的web项目,然后通过获取集群的IP地址列表,随机选择一个server发送请求.相对于服务端负载均衡来说,它不需要消耗服务器的资源. 基础环境 JDK 1.8 Maven 3.3.9 IntelliJ 2018.1 Git:项目源码 更新配置 我们这次

  • Spring cloud alibaba之Ribbon负载均衡方案

    目录 1.什么是Ribbon 1.1客户端的负载均衡 1.2服务器端的负载均衡 1.3常见负载均衡算法 2.Nacos使用Ribbon 3.Ribbon负载均衡策略 3.1常用负载均衡描述 3.3修改默认的负载均衡策略--配置文件的方式 3.4自定义负载均衡策略 4.使用spring cloud loadbalancer替代ribbon 1.什么是Ribbon 目前主流的负载均衡方案分为以下两种: (1)集中式负载均衡:在消费者和服务提供者中间使用独立的代理方式进行负载,有硬件的(F5),软件的

随机推荐