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

实现Sentinel与Nacos的规则双向同步

实现Sentinel与Nacos的规则双向同步:完整解决方案

前言

在微服务架构中,流量控制和熔断降级是保障系统稳定性的重要手段。阿里开源的Sentinel作为一款轻量级的流量控制组件,常被用于实现这些功能。然而,在实际生产环境中,我们往往需要动态调整规则配置,这就需要将Sentinel规则与配置中心(如Nacos)集成。

本文将详细介绍如何实现Sentinel规则(包括流控规则和熔断规则)与Nacos的双向同步,确保规则变更能够实时生效并持久化。

一、核心设计思路

我们实现的双向同步机制包含三个关键功能:

  1. 从Nacos读取初始配置 - 服务启动时加载最新规则
  2. 监听Nacos配置变更 - 实时响应远程配置变化
  3. Sentinel改变规则本地动态加载-实时响应远程配置变化
  4. 本地规则变更写回Nacos - 确保所有服务实例配置一致
1.修改规则
2.通知
3.发布到
4.推送通知
5.更新本地规则
Sentinel Dashboard
本地RuleManager
NacosDataSource
Nacos Server
所有服务实例

二、完整实现代码

1. 双向转换器接口(对象与字符串之间的双向转换)

/*** 双向转换器接口,支持对象与字符串之间的双向转换* @param <S> 源类型(通常是String)* @param <T> 目标类型*/
public interface BidirectionalConverter<S, T> extends Converter<S, T> {/*** 将目标类型转换回源类型* @param target 目标对象* @return 源类型表示*/S reverseConvert(T target);
}

2. 流控规则转换器

public class FlowRuleConverter implements BidirectionalConverter<String, List<FlowRule>> {@Overridepublic List<FlowRule> convert(String source) {return JSON.parseObject(source, new TypeReference<List<FlowRule>>() {});}@Overridepublic String reverseConvert(List<FlowRule> target) {return JSON.toJSONString(target);}
}

3. 熔断规则转换器

public class DegradeRuleConverter implements BidirectionalConverter<String, List<DegradeRule>> {@Overridepublic List<DegradeRule> convert(String source) {if (StrUtil.isBlank(source)) {return new ArrayList<>();}return JSON.parseObject(source, new TypeReference<List<DegradeRule>>() {});}@Overridepublic String reverseConvert(List<DegradeRule> rules) {return JSON.toJSONString(rules);}
}

4. 增强版Nacos数据源

