SpringCloud入门实战(五)-集成Ribbon

news2024/11/14 8:25:17

一、Ribbon简介

Spring Cloud Ribbon是Netflix发布的开源项目,主要功能是提供客户端软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单地说,就是在配置文件中列出Load Balancer(简称LB)后面所有机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。我们很容易使用Ribbon实现自定义的负载均衡算法

由官网https://github.com/Netflix/ribbon可知,Ribbon也进入维护中了,但是生产中大量使用中,还是比较优秀,不是立刻退出技术舞台的时刻。
在这里插入图片描述

Tip:未来可替换方案趋势:Spring 的LoadBalancer
Ribbon=负载均衡+RestTemplate

二、Ribbon和Nginx负载均衡区别

负载均衡:简单地说就是将用户的请求平均分摊到多个服务上,从而达到系统的HA(高可用)。

常见的负载均衡软件有Nginx,LVS,硬件F5等。

1、Ribbon和Nginx负载均衡区别:

  • ​Nginx是服务器负载均衡,客户端所有请求都会交给Nginx,然后由Nginx实现转发请求。即负载均衡是由服务端实现的。

  • Ribbon本地负载均衡,在调用微服务接口时候,会在注册中心上获取注册信息服务列表之后缓存到JVM本地,从而在本地实现RPC远程服务调用技术

2、Ribbon负载均衡

  • 进程内LB将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用,然后再从这些地址中选择出一台合适的服务器。它只是一个类库,集成于消费方进程。
  • 集中式LB:即在服务的消费方和提供方之间使用独立的LB设施(可以是硬件,如F5,也可以是软件,如Nginx),由该设施负责把访问请求通过某种策略转发至服务提供方。

eg:我们的order调用payment工程,ribbon应该在我们的order服务消费方

三、RestTemplate

RestTemplate的一些方法 :
获取数据结果可通过 RestTemplate 的getForObjectgetForEntity 发送数据postForObject,getForEntity 中可以获取返回的状态码、请求头等信息,通过 getBody 获取响应的内容。其余的和 getForObject 一样,也是有 3 个重载的实现:

@RestController
@RequestMapping("/consumer")
@Slf4j
public class OrderController {
    //public static final String PAYMENT_URL = "http://localhost:8001";
    public static final String PAYMENT_URL = "http://CLOULD-PAYMENT";
    @Resource
    private RestTemplate restTemplate;

    @PostMapping("/order")
    public CommonResult<Payment> createOrder(@RequestBody Payment payment) {
        return restTemplate.postForObject(PAYMENT_URL + "/payment", payment, CommonResult.class);
    }

    @GetMapping("/order/{id}")
    public CommonResult<Payment> getOrderPayment(@PathVariable("id") Long id) {
        return restTemplate.getForObject(PAYMENT_URL + "/payment/" + id, CommonResult.class);
    }

    @GetMapping("/order/getForEntity/{id}")
    public CommonResult<Payment> getOrderPayment2(@PathVariable("id") Long id) {
        ResponseEntity<CommonResult> entity = restTemplate.getForEntity(PAYMENT_URL + "/payment/" + id, CommonResult.class);
        if (entity.getStatusCode().is2xxSuccessful()) {
            return entity.getBody();
        } else {
            return new CommonResult<>(444, "操作失败");
        }
    }
}

四、Ribbon核心组件IRule

Ribbon在工作时分为两步
第一步:先选择 EurekaServer,它优先选择在同一个区域内负载较少的Server;
第二步:再根据用户指定的策略,在从Server取到的服务注册列表中选择一个地址;
其中Ribbon提供了多种策略,比如轮询、随机、根据响应时间加权。

1、Ribbon与Eureka

spring-cloud-starter-netflix-eureka-client3.0.x版本以前是包含对ribbon的依赖的,官方内置了随机和轮询负载均衡策略,所以不用额外引入ribbon依赖也可以使用,但是Spring Cloud在2020.0版本后就移除了Ribbon,用的是 loadbalancer.。

 <dependency>
     <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
       </dependency>

在这里插入图片描述
在这里插入图片描述

由于我们之前搭建的工程都是基于最新版本的springcloud 2021.0.3版本,导入Eureka依赖spring-cloud-starter-netflix-eureka-client后检查不到Ribbon的依赖,无法查看IRule接口代码,是使用LoadBalancer代替的Ribbon。

