Spring Cloud 负载均衡(Ribbon)- 流量管理与服务调用优化

一、Spring Cloud Ribbon 概述

1、什么是 Spring Cloud Ribbon?

Spring Cloud Ribbon 是一个基于客户端的负载均衡器,其核心目标是为微服务架构中的服务调用提供智能流量分发能力。与传统的服务端负载均衡(如 Nginx)不同,Ribbon 将负载均衡逻辑嵌入到服务消费者端,结合服务注册中心(如 Eureka)动态获取实例列表,并根据预设策略选择目标实例,从而高效管理微服务流量。

这种设计天然支持分布式系统的弹性扩展和高可用性,避免了单点故障,并提供更灵活的流量调度策略。

2、核心优势

  • 去中心化:无需独立负载均衡服务器,避免单点故障。

  • 动态感知:与 Eureka 无缝集成,实时更新服务实例状态。

  • 灵活策略:支持轮询、随机、响应时间加权等算法,并可自定义规则。

二、Ribbon 的核心原理

2.1 客户端负载均衡 vs 服务端负载均衡
在这里插入图片描述

2.2 Ribbon 核心组件

Ribbon 采用客户端负载均衡,将流量分配的决策交给客户端处理。它通常与Eureka结合使用,能够动态获取服务实例列表,并选择合适的目标进行请求。Ribbon 依赖以下几个关键组件:

1. 服务实例列表(ServerList)

• 负责从Eureka获取服务实例列表(如:DiscoveryEnabledNIWSServerList)。

• 默认每 30 秒更新一次,支持增量更新(通过 Eureka 事件监听)。

2. 负载均衡策略(IRule)

Ribbon 提供两类负载均衡策略:

内置策略(默认可用)

自定义策略(开发者自定义)

内置负载均衡策略包含如下:

• 轮询(RoundRobinRule)

按顺序循环选择服务实例。

• 加权轮询(WeightedRoundRobinRule)

根据每个实例的权重动态分配流量,适用于不同能力的服务实例。

• 随机(RandomRule)

每次随机选择一个实例,适用于请求量不均衡的场景。

• 响应时间(WeightedResponseTimeRule)

根据服务实例的响应时间优先选择较快的实例。

3. 健康检查(IPing)

• 负责检测服务实例健康状态,决定是否参与负载均衡。

• 默认使用 DummyPing(依赖 Eureka 健康检查)。

• 可替换为PingUrl(HTTP 探测)或PingTcp(TCP 探测)以增强健康检查能力。

示例:使用 PingUrl 进行健康检查

@Bean
public IPing ribbonPing() {return new PingUrl(false, "/health");
}

此配置会定期访问 /health 端点,确保实例可用。

三、内置负载均衡策略的用法

3.1 默认策略与配置

若未显式配置,Ribbon默认使用 ZoneAvoidanceRule,其行为如下:

• 优先选择与消费者**同 Zone(区域)**的服务实例。

• 若同 Zone 无可用实例,则跨 Zone 选择。

• 在 Zone 内采用轮询策略进行调用。

3.2 配置文件配置(推荐)

在消费者端的application.yml或application.properties中,可以针对全局或具体服务配置负载均衡策略。

1. 服务专属策略(对指定服务生效)

为目标服务user-service指定 RandomRule 负载均衡策略。

# 示例:为特定服务(user-service)配置负载均衡策略
user-service:  # 目标服务名称(与Eureka注册的名称一致)  ribbon:  NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule  ConnectTimeout: 2000  # 连接超时时间(ms)  ReadTimeout: 5000     # 读取响应超时时间(ms)  MaxAutoRetries: 1     # 同一实例最大重试次数  

此配置仅对 user-service 生效,不会影响其他服务。

解析:

以下参数定义了 Ribbon 调用user-service时的超时与重试策略,对于网络不稳定或需要高可用性的服务尤为重要。

• ConnectTimeout:连接超时时间,2000ms 内未建立连接则请求失败。