/*** 增强版 Nacos 数据源(支持双向同步)* 功能:* 1. 从 Nacos 读取初始配置* 2. 监听 Nacos 配置变更* 3. 本地配置变更时自动写回 Nacos** @param <T> 配置数据类型(如 List<FlowRule>)*/
@Slf4j
public class NacosDataSource<T> extends AbstractDataSource<String, T> {// 默认从Nacos获取配置的超时时间(毫秒)private static final int DEFAULT_TIMEOUT = 3000;/*** 单线程线程池(用于处理配置变更通知)* 设计说明:* - 核心/最大线程数=1:确保配置变更顺序处理* - 队列容量=1:防止积压过多变更请求* - 拒绝策略=DiscardOldestPolicy:当队列满时丢弃最老任务*/private final ExecutorService pool = new ThreadPoolExecutor(1, 1, 0, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<>(1),new NamedThreadFactory("sentinel-nacos-ds-update", true),new ThreadPoolExecutor.DiscardOldestPolicy());// Nacos配置变更监听器private final Listener configListener;// Nacos配置的组ID(如 DEFAULT_GROUP)private final String groupId;// Nacos配置的数据ID(如 mianshimao-sentinel)private final String dataId;// 连接Nacos的配置属性private final Properties properties;// Nacos配置服务实例(注意:初始化失败可能为null)private ConfigService configService = null;// 是否启用自动发布到Nacosprivate final boolean autoPublish;// 双向转换器(支持对象与字符串互转)private final BidirectionalConverter<String, T> bidirectionalConverter;/*** 构造方法(简化版,默认启用自动发布)*/public NacosDataSource(final String serverAddr, final String groupId, final String dataId,BidirectionalConverter<String, T> converter) {this(serverAddr, groupId, dataId, converter, true);}/*** 构造方法(可控制自动发布)*/public NacosDataSource(final String serverAddr, final String groupId, final String dataId,BidirectionalConverter<String, T> converter, boolean autoPublish) {this(buildProperties(serverAddr), groupId, dataId, converter, autoPublish);}/*** 核心构造方法* @param properties   Nacos连接配置* @param groupId      配置组ID* @param dataId       配置数据ID* @param converter    双向转换器* @param autoPublish  是否自动发布变更到Nacos*/public NacosDataSource(final Properties properties, final String groupId, final String dataId,BidirectionalConverter<String, T> converter, boolean autoPublish) {super(converter);// 参数校验if (StringUtil.isBlank(groupId) || StringUtil.isBlank(dataId)) {throw new IllegalArgumentException("groupId和dataId不能为空");}AssertUtil.notNull(properties, "Nacos配置属性不能为null");AssertUtil.notNull(converter, "转换器不能为null");// 初始化字段this.groupId = groupId;this.dataId = dataId;this.properties = properties;this.autoPublish = autoPublish;this.bidirectionalConverter = converter;// 创建Nacos配置监听器this.configListener = new Listener() {@Overridepublic Executor getExecutor() {return pool; // 使用专用线程池处理变更事件}@Overridepublic void receiveConfigInfo(final String configInfo) {handleConfigUpdate(configInfo); // 处理配置变更}};// 注册本地变更监听器(用于自动发布到Nacos)if (autoPublish) {getProperty().addListener(new PropertyListener<T>() {@Overridepublic void configUpdate(T newValue) {log.info("检测到本地配置变更,准备同步到Nacos...");boolean success = publishConfig(newValue);log.info("同步结果: {}", success ? "成功" : "失败");}@Overridepublic void configLoad(T value) {// 初始加载时不触发发布}});}// 初始化Nacos连接和监听initNacosListener();// 加载初始配置loadInitialConfig();}/*** 处理Nacos配置变更* @param configInfo 配置内容(JSON字符串)*/private void handleConfigUpdate(String configInfo) {try {log.info("接收到Nacos配置变更通知 dataId={}, groupId={}", dataId, groupId);// 1. 转换配置格式T newValue = bidirectionalConverter.convert(configInfo);// 2. 更新本地属性(会自动触发监听器)getProperty().updateValue(newValue);} catch (Exception ex) {log.error("配置转换失败 dataId=" + dataId, ex);}}/*** 发布配置到Nacos* @param config 配置对象* @return 是否发布成功*/public boolean publishConfig(T config) {// 1. 检查自动发布是否启用if (!autoPublish) {log.warn("自动发布功能未启用");return false;}// 2. 检查Nacos客户端是否初始化if (configService == null) {log.error("Nacos ConfigService未初始化");return false;}try {// 3. 转换配置为字符串String content = bidirectionalConverter.reverseConvert(config);log.debug("准备发布配置到Nacos:\n{}", content);// 4. 调试信息输出log.info("=== 发布配置调试信息 ===");log.info("Nacos地址: {}", properties.getProperty(PropertyKeyConst.SERVER_ADDR));log.info("命名空间: {}", properties.getProperty(PropertyKeyConst.NAMESPACE, "public"));log.info("DataID: {}", dataId);log.info("Group: {}", groupId);// 5. 执行发布(指定内容类型为JSON)boolean result = configService.publishConfig(dataId, groupId, content, "json");if (result) {log.info("配置发布成功 dataId={}", dataId);} else {log.error("Nacos返回发布失败");}return result;} catch (NacosException e) {log.error("Nacos发布配置失败 code={}, msg={}", e.getErrCode(), e.getMessage(), e);return false;}}/*** 加载初始配置*/private void loadInitialConfig() {try {T newValue = loadConfig();if (newValue == null) {log.warn("初始配置为空 dataId={}", dataId);}getProperty().updateValue(newValue);} catch (Exception ex) {log.error("加载初始配置失败", ex);}}/*** 初始化Nacos监听器*/private void initNacosListener() {try {// 1. 创建ConfigService实例this.configService = NacosFactory.createConfigService(this.properties);log.info("Nacos ConfigService初始化成功");// 2. 添加配置监听器configService.addListener(dataId, groupId, configListener);log.info("Nacos监听器注册成功 dataId={}", dataId);} catch (Exception e) {log.error("Nacos监听器初始化失败", e);}}/*** 从数据源读取配置(实现父类抽象方法)*/@Overridepublic String readSource() throws Exception {if (configService == null) {throw new IllegalStateException("Nacos ConfigService未初始化");}return configService.getConfig(dataId, groupId, DEFAULT_TIMEOUT);}/*** 关闭资源*/@Overridepublic void close() {// 1. 移除Nacos监听器if (configService != null) {configService.removeListener(dataId, groupId, configListener);try {configService.shutDown();log.info("Nacos ConfigService已关闭");} catch (Exception e) {log.error("关闭Nacos ConfigService失败", e);}}// 2. 关闭线程池pool.shutdownNow();log.info("Nacos数据源线程池已关闭");}/*** 构建基础Nacos配置*/private static Properties buildProperties(String serverAddr) {Properties properties = new Properties();properties.setProperty(PropertyKeyConst.SERVER_ADDR, serverAddr);return properties;}
}

