当前位置: 首页 > news >正文

滚雪球学SpringCloud[2.3]:服务发现与负载均衡详解

全文目录:

    • 前言
    • 1. Ribbon的使用与配置
      • 1.1 Ribbon 概述
        • Ribbon 的核心功能:
      • 1.2 Ribbon 的基本使用
        • 1.2.1 引入 Ribbon 依赖
        • 1.2.2 配置 `RestTemplate` 与 Ribbon
        • 1.2.3 示例:通过 Ribbon 调用服务
      • 1.3 Ribbon 的配置选项
    • 2. Ribbon的负载均衡策略
      • 2.1 内置的负载均衡策略
      • 2.2 自定义负载均衡策略
      • 2.3 负载均衡策略的选择
    • 3. 与Eureka的集成
      • 3.1 Ribbon 与 Eureka 的集成原理
      • 3.2 Eureka 与 Ribbon 的无缝集成
    • 小结
    • 下期预告

前言

在上一节【2.2 Consul与Zookeeper服务注册】中,我们探讨了 Consul 和 Zookeeper 作为服务注册中心的工作原理、应用场景以及它们与 Eureka 的对比。服务注册中心的主要职责是帮助服务动态地注册和发现,确保微服务之间能够灵活通信。虽然服务注册为微服务的动态扩展提供了支持,但要真正实现系统的高可用性和性能优化,负载均衡同样至关重要。

在微服务架构中,负载均衡可以分为两类:服务端负载均衡(如 Nginx)和客户端负载均衡(如 Ribbon)。服务端负载均衡集中控制流量分发,而客户端负载均衡则将决策放在服务调用方,由客户端选择最优服务实例进行请求分发。在 Spring Cloud 微服务生态系统中,Ribbon 是最常用的客户端负载均衡工具。本节将重点介绍 Ribbon 的使用与配置Ribbon 的负载均衡策略,以及它如何与 Eureka 集成实现高效的服务发现与流量调度。

1. Ribbon的使用与配置

1.1 Ribbon 概述

Ribbon 是 Netflix 开源的客户端负载均衡器。它允许客户端在多个服务实例之间进行流量分发,并根据配置的策略选择最佳服务实例。与传统的服务端负载均衡不同,Ribbon 的负载均衡逻辑发生在客户端,即调用方可以根据获取的服务实例列表,结合负载均衡策略来选择具体的服务实例进行调用。

Ribbon 的核心功能:
  • 客户端负载均衡:客户端自动选择服务实例,减少对外部负载均衡设备的依赖。
  • 重试机制:如果选定的服务实例不可用,Ribbon 会自动重试其他可用的实例。
  • 动态服务发现:Ribbon 可以与 Eureka 集成,动态获取服务实例列表,适应服务的扩展和缩减。
  • 多种负载均衡策略:提供内置的多种负载均衡算法,如随机、轮询、加权等。

1.2 Ribbon 的基本使用

在 Spring Cloud 中,Ribbon 已默认与 RestTemplate 集成,通过添加简单的配置即可启用负载均衡。以下是如何使用 Ribbon 进行负载均衡的步骤:

1.2.1 引入 Ribbon 依赖

首先,在 pom.xml 文件中引入 Ribbon 相关的依赖。如果你已经使用了 Spring Cloud 的 Eureka 或其他服务发现工具,Ribbon 通常会自动包含,但仍可以显式添加:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
1.2.2 配置 RestTemplate 与 Ribbon

通过 RestTemplate 实现负载均衡非常简单,只需在创建 RestTemplate 实例时,添加 @LoadBalanced 注解即可:

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;@Configuration
public class RibbonConfig {@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}
}

这个配置会告诉 Spring Cloud,RestTemplate 需要使用 Ribbon 进行负载均衡。这样,当我们通过 RestTemplate 调用服务时,Ribbon 会从服务注册中心(如 Eureka)获取服务实例列表,并根据配置的负载均衡策略选择最优的服务实例。

1.2.3 示例:通过 Ribbon 调用服务

假设有一个名为 user-service 的微服务,已在 Eureka 注册。我们可以通过服务名直接调用,而不需要关心具体的 IP 地址和端口号:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;@RestController
public class UserController {private final RestTemplate restTemplate;public UserController(RestTemplate restTemplate) {this.restTemplate = restTemplate;}@GetMapping("/get-user")public String getUser() {return restTemplate.getForObject("http://user-service/user", String.class);}
}

在这个例子中,user-service 是在 Eureka 中注册的服务名,Ribbon 会自动从 Eureka 获取该服务的可用实例,并根据负载均衡策略选择一个实例进行调用。