• ReadTimeout:读取响应超时时间,5000ms 内未收到响应则请求失败。

• MaxAutoRetries:同一实例的最大重试次数,请求失败后最多再尝试 1 次(不包含初始请求)。

2. 全局配置(对所有服务生效)

# 示例:全局配置(对所有服务生效)
ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule  # 轮询策略(默认)

application.properties 配置 示例:

ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RoundRobinRule # 设置为轮询

可将RoundRobinRule替换为其他策略,如:

• RandomRule— 随机策略

• WeightedResponseTimeRule— 响应时间加权策略

• ZoneAvoidanceRule— 根据区域进行选择

• WeightedRoundRobinRule— 加权轮询策略

3.3 代码配置(非必须)

在消费者端可以通过@Configuration类覆盖默认策略,主要分为全局代码配置和服务专属代码配置两种方式。

1. 全局代码配置

作用:为所有 Ribbon 客户端统一配置负载均衡策略。

实现:在 Spring 容器中定义全局的 Ribbon 负载均衡配置。

代码示例:

@Configuration
public class GlobalRibbonConfig {// 定义全局 Ribbon 负载均衡策略@Beanpublic IRule ribbonRule() {return new RoundRobinRule(); // 采用轮询策略}
}

解析:

• @Configuration:声明该类为 Spring 配置类。

• @Bean定义IRule:将RoundRobinRule作为全局 Ribbon 负载均衡策略,应用于所有服务。

• 默认策略覆盖:所有未单独配置的服务都会使用这个全局策略。

2. 服务专属代码配置(最高优先级)

作用:为特定服务配置负载均衡策略,使其不受全局配置影响。

实现:使用@RibbonClient精准控制作用域,为指定服务配置策略。

代码示例:

// 作用于 user-service,指定使用 CustomRibbonConfig 进行个性化配置

@Configuration
@RibbonClient(name = "user-service", configuration = CustomRibbonConfig.class)
public class RibbonConfig {
}  // 空类,仅用于承载@RibbonClient注解

//自定义 Ribbon 负载均衡策略配置类

@Configuration
public class CustomRibbonConfig {@Bean@ConditionalOnMissingBean //安全条件:无IRule Bean时生效public IRule ribbonRule() {return new RandomRule(); // 采用随机负载均衡策略}
}

解析:

• CustomRibbonConfig 类:自定义 Ribbon 负载均衡策略配置类。

• @RibbonClient(name = “user-service”, configuration = CustomRibbonConfig.class):

精准作用域控制,指定 user-service 使用 CustomRibbonConfig 进行个性化负载均衡配置。不受全局 GlobalRibbonConfig 影响。

参数说明:

• @RibbonClient:为特定微服务配置自定义负载均衡规则,不使用全局默认配置。

• name:指定目标服务名(必须与注册中心中的服务名一致)。

• configuration:关联自定义配置类,定义负载均衡策略、超时时间等。

• @ConditionalOnMissingBean:

仅当 Spring 容器未定义相同类型的 IRule Bean时,才加载ribbonRule()。

避免重复注入导致冲突。

• IRule(Ribbon 负载均衡策略接口):

RandomRule:随机选择实例。

默认策略ZoneAvoidanceRule:基于区域权重和可用性进行选择。

3.4 配置验证与优先级

1. 配置优先级规则

优先级顺序(从高到低):

  • 服务专属代码配置(@RibbonClient)

  • 配置文件专属配置 ( 参考 3.2 示例 1)

  • 全局代码配置

  • 全局配置文件配置 (参考 3.2 示例 2)

2. 验证方法

调用目标服务接口,观察请求是否按配置的策略分发,验证负载均衡策略是否生效。

验证示例:

• 随机策略(RandomRule):请求会随机分配到不同实例。

• 轮询策略(RoundRobinRule):请求会依次按顺序分配到各实例。

3.5 常见配置问题

(1) 配置未生效的可能原因

• 服务名称不匹配

确保application.yml中的服务名称与 Eureka 注册的名称完全一致(区分大小写)。

• 依赖缺失