完整代码较长,包含以下关键功能:

  • 配置监听器注册
  • 自动发布机制
  • 异常处理和日志记录
  • 资源清理

5. 规则管理器

@ConfigurationProperties(prefix = "sentinel-datasource-nacos")
@Component
@Data
public class SentinelRulesManager {// 初始化流控和熔断规则数据源public void initNacosDataSource() {Properties properties = new Properties();properties.put(PropertyKeyConst.SERVER_ADDR, remoteAddress);properties.put(PropertyKeyConst.USERNAME, "nacos");properties.put(PropertyKeyConst.PASSWORD, "123456");// 流控规则数据源NacosDataSource<List<FlowRule>> flowRuleDataSource = new NacosDataSource<>(properties, groupId, dataId, new FlowRuleConverter(), true);FlowRuleManager.register2Property(flowRuleDataSource.getProperty());// 熔断规则数据源NacosDataSource<List<DegradeRule>> degradeRuleDataSource = new NacosDataSource<>(properties, groupId, "mianshimao-sentinel1", new DegradeRuleConverter(), true);DegradeRuleManager.register2Property(degradeRuleDataSource.getProperty());}
}

三、配置说明

1. 应用配置

限流配置:

sentinel-datasource-nacos:remote-address: 127.0.0.1:8848group-id: DEFAULT_GROUPdata-id: {data-id}

熔断配置:

sentinel-datasource-nacos:remote-address: 127.0.0.1:8848group-id: DEFAULT_GROUPdata-id1: {data-id1}

2. Nacos配置示例

流控规则配置

  • Data ID: {data-id}
  • Group: DEFAULT_GROUP
  • 内容:自行在sentinel中配置,可以自动同步到nacos

熔断规则配置

  • Data ID: data-id1 注意与限流的data_id不同
  • Group: DEFAULT_GROUP
  • 内容:自行在sentinel中配置,可以自动同步到nacos

四、实现原理分析

1. 初始化流程

App Nacos Sentinel 1. 请求初始配置 2. 返回配置内容 3. 注册数据源 4. 应用规则 App Nacos Sentinel

2. 动态更新流程

Dashboard App Nacos 所有App实例 Sentinel 1. 修改规则 2. 发布新配置 3. 推送变更 4. 更新规则 Dashboard App Nacos 所有App实例 Sentinel

五、常见问题解决

1. 配置变更未同步

检查步骤

  1. 确认Nacos控制台配置是否更新
  2. 检查应用日志是否有发布成功记录
  3. 验证网络连接和权限设置

调试方法

// 在publishConfig方法中添加调试日志
System.out.println("=== DEBUG ===");
System.out.println("Nacos Server: " + properties.getProperty(PropertyKeyConst.SERVER_ADDR));
System.out.println("Namespace: " + properties.getProperty(PropertyKeyConst.NAMESPACE));
System.out.println("DataID: " + dataId); 
System.out.println("Group: " + groupId);

2. 规则不生效

可能原因

  • 资源名称不匹配
  • 规则类型设置错误
  • 阈值设置不合理

解决方案

  1. 检查Sentinel日志中的资源统计
  2. 使用Arthas等工具查看已加载规则
  3. 逐步调整阈值测试

