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

【PmHub后端篇】PmHub集成 Sentinel+OpenFeign实现网关流量控制与服务降级

在微服务架构中,保障服务的稳定性和高可用性至关重要。本文将详细介绍在 PmHub 中如何利用 Sentinel + Gateway 进行网关限流,以及集成 Sentinel + OpenFeign 实现自定义的 fallback 服务降级。

1 熔断降级的必要性

在微服务架构中,服务间的调用错综复杂。一个服务可能会调用远程服务、数据库或第三方 API,例如支付时调用银联 API、查询商品价格时访问数据库等。然而,依赖的服务稳定性不可控,若其出现不稳定情况,请求响应时间过长,调用服务的方法会阻塞,耗尽业务线程资源,最终导致服务不可用。为避免这种情况,对不稳定的弱依赖服务调用进行熔断降级是保障高可用的重要措施。

2 Sentinel 的发展历史

早些年,Netflix 的 Hystrix 是熔断降级的热门组件,但在 2018 年底 Netflix 宣布不再维护它。此后,阿里巴巴开源的 Sentinel 成为了不错的替代产品。此外,Resilience4J 也是 Hystrix 官方推荐的替代产品,具有轻量、简单、文档清晰丰富的特点。Sentinel 是面向分布式的流量治理组件,以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、自适应过载保护、热点流量防护等多个维度保障微服务的稳定性。Sentinel 自 2012 年诞生,历经多次版本更新。

在这里插入图片描述

3 Sentinel 的基本概念

  • 资源
    资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。在接下来的文档中,我们都会用资源来描述代码块。

    只要通过 Sentinel API 定义的代码,就是资源,能够被 Sentinel 保护起来。大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源。

  • 规则
    围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整。

4 Sentinel 的原理

在 Sentinel 中,所有资源对应一个资源名称和一个 Entry。Entry 可通过对主流框架的适配自动创建,也可通过注解或调用 API 显式创建。每个 Entry 创建时,会同时创建一系列功能插槽(slot chain)。

这些插槽有不同的职责,例如:

  • NodeSelectorSlot 负责收集资源的路径,并将这些资源的调用路径,以树状结构存储起来,用于根据调用路径来限流降级;
  • ClusterBuilderSlot 则用于存储资源的统计信息以及调用者信息,例如该资源的 RT, QPS, thread count 等等,这些信息将用作为多维度限流,降级的依据;
  • StatisticSlot 则用于记录、统计不同纬度的 runtime 指标监控信息;
  • FlowSlot 则用于根据预设的限流规则以及前面 slot 统计的状态,来进行流量控制;
  • AuthoritySlot 则根据配置的黑白名单和调用来源信息,来做黑白名单控制;
  • DegradeSlot 则通过统计信息以及预设的规则,来做熔断降级;
  • SystemSlot 则通过系统的状态,例如 load1 等,来控制总的入口流量;

总体的框架如下:
在这里插入图片描述

Sentinel 将 ProcessorSlot 作为 SPI 接口进行扩展(1.7.2 版本以前 SlotChainBuilder 作为 SPI),使 Slot Chain 具备扩展能力,可加入自定义 slot 并编排顺序,为 Sentinel 添加自定义功能。
在这里插入图片描述

5 Sentinel 的下载和使用

5.1 下载Sentinel

  • 下载地址:https://github.com/alibaba/Sentinel/releases
  • 官方参考文档地址:https://sentinelguard.io/zh-cn/docs/quick-start.html

在这里插入图片描述

5.2 启动Sentinel

Sentinel 控制台的运行依赖 JDK 1.8 及以上版本,在搭建环境前需确保本地已安装符合要求的 JDK。

Sentinel 控制台本质上是一个可执行的 jar 包,使用 Java 命令即可运行。在启动前,需要确认默认端口 8080 是否被占用,可通过以下命令进行查看:

linux版:lsof -i :8080
windows版:netstat -ano | findstr "8080"

若命令执行后无任何输出,表明 8080 端口未被占用,可直接使用以下命令启动 Sentinel 控制台:

java -jar sentinel-dashboard-1.8.7.jar

若 8080 端口已被占用,则需切换至其他端口,例如 8081,启动命令如下:

java -jar sentinel-dashboard-1.8.7.jar --server.port=8081

当控制台输出类似 “Starting DashboardApplication using Java” 等相关信息时,即表明 Sentinel 控制台启动成功。
在这里插入图片描述