1.3 Ribbon 的配置选项

Ribbon 提供了多种配置选项,允许开发者自定义服务调用行为,如超时设置、重试次数、负载均衡策略等。这些配置可以通过 application.ymlapplication.properties 文件进行调整。

user-service:ribbon:ConnectTimeout: 3000      # 连接超时时间(毫秒)ReadTimeout: 5000         # 读取超时时间(毫秒)MaxAutoRetries: 3         # 最大重试次数MaxAutoRetriesNextServer: 2 # 切换到其他服务实例的重试次数OkToRetryOnAllOperations: true # 是否允许在所有操作中进行重试

这些配置可以优化服务调用的可靠性,特别是在高并发或服务实例状态动态变化的情况下,设置合理的超时和重试策略可以提升系统的稳定性。

2. Ribbon的负载均衡策略

2.1 内置的负载均衡策略

Ribbon 提供了多种内置的负载均衡策略,开发者可以根据实际业务需求选择合适的策略。这些策略通过 IRule 接口实现,开发者可以在配置中灵活地指定不同的负载均衡算法。

以下是 Ribbon 中几种常见的负载均衡策略:

  1. 轮询策略(RoundRobinRule)

    • Ribbon 按照服务实例的顺序,轮流选择可用的实例进行调用。此策略非常适合负载均衡需求明确、服务实例性能相对均衡的场景。
    @Bean
    public IRule ribbonRule() {return new RoundRobinRule(); // 使用轮询策略
    }
    
  2. 随机策略(RandomRule)

    • 随机选择服务实例进行调用,适合服务实例性能差异较大或需要平均分配流量的场景。
    @Bean
    public IRule ribbonRule() {return new RandomRule(); // 使用随机策略
    }
    
  3. 加权响应时间策略(WeightedResponseTimeRule)

    • 根据每个服务实例的响应时间来动态调整权重,响应时间越短的实例分配的请求越多。适合服务性能不均衡、需要根据实际性能进行流量分配的场景。
    @Bean
    public IRule ribbonRule() {return new WeightedResponseTimeRule(); // 使用基于响应时间的权重策略
    }
    
  4. 最小并发策略(BestAvailableRule)

    • Ribbon 会优先选择当前并发请求数最少的服务实例,适用于需要减少高并发场景下单个实例负载的情况。
    @Bean
    public IRule ribbonRule() {return new BestAvailableRule(); // 选择并发最小的服务实例
    }
    
  5. 区域感知策略(ZoneAvoidanceRule)

    • 根据服务实例的所在区域和性能指标来选择实例,适合跨数据中心或跨区域部署的场景。
    @Bean
    public IRule ribbonRule() {return new ZoneAvoidanceRule(); // 区域感知策略
    }
    

2.2 自定义负载均衡策略

虽然 Ribbon 提供了多种内置策略,但在某些特殊场景下,我们可能需要自定义负载均衡策略。例如,当我们希望根据服务实例的某些自定义指标(如 CPU 负载、响应时间、地理位置等)进行流量分发时,可以通过实现 Ribbon 的 IRule 接口来自定义策略:

import com.netflix.loadbalancer.Server;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import java.util.List;public class CustomLoadBalancerRule extends AbstractLoadBalancerRule {@Overridepublic Server choose(Object key) {List<Server> servers = getLoadBalancer().getReachableServers();// 根据自定义逻辑选择服务实例return servers.get(0); // 返回选定的实例}@Overridepublic void initWithNiwsConfig(IClientConfig clientConfig) {// 初始化自定义配置}
}

通过这样的自定义策略,开发者可以将业务需求与负载均衡深度结合,确保服务的调用逻辑更加灵活和精确。

2.3 负载均衡策略的选择

选择合适的负载均衡策略至关重要。不同的策略适合不同的场景,例如:

  • 如果服务实例性能均衡,轮询策略可以较好地分配负载。
  • 如果服务实例响应时间差异较大,加权响应时间策略能够优化流量分发。
  • 对于需要动态适应负载和响应的场景,区域感知策略或自定义策略能够提供更灵活的负载分发能力。

负载均衡策略的选择应根据系统的业务特性、服务的性能状况和调用的频率等因素进行调整,从而在高并发场景下保证系统的性能和稳定性。

3. 与Eureka的集成

3.1 Ribbon 与 Eureka 的集成原理

Ribbon 和 Eureka 的集成是 Spring Cloud 中常见的架构模式。Eureka 作为服务注册中心,负责管理所有服务实例的状态信息,而 Ribbon 作为客户端负载均衡器,从 Eureka 中获取服务实例列表,结合负载均衡策略选择合适的实例进行调用。

当服务在 Eureka 注册中心注册后,Ribbon 会定期从 Eureka 获取服务实例的状态信息。Ribbon 将这些实例缓存到本地,并根据配置的负载均衡策略(如轮询、随机等)选择一个健康的实例进行请求调用。这种集成方式使得服务能够动态扩展、缩减,提供了极大的灵活性和高可用性。

3.2 Eureka 与 Ribbon 的无缝集成

在 Spring Cloud 中,Ribbon 和 Eureka 的集成非常简单。只要 Eureka 和 Ribbon 都配置到项目中,Spring Cloud 会自动将它们集成在一起,开发者只需通过 RestTemplate 或 Feign 调用服务时,Ribbon 就会使用 Eureka 的服务发现功能获取实例列表。

以下是 Eureka 与 Ribbon 集成的步骤:

  1. application.yml 中配置 Eureka 服务地址

    eureka:client:service-url:defaultZone: http://localhost:8761/eureka/
    
  2. 注册服务到 Eureka:当微服务启动时,服务会自动注册到 Eureka,Ribbon 会从 Eureka 拉取服务列表。

  3. 通过 Ribbon 进行负载均衡调用:在服务调用时,Ribbon 会根据 Eureka 提供的服务列表和配置的负载均衡策略进行流量分发:

    restTemplate.getForObject("http://user-service/user", String.class);
    

Ribbon 和 Eureka 的结合确保了系统的动态可扩展性和高可用性。Ribbon 可以处理服务实例的动态变化,而 Eureka 提供服务注册和发现,二者共同构建了一个健壮的服务调用与负载均衡体系。

小结

本节详细介绍了 Ribbon 的使用和配置,以及它如何与 Eureka 集成实现动态负载均衡。通过 Ribbon,客户端可以根据多种负载均衡策略选择服务实例,确保流量在不同实例之间合理分配。与 Eureka 集成后,Ribbon 可以动态获取服务实例列表,实现更加灵活的微服务架构。

负载均衡是确保高并发场景下系统性能和稳定性的关键,Ribbon 提供了丰富的策略和扩展能力,开发者可以根据业务需求选择或自定义合适的负载均衡策略。

下期预告

在下一节【3.1 Feign:声明式服务调用】中,我们将探讨如何通过 Feign 实现更加简洁的声明式服务调用,进一步简化微服务之间的通信。敬请期待!

相关文章:

滚雪球学SpringCloud[2.3]:服务发现与负载均衡详解

全文目录&#xff1a; 前言1. Ribbon的使用与配置1.1 Ribbon 概述Ribbon 的核心功能&#xff1a; 1.2 Ribbon 的基本使用1.2.1 引入 Ribbon 依赖1.2.2 配置 RestTemplate 与 Ribbon1.2.3 示例&#xff1a;通过 Ribbon 调用服务 1.3 Ribbon 的配置选项 2. Ribbon的负载均衡策略2…...

商务英语口语之聚会宴饮常用口语柯桥培训到蓝天广场

吃饭一定要掌握的英语口语 邀请他人共进餐&#xff1a; Would you like to join me for dinner? 你愿意和我一起吃饭吗&#xff1f; Lets grab a bite to eat together. 我们一起去吃点东西吧。 How about having lunch with me? 和我一起吃午饭怎么样&#xff1f; 询问…...

【C#】VS插件

翻译 目前推荐较多的 可以单词发言&#xff0c;目前还在开发阶段 TranslateIntoChinese - Visual Studio Marketplace 下载量最高的(推荐) Visual-Studio-Translator - Visual Studio Marketplace 支持翻译的版本较多&#xff0c;在 Visual Studio 代码编辑器中通过 Googl…...

嵌入式C语言自我修养:C语言的面向对象编程思想

⭐关联知识点&#xff1a;C和C的区别 代码复用与分层思想 什么是代码复用呢&#xff1f; &#xff08;1&#xff09;函数级代码复用&#xff1a;定义一个函数实现某个功能&#xff0c;所有的程序都可以调用这个函数&#xff0c;不用自己再单独实现一遍&#xff0c;函数级的代…...

行车记录仪格式化了怎么恢复?专业恢复方法分享

行车记录仪作为现代驾驶的必备设备&#xff0c;它忠实记录着行车过程中的点点滴滴&#xff0c;是保障行车安全、处理交通事故的重要依据。然而&#xff0c;有时由于操作失误或其他原因&#xff0c;我们可能会不小心将行车记录仪进行格式化&#xff0c;导致宝贵的录像数据丢失。…...

C++中extern ”c“的理解

c中extern “C“的作用及理解_extern "c-CSDN博客...

红黑树的删除

文章目录 前言一.删除的节点左子树右子树都有二.删除的节点只有左/右子树删除调整操作 三.删除的节点没有孩子1.删除的节点为红色2.删除的节点为黑色1).兄弟节点为黑色(1).兄弟节点至少有一个红色的孩子节点LL型RR型RL型LR型 (2).兄弟节点没有孩子或所有孩子为黑色 2).兄弟节点…...