六、最佳实践建议

  1. 生产环境建议

    • 为不同环境使用不同的Namespace
    • 配置合理的规则默认值
    • 添加监控告警机制
  2. 性能优化

    // 在NacosDataSource构造函数中添加
    properties.put(PropertyKeyConst.CONFIG_LONG_POLL_TIMEOUT, "30000");
    properties.put(PropertyKeyConst.CONFIG_RETRY_TIME, "3000");
    
  3. 安全建议

    • 使用Nacos的ACL功能
    • 敏感配置加密存储
    • 定期轮换认证凭证

结语

通过本文实现的Sentinel-Nacos双向同步方案,我们能够:

  • 实现规则的集中管理
  • 支持动态实时更新
  • 保证多实例配置一致性
  • 提供完整的审计日志

这套方案已在生产环境验证,能够有效提升微服务的稳定性和可维护性。读者可以根据实际需求进一步扩展,如增加系统规则、热点参数规则等的支持。

相关文章:

实现Sentinel与Nacos的规则双向同步

实现Sentinel与Nacos的规则双向同步&#xff1a;完整解决方案 前言 在微服务架构中&#xff0c;流量控制和熔断降级是保障系统稳定性的重要手段。阿里开源的Sentinel作为一款轻量级的流量控制组件&#xff0c;常被用于实现这些功能。然而&#xff0c;在实际生产环境中&#x…...

2025五一杯数学建模A题:支路车流量推测问题,思路分析+模型代码

一持续更新&#xff0c;见文末名片 二、问题背景 想象一下&#xff0c;城市的道路如同一张巨大的脉络图&#xff0c;主路如同大动脉&#xff0c;配备着车流量监测设备&#xff0c;能实时记录车流量数据&#xff0c;就像我们身体的传感器一样。然而&#xff0c;当多条支路像毛细…...

Linux51 安装baidunetdisk yum install rpm -ivh

推测网卡 感觉是不是以前哪里设置了下 deepseek说的这个设置 我没有设置过 这个不会弄啊 准备用虚拟机安个软件 神奇 换了这个命令又能打开网卡了 参考了这个 参考 之前地址我觉得配置错误 动态分配 我就删掉ip地址了 路由表中无ip地址吗&#xff1f; OK 卸载 运…...

【Python-Day 8】从入门到精通:Python 条件判断 if-elif-else 语句全解析

Langchain系列文章目录 01-玩转LangChain&#xff1a;从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块&#xff1a;四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain&#xff1a;从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...

若依 FastAPI + Vue3 项目 Docker 部署笔记( 启动器打包教程)

本文记录了将 start.bat 打包成 .exe 启动器的详细教程&#xff0c;适合项目交付或导师演示用。 &#x1f9ed; 一、如何将 start.bat 打包为启动器 .exe&#xff08;含图标 自动打开浏览器&#xff09; ✅ 1. 创建三大功能脚本 start.bat → 启动项目&#xff08;docke…...

Lebesgue测度和积分理论发展概观

1. 发展背景 积分可以从两个角度来理解。首先&#xff0c;积分是微分的逆函数&#xff0c;因此积分是反导数(译注&#xff1a;但积分是独立于微分的&#xff0c;不能微分的函数也可能可积)。然而&#xff0c;这是一个非常抽象的概念。其次&#xff0c;两点之间的积分可以看…...

算法题题型总结

二叉树题型 解法综述&#xff1a;二叉树的解法&#xff0c;基本上都是依赖遍历&#xff0c;再加上递归的思路来做的。那递归又分为深度优先和广度优先。深度优先算法&#xff0c;前序&#xff0c;中序&#xff0c;后序。广度优先&#xff0c;利用先进先出队列&#xff0c;一层…...

网络编程——TCP和UDP详细讲解

文章目录 TCP/UDP全面详解什么是TCP和UDP&#xff1f;TCP如何保证可靠性&#xff1f;1. 序列号&#xff08;Sequence Number&#xff09;2. 确认应答&#xff08;ACK&#xff09;3. 超时重传&#xff08;Timeout Retransmission&#xff09;4. 窗口控制&#xff08;Sliding Win…...

Qt多线程TCP服务器实现指南