确认已引入spring-cloud-starter-netflix-ribbon依赖。

• 配置位置错误

配置必须位于消费者端的配置文件中。

(2) 策略类名错误

若策略类名拼写错误,启动时会抛出ClassNotFoundException。如:

# 错误示例(正确类名应为 WeightedResponseTimeRule)
ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRul  # 缺少结尾的"e"

3.6 最佳实践

• 内嵌负载均衡策略优先使用 application.yml 配置。

• 防御性条件注解 @ConditionalOnMissingBean,防止多个策略 Bean 冲突,但生产环境建议删除该注解。生产代码应强制指定策略,避免不可控的全局配置继承。

• 兼容性提醒
name参数必须与 Eureka 注册名一致,避免因大小写不一致导致配置失效。

四、自定义负载均衡策略

若负载均衡策略的逻辑超出 Ribbon 的内置能力(例如基于元数据或业务参数进行路由),则必须通过代码实现自定义策略,并手动注册到 Ribbon 配置中。

4.1 常规(内置)策略 vs 自定义策略

1. 常规(内置)策略 vs 自定义策略
在这里插入图片描述

2. 配置方式对比
在这里插入图片描述

4.2 自定义负载均衡策略实例

场景:实现基于元数据的灰度发布策略,优先选择标记为version: v2的实例。

步骤1:自定义负载均衡策略类

自定义GrayReleaseRule,优先选择带有version: v2标记的实例。

import com.netflix.loadbalancer.Server;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import java.util.List;
import java.util.stream.Collectors;
import java.util.Random;/*** 自定义负载均衡策略:优先选择具有 "version: v2" 标记的实例*/
public class GrayReleaseRule extends AbstractLoadBalancerRule {private final Random random = new Random();@Overridepublic Server choose(Object key) {List<Server> serverList = getLoadBalancer().getAllServers();// 过滤出 version = v2 的服务实例List<Server> v2Servers = serverList.stream().filter(server -> "v2".equals(server.getMetaInfo().get("version"))).collect(Collectors.toList());// 如果有符合条件的 v2 实例,则从中随机选择一个if (!v2Servers.isEmpty()) {return v2Servers.get(random.nextInt(v2Servers.size()));}// 若无 v2 实例,则使用默认策略(如随机选取)return serverList.isEmpty() ? null : serverList.get(random.nextInt(serverList.size()));}@Overridepublic void initWithNiwsConfig(Object config) {// 该方法可用于读取 Ribbon 配置,当前无需特殊处理}
}

解析:

• AbstractLoadBalancerRule:Ribbon负载均衡策略的基类,必须实现choose方法。

• Server:封装了Eureka服务实例的元数据。

• choose方法:核心逻辑,通过过滤元数据来选择符合条件的实例。

步骤2:注册自定义策略

RibbonCustomConfig中注册自定义负载均衡策略。import com.netflix.loadbalancer.IRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** Ribbon 负载均衡策略配置*/
@Configuration
public class RibbonCustomConfig {@Beanpublic IRule customRule() {// 返回自定义灰度发布策略return new GrayReleaseRule();}
}

步骤3:自定义策略的使用

子步骤1:让order-service使用自定义策略

在OrderServiceApplication中,通过@RibbonClient注解绑定自定义策略。

@SpringBootApplication
@EnableEurekaClient 
@RibbonClient(name = "user-service", configuration = RibbonCustomConfig.class)
public class OrderServiceApplication {public static void main(String[] args) {SpringApplication.run(OrderServiceApplication.class, args);}
}

解析:

• @RibbonClient(name = “user-service”, configuration = RibbonCustomConfig.class):绑定user-service到自定义负载均衡策略。

子步骤2:使用RestTemplate调用user-service

配置RestTemplate并启用 Ribbon 负载均衡。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;@Configuration
public class RestTemplateConfig {@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}
}
/*** 订单服务控制器,调用 user-service*/
@RestController
@RequestMapping("/order")
public class OrderController {@Autowiredprivate RestTemplate restTemplate;@GetMapping("/user")public String getUser() {return restTemplate.getForObject("http://user-service/user", String.class);}
}

步骤4:完整实例的验证

要完成上面的完整实例并做验证,需要通过如下 3 步构建一个基于 Eureka 的服务注册与发现体系:

1.启动 Eureka 注册中心:

创建 Eureka 服务端,启用@EnableEurekaServer,并配置注册中心地址。

@EnableEurekaServer //标记应用为 Eureka 服务注册中心,负责处理服务注册和发现。
public class EurekaServerApplication {public static void main(String[] args) {SpringApplication.run(EurekaServerApplication.class, args);}
}

在application.yml配置示例:

eureka:server:enable-self-preservation: false  # 禁用自我保护模式,方便开发环境中测试

2.注册服务提供者:

创建微服务user-service,启用@EnableEurekaClient,将实例注册到 Eureka。

@SpringBootApplication
@EnableEurekaClient //标记应用为 Eureka 客户端,允许应用向 Eureka 注册并发现其他服务。
public class UserServiceApplication {public static void main(String[] args) {SpringApplication.run(UserServiceApplication.class, args);}
}

• application.yml配置示例:

spring:application:name: user-service  # 服务名
eureka:client:service-url:defaultZone: http://localhost:8761/eureka/  # Eureka 服务注册中心的地址

3.配置服务消费者:

创建消费者服务order-service,使用@LoadBalanced注解的RestTemplate通过服务名调用提供者。

@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name = "user-service", configuration = RibbonCustomConfig.class)
public class OrderServiceApplication {public static void main(String[] args) {SpringApplication.run(OrderServiceApplication.class, args);}
}

