当前位置: 首页 > 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 个升序链表 …...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...