5.3 访问管理界面​

启动成功后,可通过浏览器访问 Sentinel 管理界面,若使用默认 8080 端口,访问地址为 http://localhost:8080;若使用 8081 端口,则访问地址为 http://localhost:8081。默认的登录账号和密码均为 “sentinel”,登录后即可进入 Sentinel 控制台管理界面。
在这里插入图片描述
在这里插入图片描述

5.4 功能验证

为验证 Sentinel 环境搭建是否成功,可编写测试用例进行验证。

5.4.1 引入依赖​

在项目的 pom.xml 文件中引入 Sentinel 的核心依赖:

<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-core</artifactId><version>1.8.6</version>
</dependency>
<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-transport-simple-http</artifactId><version>1.8.6</version>
</dependency>

其中,sentinel-core 为 Sentinel 的核心包,sentinel-transport-simple-http 用于实现与控制台的连通。

5.4.2 编写测试代码​

新建一个测试类,示例代码如下:

class Demo {public static void main(String[] args) {// 配置规则initFlowRules();while (true) {// 1.5.0版本开始可以直接利用try-with-resources特性try (Entry entry = SphU.entry("HelloWorld")) {// 被保护的逻辑System.out.println("hello world");} catch (BlockException ex) {// 处理被流控的逻辑System.out.println("blocked!");}}}private static void initFlowRules() {List<FlowRule> rules = new ArrayList<>();FlowRule rule = new FlowRule();rule.setResource("HelloWorld");rule.setGrade(RuleConstant.FLOW_GRADE_QPS);// 设置QPS限制为20rule.setCount(20);rules.add(rule);FlowRuleManager.loadRules(rules);}
}

上述代码通过 initFlowRules 方法配置了流量控制规则,将 “HelloWorld” 资源的 QPS 限制为 20,在 main 方法中通过 SphU.entry 方法尝试进入资源保护块,若超出流量限制,则会捕获 BlockException 并执行相应的处理逻辑。

5.4.3 运行测试​

以 debug 模式运行上述测试类,在控制台可观察到输出信息。
在这里插入图片描述

当循环次数达到 21 次时,由于超出了设定的 QPS 限制,将进入 BlockException 处理逻辑,输出 “blocked!”,这表明 Sentinel 的流量控制功能已正常生效,至此,PmHub 中 Sentinel 环境搭建成功。
在这里插入图片描述

6 Sentinel 配合 Gateway 实现网关限流

Sentinel 支持对 Spring Cloud Gateway、Zuul 等主流的 API Gateway 进行限流。在 1.6.0 版本,Sentinel 提供了 Gateway 的适配模块,支持两种维度的限流:

  1. route 维度:在配置文件中配置路由条目,资源名为对应的 routeId,常用于对某个微服务进行限流,PmHub 主要使用该维度。
  2. 自定义 API 维度:利用 Sentinel 提供的 API 自定义一些 API 分组,可针对 URI 进行限流,跨多个服务。

具体实现步骤如下:

6.1 引入 Sentinel 依赖

在需要 Sentinel 的微服务中引入 Sentinel 依赖,可在 PmHub 中搜索 alibaba-sentinel 关键字查看。

<!-- SpringCloud Alibaba Sentinel 核心依赖-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency><!-- SpringCloud Alibaba Sentinel Gateway,如果不是gateway可以不用引入 -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency><!-- Sentinel Datasource Nacos 用来做持久化存储-->
<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId>
</dependency>

6.2 修改 yml 配置

在 pmhub-gateway 的服务配置 bootstrap.yml 中,增加 Sentinel 的配置。其中