在Qt中实现多线程TCP服务器可以通过为每个客户端连接分配独立的线程来处理&#xff0c;以提高并发性能。以下是一个分步实现的示例&#xff1a; 1. 自定义工作线程类&#xff08;处理客户端通信&#xff09; // workerthread.h #include <QObject> #include <QTcpSo…...

【经管数据】A股上市公司资产定价效率数据(2000-2023年)

数据简介&#xff1a;资产定价效率是衡量市场是否能够有效、准确地反映资产内在价值的重要指标。在理想的市场条件下&#xff0c;资产的市场价格应该与其内在价值保持一致&#xff0c;即市场定价效率达到最高。然而&#xff0c;在实际市场中&#xff0c;由于信息不对称、交易摩…...

打包 Python 项目为 Windows 可执行文件:高效部署指南

Hypackpy 是一款由白月黑羽开发的 Python 项目打包工具&#xff0c;它与 PyInstaller 等传统工具不同&#xff0c;通过直接打包解释器环境和项目代码&#xff0c;并允许开发者修改配置文件以排除不需要的内容&#xff0c;从而创建方便用户一键运行的可执行程序。以下是使用 Hyp…...

【QNX+Android虚拟化方案】138 - USB 底层传输原理

【QNX+Android虚拟化方案】138 - USB 底层传输原理 1. USB 数据包的格式2. 数据传输事务过程3. 四种传输类型3.1 批量传输3.2 中断传输3.3 实时传输3.4 控制传输4. USB 设备枚举过程4.1 Attached: 发送控制传输,读取设备描述符4.2 Power -> Default 这个状态无数据传输4.3 …...

QT6 源(66)篇三:阅读与注释类 QAbstractSpinBox ,这是螺旋框的基类,附上源码

&#xff08;9&#xff09;所有代码来自于头文件 qabstractspinbox . h : #ifndef QABSTRACTSPINBOX_H #define QABSTRACTSPINBOX_H#include <QtWidgets/qtwidgetsglobal.h> #include <QtWidgets/qwidget.h> #include <QtGui/qvalidator.h>/* QT_CONFIG宏实…...

MCP入门

什么是mcp mcp&#xff08;model context protocol&#xff0c;模型上下文协议&#xff09; 标准化协议&#xff1a;让大模型用统一的方式来调用工具&#xff0c;是llm和工具之间的桥梁 A2A&#xff1a;Agent-to-Agent协议 mcp通信机制 提供mcp服务查询的平台 具有工具合集…...

FPGA中级项目8———UART-RAM-TFT

FPGA中级项目8———UART-RAM-TFT UART串口我们学过&#xff0c;RAM IP核学过&#xff0c;TFT同样也学过。那如何将它们联合起来呢&#xff1f; 言简意赅&#xff1a;实现从串口写入图像到RAM并且由TFT显示屏输出&#xff01; 首先第一步&#xff0c;便是要将UART_RX与RAM之间…...

Ocelot\Consul\.NetCore的微服务应用案例

案例资料链接&#xff1a;https://download.csdn.net/download/ly1h1/90733765 1.效果 实现两个微服务ServerAPI1和ServerAPI2的负载均衡以及高可用。具体原理&#xff0c;看以下示意图。 2.部署条件 1、腾讯云的轻量化服务器 2、WindowServer2016 3、.NETCore7.0 4、Negut …...

数值求解Eikonal方程的方法及开源实现

Eikonal方程是一类非线性偏微分方程&#xff0c;形式为 ( |\nabla u(x)| f(x) )&#xff0c;常见于波传播、几何光学、最短路径等问题。以下是数值求解Eikonal方程的方法及开源实现参考&#xff1a; 一、数值求解方法 有限差分法&#xff08;FDM&#xff09; 快速行进法&#…...

Http详解

&#x1f9f1; 一、从 TCP 三次握手到访问网页&#xff1a;两层过程 &#x1f9e9; 1. TCP 三次握手&#xff08;网络传输层&#xff09; 这是 建立连接 的前提&#xff0c;跟 HTTP 无关&#xff0c;但 HTTP 要依赖它。 举例&#xff1a;你打开浏览器访问 https://example.c…...

实验五 完整性

一、引言 本次上机实验的目的主要是让学生掌握数据库完整性的三大类型&#xff08;实体完整性、参照完整性、用户自定义完整性&#xff09;&#xff0c;并通过实际建库建表和数据操作加深理解。 下面将为分别展示 student、course、sc 三个表的创建语句&#xff0c;并设置对应的…...

