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

[高可用/负载均衡] Ribbon LoadBalancer: 开源的客户端式负载均衡框架

0 序言

  • 某项目上,原先为自建的数据库集群提供了负载均衡IP服务器(简称: ELB IP Server),客户端的数据库请求URL都统一走ELB IP。但随着业务量的增长,识别到一个严峻的现实:
  • 其一,考虑到未来的业务增长情况,云厂商提供的 ELB IP Server 云服务的入网带宽必将完全无法满足本项目的诉求。
  • 其二,云厂商提供的 ELB IP Server 的费用较为昂贵,实在是不划算。

除了入网带宽的使用量较高外,云厂商ELB 服务提供的其他方面的资源指标,使用量均极低(有浪费钱的嫌疑)。

  • 为此开始尝试:取消服务端式负载均衡器,自行实现客户端式的负载均衡器

经过一番研究,开源的、支持Java、与spring生态框架独立/解耦的、负载均衡器 Ribbon,成为个人的首选。

即:笔者此时的诉求之一是,不需要引入spring框架,与其解耦。

1 概述:Ribbon LoadBalancer: 开源负载均衡器

负载均衡的概念

  • 负载均衡是一种通过【分发请求】来优化服务器资源利用率提高系统性能的技术。

它在微服务架构中尤为重要,常见的负载均衡方式包括服务端负载均衡客户端负载均衡

image

  • 服务端负载均衡是指请求首先被发送到【负载均衡服务器】,然后由该服务器根据【负载均衡算法】(如轮询、最小连接数等)将【请求分发】到后端服务器进行处理。
  • 常见的服务端负载均衡工具包括: 硬件设备(如F5)和软件(如Nginx、LVS)。
  • 这种方式的优点是: 客户端无感知、无需关心负载均衡的逻辑,所有的均衡操作都由服务端完成。

image

  • 客户端负载均衡则是由客户端直接从服务注册中心(如Nacos、Eureka)获取服务列表,并根据负载均衡算法选择目标服务器进行请求分发

Spring Cloud中的Ribbon为例,客户端通过RestTemplate触发负载均衡。
客户端负载均衡的特点无需额外的负载均衡服务器(例如: ELB IP Server),分发逻辑完全由客户端实现。

image

  • 两者的主要区别在于:负载均衡的实现位置。

服务端负载均衡依赖于专门的负载均衡服务器,而客户端负载均衡则由客户端自行完成分发逻辑。

客户端式负载均衡方案的实现原理

  1. ​服务发现客户端​,从注册中心获取服务实例列表并缓存。
  2. 客户端请求被 ​负载均衡拦截器​ 截获(如 @LoadBalanced 标记的 RestTemplate/WebClient)。

org.springframework.cloud.client.loadbalancer.LoadBalanced
org.springframework.web.client.RestTemplate

  1. 拦截器调用 ​LoadBalancerClient

org.springframework.cloud.client.loadbalancer.LoadBalancerClient
org.springframework.cloud.loadbalancer.annotation.LoadBalancerClient

4.​ LoadBalancerClient​ 调用底层的负载均衡器 (Ribbon / SCL) 选择一个实例。
5. 负载均衡器根据 ​负载均衡策略​ 从可用实例列表中选择一个目标实例。
6. 请求最终被​转发到选定的实例。

关键问题:负载均衡与请求客户端、连接池的集成

  • Ribbon 等本身只是一个客户端负载均衡器,它负责从服务列表里挑一台机器,把原请求 URL 中的“服务名”替换成这台服务器的真实 IP+端口。

真正发出 HTTP 请求的是下游的 HTTP 客户端

  • 若还想把“连接池”能力加进来,就是把这个客户端换成支持池化的实现(OkHttp / Apache HttpClient),并让它复用 Ribbon 等负载均衡框架已挑好的地址。

Ribbon LoadBalancer: 开源的客户端式负载均衡框架

  • Ribbon
  • Ribbon有很多子模块,官方文档中说明,目前 Netflix 公司主要用于生产环境的 Ribbon 子模块如下:
  • ribbon-core:Ribbon 的核心API。
  • ribbon-loadbalancer:可以独立使用或与其他模块一起使用的负载均衡器 API。
  • ribbon-eureka:Ribbon 结合 注册中心 Eureka 客户端的 API,为负载均衡器提供动态服务注册列表信息。