  • eager 用于取消控制台的懒加载;
  • dashboard 为 Sentinel 控制台地址;
  • port 为 Sentinel 客户端与 Sentinel 控制台通信的端口,用于上报网关的流量数据、接收动态规则配置、进行心跳检测等。
    在这里插入图片描述

6.3 使用 Nacos 对 Sentinel 进行持久化配置

Sentinel 的配置默认放在内存中,服务重启后配置会丢失。使用 Nacos 进行持久化配置,若 Nacos 已启动,可在 Nacos 的控制台找到 sentinel-pmhub-gateway
在这里插入图片描述
在这里插入图片描述

6.4 在 Sentinel 控制台查看 Gateway 的流量规则

在这里插入图片描述
Sentinel 之所以能够对流量进行控制,是因为它会监控应用的 QPS 流量或者并发线程数等指标,如果达到指定的阈值,就会进行流量控制,避免服务被瞬时的高并发流量击垮,从而保证服务的可靠性。

QPS 即每秒查询率,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。即每秒的响应请求数,也就是最大吞吐能力。

这里以 pmhub-gateway 网关流控规则为例:
在这里插入图片描述

在这里插入图片描述
这里 pmhub-system 配置的 1000,代表每秒最多可以处理 1000 个请求。

7 Sentinel 配合 OpenFeign 实现自定义 fallback 服务降级

7.1 @SentinelResource 注解

@SentinelResource 是 Sentinel 中重要的注解,能在代码层面对资源进行保护,结合控制台的规则配置,实现高效的限流与降级策略。

例如,在 PmHub 的系统服务中,可为获取用户信息的接口加上@SentinelResource 注解,blockHandler 参数用于限流,fallback 参数用于降级处理。

代码路径:com.laigeoffer.pmhub.system.controller.SysUserController#info

/*** 根据用户名获取当前用户信息*/
@InnerAuth
@GetMapping("/info/{username}")
@SentinelResource(value = "infoSentinelResource",blockHandler = "handlerBlockHandler", fallback = "doActionFallback") // 演示SentinelResource细粒度管控服务流控和降级
public R<LoginUser> info(@PathVariable("username") String username) {SysUser sysUser = userService.selectUserByUserName(username);if (StringUtils.isNull(sysUser)) {return R.fail("用户名或密码错误");}// 角色集合Set<String> roles = permissionService.getRolePermission(sysUser);// 权限集合Set<String> permissions = permissionService.getMenuPermission(sysUser);LoginUser loginUser = new LoginUser();loginUser.setUser(sysUser);loginUser.setRoles(roles);loginUser.setPermissions(permissions);loginUser.setUserId(sysUser.getUserId());loginUser.setDeptId(sysUser.getDeptId());loginUser.setNickName(sysUser.getNickName());return R.ok(loginUser);
}

来看一下登录接口涉及到的服务交互,用户发起请求,网关服务(pmhub-gateway)接收到后进行服务转发,转发到认证服务(pmhub-auth),认证服务调用系统服务(pmhub-system)获取用户。
在这里插入图片描述

7.2 fallback 服务降级

fallback 服务降级是指当调用一个服务出现异常时,给访问者一个友好的反馈,降低服务负载,避免因异常请求引发其他服务崩溃。

7.3 通过 OpenFeign 进行过渡降级处理

对于用户的登录请求,认证服务不直接调用系统服务,PmHub 抽离出公共包 pmhub-api,将用户接口统一放入,认证服务通过 OpenFeign 调用系统服务,并在 pmhub-api 服务中进行统一的服务降级。
在这里插入图片描述

7.3.1 OpenFeign的概念

OpenFeign 是一个 声明式 HTTP 客户端,用于在 Spring Cloud 微服务架构 中简化服务之间的通信。它提供了一种声明式的方式来定义和调用 HTTP 服务,我们开发者无需手动构建 HTTP 请求,就能轻松实现服务调用。

7.3.2 具体实现步骤

