Sentinel限流熔断机制实战
1、核心概念
1.1、流量控制
流量控制是为了 防止系统被过多的请求压垮,确保资源合理分配并保持服务的可用性,比如对请求数量的限制。
流量控制的 3 个主要优势:
- 防止过载:当瞬间涌入的请求量超出系统处理能力时,会导致资源枯竭,如 CPU和内存耗尽。流量控制通过限制系统能处理的请求数,确保不会发生过载。
- 避免雪崩效应:高负载下某个服务崩溃可能引发其他依赖服务的崩溃,形成连锁反应。流量控制可以有效预防这种连锁故障,避免系统雪崩。
- 优化用户体验:即便部分请求被拒绝或延迟处理,流量控制也能确保大部分用户的请求能够正常响应,避免全局响应时间过长的情况。
常见的实现流量控制方法有 2 种:
- 限流:通过固定窗口、令牌桶或漏桶等算法限制单位时间内的请求数量。
- 排队:当请求量超出处理能力时,部分请求进入等待队列,防止立即超载。
1.2、熔断机制
熔断机制的目的是 避免当下游服务发生异常时,整个系统继续耗费资源重复发起失败请求,从而防止连锁故障。
工作机制:
- 监控服务健康状态:系统会实时监控服务的调用情况,例如请求成功率、响应时间等,判断服务的健康状况。
- 进入熔断状态:当某个服务的错误率达到设定阈值(如响应时间过长或出错率过高)时,系统会激活熔断器,暂时停止对该服务的调用,避免消耗不必要的资源和让错误进一步扩散。
- 快速失败:在熔断状态下,系统不会再等待超时,而是直接返回失败响应,减少系统资源占用,并避免因长时间等待导致用户体验的恶化。(也可以降级处理)
- 熔断恢复机制:熔断并非永久状态。在一段时间后,熔断器会进入半开状态,允许少量请求测试服务的健康情况。如果恢复正常,熔断器将关闭,恢复正常服务调用;如果仍有问题,则继续保持熔断。
1.3、降级策略
降级的目的是在某个服务的响应能力下降、或该服务不可用时,提供简化版的功能或返回默认值作为 兜底,保持系统的部分功能可用,确保用户体验的连续性,避免系统频繁报错。
降级可以是手动配置,也可以根据系统负载自动触发。系统可能由于多种原因(如高负载、外部依赖不可用等)触发降级,返回简化的响应或默认值。
降级机制的好处:
- 优雅地处理故障:在降级状态下,系统不会直接返回错误信息,而是提供一个替代方案。例如,某个数据查询服务不可用时,系统可以返回缓存数据,确保用户看到的是有效信息,而非错误页面。
- 降低服务压力:降级有助于减轻系统对非核心服务的依赖,确保核心功能的稳定运行。例如,当推荐系统或广告服务出现故障时,降级可以减少对这些服务的调用,保护系统的整体稳定性。
1.4、熔断和降级的区别
具体来说:
- 熔断是当服务健康状况恶化时,通过 切断调用 避免系统资源浪费或服务间故障扩散。
- 降级是在系统压力过大或某个服务不可用时,通过提供简化的替代方案 ,保持系统的可用性和用户体验。
2、需求分析
2.1、对单个接口整体限流
目的:控制对耗时较长的、经常访问的接口的请求频率,防止过多请求导致系过载
限流规则:
- 策略:整个接口每秒钟不超过 10 次请求
- 阻塞操作:提示“系统压力过大,请耐心等待”
熔断规则:
- 熔断条件:如果接口异常率超过 10%,或者慢调用(响应时长 > 3 秒)的比例大于 20%,触发 60 秒熔断。
- 熔断操作:直接返回本地数据(缓存或空数据)
2.2、对单个 IP 访问单个接口限流
限流规则:
- 策略:每个 IP 地址每分钟允许查看题目列表的次数不能超过 60 次。
- 阻塞操作:提示“访问过于频繁,请稍后再试”
熔断规则:
- 熔断条件:如果接口异常率超过 10%,或者慢调用(响应时长 > 3 秒)的比例大于 20%,触发 60 秒熔断。
- 熔断操作:直接返回本地数据(缓存或空数据)
3、Sentinel 介绍
Sentinel是阿里巴巴开源的限流、熔断、降级组件,旨在为分布式系统提供可靠的保护机制。它设计用于解决高并发流量下的稳定性问题,并且支持与 Dubbo、Spring Cloud 等多种框架集成。
详细内容可查看 -> 官方文档
它的功能:
- 限流:支持基于 QPS、并发数量等条件的限流,支持滑动窗口、预热、漏桶等算法。
- 熔断降级:支持失败率、慢调用比例等指标触发熔断,并提供自动恢复机制。
- 热点参数限流:可以基于特定的参数进行限流,如限制特定用户 ID 的请求频率。
- 系统负载保护:可以根据系统的实际负载(如 CPU、内存)动态调整流量。
- 丰富的规则配置:通过配置中心或控制台动态调整限流和熔断规则。
优势:功能丰富、提供控制台、更新较频繁、社区活跃、文档清晰,能够快速入门上手。
3.1、使用方式
使用 Sentinel 来进行资源保护,主要分为几个步骤:
- 定义资源
- 定义规则
- 检验规则是否生效
3.2、架构设计
在 Sentinel 里面,所有的资源都对应一个资源名称以及一个 Entry。Entry 可以通过对主流框架的适配自动创建,也可以通过注解的方式或调用 API 显式创建;每一个 Entry 创建的时候,同时也会创建一系列功能插槽(slot chain)。这些插槽有不同的职责,例如:
3.2.1、NodeSelectorSlot
NodeSelectorSlot 的本质作用:Sentinel 是通过一条一条资源“链路”来判断是否限流/降级的,而 它 就是用来维护这些资源链路的结构树。
具体干这几件事:
1、把资源“挂”到调用上下文树上
比如你访问 nodeA,它就会:
- 看你当前上下文是哪个入口(entrance1)
- 在 entrance1 节点下面查:有没有挂过 nodeA
- 没有就新建一个 DefaultNode(nodeA),挂上去!
2、同一个资源,但不同入口,树结构是独立的!
ContextUtil.enter("entrance1", "appA");
SphU.entry("nodeA"); // 第一次
ContextUtil.exit();ContextUtil.enter("entrance2", "appA");
SphU.entry("nodeA"); // 第二次
ContextUtil.exit();
这相当于你从 两个不同入口玩了同一个关卡,Sentinel 会建立两条路径记录:
machine-root├── EntranceNode(entrance1)│ └── DefaultNode(nodeA)└── EntranceNode(entrance2)└── DefaultNode(nodeA)
为什么这么设计?
因为在真实业务中:
- 你可能有多个入口(比如首页、搜索页都能访问同一个资源)
- 你想控制每条链路的 QPS(比如“从搜索页过来的 QPS 限制更严格”)
所以 Sentinel 就必须要分得清:
“你是从哪儿来的,然后才访问的这个资源”
3.2.2、ClusterBuilderSlot
ClusterBuilderSlot 则用于存储资源的统计信息以及调用者信息,例如该资源的 RT, QPS, thread count 等等,这些信息将用作为多维度限流,降级的依据;
ClusterBuilderSlot 的作用
1、调用方级别限流!
- 比如限制 “微信小程序” 每秒最多访问 100 次,其他 origin 不受影响。
2、监控更细粒度!
- 哪个来源调用最多?
- 哪个来源的调用最慢、最容易出错?
比如:是不是 Web 前端的调用出异常多,是不是他们传参老有问题?
配合热点参数限流、来源限流做更精细的控制。
3.3.3、StatisticSlot
StatisticSlot 是 Sentinel 的核心功能插槽之一,用于统计实时的调用数据。
- clusterNode:资源唯一标识的 ClusterNode 的 runtime 统计
- origin:根据来自不同调用者的统计信息
- defaultnode: 根据上下文条目名称和资源 ID 的 runtime 统计入口的统计
Sentinel 底层采用高性能的滑动窗口数据结构 LeapArray 来统计实时的秒级指标数据,可以很好地支撑写多于读的高并发场景。
3.3.4、LeapArray底层原理
LeapArray 底层是一个固定长度的环形数组,每个元素是一个带有时间戳的窗口格子 WindowWrap。
它支持在高并发场景下以时间为索引安全读写,保证统计的是“最近一段时间”的窗口数据,用于 Sentinel 的实时监控与限流、降级判断。
结构总览:
public class LeapArray<T> {protected final int sampleCount; // 窗口格子数,比如10protected final int intervalInMs; // 窗口总时长,比如1000ms(1s)private final WindowWrap<T>[] array; // 固定长度数组,环形复用
}
每个窗口格子是这样一个类:
public class WindowWrap<T> {private final long windowStart; // 窗口开始时间private final long windowLength; // 每个格子的长度(interval / sampleCount)private final T value; // 存放统计信息的对象,比如 MetricBucket
}
它是怎么定位时间属于哪个窗口的?
比如:
总窗口时间是 1000ms,格子数是 10
每个格子负责 100ms
现在时间是 10:00:01.450(即 1450ms)
① 算出这个时间属于哪个格子:
int idx = (timestamp / windowLength) % sampleCount;
// 1450 / 100 = 14 -> 14 % 10 = 4,落在索引为4的格子
② 再判断这个格子的起始时间是不是还有效:
//当前时间戳 ➜ 除以窗口长度 ➜ 计算出当前时间该落在哪个格子 ➜ 比较该格子的起始时间
//➜ 如果不同 ➜ 就滑窗、清理、重建!
window.windowStart == timestamp - (timestamp % windowLength)
如果有效:直接返回当前格子
如果无效(已经过期了):用 CAS 创建一个新的 WindowWrap(复用原来的槽位)
3.3.4.1、它是怎么滑动更新的?
核心点:每次请求到来时,才会“懒更新”窗口格子
流程如下:
1、当前时间戳算出对应窗口索引(如上)
2、取出格子对象,检查是否是当前时间的窗口
- 是:直接用
- 否:CAS 替换为新窗口 + 清空旧统计值(滑动来了)
3、更新格子里的统计数据
它并不需要定时器或后台线程维护窗口,而是靠访问触发滑动,非常节省资源。
3.3.4.2、并发怎么处理?
多线程访问时可能并发写同一个窗口:
- 用的是 AtomicReferenceArray + Compare-And-Swap (CAS)
- 每个格子内部统计信息用 LongAdder 等并发友好结构
3.3.4.3、总结:
LeapArray 是一个时间轮+懒更新+CAS构建的滑动窗口数组,专为高并发下限流降级而生。
3.3.5、FlowSlot
这个 slot 主要根据预设的资源的统计信息,按照固定的次序,依次生效。如果一个资源对应两条或者多条流控规则,则会根据如下次序依次检验,直到全部通过或者有一个规则生效为止:
- 指定应用生效的规则,即针对调用方限流的;
- 调用方为 other 的规则;
- 调用方为 default 的规则。
3.3.6、DegradeSlot
这个 slot 主要针对资源的平均响应时间(RT)以及异常比率,来决定资源是否在接下来的时间被自动熔断掉。
4、代码实战
4.1、查看题库列表接口限流熔断
/*** 分页获取题库列表(封装类)** @param questionBankQueryRequest* @param request* @return*/@PostMapping("/list/page/vo")@SentinelResource(value = "listQuestionBankVOByPage",blockHandler = "handleBlockException",fallback = "handleFallback")public BaseResponse<Page<QuestionBankVO>> listQuestionBankVOByPage(@RequestBody QuestionBankQueryRequest questionBankQueryRequest,HttpServletRequest request) {long current = questionBankQueryRequest.getCurrent();long size = questionBankQueryRequest.getPageSize();// 限制爬虫ThrowUtils.throwIf(size > 200, ErrorCode.PARAMS_ERROR);// 查询数据库Page<QuestionBank> questionBankPage = questionBankService.page(new Page<>(current, size),questionBankService.getQueryWrapper(questionBankQueryRequest));// 获取封装类return ResultUtils.success(questionBankService.getQuestionBankVOPage(questionBankPage, request));}
熔断降级操作,处理 异常 / 熔断场景下的兜底逻辑,避免用户看到系统崩溃。
/*** listQuestionBankVOByPage 降级操作:直接返回本地数据*/public BaseResponse<Page<QuestionBankVO>> handleFallback(@RequestBody QuestionBankQueryRequest questionBankQueryRequest,HttpServletRequest request, Throwable ex) {// 可以返回本地数据或空数据return ResultUtils.success(null);}
限流操作
/*** listQuestionBankVOByPage 流控操作* 限流:提示“系统压力过大,请耐心等待”* 熔断:执行降级操作*/public BaseResponse<Page<QuestionBankVO>> handleBlockException(@RequestBody QuestionBankQueryRequest questionBankQueryRequest,HttpServletRequest request, BlockException ex) {// 降级操作if (ex instanceof DegradeException) {return handleFallback(questionBankQueryRequest, request, ex);}// 限流操作return ResultUtils.error(ErrorCode.SYSTEM_ERROR, "系统压力过大,请耐心等待");}
小Tips💡:为什么需要专门写降级操作判断?
// 降级操作if (ex instanceof DegradeException) {return handleFallback(questionBankQueryRequest, request, ex);}
Sentinel 中“熔断触发”其实本质上也是一种“被限流”行为,会先走 blockHandler,而不是直接走 fallback。
具体来说
情况 | 触发逻辑 | 进入哪个方法? |
---|---|---|
QPS 超限 | Sentinel 流控规则 | blockHandler() |
异常率 > 50% 熔断开启 | Sentinel 熔断规则 | 也进入 blockHandler() ! |
方法内空指针等异常 | Java 抛异常 | fallback() |
这时候你在 blockHandler() 里接收到的是 BlockException,它可能是:
- FlowException(QPS 控制)
- DegradeException(熔断控制)
- ParamFlowException(热点参数)
- AuthorityException(授权规则)
- SystemBlockException(系统保护)
你得根据 ex instanceof DegradeException
去区分熔断的 case。
总结: 虽然 Sentinel 有 fallback 专门处理 异常 / 熔断,但 在触发熔断时默认走的是 blockHandler,你必须自己判断 ex 类型来决定要不要转交给 fallback 处理。也可以理解为:只有业务异常(比如请求参数错误、或者数据库操作失败等问题),才会算到熔断条件中,限流熔断本身的异常 BlockException 是不计算的
4.2、单 IP 查看题目列表限流熔断
对于这个需求,需要对每个用户进一步精细化限流,而不是整体接口限流,可以采用 热点参数限流机制,允许根据参数控制限流触发条件,例如:将 IP 地址作为热点参数。
代码如下:
/*** 分页获取题目列表(封装类) - 限流版** @param questionQueryRequest* @param request* @return*/@PostMapping("/list/page/vo/sentinel")public BaseResponse<Page<QuestionVO>> listQuestionVOByPageSentinel(@RequestBody QuestionQueryRequest questionQueryRequest,HttpServletRequest request) {long current = questionQueryRequest.getCurrent();long size = questionQueryRequest.getPageSize();// 限制爬虫ThrowUtils.throwIf(size > 20, ErrorCode.PARAMS_ERROR);// 基于 IP 限流String remoteAddr = request.getRemoteAddr();Entry entry = null;try {entry = SphU.entry("listQuestionVOByPage", EntryType.IN, 1, remoteAddr);// 被保护的业务逻辑// 查询数据库Page<Question> questionPage = questionService.listQuestionByPage(questionQueryRequest);// 获取封装类return ResultUtils.success(questionService.getQuestionVOPage(questionPage, request));} catch (Throwable t) {// 自定义业务异常if (!BlockException.isBlockException(t)) {Tracer.trace(t);return ResultUtils.error(ErrorCode.SYSTEM_ERROR, "系统异常");}// 资源访问阻止,被限流或被降级if (t instanceof DegradeException) {return handleFallback(questionQueryRequest, request, t);}// 限流操作return ResultUtils.error(ErrorCode.SYSTEM_ERROR, "访问过于频繁,请稍后再试");} finally {if (entry != null) {entry.exit(1, remoteAddr);}}}/*** listQuestionVOByPageSentinel 降级操作:直接返回本地数据*/public BaseResponse<Page<QuestionVO>> handleFallback(@RequestBody QuestionQueryRequest questionQueryRequest,HttpServletRequest request, Throwable ex) {// 可以返回本地数据或空数据return ResultUtils.success(null);}
String remoteAddr = request.getRemoteAddr()
参数 remoteAddr 的作用是获取用户 IP,作为限流参数维度,防止一个 IP 乱刷。
entry = SphU.entry("listQuestionVOByPage", EntryType.IN, 1, remoteAddr)
作用是将 listQuestionVOByPage 作为资源注册到 Sentinel 的上下文中,开始对该资源进行限流、熔断、热点参数等规则的监控与统计。
异常处理判断逻辑:
情况 | 处理方式 |
---|---|
不是 Sentinel 异常(业务异常、系统异常) | 打点上报(Tracer.trace(t) ),提示“系统异常” |
是 Sentinel 熔断异常(DegradeException ) | 走自定义的降级处理逻辑:handleFallback |
是 Sentinel 限流异常(FlowException 等) | 返回:“访问过于频繁,请稍后再试” |
重点💡
1、若 entry 的时候传入了热点参数,那么 exit 的时候也一定要带上对应的参数(exit(count, args)),否则可能会有统计错误。
2、SphU.entry(xxx) 需要与 entry.exit() 方法成对出现,匹配调用,否则会导致调用链记录异常,抛出 ErrorEntryFreeException 异常。
3、注意 Sentinel 的降级仅针对业务异常,对 Sentinel 限流降级本身的异常 BlockException 不生效。为了统计异常比例或异常数,需要手动通过 Tracer.trace(ex) 记录业务异常。
4.3、定义规则
新建 sentinel 包并定义一个单独的 Manager 作为 Bean,利用 @PostConstruct 注解,在 Bean 加载后创建规则。
@Component
public class SentinelRulesManager {@PostConstructpublic void initRules() throws Exception {initFlowRules();initDegradeRules();}// 限流规则public void initFlowRules() {// 单 IP 查看题目列表限流规则ParamFlowRule rule = new ParamFlowRule("listQuestionVOByPage").setParamIdx(0) // 对第 0 个参数限流,即 IP 地址.setCount(60) // 每分钟最多 60 次.setDurationInSec(60); // 规则的统计周期为 60 秒ParamFlowRuleManager.loadRules(Collections.singletonList(rule));}// 降级规则public void initDegradeRules() {// 单 IP 查看题目列表熔断规则DegradeRule slowCallRule = new DegradeRule("listQuestionVOByPage").setGrade(CircuitBreakerStrategy.SLOW_REQUEST_RATIO.getType()).setCount(0.2) // 慢调用比例大于 20%.setTimeWindow(60) // 熔断持续时间 60 秒.setStatIntervalMs(30 * 1000) // 统计时长 30 秒.setMinRequestAmount(10) // 最小请求数.setSlowRatioThreshold(3); // 响应时间超过 3 秒DegradeRule errorRateRule = new DegradeRule("listQuestionVOByPage").setGrade(CircuitBreakerStrategy.ERROR_RATIO.getType()).setCount(0.1) // 异常率大于 10%.setTimeWindow(60) // 熔断持续时间 60 秒.setStatIntervalMs(30 * 1000) // 统计时长 30 秒.setMinRequestAmount(10); // 最小请求数// 加载规则DegradeRuleManager.loadRules(Arrays.asList(slowCallRule, errorRateRule));}
}
本地化配置,让 Sentinel 的限流和降级规则支持本地文件持久化(可读可写)
/*** 持久化配置为本地文件*/
public void listenRules() throws Exception {//获取项目根目录并创建 sentinel/ 文件夹String rootPath = System.getProperty("user.dir");File sentinelDir = new File(rootPath, "sentinel");if (!FileUtil.exist(sentinelDir)) {FileUtil.mkdir(sentinelDir);}// 设置规则文件路径String flowRulePath = new File(sentinelDir, "FlowRule.json").getAbsolutePath();String degradeRulePath = new File(sentinelDir, "DegradeRule.json").getAbsolutePath();// 初始化 限流规则读取器(拉模式)ReadableDataSource<String, List<FlowRule>> flowRuleDataSource = new FileRefreshableDataSource<>(flowRulePath, flowRuleListParser);FlowRuleManager.register2Property(flowRuleDataSource.getProperty());//注册 限流规则写入器WritableDataSource<List<FlowRule>> flowWds = new FileWritableDataSource<>(flowRulePath, this::encodeJson);WritableDataSourceRegistry.registerFlowDataSource(flowWds);// 降级规则读取器FileRefreshableDataSource<List<DegradeRule>> degradeRuleDataSource= new FileRefreshableDataSource<>(degradeRulePath, degradeRuleListParser);DegradeRuleManager.register2Property(degradeRuleDataSource.getProperty());WritableDataSource<List<DegradeRule>> degradeWds = new FileWritableDataSource<>(degradeRulePath, this::encodeJson);// Register to writable data source registry so that rules can be updated to fileWritableDataSourceRegistry.registerDegradeDataSource(degradeWds);
}//JSON字符串 -> 规则对象
private Converter<String, List<FlowRule>> flowRuleListParser = source -> JSON.parseObject(source,new TypeReference<List<FlowRule>>() {});
private Converter<String, List<DegradeRule>> degradeRuleListParser = source -> JSON.parseObject(source,new TypeReference<List<DegradeRule>>() {});// 规则对象 -> JSON字符串
private <T> String encodeJson(T t) {return JSON.toJSONString(t);
}
注意:在初始化时加入 listenRules()
方法
@PostConstructpublic void initRules() throws Exception {initFlowRules();initDegradeRules();listenRules();}
5、总结
Sentinel 的规则配置 + 接口中的限流/熔断操作 的联动协同
5.1、规则配置部分(限流 & 熔断)
①在内存中加载规则(程序启动时)
如对 listQuestionVOByPage 添加:
- 限流:每个 IP 每分钟访问不超 60 次
- 熔断:慢调用比例超 20%,触发熔断;异常率超 10%,也触发熔断
②文件持久化监听
调用 listenRules() 做两件事:监听本地文件变化,自动刷新配置
将规则写回文件(支持动态修改)
5.2、接口限流/熔断的具体操作(怎么用规则)
①注解方式(简洁明了)
具体来说:
应规则名就是 value 指定的 “listQuestionBankVOByPage”:
- 如果被限流了 ➜ 走 handleBlockException()
- 如果被熔断了 ➜ 也会走 handleBlockException(),但你可以判断异常类型 DegradeException
- 如果业务异常了(比如系统异常)➜ 走 handleFallback()
②编程方式(可扩展性强)
entry = SphU.entry("listQuestionVOByPage", EntryType.IN, 1, remoteAddr);
- 参数 remoteAddr 作为限流 key(这是为了实现 ParamFlowRule)
- try-catch 中写核心业务逻辑
- catch 中判断是否是限流/熔断异常:
对于 对单个接口整体限流 我们使用 @SentinelResource 注解方式 做限流操作,这时注解会监控所有参数。
对于 单个IP查看题目列表限流熔断 用 编程式 做限流操作,是因为我们只需要对 用户IP 这一个参数监控,不需要对传入的所有参数做监控。
相关文章:

Sentinel限流熔断机制实战
1、核心概念 1.1、流量控制 流量控制是为了 防止系统被过多的请求压垮,确保资源合理分配并保持服务的可用性,比如对请求数量的限制。 流量控制的 3 个主要优势: 防止过载:当瞬间涌入的请求量超出系统处理能力时,会…...
Java 数据处理 - 数值转不同进制的字符串(数值转十进制字符串、数值转二进制字符串、数值转八进制字符串、数值转十六进制字符串)
一、数值转十进制字符串 调用 String.valueOf() int num 123;String decStr String.valueOf(num);System.out.println(decStr);# 输出结果123调用 Integer.toString(),指定进制 int num 123;String decStr Integer.toString(num);System.out.println(decStr)…...

79. 单词搜索-极致优化,可行性剪枝和顺序剪枝
给你一个目标字符串,和一个二维字符数组,判断在数组中是否能找到目标字符串。 例如,board [["A","B","C","E"],["S","F","C","S"],["A","…...

ICDMC 2025:创新媒体模式,迎接数字时代的挑战
2025年数字媒体与通讯国际会议将在风景秀丽的中国山东举行。此次会议致力于促进数字媒体和通讯领域的国际合作与交流,为相关产业发展提供智力支持和技术引领。我们诚挚邀请来自世界各地的学者、研究人员和行业专家参加本次会议,共同探讨前沿问题和发展方…...
深入解析C#多态性:基类引用、虚方法与覆写机制
基类引用的本质 在C#面向对象编程中,派生类对象由基类部分和扩展部分组成。通过基类引用访问派生类对象时,实际是在进行「观察视角」的转换: MyDerivedClass derived new MyDerivedClass(); MyBaseClass mybc (MyBaseClass)derived; //…...

SoftThinking:让模型学会模糊思考,同时提升准确性和推理速度!!
摘要:人类的认知通常涉及通过抽象、灵活的概念进行思考,而不是严格依赖离散的语言符号。然而,当前的推理模型受到人类语言边界的限制,只能处理代表语义空间中固定点的离散符号嵌入。这种离散性限制了推理模型的表达能力和上限潜力…...
C++中 newdelete 与 mallocfree 的异同详解
C中 new/delete 与 malloc/free 的异同详解 在 C 开发中,动态内存管理是重中之重!new/delete 和 malloc/free 都是用来动态申请和释放内存的,但它们有本质的区别。今天我们就来彻底搞懂它们的区别,避免内存泄漏和 undefined beha…...

晨控CK-UR08与欧姆龙PLC配置Ethernet/IP通讯连接操作手册
晨控CK-UR08与欧姆龙PLC配置Ethernet/IP通讯连接操作手册 晨控CK-UR08系列作为晨控智能工业级别RFID读写器,支持大部分工业协议如RS232、RS485、以太网。支持工业协议Modbus RTU、Modbus TCP、Profinet、EtherNet/lP、EtherCat以及自由协议TCP/IP等。 本期主题:围绕…...
STM32入门教程——LED闪烁LED流水灯蜂鸣器
前言 本教材基于B站江协科技课程整理,适合有C语言基础、刚接触STM32的新手。它梳理了STM32核心知识点,帮助大家把C语言知识应用到STM32开发中,更高效地开启STM32学习之旅。 一、硬件电路搭建与工程配置 电路连接要点 LED 闪烁 / 流水灯&…...
鸿蒙OSUniApp 实现的数据可视化图表组件#三方框架 #Uniapp
UniApp 实现的数据可视化图表组件 前言 在移动互联网时代,数据可视化已成为产品展示和决策分析的重要手段。无论是运营后台、健康监测、还是电商分析,图表组件都能让数据一目了然。UniApp 作为一款优秀的跨平台开发框架,支持在鸿蒙…...
Tornado WebSocket实时聊天实例
在 Python 3 Tornado 中使用 WebSocket 非常直接。你需要创建一个继承自 tornado.websocket.WebSocketHandler 的类,并实现它的几个关键方法。 下面是一个简单的示例,演示了如何创建一个 WebSocket 服务器,该服务器会接收客户端发送的消息&a…...
HarmonyOS鸿蒙与React Native的融合开发模式以及能否增加对性能优化的具体案例
鸿蒙与React Native的融合开发模式 一、技术架构设计 底层适配层 通过HarmonyOS的NDK封装原生能力(如分布式软总线、AI引擎) 使用React Native的Native Modules桥接鸿蒙API(需重写Java/Objective-C部分为ArkTS) 组件映射机制 …...
化学分析原理。
化学分析关心的要素:a.空间结构(晶格结构、胶体结构、玻璃体结构、膜结构,宏观与微观两个层面,化学键与键角以及结构强度,结合能以及物质内聚力研究,主要目的是化学建模),b.成分与组…...

开源即战力!从科研到商用:Hello Robot 移动操作机器人Stretch 3多模态传感融合(RGB-D/激光/力矩)控制方案
科研领域对机器人技术的需求日益增长,Hello Robot的移动操作机器人Stretch 3凭借其灵活性和性能满足了这一需求。其模块化设计、开源架构和高精度传感控制能力,使科研人员能够顺利开展实验。Stretch 3以其独特的移动操作能力,为科研探索提供了…...

元胞自动机(Cellular Automata, CA)
一、什么是元胞自动机(Cellular Automata, CA) 元胞自动机(CA) 是一种基于离散时间、离散空间与规则驱动演化的动力系统,由 冯诺依曼(John von Neumann) 于1940年代首次提出,用于模…...

智能手表单元测试报告(Unit Test Report)
📄 智能手表单元测试报告(Unit Test Report) 项目名称:Aurora Watch S1 模块版本:Firmware v1.0.4 测试阶段:模块开发完成后的单元测试 报告编号:AW-S1-UTR-2025-001 测试负责人:赵磊(软件架构师) 报告日期:2025-xx-xx 一、测试目的 通过对智能手表关键功能模块进…...

微深节能 码头装卸船机定位与控制系统 格雷母线
微深节能码头装卸船机定位与控制系统:格雷母线技术赋能港口作业智能化升级 在现代化港口散货装卸作业中,装卸船机是连接船舶与陆域运输的核心枢纽设备。传统装卸船机依赖人工操作,存在定位偏差大、动态协同难、安全风险高等痛点。微深节能基于…...
基于matlab遗传算法和模拟退火算法求解三维装箱优化问题
一、遗传算法和模拟退火算法求解三维装箱优化问题 遗传算法(Genetic Algorithm)和模拟退火算法(Simulated Annealing Algorithm)都是优化算法,可以用来求解三维装箱优化问题。 遗传算法原理和流程: 1 原理…...
在Spring Boot中集成Redis进行缓存
在Spring Boot中集成Redis进行缓存,主要分为以下步骤: 1. 添加依赖 在pom.xml中添加Redis和缓存相关的依赖: <!-- Spring Boot Redis Starter --> <dependency><groupId>org.springframework.boot</groupId><ar…...

Python实现P-PSO优化算法优化循环神经网络LSTM分类模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 随着深度学习技术的迅猛发展,循环神经网络(RNN)及其变体LSTM(Long S…...
OSG编译wasm尝试
最近遇到一个情况,需要尝试一下OSG到webassembly 发现官网有教程 于是顺着看了看,默认教程是xubuntu的一个系统跑的,但是我本着试一试的想法,拉下来直接在windows上跑,奇奇怪怪的报错简直头皮发麻 然后怎么办呢&#x…...

Scratch节日 | 龙舟比赛 | 端午节
端午节快乐! 这款专为孩子们打造的Scratch游戏——《龙舟比赛》,让你在掌控龙舟的竞速中,沉浸式体验中华传统节日的魅力! 🎮 游戏亮点 节日氛围浓厚:化身龙舟选手,在波涛汹涌的河流中展开刺激竞…...
Ubuntu搭建DNS服务器
1.安装 BIND 软件包 sudo apt update sudo apt install bind9 bind9utils bind9-doc -y 2.配置主配置文件 编辑/etc/bind/named.conf.options,添加上游 DNS 服务器 options {directory "/var/cache/bind";// 添加Google DNS作为上游服务器forwarders {…...

electron开发百度桌面应用demo及如何打包应用
1.开发入口文件main.js 1-1 加载百度URL const { app, BrowserWindow, nativeImage } require(electron) const path require(node:path)const createWindow () > {const win new BrowserWindow({width: 800,height: 600,})//加载百度URLwin.loadURL(https://www.baid…...

关于用Cloudflare的Zero Trust实现绕过备案访问国内站点说明
cloudflare 是一个可免费的CDN,CDN(Content Delivery Network,内容分发网络)加速国内网站,通常是已备案的。Zero Trust类似FRP,可以将请求转发到目标服务器。在使用Zero Trust绕过备案访问国内网站需要&…...
2025年DDoS混合CC攻击防御全攻略:构建智能弹性防护体系
2025年,DDoS与CC混合攻击已成为企业安全的“头号威胁”。攻击者利用AI伪造用户行为、劫持物联网设备发起T级流量冲击,同时通过高频请求精准消耗应用层资源,传统单点防御几近失效。如何应对这场“流量洪水资源枯竭”的双重打击?本文…...

方正字库助力华为,赋能鸿蒙电脑打造全场景字体解决方案
2025年5月19日,搭载华为鸿蒙操作系统的鸿蒙电脑,面向用户推出集AI智能、互联流畅、安全保障和精致体验于一体的全新办公系统。作为鸿蒙生态核心字体服务商,方正字库为此次提供了全面的系统字体支持,涵盖中文、西文及符号三大类字库…...

STM32 串口通信①:USART 全面理解 + 代码详解
一 前言 本篇文章并不会系统的从零开始讲起,适合大家对USART有一定的学习,再看本篇文章会有一定的收获,祝大家在本文中,吸收到新的知识。 二 通信方式 1)按数据传输的方式分(这就是“串行 vs 并行”&…...

【Java Web】速通CSS
参考笔记:JavaWeb 速通CSS_java css-CSDN博客 目录 一、CSS入门 1. 基本介绍 2. 作用 二、CSS的3种引入方式 1. 行内式 1.1 示例代码 1.2 存在问题 2. 写在head标签的style子标签中 2.1 示例代码 2.2 存在问题 3.以外部文件的形式引入(开发中推荐使用)⭐⭐⭐ 3.1 说明 3…...
List 源码翻译
List 源码翻译-jdk1.8 翻译来自 AI 大模型。 全部源码翻译下载 /** 版权所有 (c) 1997, 2014, Oracle 和/或其附属公司。保留所有权利。* ORACLE 专有/机密。使用受许可条款约束。*********************/package java.util;import java.util.function.UnaryOperator;/*** 有序…...