• application.yml配置示例:

spring:application:name: order-service  # 服务名
eureka:client:service-url:defaultZone: http://localhost:8761/eureka/  # Eureka 服务注册中心的地址

4.测试验证

通过如下命令,我们就可以测试上面的自定义策略了。 # 1. 启动 Eureka Server
# 假设已经构建了 eureka-server.jar,运行它
java -jar eureka-server.jar &# 2. 启动 user-service 的两个实例
# 假设 user-service.jar 在当前目录
# 启动第一个实例
java -jar user-service.jar --server.port=8081 --spring.cloud.application.name=user-service &# 启动第二个实例
java -jar user-service.jar --server.port=8082 --spring.cloud.application.name=user-service &# 3. 启动 order-service
# 假设 order-service.jar 在当前目录
java -jar order-service.jar --server.port=8083 --spring.cloud.application.name=order-service &# 4. 访问 order-service 的 /order/user 接口
# 使用 curl 发送请求
curl http://localhost:8083/order/user
预期结果• 优先返回user-servicev2实例(8082)• 仅当v2不可用时,才会降级选择v1实例(8081)

4.3 总结

• 常规策略:通过application.yml配置,适用于大多数场景。

• 自定义策略:需要通过代码实现并注册,适合动态或复杂的需求。

五、Ribbon 与 Eureka 的集成

5.1 RestTemplate 的负载均衡增强

核心概念

RestTemplate是 Spring 提供的 HTTP 客户端工具,用于在微服务间调用 REST API(如GET/POST请求)。

痛点:直接使用RestTemplate需要硬编码服务实例的 IP 和端口,无法动态适应微服务的实例扩缩容。

负载均衡增强方案

通过@LoadBalanced注解,为RestTemplate集成Ribbon的负载均衡能力:

1.服务名替换 IP:使用服务名(如 user-service)代替具体地址,Ribbon自动从注册中心获取实例列表。

2.智能路由:根据配置的策略(如轮询、随机)选择合适的实例,提高可用性和扩展性。

使用示例:

定义负载均衡的RestTemplate。

@Bean  
@LoadBalanced  // 关键!启用 Ribbon 负载均衡  
public RestTemplate restTemplate() {  return new RestTemplate();  
}  

调用示例:

// 通过服务名调用(无需关心 IP)