image

  • Ribbon LoadBalancer
  • 起源于 ​Netflix OSS,曾是 Spring Cloud ​默认的客户端负载均衡解决方案。
  • Ribbon 是一个独立的、较为成熟的库,被广泛集成到 Spring Cloud Netflix 组件(如 Zuul、Feign)中。
  • 已进入维护模式,Netflix 官方不再积极开发新功能。
  • 技术架构与依赖​
  • 非响应式 (阻塞式):​​ 核心 API 基于线程池和阻塞调用,在响应式编程场景下兼容性较差。
  • 依赖较重:​​ 包含大量 Netflix 的内部组件 (如 Archaius 配置系统),包体积和复杂度较高。
  • 独立的负载均衡器:​​ 需要额外的客户端负载均衡器实现 (如 RibbonLoadBalancerClient)。

springcloud 与 ribbon 整合

此小节旨在解释 spring cloud 项目中,如何与 ribbon 集成。ribbon 也可完全独立于 spring 项目,独立运行。

Ribbon 与 RestTemplate 整合使用

  • Spring Cloud 构建的微服务系统中,Ribbon 作为服务消费者的负载均衡器,有2种使用方式:
  • 一种是和 RestTemplate 相结合;
  • 另一种是和 Feign 相结合。
  • 那么,Spring Cloud框架中,Ribbon (负载均衡器) 是如何与 Spring 的 RestTemplate / WebClient 集成的?

下面用一张图来看看 RestTemplate 基于 Ribbon 的远程调用:

image

from : https://www.cnblogs.com/chiangchou/p/ribbon-1.html

  • RestTemplate 本身是不具备【负载均衡】的能力的。
1 RestTemplate 是 Spring Resources 中一个访问第三方 RESTful API 接口的网络请求框架,用于执行HTTP请求。
2 其暴露了一系列的模板方法API,便于操作底层的HTTP客户端库,如JDK的HttpURLConnection、Apache HttpComponents等。
3 RestTemplate 是用来消费 REST 服务的,所以 RestTemplate 的主要方法都与 REST 的 Http协议的一些方法紧密相连,例如 HEAD、GET、POST、PUT、DELETE 和 OPTIONS 等方法。
这些方法在 RestTemplate 类对应的方法为 headForHeaders()、getForObject()、postForObject()、put() 和 delete() 等。4 RestTemplate通常作为【共享组件】使用,其配置不支持【并发修改】,因此通常在【启动时】准备好配置。如果需要,可以在启动时创建多个配置不同的RestTemplate实例。这些实例可以使用相同的底层`ClientHttpRequestFactory`,如果它们需要共享HTTP客户端资源。
  • 如果 RestTemplate 未使用 @LoadBalanced 标记,就通过服务名的形式来调用,必然会报错。
  • @LoadBalanced 标记后,调用 RestTemplateREST 方法就会通过【负载均衡】的方式通过一定的负载策略【路由】到某个【服务实例】上。

此时,其底层负责负载均衡的组件就是 Ribbon

springcloud 、注册中心 eureka 、负载均衡器 ribbon 三者的整合

  • 与 eureka 整合到 springcloud 类似,springcloud 提供了对应的 spring-cloud-starter-netflix-eureka-client(server) 依赖包
  • ribbon 则整合到了 spring-cloud-starter-netflix-ribbon 中。

一般也不需要单独引入 ribbon 的依赖包,spring-cloud-starter-netflix-eureka-client 中已经依赖了 spring-cloud-starter-netflix-ribbon
因此,我们引入了 spring-cloud-starter-netflix-eureka-client 就可以使用 Ribbon 的功能了。

image

springcloud 、注册中心 nacos 、负载均衡器 ribbon 三者的整合

略,类同 eureka 。

客户端式负载均衡框架的同类竞品项目

  • ​Spring Cloud LoadBalancer (SCL)
  • Spring 官方在 ​Spring Cloud Hoxton (2020年)​​ 推出,旨在替代 Ribbon。
  • 是 ​Spring Cloud Commons​ 项目的一部分,与 Spring 生态集成度更高。
  • 目前作为 ​Spring Cloud 官方推荐的负载均衡解决方案,持续更新迭代。

spring项目中,若同时引了 spring-cloud-starter-netflix-ribbonspring-cloud-loadbalancer 会冲突,用 spring.cloud.loadbalancer.ribbon.enabled=false 可回退到 Ribbon

  • 技术架构与依赖​
  • ​响应式优先:​​ 核心接口 ReactiveLoadBalancer 基于 ​Project Reactor​(Reactor Core),天然支持响应式编程,同时对阻塞式调用提供适配。
  • 轻量级:​​ 源码简洁,依赖少 (spring-cloud-starter-loadbalancer),启动更快。
  • Spring原生集成:​​ 与 Spring 框架深度集成(如 Environment、BeanFactory),配置管理更简单。(既是优点,也是缺点)