  1. 使用 @FeignClient 注解:在 UserFeignService 中,在 @FeignClient 注解上添加自定义的 fallbackFactory
    代码路径:com.laigeoffer.pmhub.api.system.UserFeignService
@FeignClient(contextId = "userFeignService", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = UserFeginFallbackFactory.class)
public interface UserFeignService {/*** 根据用户名获取当前用户信息*/@GetMapping("/system/user/info/{username}")R<LoginUser> info(@PathVariable("username") String username, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);/*** 根据 userId 获取用户信息*/@GetMapping("/system/user/getInfoByUserId/{userId}")R<LoginUser> getInfoByUserId(@PathVariable("userId") Long userId, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);/*** 根据条件获取用户列表*/@PostMapping("/system/user/listOfInner")R<List<SysUserVO>> listOfInner(@RequestBody SysUserDTO sysUserDTO, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);/*** 注册用户信息** @param sysUser 用户信息* @param source 请求来源* @return 结果*/@PostMapping("/system/user/register")R<Boolean> registerUserInfo(@RequestBody SysUser sysUser, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
}
  1. 创建 UserFeginFallbackFactory:进行自定义的降级处理,在 FallbackFactory 中,不仅能捕获异常进行处理,还能通过 Throwable 获取详细的异常信息,处理复杂的限流逻辑。
    代码路径:com.laigeoffer.pmhub.api.system.factory.UserFeginFallbackFactory
@Component
public class UserFeginFallbackFactory implements FallbackFactory<UserFeignService>
{private static final Logger log = LoggerFactory.getLogger(UserFeginFallbackFactory.class);@Overridepublic UserFeignService create(Throwable throwable){log.error("用户服务调用失败:{}", throwable.getMessage());return new UserFeignService(){@Overridepublic R<LoginUser> info(String username, String source) {return R.fail("根据用户名获取用户失败:" + throwable.getMessage());}@Overridepublic R<LoginUser> getInfoByUserId(Long userId, String source) {return R.fail("根据userId获取用户失败:" + throwable.getMessage());}@Overridepublic R<List<SysUserVO>> listOfInner(SysUserDTO sysUserDTO, String source) {return R.fail("根据调教获取用户列表失败:" + throwable.getMessage());}@Overridepublic R<Boolean> registerUserInfo(SysUser sysUser, String source) {return R.fail("注册用户失败:" + throwable.getMessage());}};}
}

8 总结

本文围绕 PmHub,介绍 Sentinel 在微服务架构中熔断降级的必要性、基本概念、原理等,阐述其下载使用方法,以及配合 Gateway 实现网关限流、配合 OpenFeign 实现自定义 fallback 服务降级,助力开发者保障微服务架构稳定性。

9 参考链接

