Spring Cloud Ribbon(负载均衡器)介绍及使用

news2024/11/18 15:27:17

目前主流的负载方案分为以下两种:

  • 集中式负载均衡,在消费者和服务提供方中间使用独立的代理方式进行负载,有硬件的(比如 F5),也有软件的(比如 Nginx)。
  • 客户端自己做负载均衡,根据自己的请求情况做负载,Ribbon 就属于客户端自己做负载。

Spring Cloud Ribbon 是一个基于 HTTP 和 TCP 的客户端负载均衡工具,它基于 Netflix Ribbon 实现。通过 Spring Cloud 的封装,可以让我们轻松地将面向服务的 REST 模版请求自动转换成客户端负载均衡的服务调用。

Spring Cloud Ribbon 虽然只是一个工具类框架,它不像服务注册中心、配置中心、API 网关那样需要独立部署,但是它几乎存在于每一个 Spring Cloud 构建的微服务和基础设施中。因为微服务间的调用,API 网关的请求转发等内容,实际上都是通过 Ribbon 来实现的(https://github.com/Netflix/ribbon)。

Ribbon 模块

Ribbon 模块介绍如下表 1 所示。

名 称说 明
ribbon-loadbalancer负载均衡模块,可独立使用,也可以和别的模块一起使用。
Ribbon内置的负载均衡算法都实现在其中。
ribbon-eureka基于 Eureka 封装的模块,能够快速、方便地集成 Eureka。
ribbon-transport基于 Netty 实现多协议的支持,比如 HTTP、Tcp、Udp 等。
ribbon-httpclient基于 Apache HttpClient 封装的 REST 客户端,集成了负载均衡模块,可以直接在项目中使用来调用接口。
ribbon-exampleRibbon 使用代码示例,通过这些示例能够让你的学习事半功倍。
ribbon-core一些比较核心且具有通用性的代码,客户端 API 的一些配置和其他 API 的定义。

Ribbon 使用

我们使用 Ribbon 来实现一个最简单的负载均衡调用功能,接口就用《使用Eureka编写服务提供者》提供的 /user/hello 接口,需要启动两个服务,一个是 8081 的端口,一个是 8083 的端口。

然后创建一个新的 Maven 项目 ribbon-native-demo,在项目中集成 Ribbon,在 pom.xml 中添加如下代码所示的依赖。

  1. <dependency>
  2. <groupId>com.netflix.ribbon</groupId>
  3. <artifactId>ribbon</artifactId>
  4. <version>2.2.2</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>com.netflix.ribbon</groupId>
  8. <artifactId>ribbon-core</artifactId>
  9. <version>2.2.2</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>com.netflix.ribbon</groupId>
  13. <artifactId>ribbon-loadbalancer</artifactId>
  14. <version>2.2.2</version>
  15. </dependency>
  16. <dependency>
  17. <groupId>io.reactivex</groupId>
  18. <artifactId>rxjava</artifactId>
  19. <version>1.0.10</version>
  20. </dependency>

接下来我们编写一个客户端来调用接口,代码如下所示。

  1. // 服务列表
  2. List<Server> serverList = Lists.newArrayList(new Server("localhost", 8081), new Server("localhost", 8083));
  3. // 构建负载实例
  4. ILoadBalancer loadBalancer = LoadBalancerBuilder.newBuilder().buildFixedServerListLoadBalancer(serverList);
  5. // 调用 5 次来测试效果
  6. for (int i = 0; i < 5; i++) {
  7. String result = LoadBalancerCommand.<String>builder().withLoadBalancer(loadBalancer).build()
  8. .submit(new ServerOperation<String>() {
  9. public Observable<String> call(Server server) {
  10. try {
  11. String addr = "http://" + server.getHost() + ":" + server.getPort() + "/user/hello";
  12. System.out.println(" 调用地址:" + addr);
  13. URL url = new URL(addr);
  14. HttpURLConnection conn = (HttpURLConnection) url.openConnection();
  15. conn.setRequestMethod("GET");
  16. conn.connect();
  17. InputStream in = conn.getInputStream();
  18. byte[] data = new byte[in.available()];
  19. in.read(data);
  20. return Observable.just(new String(data));
  21. } catch (Exception e) {
  22. return Observable.error(e);
  23. }
  24. }
  25. }).toBlocking().first();
  26. System.out.println(" 调用结果:" + result);
  27. }

上述这个例子主要演示了 Ribbon 如何去做负载操作,调用接口用的最底层的 HttpURLConnection。当然你也可以用别的客户端,或者直接用 RibbonClient 执行程序,可以看到控制台输出的结果如下:


图 1 控制台输出结果

从输出的结果中可以看到,负载起作用了,8083 调用了 3 次,8081 调用了 2 次。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/77715.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]Python计算机毕业设计SSM基于框架的秧苗以及农产品交易网站(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

命令设计模式

一、命令模式 1、定义 命令模式&#xff08;Command Pattern&#xff09;是对命令的封装&#xff0c;每一个命令都是一个操作&#xff0c;请求方发出请求要求执行一个操作&#xff0c;接收方收到请求并执行操作。属于行为型设计模式。 命令模式通过在请求与实现之间引入一个抽…

Spring注解开发

1、Spring注解开发 1 注解开发定义Bean对象【重点】 目的&#xff1a;xml配置Bean对象有些繁琐&#xff0c;使用注解简化Bean对象的定义 问题导入 问题1&#xff1a;使用什么标签进行Spring注解包扫描&#xff1f; 问题2&#xff1a;Component注解和Controller、Service、Re…

【指纹识别】指纹识别【含GUI Matlab源码 029期】

⛄一、指纹识别简介 指纹识别技术主要分三个步骤&#xff1a;指纹预处理、特征提取、指纹分类与匹配。 无论是指纹分类还是指纹匹配,都需要提取指纹的有效特征,而特征提取的性能很大程度上要依赖于指纹图像的质量。在实际应用中,由于采集条件和采集设备的因素,采集到的指纹图像…

IBRNet:基于IBR的NeRF

IBRNet: Learning Multi-View Image-Based Rendering 针对问题&#xff1a;使NeRF具有泛化能力 如何做&#xff1a;主要还是针对颜色和密度的预测进行改进&#xff08;三维重建部分&#xff09;&#xff0c;和NeRF一样&#xff0c;使用的是volume rendering&#xff08;渲染部…

Vulkan下多线程渲染设计

1 Vulkan 视角下的多线程渲染 首先我们需要从vulkan api的顶层框架上来看一下&#xff0c;它在哪些地方可以让我们并行。 Vulkan API的基本框架 Vulkan不同于Gles只有一个&#xff08;不被API暴露出来的&#xff09;单一链条的cmdbuffer处理&#xff0c;它最大的特点是允许多…

阿里巴巴内部:2022年全技术栈PPT分享(架构篇+算法篇+大数据)

我只截图不说话&#xff0c;PPT大全&#xff0c;氛围研发篇、算法篇、大数据、Java后端架构&#xff01;除了大家熟悉的交易、支付场景外&#xff0c;支撑起阿里双十一交易1682亿元的“超级工程”其实包括以下但不限于客服、搜索、推荐、广告、库存、物流、云计算等。 Java核心…

Linux中裸机串口通信的基本方法

大家好&#xff0c; 今天主要和大家聊一聊&#xff0c;如何使用串口进行通信的方法。 目录 第一&#xff1a;串口的基本简介 第二&#xff1a;UART的特点 ​第三&#xff1a;UART的配置步骤 第一&#xff1a;串口的基本简介 串口又叫做串行接口&#xff0c;通常叫做COM接…

农业灌区量测水流量在线监测系统解决方案-灌区信息化管理系统-灌区水网智慧化

平升电子农业灌区量测水流量在线监测系统解决方案/灌区信息化管理系统/灌区水网智慧化&#xff0c;对灌区的渠道水位、流量、水雨情、土壤墒情、气象等信息进行监测&#xff0c;同时对泵站、闸门进行远程控制&#xff0c;对重点区域进行视频监控&#xff0c;实现了信息的采集、…

Docker系统性入门(五)

文章目录Podman安装&基操pod多架构CI/CD容器安全监控Podman Podman 是 Red Hat 在2018年推出的&#xff0c;源代码开放是一个基于 Linux 系统的 daemon-less 的容器引擎&#xff1b;可以运行在root或者非root用户模式最近总听到这个要代替docker什么的&#xff0c;可以参考…

甲骨文蟾蜍 Toad for Oracle 16.2 注册版

使您的 Oracle 数据库操作现代化以实现业务敏捷性。 Toad for Oracle 是唯一一款可帮助您简化工作流程、减少代码缺陷并提高代码质量和性能同时支持团队协作的开发人员工具。自动化管理任务并主动管理您的数据库&#xff0c;同时实现性能优化和风险缓解。快速轻松地定义、搜索…

硬核干货,带你一文掌握 MySQL 的binlog 、redo log、undo log

​hello&#xff0c;大家好。 在MySQL 中我们经常会接触到三个核心日志&#xff0c;它们分别是&#xff1a;binlog 、redo log、undo log。 好多同学对于它们可能并不陌生&#xff0c;但是具体区分起来各自的功能用途以及实现原理&#xff0c;那可能认知就会比较模糊了&#x…

Web前端开发技术课程大作业_ 关于美食的HTML网页设计——HTML+CSS+JavaScript在线美食订餐网站html模板源码30个页面_

&#x1f468;‍&#x1f393;静态网站的编写主要是用HTML DIVCSS JS等来完成页面的排版设计&#x1f469;‍&#x1f393;,常用的网页设计软件有Dreamweaver、EditPlus、HBuilderX、VScode 、Webstorm、Animate等等&#xff0c;用的最多的还是DW&#xff0c;当然不同软件写出的…

Git基础|配置Git账号信息,Git存储的原理详解【建议收藏】

Git作为分布式版本管理&#xff0c;就需要对用户进行认证&#xff0c;账号名和邮箱&#xff0c;方便开发者从不同的电脑进行登录。同时&#xff0c;要想真的记住Git的命令&#xff0c;也必须要清楚Git的存储、上传原理。 Git基础2一、用户签名1、打开命令界面2、进入到用户管理…

CleanMyMac2023最新版软件功能及使用心得教程

电脑明明有100G&#xff0c;但是只剩下几个G&#xff0c;明明已经清理了很多&#xff0c;但是还是没有释放出内存&#xff0c;怎么办&#xff1f;可以试试CleanMyMac X&#xff0c;怎么使用呢&#xff1f;来看看吧&#xff01;CleanMyMac X是一款颇受欢迎的专业清理软件&#x…

【2022.12.10】备战春招Day5——每日一题 + 96. 不同的二叉搜索树

【每日一题】1691. 堆叠长方体的最大高度 题目描述 给你 n 个长方体 cuboids &#xff0c;其中第 i 个长方体的长宽高表示为 cuboids[i] [widthi, lengthi, heighti]&#xff08;下标从 0 开始&#xff09;。请你从 cuboids 选出一个 子集 &#xff0c;并将它们堆叠起来。 如…

​创新不是公司的救命良药

阅读本文大概需要1.06 分钟。之前问说当整个大环境都差的时候&#xff0c;公司还有项目可做就不错了&#xff0c;不要觉得只能赚点小钱就看不上&#xff0c;现在已经从伸手抓钱&#xff0c;变成弯腰捡钱的时代了。 开始赚的钱是不多&#xff0c;但能验证方向&#xff0c;先把跑…

web前端期末大作业 基于HTML+CSS+JavaScript学生宿舍管理系统

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

SSM+Mysql实现的仿网盘系统(功能包含注册登录,文件上传、所有文件、分类资源查看、用户管理、分享资源等)

博客目录SSMMysql实现的仿网盘系统实现功能截图系统功能使用技术代码完整源码SSMMysql实现的仿网盘系统 本系统是一个模拟百度网盘的系统&#xff0c;通过实现了图片/文本文件/视频等资源上传&#xff0c;并且分类管理、资源分享&#xff0c;实现了资源的在线管理。 (文末查看…

Vue2.0开发之——Vue组件-组件属性(34)

一 概述 为Count组件添加自定义属性为自定义属性添加v-bind自定义属性props是只读的自定义属性default默认值自定义属性type值类型自定义属性required必填值 二 为Count组件添加自定义属性 2.1 组件的props props 是组件的自定义属性&#xff0c;在封装通用组件的时候&#…