所以我们新搭建一个SpringCloud 2020版本以下的工程学习Ribbon,注意引入的依赖:
父pom:

 <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>2.0.2.RELEASE</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>Finchley.RELEASE</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>

子pom:

 <!--Eureka的依赖版本不要填,因为dependencyManagement中指定了版本,交给maven自动匹配就好-->
 <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>

IRule接口在ribbon-loadbalancer包中,下载源码,可以查看IRule类图
在这里插入图片描述

2、IRule 简介

IRule 是一个接口。其作用是:根据特定算法从服务列表中选取一个要访问的服务,Ribbon默认的算法为轮询算法

IRule类图
在这里插入图片描述
Ribbon中的7中负载均衡算法:

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

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

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

相关文章

python爬虫学习笔记-mongodb安装基本介绍pymongo使用

MongoDB数据存储 MongoDB是一个非关系型数据库(NoSQL). 非常适合超大数据集的存储, 由 C 语言编写,旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品&#xff0c;是非关系数据库当中功能最丰富&#xff0c;最像关系…

Spring Cloud_OpenFeign服务接口调用

目录一、概述1.OpenFeign是什么2.能干嘛二、OpenFeign使用步骤1.接口注解2.新建Module3.POM4.YML5.主启动类6.业务类7.测试8.小总结三、OpenFeign超时控制1.超时设置&#xff0c;故意设置超时演示出错情况2.是什么3.YML中需要开启OpenFeign客户端超时控制四、OpenFeign日志打印…

论文投稿指南——中文核心期刊推荐(水路运输)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

Json的语法及使用

Json的语法及使用前言一、Json是什么&#xff1f;二、Json语法三、Json示例前言 在数据传输时用到Json格式&#xff0c;在此稍作记录。 一、Json是什么&#xff1f; JSON 指的是 JavaScript 对象表示法&#xff08;JavaScript Object Notation&#xff09;JSON 是轻量级的文本…

零入门容器云网络实战-4->ip地址分类尝试

本篇文章主要用于收集、整理、总结关于IP地址相关知识点。 1、IP地址分类&#xff1f; IPv4地址是指IPv4协议使用的32位地址。 为了便于对IP地址进行管理&#xff0c; 根据IPv4地址的第一个字节&#xff0c;IPv4地址可以分为以下五类。 A类&#xff1a;0~127 B类&#xff1…

【Linux】Linux自动化构建工具make/makefile

文章目录&#x1f3aa; Linux自动化构建工具make/makefile&#x1f680; 1.Makefile文件格式⭐1.1 简单makefile例子⭐1.2 概述⭐1.3 目标(target)⭐1.4 前置条件(prerequisites)⭐1.5 命令(commands)&#x1f680; 2.Makefile文件语法⭐2.1 注释⭐2.2 回声⭐2.3 通配符⭐2.4 变…

4-异步:非阻塞IO

4-异步&#xff1a;非阻塞I_O 简介 什么是Node.js的非阻塞I/O I/O 即 Input/Output. 也就是一个系统的输入和输出阻塞I/O和非阻塞I/O的却别就在于系统接收输入再到输出期间&#xff0c;能不能接收其他输入 对于这两句话的理解&#xff0c;可以把系统比作服务员&#xff0c;…

React 实现自动上报 PV/Click 的埋点 Hooks

自定义 hooks 是基于 React Hooks 的一个拓展&#xff0c;我们可以根据业务需求制定满足业务需要的组合 hooks&#xff0c;更注重的是逻辑单元。怎样把一段逻辑封装起来&#xff0c;做到复用&#xff0c;这才是自定义 hooks 的初衷。 自定义 hooks 也可以说是 React Hooks 的聚…

【并发编程十三】c++原子操作

【并发编程十三】c原子操作一、改动序列1、改动序列2、预测执行二、原子操作及其类别1、原子操作2、非原子操作3、原子类型三、标准原子类型1、标准原子类型的两种实现方式2、原子操作的用途3、原子操作的宏四、操作std:atomic_flag1、简介2、使用说明3、使用std:atomic_flag实…

Kettle(16):Kitchen作业执行引擎