Maven依赖

<!-- 客户端式负载均衡器 https://github.com/Netflix/ribbon | https://mvnrepository.com/artifact/com.netflix.ribbon/ribbon -->
<dependency><groupId>com.netflix.ribbon</groupId><artifactId>ribbon</artifactId><!-- 2.7.18 --><version>${ribbon.version}</version>
</dependency>
<dependency><groupId>com.netflix.ribbon</groupId><artifactId>ribbon-core</artifactId><version>${ribbon.version}</version>
</dependency>
<dependency><groupId>com.netflix.ribbon</groupId><artifactId>ribbon-loadbalancer</artifactId><version>${ribbon.version}</version>
</dependency>

2 Ribbon LoadBalancer 核心 API

  • IClientConfig:Ribbon 客户端配置类,默认实现是 DefaultClientConfigImpl。
  • IRule:负载均衡策略规则组件,默认实现是 ZoneAvoidanceRule。
  • IPing:判断 Server 是否存活,默认实现是 DummyPing,永远都是返回 true。
  • ServerList:获取 Server 的组件,默认实现类为 ConfigurationBasedServerList,从配置文件获取。
  • ServerListUpdater:Server 列表更新组件,默认实现类为 PollingServerListUpdater。
  • ServerListFilter:过滤可用的 Server 列表,默认实现类为 ZonePreferenceServerListFilter。
  • RibbonLoadBalancerContext:负载均衡客户端。
  • RetryHandler:重试处理器,默认实现类为 DefaultLoadBalancerRetryHandler。

IClientConfig : 客户端配置

  • com.netflix.client.config.IClientConfig : 管理客户端配置的核心接口,它的默认实现类是 DefaultClientConfigImpl

可以看到在创建 IClientConfig 时,设置了 Ribbon 客户端默认的连接和读取超时时间为 1 秒,例如读取如果超过1秒,就会返回超时,这两个一般需要根据实际情况来调整。

import com.netflix.client.config.IClientConfig;
import com.netflix.client.config.CommonClientConfigKey;@Bean
@ConditionalOnMissingBean
public IClientConfig ribbonClientConfig() {DefaultClientConfigImpl config = new DefaultClientConfigImpl();// 加载配置config.loadProperties(this.name);// 连接超时默认 1 秒config.set(CommonClientConfigKey.ConnectTimeout, DEFAULT_CONNECT_TIMEOUT);// 读取超时默认 1 秒config.set(CommonClientConfigKey.ReadTimeout, DEFAULT_READ_TIMEOUT);config.set(CommonClientConfigKey.GZipPayload, DEFAULT_GZIP_PAYLOAD);return config;
}
  • com.netflix.client.config.CommonClientConfigKey

这个类定义了 Ribbon 客户端相关的所有配置的键常量,可以通过这个类来看有哪些配置。

https://github.com/Netflix/ribbon/blob/v2.7.18/ribbon-core/src/main/java/com/netflix/client/config/CommonClientConfigKey.java

  • 进入到 DefaultClientConfigImpl,可以看到 CommonClientConfigKey 中的每个配置都对应了一个默认值。

在加载配置的时候,如果用户没有定制配置,就会使用默认的配置。

https://github.com/Netflix/ribbon/blob/v2.7.18/ribbon-archaius/src/main/java/com/netflix/client/config/DefaultClientConfigImpl.java
https://github.com/Netflix/ribbon/blob/v2.7.18/ribbon-core/src/test/java/com/netflix/client/config/DefaultClientConfigImplTest.java

也可以在配置文件中定制配置,例如配置超时和重试:

# 全局配置
ribbon:# 客户端读取超时时间ReadTimeout: 3000# 客户端连接超时时间ConnectTimeout: 3000# 默认只重试 GET,设置为 true 时将重试所有类型,如 POST、PUT、DELETEOkToRetryOnAllOperations: false# 重试次数MaxAutoRetries: 1# 最多重试几个实例MaxAutoRetriesNextServer: 1# 只针对 demo-producer 客户端
demo-producer:ribbon:# 客户端读取超时时间ReadTimeout: 5000# 客户端连接超时时间ConnectTimeout: 3000

IRule : 均衡策略

  • IRule 是最终选择 Server 的策略规则类,核心的接口就是 choose
public interface IRule{// 选择 Serverpublic Server choose(Object key);// 设置 ILoadBalancerpublic void setLoadBalancer(ILoadBalancer lb);// 获取 ILoadBalancerpublic ILoadBalancer getLoadBalancer();
}
  • Ribbon 提供了丰富的负载均衡策略,我们也可以通过配置指定使用某个均衡策略。下面是整个Ribbon提供的 IRule 均衡策略。