String result = restTemplate.getForObject(  "http://user-service/api/user/1",  // user-service 是注册到 Eureka 的服务名  String.class  
);  

@LoadBalanced :为 RestTemplate 添加负载均衡拦截器,使其支持服务名解析和 实例选择。

对比:有无负载均衡的区别
在这里插入图片描述

原理简述

1.拦截器注入:@LoadBalanced为RestTemplate添加LoadBalancerInterceptor,实现负载均衡能力。

2.服务名解析:拦截请求,提取 URL 中的服务名(如user-service)。

3.实例选择:Ribbon 根据负载均衡策略,从 Eureka 获取实例列表并选择目标实例。

4.请求转发:将服务名替换为实际IP:Port,然后发起真实 HTTP 调用。

5.2 动态服务列表更新机制

核心目标

确保 Ribbon 负载均衡时使用的服务实例列表能够实时反映 Eureka 的最新状态,避免调用已下线或故障的实例。

更新机制详解

1. 主动拉取(默认方式)

• 周期性全量更新:Ribbon 默认每 30 秒从 Eureka Server 拉取最新的服务列表。

• 优点:简单可靠,不依赖额外的事件监听。

• 缺点:实时性受拉取间隔影响,可能短暂使用过期的实例列表。

• 调整拉取频率(application.yml)

eureka:client:registryFetchIntervalSeconds: 10  # 调整拉取间隔(默认30秒)

• 平衡建议

• 生产环境:建议设置15-30 秒,避免频繁拉取增加 Eureka Server 负担。

• 测试环境:可缩短至5-10 秒,加快问题复现,提升调试效率。

2.事件监听(增量更新)

原理:通过EurekaNotificationServerListUpdater监听 Eureka 服务变更(如实例上下线),实时触发本地列表更新。

优势

• 毫秒级响应:实例状态变更时立即更新,无需等待拉取间隔。

• 减少网络开销:仅同步变更数据,而非全量服务列表。

触发条件

• 实例注册 / 下线

• 心跳续约失败(实例被标记为 DOWN)

• 手动通过 Eureka 控制台剔除实例

3.机制对比
在这里插入图片描述

4.配置建议

生产环境基准配置

eureka:  client:  registryFetchIntervalSeconds: 30  # 全量拉取间隔  instance:  leaseRenewalIntervalInSeconds: 15  # 客户端心跳间隔(默认30秒)  

关联影响

• 若实例心跳间隔 (leaseRenewalIntervalInSeconds)为 30 秒,Eureka Server约 90 秒未收到心跳将剔除实例。

• Ribbon 最长可能在 30 + 90 = 120 秒 后感知实例下线,存在调用失败风险。

5.高实时性场景优化

eureka:  client:  registryFetchIntervalSeconds: 5    # 更频繁拉取  instance:  leaseRenewalIntervalInSeconds: 5   # 加快心跳频率  leaseExpirationDurationInSeconds: 10 # 缩短剔除超时  

6.验证方法

• 日志观察:搜索 Ribbon 日志关键词DynamicServerListLoadBalancer,检查服务列表刷新时间戳。

• 主动触发更新:在Eureka Server 控制台手动下线实例,观察消费者日志,确认是否立即更新列表。

7.常见问题

Q1 列表更新延迟导致调用失败?

原因:Ribbon 未及时感知实例下线。

解决方案:

• 确保事件监听已启用(默认开启)。

• 缩短 registryFetchIntervalSeconds,提高更新频率。

Q2 增量更新未生效?

检查点:

• Eureka Server 版本 ≥ 1.4.0(需支持事件推送)。

• 确认消费者未禁用 EurekaNotificationServerListUpdater。

六、总结

6.1 核心要点

• 去中心化客户端负载均衡

Ribbon 基于 Eureka 动态感知服务实例状态,实现毫秒级服务列表更新和故障实例自动剔除,有效规避了传统中心化负载均衡的单点故障风险。

• 多层次路由策略体系