《原码、反码与补码:计算机中的数字奥秘》

&#x1f680;个人主页&#xff1a;BabyZZの秘密日记 &#x1f4d6;收入专栏&#xff1a;C语言 &#x1f30d;文章目入 一、原码&#xff1a;最直观的表示法1. 正数的原码2. 负数的原码3. 原码的特点 二、反码&#xff1a;原码的“反转”1. 正数的反码2. 负数的反码3. 反码的特…...

论文笔记——QWen2.5 VL

目录 引言架构创新数据整理与训练策略性能与基准测试精细感知能力应用与现实世界影响与现有模型比较结论 引言 视觉理解和自然语言处理的集成一直是人工智能研究的一个重要焦点&#xff0c;促成了日益复杂的视觉语言模型 (VLMs) 的发展。由阿里巴巴集团 Qwen 团队开发的 Qwe…...

前端HTML基础知识

1.HTML介绍 HTML(HyperText Markup Language&#xff0c;超文本标记语言)是构成网页的基本元素&#xff0c;是一种用于创建网页的标准化标记语言。HTML不是一种编程语言&#xff0c;而是一种标记语言&#xff0c;通过标签来描述网页的结构和内容。 超文本&#xff1a;超文本是…...

程序代码篇---ESP32云开发

文章目录 前言 前言 本文简单介绍了实现 ESP32-S3 传感器数据上传至云平台 手机远程控制电机 的完整方案&#xff0c;涵盖推荐的云平台、手机端。 一、推荐云平台及工具 云平台选择 阿里云 IoT 平台 优势&#xff1a;国内稳定、支持大规模设备接入、提供完整设备管理及安全…...

【C语言】文本操作函数fseek、ftell、rewind

一、fseek int fseek ( FILE * stream, long int offset, int origin ); 重新定位文件指针的位置&#xff0c;使其指向以origin为基准、偏移offset字节的位置。 成功返回0&#xff0c;失败返回非零值&#xff08;通常为-1&#xff09;。 origin有如下三种&#xff1a;分别是…...

ARM ASM

ARM ASM ARM寄存器集 列出了ARM的16个程序员可见寄存器&#xff08;r0~r15&#xff09;以及它的状态寄存器。 ARM共有14个通用寄存器r0~r13。寄存器r13被保留用作栈指针&#xff0c;r14存放子程 序返回地址&#xff0c;r15为程序计数器。 由于r15能够被程序员访问&#xff0c…...

【五一培训】Day1

注&#xff1a; 1. 本次培训内容的记录将以“Topic”的方式来呈现&#xff0c;用于记录个人对知识点的理解。 2. 由于培训期间&#xff0c;作者受限于一些现实条件&#xff0c;本文的排版及图片等相关优化&#xff0c;需要过一段时间才能完成。 Topic 1&#xff1a;使用DeepS…...

SpringBoot使用分组校验解决同一个实体对象在不同场景下需要不同校验规则的问题

背景 添加分类的接口不需要id字段&#xff0c;但更新分类的接口需要id字段&#xff0c;当在id字段上使用NotNull注解时&#xff0c;会导致使用添加分类接口报id字段不能为空的错误 解决 定义分组 pojo/Category.java // 如果没有指定分组&#xff0c;则默认属于Default分组…...

Hibernate与MybatisPlus的混用问题(Invalid bound statement (not found))

当项目里已经有了Hibernate后&#xff1a; spring:jpa:hibernate:ddl-auto: updateshow-sql: trueproperties:hibernate:format_sql: true 再配置yml文件就会失效&#xff1a; mybatis-plus:mapper-locations: classpath:mapper/*.xml# 全局策略global-config:db-config:# 自…...

【音视频】ffplay数据结构分析

struct VideoState 播放器封装 typedef struct VideoState {SDL_Thread *read_tid; // 读线程句柄AVInputFormat *iformat; // 指向demuxerint abort_request; // 1时请求退出播放int force_refresh; // 1时需要刷新画⾯&#xff0c;请求⽴即刷新画⾯的意思int paused; // 1时…...

PV操作:宣帧闯江湖武林客栈版学习笔记【操作系统】

P,V,S江湖话翻译 P&#xff08;申请&#xff09; 江湖侠客拔剑大喊“掌柜的&#xff0c;给我一间上房&#xff01;”&#xff08;申请资源&#xff0c;房不够就蹲门口等&#xff09;-要房令牌 V&#xff08;释放&#xff09; 江湖侠客退房时甩出一锭银子&#xff0c;大喊“…...

精品推荐-湖仓一体电商数据分析平台实践教程合集(视频教程+设计文档+完整项目代码)

精品推荐&#xff0c;湖仓一体电商数据分析平台实践教程合集&#xff0c;包含视频教程、设计文档及完整项目代码等资料&#xff0c;供大家学习。 1、项目背景介绍及项目架构 2、项目使用技术版本及组件搭建 3、项目数据种类与采集 4、实时业务统计指标分析一——ODS分层设计与…...

对计网考研中的信道、传输时延、传播时延的理解

对计网考研中的信道、传输时延、传播时延的理解 在学习数据链路层流量控制和可靠传输那一节的三个协议的最大信道利用率时产生的疑惑 情景&#xff1a; 假如A主机和B主机通过集线器连接&#xff0c;A和集线器是光纤连接&#xff0c;B和集线器也是光纤连接&#xff0c;A给B发…...

RAGFlow报错:ESConnection.sql got exception

环境&#xff1a; Ragflowv0.17.2 问题描述&#xff1a; RAGFlow报错&#xff1a;ESConnection.sql got exception _ming_cheng_tks, 浙江, operatorOR;minimum_should_match30%) 2025-04-25 15:55:06,862 INFO 244867 POST http://localhost:1200/_sql?formatjson […...

报错:函数或变量 ‘calcmie‘ 无法识别。

1、具体报错 运行网上一个开源代码&#xff0c;但是运行报如下错&#xff1a; TT_para_gen 函数或变量 calcmie 无法识别。 出错 TT_para_gen>Mie (第 46 行) [S, C, ang,~] calcmie(rad, ns, nm, lambda, nang, ... 出错 TT_para_gen (第 17 行) [~,ang,Miee,C] …...

蓝桥杯获奖后心得体会

文章目录 获奖项备考心得&#x1f4d6; 蓝桥杯 Java 研究生组备考心得&#x1f4cc; 一、备考规划&#x1f4cc; 二、考试技巧&#x1f4cc; 三、心理调整&#x1f4cc; 四、总结 获奖项 JAVA研究生组省二 备考心得 好&#xff01;我来给你写一篇蓝桥杯研究生组Java方向的备…...

大鱼吃小鱼开源

因为知道一些学校也有相关C语言课设 所以这里对代码开源&#xff08;如果没有csdn会员请用夸克&#xff09; 我用夸克网盘分享了「大鱼吃小鱼-程序.zip」&#xff0c;点击链接即可保存。打开「夸克APP」&#xff0c;无需下载在线播放视频&#xff0c;畅享原画5倍速&#xff0…...

深度学习框架搭建(Vscode/Anaconda/CUDA/Pytroch)

目录 ​​​​​​一 Vscode安装 二、Anaconda安装 三、更新显卡驱动 四、安装CUDA 五、安装Pytorch 六、Vscode配置 七、出现的问题汇总 ​​​​​​一 Vscode安装 在 Windows 上安装 访问 VS Code 官网 https://code.visualstudio.com/&#xff0c;点击 "Downl…...

免费实用的图像处理工具箱​

提到图像处理&#xff0c;一般会想到Photoshop。的确PS比较专业&#xff0c;但是学习成本比较高。其实&#xff0c;针对具体的应用场景&#xff0c;选些简单的工具软件会更方便。 今天就给大家分享一款“洋芋田图像工具箱”软件。它支持Windows和Mac电脑。 用这款软件&#x…...

范式演进:从ETL到ELT及未来展望

范式演进:从ETL到ELT及未来展望 引言 随着数据规模与实时分析需求的爆发,传统的集中式 ETL(Extract-Transform-Load)已难以为继,ELT(Extract-Load-Transform)凭借云原生仓库的弹性计算与分析工程的兴起逐步成为主流。2025 年,数据团队正加速从“先变换再加载”走向“…...

定义一个3D cube,并计算cube每个顶点的像素坐标

定义一个3D cube,并计算cube每个顶点的像素坐标 scratch a pixel课程&#xff1a;Your Starting Point! 3D场景中物体所有点与坐标系原点的连线&#xff0c;该连线与像素平面canvas的交点就是场景中3D点其投影点的位置 3D场景中的点均由这个坐标系描述 相似三角形ABC和A’B’…...

Python学习笔记(第二部分)

接续 Python.md 文件的第二部分 字典 字典的基本操作 字典是一系列 键—值 对&#xff0c;每一个键都与一个值关联&#xff0c;值可以是数字&#xff0c;字符串&#xff0c;甚至是列表或字典&#xff0c;可以把任何python对象都作为字典中的值 alien {color:green,points:5}键…...

ZYNQB笔记(十六):AXI DMA 环路测试

版本&#xff1a;Vivado2020.2&#xff08;Vitis&#xff09; 任务&#xff1a;使用 PL 端的 AXI DMA IP 核实现对 DDR3 中数据的读取与写入&#xff0c;实现数据环回&#xff0c;具体流程为&#xff1a; PS 端产生测试数据并写入到 DDR3 中&#xff0c;然后 PL 端的 AXI DMA I…...

Java学习手册:Spring 数据访问

一、Spring JDBC JdbcTemplate &#xff1a;Spring JDBC 提供了 JdbcTemplate 类&#xff0c;它简化了数据库操作&#xff0c;提供了丰富的 API 来执行数据库访问任务。JdbcTemplate 可以自动处理数据库连接的获取、释放&#xff0c;SQL 语句的执行&#xff0c;结果集的处理等…...

第二章 日志分析-apache日志分析(玄机系列)

简介 账号密码 root apacherizhi ssh rootIP 1、提交当天访问次数最多的IP&#xff0c;即黑客IP&#xff1a; 2、黑客使用的浏览器指纹是什么&#xff0c;提交指纹的md5&#xff1a; 3、查看包含index.php页面被访问的次数&#xff0c;提交次数&#xff1a; 4、查看黑客IP访问了…...

类比分析AI Agent 技术

引言&#xff1a;AI Agent 的本质与范式转变 在人工智能领域&#xff0c;AI Agent&#xff08;智能体&#xff09;代表了一种从传统软件系统到自主性实体的深刻范式转变。不同于仅仅执行预设指令或算法的程序&#xff0c;现代 AI Agent 被设计为能够&#xff1a; 感知 (Perce…...

【业务领域】PCIE协议理解

PCIE协议理解 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 PCIE学习理解。 文章目录 PCIE协议理解[TOC](文章目录) 前言零、PCIE掌握点&#xff1f;一、PCIE是什么&#xff1f;二、PCIE协议总结物理层切速 链路层事务层6.2 TLP的路…...

设计模式简述(十四)组合模式

组合模式 描述基本使用所有节点方法一致使用 叶子无实现子节点使用 添加向上查询使用&#xff08;没变化&#xff09; 描述 组合模式用于描述部分与整体的关系&#xff0c;将个体对象与组合对象的行为统一&#xff0c;便于维护整个数据集。 基本使用 所有节点方法一致 定义…...

【Tool】vscode

vscode问题集锦 1 全局搜索失效 ctrl shift f 快捷键失效&#xff1a; 原因&#xff1a;可能与输入法快捷键冲突&#xff0c;重定义输入法快捷键即可 其他 看心情和经历补充&#xff5e;...

文件操作--文件包含漏洞

本文主要内容 脚本 ASP、PHP、JSP、ASPX、Python、Javaweb --# 各种包含函数 检测 白盒 代码审计 黑盒 漏扫工具、公开漏洞、手工看参数值及功能点 类型 本地包含 有限制、无限制 远程包含 无限制、有限制…...

数字智慧方案6156丨智慧医联体信息化解决方案(50页PPT)(文末有下载方式)

资料解读&#xff1a;智慧医联体信息化解决方案 详细资料请看本解读文章的最后内容。 在医疗改革不断深化的大背景下&#xff0c;医联体信息化建设成为推动医疗服务高质量发展的关键力量。《智慧医联体信息化解决方案》这份资料&#xff0c;全面且深入地阐述了医联体信息化建…...