image

策略类 命名 描述
RandomRule 随机策略 随机选择 server
RoundRobinRule 轮询策略 按顺序循环选择 server
RetryRule 重试策略 在一个配置时间段内当选择 server 不成功,则一直尝试选择一个可用的 server
BestAvailableRule 最低并发策略 逐个考察 server,如果 server 断路器打开,则忽略,再选择其中并发连接最低的 server
AvailabilityFilteringRule 可用过滤策略 过滤掉一直连接失败并被标记为 circuit tripped 的 server,过滤掉那些高并发连接的 server(active connections 超过配置的阈值)
ResponseTimeWeightedRule 响应时间加权策略 根据 server 的响应时间分配权重。响应时间越长,权重越低,被选择到的概率就越低;响应时间越短,权重越高,被选择到的概率就越高。这个策略很贴切,综合了各种因素,如:网络、磁盘、IO 等,这些因素直接影响着响应时间
ZoneAvoidanceRule 区域权衡策略 综合判断 server 所在区域的性能和 server 的可用性轮询选择 server,并且判定一个 AWS Zone 的运行性能是否可用,剔除不可用的 Zone 中的所有 server

例如: RandomRule => com.netflix.loadbalancer.RandomRule

IPing : 服务检查

  • com.netflix.loadbalancer.IPing :

用于定期检查 Server 的可用性的,它只提供了一个接口,用来判断 Server 是否存活:

package com.netflix.loadbalancer;public interface IPing {boolean isAlive(Server var1);
}
  • IPing 也提供了多种策略可选。
    image

image

下面是整个 IPing 体系结构:

image

ServerList : 获取服务列表

  • ServerList 提供了2个接口: 一个是第一次获取 Server 列表,一个是更新 Server 列表

其中 getUpdatedListOfServers 会每被 Loadbalancer 隔 30 秒调一次来更新 allServerList。

public interface ServerList<T extends Server> {public List<T> getInitialListOfServers();/*** Return updated list of servers. This is called say every 30 secs* (configurable) by the Loadbalancer's Ping cycle*/public List<T> getUpdatedListOfServers();
}
  • ServerList 也提供了多种实现

ServerList 体系结构如下:

image

image

ServerListFilter : 过滤服务

  • ServerListFilter 提供了一个接口用来过滤出可用的 Server。
public interface ServerListFilter<T extends Server> {public List<T> getFilteredListOfServers(List<T> servers);
}

image

ServerListUpdater :服务列表更新

  • ServerListUpdater 有多个接口,最核心的就是 start 开启定时任务调用 updateAction 来更新 allServerList
public interface ServerListUpdater {/*** an interface for the updateAction that actually executes a server list update*/public interface UpdateAction {void doUpdate();}/*** start the serverList updater with the given update action* This call should be idempotent.*/void start(UpdateAction updateAction);
}
  • 默认有两个实现类:

image

ILoadBalancer : 负载均衡器

  • ILoadBalancer 是负载均衡选择服务的核心接口,主要提供了如下的获取Server列表和根据客户端名称选择Server的接口。
public interface ILoadBalancer {// 添加Serverpublic void addServers(List<Server> newServers);// 根据key选择一个Serverpublic Server chooseServer(Object key);// 获取存活的Server列表,返回 upServerListpublic List<Server> getReachableServers();// 获取所有Server列表,返回 allServerListpublic List<Server> getAllServers();
}

image

Z 案例实践

CASE 实现客户端式负载均衡器(快速入门版)

package com.knowdata.framework.study.ribbon.lb;import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Arrays;
import java.util.List;import com.netflix.loadbalancer.BaseLoadBalancer;
import com.netflix.loadbalancer.RoundRobinRule;
import com.netflix.loadbalancer.Server;/** @description Ribbon 负载均衡框架的快速入门示例* @updateTime 2025/09/14 16:39*/
public class RibbonQuickStartTest {public static void main(String[] args) throws Exception {// 定义目标服务器列表List<Server> serverList = Arrays.asList(new Server("localhost", 8086),new Server("localhost", 8086),new Server("localhost", 8086));// 创建(客户端式)负载均衡器BaseLoadBalancer loadBalancer = new BaseLoadBalancer();loadBalancer.setServersList(serverList);// 配置负载均衡策略(可选,默认为轮询)loadBalancer.setRule(new RoundRobinRule());// 其他策略示例:// loadBalancer.setRule(new RandomRule());// loadBalancer.setRule(new WeightedResponseTimeRule());// 模拟多次请求,查看负载均衡效果for (int i = 0; i < 10; i++) {Server server = loadBalancer.chooseServer(null);System.out.println("第 " + (i + 1) + " 次请求,选中服务器: " + server.getHostPort());sendRequest(server);}}private static void sendRequest(Server server) {try {URL url = new URL("http://" + server.getHost() + ":" + server.getPort() + "/api/hello");HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod("GET");int responseCode = connection.getResponseCode();System.out.println("响应码: " + responseCode);connection.disconnect();} catch (IOException e) {System.err.println("请求失败: " + e.getMessage());}}
}

Y 推荐文献