Ribbon 内置轮询、随机、响应时间权重等 7 种负载均衡策略,支持通过IRule自定义灰度路由、区域亲和、版本分流等高级流量调度逻辑。

• 生产级灵活配置能力

Ribbon 提供YAML 配置、注解声明、代码级策略注入三种控制方案,支持全局默认规则与精细化服务专属策略的协同运作。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

内网环境安装dlv,本地远程调试go

背景&#xff1a;内网环境(服务器)下安装dlv,本地通过dlv调试编译后的go代码。 可以配合观看: 【dlv远程调试-哔哩哔哩】 https://b23.tv/NqPZ5q9 内网安装dlv步骤 1、dlv安装: &#xff08;我额服务器和内网的go都是1.21以上&#xff09; # 先在有网络的环境下&#xff08…

C# MVC项目部署II后错误,403禁止访问:访问被拒绝问题处理

C# MVC项目部署II后错误&#xff0c;403禁止访问&#xff1a;访问被拒绝问题处理 问题如下&#xff1a; 解决办法&#xff1a; 1. 应用程序池要选v4.xx&#xff0c;托管模式选“集成” 2. 把asp.net 4.xx安装在iis上&#xff0c;方法&#xff1a; cd \Windows\Microsoft .NE…

基于Flask的东方财富网股票数据可视化分析系统

【大数据】基于Flask的东方财富网股票数据可视化分析系统 &#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统能够高效地从东方财富网抓取股票数据&#xff0c;并通过Python的强大数据处理能…

整形在内存中的存储(例题逐个解析)

目录 一.相关知识点 1.截断&#xff1a; 2.整形提升&#xff1a; 3.如何 截断&#xff0c;整型提升&#xff1f; &#xff08;1&#xff09;负数 &#xff08;2&#xff09;正数 &#xff08;3&#xff09;无符号整型&#xff0c;高位补0 注意&#xff1a;提升后得到的…

HarmonyOS第26天:应用发布与推广全攻略:从0到1走向市场

一、引言:开启 HarmonyOS 应用之旅 在数字化时代的浪潮中,HarmonyOS 以其独特的分布式理念和强大的跨设备协同能力,为应用开发领域开辟了一片崭新的天地。随着 HarmonyOS 市场份额的稳步增长,其生态设备数量已突破 9 亿大关,吸引了超过 254 万开发者投身其中 ,成为了开发…

【操作系统安全】任务4:Windows 系统网络安全实践里常用 DOS 命令

目录 一、引言 二、网络信息收集类命令 2.1 ipconfig 命令 2.1.1 功能概述 2.1.2 实例与代码 2.2 ping 命令 2.2.1 功能概述 2.2.2 实例与代码 2.3 tracert 命令 2.3.1 功能概述 2.3.2 实例与代码 三、网络连接与端口管理类命令 3.1 netstat 命令 3.1.1 功能概述…

《我的Python觉醒之路》之转型Python(十五)——控制流