Vue3+setup实现父子组件单表增删改查写法模板

父组件写法 <el-card><!-- el-card 头部插槽 显示列表名和新增按钮 --><template #header><div class"table-header-container"><i class"fas fa-th" />角色列表&#xff08;100&#xff09;<span style"flex-grow…...

jmeter 录制APP脚本

一、手机 1、修改网络 代理选择手动→填写服务器主机名&#xff08;电脑IP&#xff0c;如&#xff1a;192.1xx.x.xx&#xff09;→服务器端口&#xff08;任意未被占用端口&#xff0c;如&#xff1a;8888&#xff09; 2、安装证书 手机浏览器访问服务器主机名:服务器端口&a…...

C++类与对象深度解析(一):从抽象到实践的全面入门指南

文章目录 C 类与对象——详细入门指南前言1. 类的定义1.1 类定义的基本格式示例代码解释 1.2 访问限定符示例代码解释 1.3 类域示例代码解释 1.4 成员命名规范常见的命名约定&#xff1a;示例&#xff1a;拓展&#xff1a; 1.5 class与struct的默认访问权限示例&#xff1a; 2.…...

docker拉取 jdk 8

docker pull openjdk:8docker run -d -it --name java-8 openjdk:8docker run -d -it --name java-8 openjdk:8 –name java-8 容器名&#xff0c;自定义的 openjdk:8 镜像名&#xff1a;标签名 &#xff0c; 使用 docker images 查看 2、查看已运行的容器实例&#xff1a; doc…...

机器学习VS深度学习

机器学习&#xff08;Machine Learning, ML&#xff09;和深度学习&#xff08;Deep Learning, DL&#xff09;是人工智能&#xff08;AI&#xff09;的两个子领域&#xff0c;它们有许多相似之处&#xff0c;但在技术实现和应用范围上也有显著区别。下面从几个方面对两者进行区…...