在Linux中对Kettle做Linux配置(和Windows相同,添加驱动jar包) 上传以后需要重启。 1 在Windows中开发作业 2 配置Start组件 3 配置转换组件 修改Kettle&

【HBase——陌陌海量存储案例】1.案例介绍与HBase表结构设计(上)

前言 本系列接【HBase入门】系列文章后实战案例的学习。 学习目标 能够掌握HBase表结构设计&#xff08;表设计、ROWKEY设计、预分区&#xff09; 能够安装部署Apache Phoenix 能够掌握Phoenix的基本操作 能够掌握使用Phoenix建立二级索引提升性能 能够基于Phoenix JDBC API编…

Ubuntu安装ROS(每个步骤图文详细)

Ubuntu安装ROS&#xff08;每个步骤图文详细&#xff09;前言&#xff08;推荐安装&#xff09;ROS对应的Ubuntu的版本换源安装ROS一、添加ROS软件源二、添加密钥三、安装ROS-melodic四、初始化rosdep可能出现的问题&#xff1a;一 、 **sudo: rosdep&#xff1a;找不到命令**二…

算法_位运算x(-x)和x(x-1)

最近在跟着y总学算法。 今天学到了两个很经典的位运算&#xff0c;x&(-x)和x&(x-1)&#xff1a; x&(-x)&#xff1a;保留二进制下最后出现的1的位置&#xff0c;其余位置置0&#xff08;即一个数中最大的2的n次幂的因数 x&(x-1)&#xff1a;消除二进制下最后…

SpringCloud整合Zookeeper代替Eureka

目录 一、注册中心Zookeeper 二、服务提供者 三、服务消费者 一、注册中心Zookeeper zookeeper是一个分布式协调工具&#xff0c;可以实现注册中心功能 关闭Linux服务器防火墙后启动zookeeper服务器 zookeeper服务器取代Eureka服务器&#xff0c;zk作为服务注册中心 Lin…

ORA-600 kcbzpbuf_1故障恢复----惜分飞

数据库启动报错ORA-03113SQL> startup;ORACLE instance started. Total System GlobalArea 5.1310E10 bytesFixed Size 2265224 bytesVariable Size 1.8119E10 bytesDatabaseBuffers 3.3152E10 bytesRedo Buffers 36069376 bytesDatabasemounted. ORA-03113: end-of-file on…

二叉树的层序遍历

二叉树的层序遍历 层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。 需要借用一个辅助数据结构即队列来实现&#xff0c;队列先进先出&#xff0c;符合一层一层遍历的逻辑&#xff0c;而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。 而这种层序遍历方式就是…

Java:基于XML的Spring使用

基于XML的Spring使用一、Spring IOC 底层实现1.1 BeanFactory与ApplicationContexet1.2 图解IOC类的结构二、 Spring依赖注入数值问题【重点】2.1 字面量数值2.2 CDATA区2.3 外部已声明bean及级联属性赋值2.4 内部bean2.5 集合三、 Spring依赖注入方式【基于XML】3.1 set注入3.…

白炽灯护眼还是LED护眼?盘点专业护眼的LED护眼灯

目前大多数家庭都会购买台灯使用&#xff0c;选择白炽灯还是LED灯呢&#xff1f;建议是LED灯更护眼。白炽灯缺点&#xff1a;耗电、发光效率低、温度过高不安全。白炽灯优点&#xff1a;体积小、显色能力好。LED灯缺点:价格较高、显色能力比白炽灯弱一些。LED灯优点&#xff1a…

JDBC(powernode CD2206)详尽版(内含教学视频、源代码、SQL文件)

JDBC&#xff08;powernode CD2206&#xff09;详尽版&#xff08;内含教学视频、源代码、SQL文件&#xff09; 包含&#xff1a;教学视频、源代码&#xff08;与博客同步&#xff09;、SQL文件 下载链接地址&#xff1a; https://download.csdn.net/download/weixin_4641135…

使用kubebuilder开发operator详解--踩坑记录

跟着教程&#xff1a;使用kubebuilder开发operator详解出现&#xff1a; 国内无法访问该ip&#xff0c;需要设置go env&#xff1a; go envGOPROXYhttps://goproxy.c 查看go env&#xff1a; 修改镜像后仍然无法解决&#xff1a;借鉴该问题https://github.com/goproxy/goprox…