[今天是2025年3月17日&#xff0c;继续复习第一章节、第二章节的内容 ] 《我的Python觉醒之路》之转型Python&#xff08;十四&#xff09;——控制流

通过 SVG 使用 AI 生成理想图片:技术实现与实践指南

文章目录 1. SVG 与 AI 的结合&#xff1a;技术价值2. 技术原理&#xff1a;AI 如何生成 SVG&#xff1f;3. 实现步骤&#xff1a;从需求到图形3.1 定义需求3.2 使用 AI 生成 SVG3.3 验证与调整 4. 代码解析&#xff1a;实现科技感的关键4.1 渐变背景4.2 网格线条4.3 发光六边形…

OpenCV计算摄影学(22)将输入的彩色图像转换为两种风格的铅笔素描效果函数pencilSketch()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 铅笔风格非写实线描图。 该函数通过图像处理技术将输入的彩色图像转换为两种风格的铅笔素描效果&#xff1a; dst1&#xff1a;炭笔效果的灰度图…

JavaScript运算符与流程控制详解

一、运算符 • 赋值运算符 • 一元运算符 • 比较运算符 • 逻辑运算符 • 运算符优先级 1.算术运算符 数字是用来计算的&#xff0c;比如&#xff1a;乘法 * 、除法 / 、加法 、减法 - 等等&#xff0c;所以经常和算术运算符一起。 算术运算符&#xff1a;也叫数学运算符&…

设计模式(行为型)-观察者模式

目录 定义 类图 角色 Subject&#xff1a;抽象主题&#xff08;抽象被观察者&#xff09;​ ConcreteSubject&#xff1a;具体主题&#xff08;具体被观察者&#xff09;​ Observer&#xff1a;抽象观察者​ ConcrereObserver&#xff1a;具体观察者​ 优缺点 优点​…

调用华为云API实现口罩识别

1.作者介绍 范小雨&#xff0c;女&#xff0c;西安工程大学电子信息学院&#xff0c;2024级研究生 研究方向&#xff1a;机器视觉与人工智能 电子邮件&#xff1a;1019044907qq.com 高金年&#xff0c;男&#xff0c;西安工程大学电子信息学院&#xff0c;2024级研究生&#…

C++中的单例模式及具体应用示例

AI 摘要 本文深入探讨了C中的单例模式及其在机器人自主导航中的应用&#xff0c;特别是如何通过单例模式来管理地图数据。文章详细介绍了单例模式的基本结构、优缺点以及在多线程环境中的应用&#xff0c;强调了其在保证数据一致性和资源管理中的重要性。 接着&#xff0c;文章…

【STM32】从新建一个工程开始:STM32 新建工程的详细步骤

STM32 开发通常使用 Keil MDK、STM32CubeMX、IAR 等工具来创建和管理工程。此处是 使用 Keil MDK5 STM32CubeMX 创建 STM32 工程的详细步骤。 新建的标准库工程文件已上传至资源中&#xff0c;下载后即可直接使用。 标准库新建 STM32 工程的基本目录结构&#xff1a;STD_STM…

Java 大视界 -- 基于 Java 的大数据实时流处理中的窗口操作与时间语义详解(135)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

Fastdata极数:中国民宿行业发展趋势报告2025

2024年&#xff0c;中国游客出行次数大幅上涨&#xff0c;旅游相关支出也复苏强劲。2025年中国旅游业还将持续稳健的复苏及增长。同时&#xff0c;中国旅游业将见证一场深刻的变革&#xff0c;这场变革的推动力是消费者对旅游期望的转变&#xff0c;经济因素和年轻人全新价值观…

【自定义微信小程序拉下选择过滤组件】searchable-select

【自定义微信小程序拉下选择过滤组件】searchable-select 组件说明 点击输入框获取焦点&#xff0c;输入内容&#xff0c;自动匹配搜索结果&#xff0c;点击搜索结果&#xff0c;自动填充搜索结果。 组件使用 将组件文件夹放在项目中。在需要使用的页面的json文件中&#x…

推理大模型的后训练增强技术-Reasoning模型也进化到2.0了,这次居然学会用工具了

论文题目&#xff1a;START: Self-taught Reasoner with Tools 论文链接&#xff1a;https://arxiv.org/pdf/2503.04625 论文简介 Reasoning模型也进化到2.0了&#xff0c;这次居然学会用工具了&#xff01;✨ 最近有个叫START的方法&#xff0c;让大模型也能学着用工具&#…

Idea集成docker通过ca加密实现镜像打包

​ Idea集成docker实现镜像打包_ideadocker镜像打包-CSDN博客 ​ 之前通过这种方式虽然可以实现idea通过maven打jar包的同时把docker镜像也进行打包&#xff0c;但是这种方式存在很大漏洞&#xff0c;就是服务器的2375端口大开&#xff0c;任何人拿着idea通过这种方式都可以连…

SOC与电压的关系

与电池相关的参数都与SOC有关&#xff0c;也就是电池剩余容量的百分比即荷电状态。 SOC百分之二十时&#xff0c;对应3.2V,SOC80&#xff05;时对应3.3V。