基于vue框架的宠物交流平台1n2n3(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;会员,宠物信息,宠物类型,团队信息,申请领养,团队申请,领养宠物 开题报告内容 基于Vue框架的宠物交流平台开题报告 一、项目背景 随着现代生活节奏的加快与人们情感需求的日益增长&#xff0c;宠物已成为众多家庭不可或缺的重要成员。…...

Rust 所有权 借用与引用

文章目录 发现宝藏1. 所有权&#xff08;Ownership&#xff09;2. 引用&#xff08;References&#xff09;2.1 不可变引用2.2 可变引用2.3 引用的规则 3. 悬垂引用&#xff08;Dangling References&#xff09;4. 借用&#xff08;Borrowing&#xff09;结论 发现宝藏 前些天…...

构建智能电商新生态:深度解析京东商品详情API的力量

在当今数字化浪潮中&#xff0c;智能电商系统已成为推动零售业转型升级的重要引擎。作为电商行业的领军者之一&#xff0c;京东凭借其庞大的商品数据库和先进的技术架构&#xff0c;为开发者与商家提供了丰富的API接口&#xff0c;其中商品详情API无疑是构建智能电商系统的关键…...

Golang | Leetcode Golang题解之第398题随机数索引

题目&#xff1a; 题解&#xff1a; type Solution []intfunc Constructor(nums []int) Solution {return nums }func (nums Solution) Pick(target int) (ans int) {cnt : 0for i, num : range nums {if num target {cnt // 第 cnt 次遇到 targetif rand.Intn(cnt) 0 {ans …...

使用注意力机制可以让你的模型更加灵活,但是需要额外的计算资源。rnn lstm bilstm attension

确实&#xff0c;使用注意力机制可以使模型更加灵活&#xff0c;但也确实需要额外的计算资源。注意力机制允许模型在处理序列数据时&#xff0c;能够动态地关注不同位置的重要性&#xff0c;从而更好地捕捉长依赖关系。下面是一个简单的注意力机制实现示例&#xff0c;可以帮助…...

git命令大全

简介&#xff1a;个人学习分享&#xff0c;如有错误&#xff0c;欢迎批评指正 一、Git操作流程 1、代码提交和同步代码 第零步: 工作区与仓库保持一致第一步: 文件增删改&#xff0c;变为已修改状态第二步: git add &#xff0c;变为已暂存状态 $ git status $ git add --al…...

【数据仓库】数据仓库常见的数据模型——范式模型

目录 一、范式 1、第一范式 2、第二范式 3、第三范式 4、进一步范式化&#xff1a;BCNF、4NF 和 5NF 简介 &#xff08;1&#xff09;Boyce-Codd 范式&#xff08;BCNF&#xff09; &#xff08;2&#xff09;第四范式&#xff08;4NF&#xff09; &#xff08;5&#x…...

【LeetCode每日一题】——LCR 078.合并 K 个升序链表

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目注意】六【题目示例】七【题目提示】八【解题思路】九【时间频度】十【代码实现】十一【提交结果】 一【题目类别】 优先队列 二【题目难度】 困难 三【题目编号】 LCR 078.合并 K 个升序链表 …...

代码随想录算法训练营第五十九天 | dijkstra(堆优化版)精讲

目录 dijkstra&#xff08;堆优化版&#xff09;精讲 思路 堆优化细节 方法一&#xff1a; 最小堆优化 dijkstra&#xff08;堆优化版&#xff09;精讲 题目链接&#xff1a;卡码网&#xff1a;47. 参加科学大会 文章讲解&#xff1a;代码随想录 小明是一位科学家&#x…...

go语言后端开发学习(七)——如何在gin框架中集成限流中间件

一.什么是限流 限流又称为流量控制&#xff08;流控&#xff09;&#xff0c;通常是指限制到达系统的并发请求数。 我们生活中也会经常遇到限流的场景&#xff0c;比如&#xff1a;某景区限制每日进入景区的游客数量为8万人&#xff1b;沙河地铁站早高峰通过站外排队逐一放行的…...

SpringBoot2:web开发常用功能实现及原理解析-整合EasyExcel实现Excel导入导出功能

1、工程包结构 主要是这5个Java类 2、导入EasyExcel包 这里同时贴出其他相关springboot的基础包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><depend…...

CTFShow-信息搜集

Web1&#xff1a; ​ 题目描述&#xff1a;开发注释未及时删除 。 ​ 打开题目后提示web1:where is flag? ​ ctrlu读取源码。 Web2&#xff1a; ​ 题目描述&#xff1a;js前台拦截 无效操作 ​ 打开题目后显示&#xff1a;无法查看源代码 ​ 右键无法用&#xff0c;…...

Facebook的虚拟现实功能简介:社交网络的新前沿

在科技飞速发展的今天&#xff0c;虚拟现实&#xff08;VR&#xff09;已经从科幻小说中的梦想变成了触手可及的现实。作为全球领先的社交平台&#xff0c;Facebook&#xff08;现已更名为Meta&#xff09;正大力推动虚拟现实技术的发展&#xff0c;以重新定义用户的社交体验。…...

Redis embstr 编码

embstr 编码 是 Redis 中一种优化存储小型字符串的编码方式。它是 Redis 内部存储字符串的多种方式之一&#xff0c;特别适用于存储长度不超过 44 字节的小字符串。...

【Elasticsearch系列二】安装 Kibana

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

中国电子学会202403青少年软件编程(Python)等级考试试卷(三级)真题与解析

202403Python 三级真题 一、选择题 1.在 Python 中,hex(2023)的功能是?( ) A.将十进制数 2023 转化为十六进制数 B.将十进制数 2023 转化为八进制数 C.将十六进制数 2023 转化为十进制数 D.将八进制数 2023 转化为十进制数 2.下列表达式的值与其他三个选项不相…...

k8s 资源管理

文章目录 ResourceQuota什么是资源配额定义一个ResourceQuotaResourceQuota的使用 LimitRangeLimitRange的用途示例1&#xff1a;配置默认的requests和limits示例2&#xff1a;配置requests和limits的范围 QoS什么是服务质量保证示例1&#xff1a;实现QoS为Guaranteed的Pod示例…...

演示:基于WPF的自绘的中国地铁轨道控件

一、目的&#xff1a;演示一个基于WPF的自绘的中国地铁轨道控件 二、效果演示 北京地铁 成都地铁 上海地铁 深圳地铁 南京地铁 长春地铁 哈尔滨地铁 武汉地铁 厦门地铁 香港地铁 三、功能 支持平移、缩放等操作 鼠标悬停显示线路信息和站点信息 按表格显示&#xff0c;按纸张…...