  1. PmHub集成 Sentinel+OpenFeign实现网关流量控制,以及自定义fallback服务降级
  2. 项目仓库(GitHub)
  3. 项目仓库(码云): (国内访问速度更快)

相关文章:

【PmHub后端篇】PmHub集成 Sentinel+OpenFeign实现网关流量控制与服务降级

在微服务架构中&#xff0c;保障服务的稳定性和高可用性至关重要。本文将详细介绍在 PmHub 中如何利用 Sentinel Gateway 进行网关限流&#xff0c;以及集成 Sentinel OpenFeign 实现自定义的 fallback 服务降级。 1 熔断降级的必要性 在微服务架构中&#xff0c;服务间的调…...

C#扩展方法的入门理解

public static class CanGetModelExtension {public static T GetModel<T>(this ICanGetModel self) where T : class, IModel >self.GetArchitecture().GetModel<T>(); } 前言&#xff1a; 在学习QFramework时&#xff0c;看底层框架代码注意到这个函数&#…...

HTML应用指南:利用POST请求获取全国圆通快递服务网点位置信息

圆通快递作为国内物流行业的领军企业&#xff0c;自2000年成立以来&#xff0c;始终秉持 “客户要求&#xff0c;圆通使命” 的服务宗旨&#xff0c;致力于为客户提供高效、优质的物流服务。凭借其庞大的物流网络、先进的信息技术以及卓越的运营管理&#xff0c;圆通快递在激烈…...

vulnhub靶场——secarmy

靶机&#xff1a;secarmy靶机&#xff0c;IP地址为192.168.230.18 攻击&#xff1a;kali&#xff0c;IP地址为192.168.230.134 靶机和攻击机都采用VMware虚拟机&#xff0c;都采用NAT模式 端口扫描&#xff1a; nmap 192.168.230.18 -O -A -p- --reason -sV 21/tcp (ftp): 开…...

Daily AI 20250514 (迁移学习与元学习)

参考资料&#xff1a;神经网络与深度学习 目录 迁移学习 &#xff08;Transfer Learning&#xff09;归纳迁移学习转导迁移学习 元学习 &#xff08;Meta Learning&#xff09;基于优化器的元学习模型无关的元学习&#xff08;Model-AgnosticMeta-Learning&#xff0c;MAML&am…...

牛市买卖数字货币逻辑

在牛市中进行数字货币交易&#xff0c;核心逻辑是顺势而为、控制风险、把握周期。以下是关键策略和逻辑框架&#xff1a; 一、牛市的核心逻辑 资金驱动 牛市由增量资金&#xff08;新投资者、机构资金、杠杆资金&#xff09;推动&#xff0c;流动性充裕时&#xff0c;市场情绪乐…...

7.DTH11和PWM波

目录 室内/本地温湿度检测 温湿度传感器介绍 获取手册和例程的方法 从手册中提取重要信息 传感器的分类 温度传感器类型 DHT11 的介绍 温湿度传感器的接口 温湿度传感器的时序 温湿度传感器电路介绍 IO 的配置 定时器输出 PWM 波 PWM 波介绍 PWM 波的作用&#x…...

在UI 原型设计中,交互规则有哪些核心要素?

在UI 原型设计中&#xff0c;交互规则主要有三个核心要素&#xff0c;分别为重要性、原则与实践&#xff0c;具体表现在&#xff1a; 一、交互规则在 UI 原型设计中的重要性 明确交互逻辑&#xff1a;设计阶段制定交互规则&#xff0c;清晰定义界面元素操作响应。 如社交应用…...

树的直径 | 树的最长路径

树的直径&#xff1a; 树上任意两节点之间最长的简单路径即为树的「直径」。 定理&#xff1a; 在一棵树上&#xff0c;从任意节点 u 开始进行一次 DFS&#xff0c;到达的距离其最远的节点 v 必为直径的一端。 B4016 树的直径 - 洛谷 思路&#xff1a; 由于这题中每条边的…...

AbMole解读:脂质体的关键组分和主要合成方法

脂质体&#xff08;Liposome&#xff09;是一种由磷脂等两性分子自发形成的封闭囊泡结构&#xff0c;随着纳米技术、材料科学等多学科的交叉发展&#xff0c;脂质体的研究与应用进入了一个新的阶段&#xff0c;并在肿瘤研究、疫苗研发、基因递送等多个领域发挥着关键作用。AbMo…...

Python爬虫之品牌口碑数据抓取

上一篇我们介绍了爬虫营销的优势&#xff0c;这次我就展开详细的说说&#xff0c;如何通过爬取社交媒体或电商平台的公开评论来分析自己或竞争对手的品牌声誉。 选择微博这样的平台&#xff0c;因为它的数据相对公开&#xff0c;而且有API支持&#xff0c;但要注意频率限制和反…...

【android bluetooth 协议分析 12】【A2DP详解 1】【车机侧蓝牙音乐免切源介绍】

“车机蓝牙音乐免切源” 是近年来车载系统&#xff08;IVI&#xff0c;In-Vehicle Infotainment&#xff09;中常见的一个用户体验优化功能。它主要是为了简化蓝牙音乐播放流程、减少用户操作&#xff0c;提升使用便捷性。 一、什么是“切源”&#xff1f; 在车机系统中&#…...

眼镜店哪个品牌好,你会选择哪一款眼镜

有些人买眼睛是为了耍帅&#xff0c;有些人买眼镜&#xff0c;可能就是为了调节视力。现在手机以及其他的电子产品越来越普及&#xff0c;近视眼的人群是越来越多了&#xff0c;那么要准备去配眼镜的话&#xff0c;就要找到一个正规的眼镜店&#xff0c;一起来了解一下眼镜店哪…...

基于EFISH-SCB-RK3576/SAIL-RK3576的畜禽养殖监控仪技术方案‌

&#xff08;国产化替代J1900的农业物联网解决方案&#xff09; 一、硬件架构设计‌ ‌多源环境感知模块‌ ‌空气质量监测‌&#xff1a; 集成NH₃/CO₂/H₂S三合一气体传感器&#xff08;量程0-500ppm&#xff0c;精度2%FS&#xff09;&#xff0c;采样间隔≤1秒激光粉尘检测…...

linux - 权限的概念

目录 用户权限 超级用户与普通用户的区别 超级用户&#xff08;root&#xff09;&#xff1a; 普通用户&#xff1a; 切换用户身份 使用sudo执行高权限命令 用户管理 用户组管理 文件权限 文件访问者类别 基本权限 权限表示方法 权限修改 chmod chown chgrp u…...

LeRobot 框架的核心架构概念和组件(中)

本文档概述构成 LeRobot 框架的核心架构概念和组件。它介绍主要的子系统&#xff0c;并解释它们如何相互作用以实现机器人学习。 。。。。。。继续。。。。。。 环境接口 环境系统提供与模拟环境交互的统一接口。这些环境允许在部署到物理机器人之前&#xff0c;在受控环境中…...

鸿蒙5.0项目开发——鸿蒙天气项目的实现(主页1)

【高心星出品】 文章目录 页面效果&#xff1a;页面功能&#xff1a;页面执行流程&#xff1a;1. 页面初始化阶段2. 定位获取阶段3. 天气数据加载阶段 这个页面是整个天气应用的核心&#xff0c;集成了天气查询、定位、搜索等主要功能&#xff0c;提供了完整的天气信息服务。 …...

虚幻引擎5-Unreal Engine笔记之摄像机与场景捕获相关概念的解析

虚幻引擎5-Unreal Engine笔记之摄像机与场景捕获相关概念的解析 code review! 文章目录 虚幻引擎5-Unreal Engine笔记之摄像机与场景捕获相关概念的解析1. UE中SceneCapture和UCameraComponent的关系是什么&#xff1f;Camera和SceneCapture2D的关系是什么1.1 UCameraComponen…...

【vim】--- vim 插件说明 超详细持续更新中

在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。【vim】--- vim 插件说明 超详细持续更新中 开发环境一、vim 插件管理器1、Vim-Plug2…...

医学影像系统的集成与工作流优化

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C++, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C++、C#等开发语言,熟悉Java常用开发技术,能熟练应用常用数据库SQL server,Oracle,mysql,postgresql等进行开发应用…...

Vue 和 React 状态管理的性能优化策略对比

一、Vue 状态管理优化策略 合理使用 Vuex 模块化 将全局状态拆分为模块&#xff0c;按需加载&#xff0c;避免单一 Store 文件过大。通过命名空间隔离状态&#xff0c;减少状态冗余和无效更新。 const moduleA { namespaced: true, state: { /* ... */ } }; const store new …...

python打包exe报错:处理文件时错误:Excel xlsx file; not supported

背景&#xff1a;最近用python写一个excel解析工具&#xff0c;然后打包成exe可执行文件的时候&#xff0c;遇到这样的问题 1.在我自己编译器运行是可以正常将上传后的excel进行解析&#xff0c;但是在打包成exe后&#xff0c;就无法正常解析excel 问题排查&#xff1a; 1.切换…...

libmemcached库api接口讲解一

前言&#xff1a;好多接口的用法都不怎么会&#xff0c;得学习一下具体的用法 memcached_st ✅ 一个连接 memcached 服务集群的“客户端实例”对象&#xff0c;用于管理连接、执行读写操作、设置行为、维护哈希环等一切功能。 它在使用中通常通过下面的方式创建&#xff1a; …...

【RabbitMQ】发布确认机制的具体实现

文章目录 模式介绍建立连接单独确认代码实现逻辑运行结果 批量确认代码实现逻辑运行结果 异步确认实现逻辑介绍代码实现逻辑运行结果 三种策略对比以及完整代码 模式介绍 作为消息中间件&#xff0c;都会面临消息丢失的问题&#xff0c;消息丢失大概分为三种情况&#xff1a; …...

RabbitMQ是什么?应用场景有哪些?

RabbitMQ 是一款开源的消息代理中间件,基于 AMQP(高级消息队列协议)实现,用于在分布式系统中进行异步通信和消息传递。它通过将消息的发送者和接收者解耦,提高了系统的可扩展性、可靠性和灵活性。 核心特点 多协议支持:不仅支持 AMQP,还兼容 STOMP、MQTT 等多种消息协议…...

数学实验(Matlab符号运算)

一、符号对象的建立 Matlab符号运算特点 计算以推理方式进行&#xff0c;因此不受计算误差积累所带来的困扰 符号计算指令的调用比较简单&#xff0c;与数学教科书上的公式相近 Matlab符号运算举例 符号对象与符号表达式 在进行符号运算时&#xff0c;必须先定义基本的符号…...

使用 hover-class 实现触摸态效果 - uni-app 教程

目录 一、什么是 hover-class 二、常用组件支持 hover-class 三、基本 效果说明&#xff1a; 四、配合 hover-start-time 和 hover-stay-time 五、注意事项 六、实践建议 在移动端开发中&#xff0c;良好的用户交互体验尤为重要&#xff0c;点击或长按某个按钮时&#x…...

# 深度剖析LLM的“大脑”:单层Transformer的思考模式探索

简单说一下哈 —— 咱们打算训练一个单层 Transformer 加上稀疏自编码器的小型百万参数大型语言模型&#xff08;LLM&#xff09;&#xff0c;然后去调试它的思考过程&#xff0c;看看这个 LLM 的思考和人类思考到底有多像。 LLMs 是怎么思考的呢&#xff1f; 开源 LLM 出现之后…...

Git仓库迁移

前言 前面我讲了GitLab搭建与使用(SSH和Docker)两种方式&#xff0c;那么就会延伸出来一个情况&#xff1a;Git仓库迁移虽然这种情况很少发生&#xff0c;但是我自己公司近期要把 阿里云迁移到华为云&#xff0c;那么放在上面的Git仓库也要全量迁移下面我就写了一个脚本演示&am…...

Windows避坑部署CosyVoice多语言大语言模型

#工作记录 前言 在实际部署与应用过程中&#xff0c;项目的运行环境适配性对其稳定性与功能性的发挥至关重要。CosyVoice 项目虽具备强大的语音处理能力&#xff0c;但受限于开发与测试环境的侧重方向&#xff0c;其对运行环境存在特定要求。 该项目在 Linux 和 Docker 生态…...

《实现模式》以Golang视角解读 价值观和原则 day 1

为什么阅读实现模式&#xff1f; 为什么阅读《实现模式》&#xff1f;Kent Beck 的《实现模式》其核心思想——编写清晰、易于理解且易于维护的代码&#xff0c;对于软件工程的新手而言&#xff0c;直接深入复杂的设计模式或架构理念可能会感到困惑。《实现模式》则弥合了设计…...

解决 PicGo 上传 GitHub图床及Marp中Github图片编译常见难题指南

[目录] 0.行文概述 1.PicGo图片上传失败 2.*关于在Vscode中Marp图片的编译问题* 3.总结与启示行文概述 写作本文的动机是本人看到了Awesome Marp&#xff0c;发现使用 Markdown \texttt{Markdown} Markdown做PPT若加持一些 CSS , JavaScript \texttt{CSS},\texttt{JavaScript} …...

LeetCode 820 单词的压缩编码题解

LeetCode 820 单词的压缩编码题解 题目描述 题目链接 给定一个单词列表&#xff0c;将其编码为一个索引字符串S&#xff0c;格式为"单词1#单词2#…"。要求当某个单词是另一个单词的后缀时&#xff0c;该单词可以被省略。求最终编码字符串的最小长度。 解题思路 逆…...

Windows软件插件-写wav

下载本插件 本插件&#xff0c;将PCM音频流写入WAV音频文件。或将PCM音频流压缩为ALAW格式&#xff0c;写入WAV文件。可以创作大文件&#xff08;超过4字节所能表示的大小&#xff09;。插件类型为DLL&#xff0c;可以在win32和MFC程序中使用。使用本插件创建的ALAW格式WAV音频…...

基于 Spring Boot 瑞吉外卖系统开发(十五)

基于 Spring Boot 瑞吉外卖系统开发&#xff08;十五&#xff09; 前台用户登录 在登录页面输入验证码&#xff0c;单击“登录”按钮&#xff0c;页面会携带输入的手机号和验证码向“/user/login”发起请求。 定义UserMapper接口 Mapper public interface UserMapper exte…...

【Linux高级IO】多路转接之epoll

多路复用之epoll 一&#xff0c;认识epoll二&#xff0c;epoll的相关接口1. epoll_create2. epoll_ctl3. epoll_wait 三&#xff0c;epoll的原理四&#xff0c;epoll的两种工作模式&#xff08;ET和LT&#xff09;1. 两种工作模式2. 对比ET和LT 五&#xff0c;总结 在了解到sel…...

Java 性能调优全解析:从设计模式到 JVM 的 7 大核心方向实践

引言 在高并发、低延迟的技术场景中&#xff0c;Java 性能优化需要系统化的方法论支撑。本文基于7 大核心优化方向&#xff08;复用优化、计算优化、结果集优化、资源冲突优化、算法优化、高效实现、JVM 优化&#xff09;&#xff0c;结合权威框架与真实案例&#xff0c;构建从…...

“海外滴滴”Uber的Arm迁移实录:重构大规模基础设施​

云工作负载在性价比上的自然演进路径&#xff1a; Intel ➜ AMD ➜ ARM 不信&#xff1f;来看看 Uber 的做法&#xff1a; 01/Arm架构&#xff1a;云计算新时代 2023 年 2 月&#xff0c;Uber 正式开启了一项战略性迁移&#xff1a;将从本地数据中心迁移至云端&#xff0c;…...

java加强 -File

File类的对象可以代表文件/文件夹&#xff0c;并可以调用其提供的方法对象文件进行操作。 File对象既可以代表文件&#xff0c;也可以代表文件夹。 创建File对象&#xff0c;获取某个文件的信息 语法&#xff1a; File 对象名 new File("需要访问文件的绝对路径&…...

SQL注入 ---04

1 简单的sql注入 要求&#xff1a; 要有sql注入&#xff1a; 1&#xff0c;变量 2&#xff0c;变量要带入数据库进行查询 3&#xff0c;没有对变量进行过滤或者过滤不严谨 mysql> select * from users where id2 limit 0,1; 当我的语句这样写时查寻到的结果 当我修改为&…...

MySQL知识点总结(持续更新)

聚合函数通常用于对数据进行统计和聚合操作。以下是一些常见数据库系统&#xff08;如 MySQL、PostgreSQL、Oracle、SQL Server 等&#xff09;中常用的聚合函数&#xff1a; 常见的数据库聚合函数&#xff1a; COUNT()&#xff1a;计算指定列中非空值的数量 SELECT COUNT(*) …...

数字信号处理-大实验1.1

MATLAB仿真实验目录 验证实验&#xff1a;常见离散信号产生和实现验证实验&#xff1a;离散系统的时域分析应用实验&#xff1a;语音信号的基音周期&#xff08;频率&#xff09;测定 目录 一、常见离散信号产生和实现 1.1 实验目的 1.2 实验要求与内容 1.3 实验…...

Qt操作SQLite数据库教程

Qt 中操作 SQLite 数据库的步骤如下&#xff1a; 1. 添加 SQLite 驱动并打开数据库 #include <QSqlDatabase> #include <QSqlError> #include <QSqlQuery>// 创建数据库连接 QSqlDatabase db QSqlDatabase::addDatabase("QSQLITE"); db.setData…...

【PSINS工具箱】基于工具箱的单独GNSS导航、单独INS导航、两者结合组合导航,三种导航的对比程序。附完整的代码

本文给出基于PSINS工具箱的单独GNSS导航、单独INS导航、两者结合组合导航(153EKF)的程序。并提供三者的轨迹对比、误差对比。 文章目录 运行结果MATLAB代码代码的简单介绍简介2. 平均绝对误差 (MAE)主要模块运行结果 三轴轨迹图: 各轴误差曲线: 命令行窗口的结果输出: …...

开发者的测试复盘:架构分层测试策略与工具链闭环设计实战

摘要‌ 针对测试复盘流于形式、覆盖率虚高等行业痛点&#xff0c;本文提出一套结合架构分层与工具链闭环的解决方案&#xff1a; ‌分层测试策略精准化‌&#xff1a;通过单元测试精准狙击核心逻辑、契约测试驱动接口稳定性、黄金链路固化端到端场景&#xff0c;实现缺陷拦截率…...

手写CString类

学习和理解字符串处理机制&#xff1a;手写 CString 类是深入学习字符串处理和内存管理的有效方式。通过实现构造函数、析构函数、赋值运算符等&#xff0c;能够理解字符串在内存中的存储方式、动态内存分配和释放的原理&#xff0c;以及如何处理字符串的复制、拼接、查找等操作…...

electron结合vue,直接访问静态文件如何跳转访问路径

在最外的app.vue或者index.vue的js模块编写 let refdade ref(1);//刷新&#xff0c;获得请求// 获取完整的查询字符串&#xff08;例如: "?dade/myms"&#xff09;const searchParams new URLSearchParams(window.location.search);// 获取 dade 参数的值&#xf…...

解读RTOS 第七篇 · 驱动框架与中间件集成

1. 引言 在面向生产环境的 RTOS 系统中,硬件驱动框架与中间件层是连接底层外设与上层应用的桥梁。一个模块化、可扩展的驱动框架能够简化外设管理,提升代码可维护性;而丰富的中间件生态则为网络通信、文件系统、图形界面、安全加密等功能提供开箱即用的支持。本章将从驱动模…...

Java GUI开发全攻略:Swing、JavaFX与AWT

Swing 界面开发 Swing 是 Java 中用于创建图形用户界面&#xff08;GUI&#xff09;的库。它提供了丰富的组件&#xff0c;如按钮、文本框、标签等。 import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener;public class SwingExa…...

Cursor 0.5版本发布,新功能介绍

Cursor,这款流行的AI编程平台,刚刚在其v0.50更新中推出了一系列新功能。 首先,请将您的Cursor IDE更新到最新版本。当您打开Cursor时,您应该会在屏幕左下方收到关于最新版本发布的通知。 更多上下文控制: 对上下文的精细可见性,以及最新模型的MAX模式。 聊天升级: 导出…...