  • Ribbon
  • https://github.com/Netflix/ribbon
  • https://mvnrepository.com/artifact/com.netflix.ribbon/ribbon
  • SpringCloud 源码系列(4)—— 负载均衡 Ribbon(上) - 博客园/bojiangzhou 【推荐】

  • SpringCloud 源码系列(5)—— 负载均衡 Ribbon(下) - 博客园/bojiangzhou 【推荐】

  • [HTTP/Spring] RestTemplate : Spring的HTTP网络请求框架 - 博客园/千千寰宇

X 参考文献

  • Ribbon和LoadBalance-负载均衡 - 技术栈

相关文章:

[高可用/负载均衡] Ribbon LoadBalancer: 开源的客户端式负载均衡框架

0 序言某项目上,原先为自建的数据库集群提供了负载均衡IP服务器(简称: ELB IP Server),客户端的数据库请求URL都统一走ELB IP。但随着业务量的增长,识别到一个严峻的现实:其一,考虑到未来的业务增长情况,云厂商提供的 ELB IP Server 云服务的入网带宽必将完全无法满足本项…...

梦话周记

忘记是哪天了。 傍晚,暗蓝色的天空,水雾,朦胧的光晕。 此时的天空与以往理解的深邃可谓是一点关系都没有,它的深邃不再来自于天空,而是来自于大海。什么地方是深蓝色的,湿润的,广阔的?海洋。 其实气体与液体有很多相似之处,它们都有浮力,都是流体。我们是不是也生活在…...

【电机控制】无刷电机结构阐述---磁极数、槽数

一、磁极数P与槽数N 1.磁极数P 定义:转子上磁极的数量,既转子上磁钢的数量,磁钢均匀的排列在转子上磁铁必定是NS极成对使用,所以极数必然是偶数。 2.槽数N 定义:定子铁芯的槽数量,既定子上的电磁铁极数量,每一个槽上都饶有一组线圈,如上图有12个槽,所以是12N电机由于无…...

金刚怒目是我哭

金刚怒目是我哭是你们太不善良,还是我太不正常马喽马基米退圈了。我下载的its my cry没了,my mujuca也只有前三集 这个可以说是我的入坑作 确实有点刻意 反正不是日常向 即使现在看来也是无可厚非的 但还是爆了 我应该说戾气很重吗 杂食党,,,理中客,和稀泥 说不出话 雨...

nginx使用默认端口80作为服务端口

背景:http默认端口是80,配置nignx.conf,希望服务url直接输入ip不用输入端口 给server配置80以及加default_server ,老是报错,后面发现是因为 include /etc/nginx/sites-enabled/*; 这个配置的server段占用了80 解决办法:把默认配置/etc/nginx/sites-available/default 里…...

机器学习和推荐算法顶级会议和期刊

在机器学习(ML)与推荐系统(Recommender Systems)领域,CIKM 和 TKDE 是信息检索、数据挖掘及数据库领域的重要学术载体,二者分别以会议(CCF A 类)和期刊(CCF A 类)形式存在,覆盖 “推荐算法”“用户行为分析”“知识图谱与推荐融合” 等核心方向,是该领域研究者发表…...

java使用mysql

用jdbc操作mysqlhttps://www.runoob.com/java/java-mysql-connect.htmlmysql8之前和之后的连接配置有差异。实际使用时,一般还需要个功能,就是连接池。这个springboot自带了,是hikari。hikari初始化的时候,也需要配置mysql的连接参数,所以一般都是在这里设置的。https://w…...

2025年医疗行业API安全最佳实践与深度案例分析:从理论到全面落地

2025年医疗行业API安全最佳实践与深度案例分析:从理论到全面落地医疗API安全是保障患者隐私和医疗数据安全的关键环节。医疗机构、信息化服务商和安全厂商需遵循GB/T《数据接口安全风险监测方法》要求,建立覆盖"发现-监测-处置"的全生命周期防护体系。以金华市中心…...

2026 NOI 做题记录(二)

推荐阅读:D、N、W、Y、Z、AB、AC、AD、AE、AFContest Link \(\text{By DaiRuiChen007}\)A. [ARC194E] Swap 0^X and 1^Y (3) Problem Link 删掉所有的串 \(0^x\) 以及 \(1^y\),每次操作不会跨过里面的连续段,因此剩下的串必定相同。 取出每个连续段,任意两个 \(0\) 连续段在…...

lc1027-最长等差数列

难度:中等(后期)题目描述给定一个数组,计算最长等差数列的长度示例 输入:nums = [3,6,9,12] 输出:4 解释:3 6 9 12输入:nums = [9,4,7,2,10] 输出:3 解释:4 7 10输入:nums = [20,1,15,3,10,5,8] 输出:4 解释:20 15 10 5题解思路:DPf(i,j): 以 i 结尾,公差为 j 结…...

13

#include <math.h>int main() { int n; scanf("%d", &n); while (n--) {int l, r;scanf("%d %d", &l, &r); int y_max = (int)sqrt(r);//算l的平方根,然后向上取整并强制转换为整数, y >= lint y_min = (int)ceil(sqrt(l));int c…...

np.zeros函数

np.zeros 是 NumPy 库中的一个非常常用的函数,它的作用是创建一个指定形状和数据类型的新数组,并用 0 来填充所有元素。 np.zeros 的基本用法 函数的完整签名是 numpy.zeros(shape, dtype=float, order=C)。shape:你想要创建的数组的形状。可以是一个整数(用于一维数组)或…...

Langchain之让LLM拥有记忆

langchain的Memory 如果AI有记忆,我们就不需要手动维护一个储存消息历史的列表 让LLM拥有记忆的方法有很多,我更喜欢使用的方法是以下方案,其优点是灵活度比较高 from langchain.memory import ConversationBufferMemory from langchain_core.prompts import ChatPromptTemp…...

25.9.14

(今天的)...

.net PublishSingleFile 打包程序提取

.net PublishSingleFile 打包程序提取 目录.net PublishSingleFile 打包程序提取提取 Bundle 的常用方法分界线工具SingleFileExtractor (低版本)SelfContainedExtractor (.NET 5+)定位offset <PublishSingleFile>true</PublishSingleFile>该部分内容为AI…...

实用指南:Java类加载机制

实用指南:Java类加载机制pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-size…...

C 语言注释

C 语言有两种注释, 即 // 和 /* ... */. /* */ 被称为 C 风格的注释, 是 ANSI C 的注释. // 被称为 C++ 风格的注释, 是 C99 新增的注释, 只有支持 C99 和 C11 的编译器才能识别这种注释. 该风格的注释被广泛应用于 C++ 和 Java. 注释在预编译阶段会被替换为一个空格. 代码示例…...

扫描线

前题引入 扫描线是用来求给你n个矩阵求他们围起来的总面积。 问题分析 可能有一些弱智的小朋友说直接把所有的矩阵的面积加起来再减掉重复的不就可以啦。 如果,你这么想请问(1<=n<=1e5)请问你该如何应对,所以我们就引入了个新算法:扫描线(废话) 先在我们先画一张图:…...

C语言中的查找与排序算法整理

查找与排序算法整理 1 查找算法 1.1 顺序查找 1.1.1 算法原理 顺序查找又称线性查找,是一种基本的查找算法,其原理是:从头开始遍历:从数据集的起始位置开始,逐个检查每个元素。 比较目标:对于每个遍历到的元素,将其与目标元素进行比较。 查找成功:如果当前元素等于目标…...

k8s练习

k8s练习 1. 简述Kubernetes是什么? Kubernetes是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。 2. Kubernetes的组成有哪些? Kubernetes主要由以下几个组件组成:kube-apiserver:提供REST API服务,作为系统的控制入口。 kube-controller-manager:执…...

css-2

css正常布局流浮动弹性盒子a {//行内盒子,比如a如果给了flex布局,则可以直接设置宽高display: flex }淘宝京东多行伸缩布局 瀑布流百度图片综合案例...

AtCoder Beginner Contest 423 ABCDEF 题目解析

A - Scary Fee 题意 你的存折中有 \(X\) 元,从存折中取钱需要花手续费。 取钱必须以 \(1000\) 元为单位,并且每取 \(1000\) 元就需要额外支付 \(C\) 元的手续费。 问你最多可以取出多少钱? 思路 我们可以把 \(C\) 元手续费当作单次取钱的一部分,也就是每当我们想取 \(1000\…...

numpy中的shape属性

.shape 不是一个函数,而是numpy的一个属性(attribute),用于获取数组维度信息。它返回一个元组(tuple),元组中的每个元素代表对应维度的大小。 import numpy as np# 1D 数组 (向量) arr1d = np.array([1, 2, 3, 4, 5]) print(f"数组内容: {arr1d}") print(f&qu…...

mac 查看fat32磁盘

1.首先安装社区维护的ntfs工具。 brew tap gromgit/homebrew-fuse #### brew install ntfs-3g2.然后就是mount啦 这里的/dev/diskXsY 就是自己看啦,看到下面是没有externatl(外部拓展这一项的,或者使用磁盘工具,如果插上了u盘也是可以看到的)然后使用命令 mkdir /Volumes/…...

使用Smart-Doc为Java项目生成gRPC API文档

本文详细介绍了如何在Java微服务项目中利用Smart-Doc工具自动生成gRPC API文档,包括配置步骤、优势分析以及实际操作指南,帮助开发者高效管理API文档。Smart-Doc:在Java项目中生成gRPC API文档 在现代Java微服务中,gRPC通过其高效的二进制协议和多语言支持简化了服务间通信…...

数字时钟用的什么字体

下载字体 字体 DS-Digital放置字体 引入字体:<style scoped> /* 定义字体 */ @font-face {font-family: DS-Digital; /* 自定义字体名称 *//* 引入不同格式的字体文件,确保兼容性 */src: url(@/assets/fonts/DS-DIGI.TTF) format(truetype),url(@/assets/fonts/DS-DIG…...

Python数据分析零基础完整课程大纲(详细版)【202509第1版】 - 指南

Python数据分析零基础完整课程大纲(详细版)【202509第1版】 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier Ne…...

详细介绍:uni-app 根据用户不同身份显示不同的tabBar

详细介绍:uni-app 根据用户不同身份显示不同的tabBarpre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monos…...

VSTO QQ群 61840693 解散通知【新群193203228 】

由于各种原因,成立16年的VSTO交流群于近日停用,损失粉丝两千人。 感谢这么多年热爱我的粉丝,如果还要跟我学习VBA,请加新群193203228...

kettle从入门到精通 第107课 ETL之kettle json_input 一个点号引发的血案

场景:在一个kettle交流群内,有一个小伙伴求助:大致意思是json input的输入参数的key中存在点号,凡是带点号的key都无法正确获取。 今天一起来分析下使用多种方式来解决这个问题,希望后续有人遇到此类问题时可以秒杀它,而不是花费N根头发!!! 1、json数据构造{"id&…...

【2024-2025第二学期】助教工作学期总结

一、助教工作的具体职责和任务: 作为《人工智能导论》课程助教,我的主要职责包括协助课程老师完成教学支持工作,确保课程顺利运行。具体任务包括:前期负责对接课程老师对比赛进行组织,比如数字中国创新大赛的各赛道报名、统计第十六届视觉艺术设计赛省赛的报名、上课后课程…...

Clion 实现多个 main 函数执行互不影响

安装插件 C/C++ single File Execution。如果 Clion 中安装不上,可以在官网安装:安装成功后,源文件右键,会提示:点击后,Clion 的右下角会提示:reload 这个文件夹:选择刚刚 add 的源文件,即想要执行的源文件:在 main.c 和 Hello.c 两个源文件都包含 main() 函数时也可…...

腾讯终于对Claude code下手了?我拿它跑完一个真实项目,结果有点意外…

前几天看腾讯也发布和开源了他们的Claude code,名字是Codebuddy code。 就下载下来试了试效果(说实话,一开始是冲着它能免费用GPT-4o、Claude 3.5这些顶级模型去的)。 整体来看效果还不错,对于刚开始发布来说,我认为已经可以初步当做生产力工具了。 目前国内版本可以使用的…...

快速利用AI读论文

使用Gemini 2.5 Pro,每天可以有五次请求 提示词如下 **Role:** You are a seasoned researcher in the field of artificial intelligence and computer vision. You excel at interpreting cutting-edge academic papers in a clear and structured manner and can disting…...

第一周预习作业(AI)

你好,很高兴认识你。...

HTTP协议核心概念全解析 - 实践

HTTP协议核心概念全解析 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font…...

Django过时了吗?从ASGI到AI时代的思考

前言 本文本来只是 DjangoStarter v3.2.1 新版本发布博客里的一段思考,不过越写越长,干脆拆分成一篇独立的文章得了。😄“Django 过时了吗?” 这是一个几乎每天都能在论坛、Reddit 或知乎上看到的问题。 但仔细想想,这个问题的背后并不是“Django 变烂了”,而是技术趋势…...

日常练习一部分

这一次练习不使用后端,只进行对使用vue3的前端练习,包括两种不同的跳转方式: 我的部分代码大致如下: DashboardView.vue: <template><div><h1>仪表盘视图</h1><p>这是您的个人仪表盘,显示各种统计信息。</p><div class="sta…...

世界史

约200000万年前,天在地的下方,但是地与天无法展示与观测,山与河都一并随着天去了遥远的歌声,日月的光辉敲响了【命运】的洪钟,于此,在钟声中,产生了最初的生命,在日月的抚慰下,生命活了,死了,分裂了,一二三四五,哦,原来【数据删除】在这里,这真是太美妙了。 最初…...

罗技M275鼠标滚轮断轴维修:建模+3D打印修复全过程

本文记录了一次鼠标滚轮损坏的维修过程。经拆解发现,滚轮与编码器连接的中心轴从根部断裂。由于原装配件价格接近鼠标本体价值,作者决定采用 3D 打印方式自制替换件。初步尝试使用开源模型失败后,使用游标卡尺对原件进行尺寸测量,并重新建模。在打印过程中,分别测试了纵向…...

Unity:网络编程

Socket 服务端至少要两个socket:一个负责接收客户端连接请求,但不负责与客户端通信;为每个连接成功的客户端,在服务端创建一个对应的socket负责与客户端通信。 客户端的socket一个就行:要指定连接的服务端的IP和端口。 通讯过程:申请一个socket 绑定IP和端口 监听 服务端…...

【比赛记录】2025CSP-S模拟赛45

A B C D Sum Rank10 - 75 20 105 16/24A. 染色(color) 考虑奇偶性染色,于是就满足了所有奇质数的限制。但是由于有 \(2\) 的存在,所以需要每四个染一个色。考虑 \(1,3,6,8\) 每两个数之差都是质数,因此 \(n\ge8\) 时答案不可能小于 \(4\)。\(n<8\) 时打表打出来即可。Cod…...

PWN手的成长之路-01

首先启动题目环境,并下载题目的附件。远程nc连接一下,发现程序就是把用户输入再次输出,并加了几句话。之后从附件下手,用file查看文件的详细信息。发现是一个linux的可执行程序。使用checksec查看文件的安全属性。P.S.详细解释查看后的信息含义: Arch: 程序架构信息。判断…...

SpringCloud全解:核心组件与实战案例 - 教程

SpringCloud全解:核心组件与实战案例 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !im…...

学起plus刷课

// ==UserScript== // @name 自动下一集-学起刷课(可用版) // @namespace https://cjlzulms.sccchina.net/ // @version 2.0 // @description 用户首次点击播放后,自动连播下一集 // @author You // @match https://cjlzulms.sccchina.net/ve…...

Windows 安装人大金仓数据库 KingbaseES_V008R006

1、安装前准备 1.1、最低硬件环境要求CPU 内存 硬盘2 核 512 MB 10 GB 空闲空间1.2、下载人大金仓数据库安装包官网下载地址:https://www.kingbase.com.cn/xzzx/index.htm注意:在官网下载人大金仓数据库安装包时,需要提供下载方相关信息1.3、校验安装包的完整性如上图所示,…...

Hadoop(十) - 教程

Hadoop(十) - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-size: 14p…...

如何注入像 MyBatis 一样注入接口

如何注入像 MyBatis 一样注入接口1.概述 我们在使用mybatis 的时候,我们发现实际上我们就是使用接口,没有实现类,但是spring 容器一样可以正常使用接口操作数据,这个是怎么做到的呢,实际上这里使用了代理模式和 spring的FactoryBean。 本文就用一个简单的例子来实现一个接…...

10 个优质周公解梦网站推荐及解析参考

梦境是潜意识的低语,也是传统文化的载体。周公解梦作为千年流传的解梦智慧,承载着古人对梦的洞察。如今,这些智慧通过网络得以延续,为人们解析梦境寓意、探寻心灵奥秘提供参考。以下推荐 10 个优质解梦网站,助你在传统与现代视角中读懂梦境。周公解梦官方网站 https://www…...

软件工程_个人项目

软件工程_个人项目个人项目报告项目 内容这个作业属于哪个课程 [软件工程](首页 - 计科23级12班 - 广东工业大学 - 班级博客 - 博客园)这个作业要求在哪里 [作业要求](个人项目 - 作业 - 计科23级12班 - 班级博客 - 博客园)这个作业的目标 训练个人项目软件开发能力,学会使用性…...