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

sentinel集成nacos启动报[check-update] get changed dataId error, code: 403错误排查及解决

整合nacos报403错误

因为平台写的一个限流代码逻辑有问题,所以准备使用sentinel来限流。平台依赖里面已经引入了,之前也测试过,把sentinel关于nacos的配置加上后,启动一直输出403错误 [fixed-10.0.20.188_8848-test] [check-update] get changed dataId error, code: 403
在这里插入图片描述

403的原因

先说结论,sentinel(我这里用到的alibaba-sentinel-datasource2.1.2.RELEASE版本)的代码有问题,他这个版本的nacos相关配置没有usernamepassword的属性,导致只能在nacos服务没有配置账号密码的时候使用,一旦改了账号密码,就无法正常访问nacos。今年不能用去年可以是因为今年测试环境nacos改了密码而去年是默认的。(文心一言竟然跟我说,他是共享了nacos的配置,所以不用配置账号密码,离谱)

仓库找了个比这高的版本(2021.0.5.0),发现这两个属性加上了,有需要的可以升级试试。不得不吐槽一句,这个依赖的版本是真的多,而且还没啥规律。如果想通过改源码的方式解决问题看最后

<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-sentinel -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId><version>2021.0.5.0</version>
</dependency>

在这里插入图片描述
配置截图,
在这里插入图片描述

com.alibaba.cloud.sentinel.datasource.config.NacosDataSourceProperties类截图:
在这里插入图片描述

403问题排查过程

打断点查看http请求代码

因为控制台输出了ERROR日志,找到输出日志的代码行,打个断点。这里打断点是最方便的,我是通过logging.levellog级别改成了trace,然后看的http请求日志,在请求那里打的断点。
com.alibaba.nacos.client.config.impl.ClientWorker
在这里插入图片描述
通过调试发现在386行会发起http请求nacos服务器,agent属性是sentinel自己写的一个HttpAgent对象,主要是在发送http请求前做一些处理(比如拼上配置文件里面配置的nacos.server-addr)。
在这里插入图片描述
调用agent.httpPost之后,会在com.alibaba.nacos.client.config.http.ServerHttpAgent#httpPost处理,ServerHttpAgent类是HttpAgent接口的实现类。这里面主要就是在发送http请求之前,通过injectSecurityInfo方法给请求参数加入一些安全相关的参数。
在这里插入图片描述
injectSecurityInfo方法里面会判断securityProxy属性里面是否有token,有就加入,这里为空,所以大概率是这个问题了。
在这里插入图片描述

和nacos框架发送的http请求做对比

为了做一个对比,查看一下nacos框架发送的http请求和这个有啥区别,因为这是nacos里面的代码,所以nacos框架也会调用,可以看一下nacos框架请求nacos服务器里面有哪些信息。
在这里插入图片描述
可以发现nacos框架发送的请求,他这个securityProxy里面是有token信息的。这个是能正常请求nacos服务器的。现在能确定问题就是出现在这里了。所以现在的重点就是securityProxy这个属性。
在这里插入图片描述

securityProxy属性排查

因为SecurityProxyServerHttpAgent类的属性,搜了一下发现这个属性只在构造函数那里初始化赋值的,所以在ServerHttpAgent类的构造函数那里打个断点。在nacos框架初始化和sentinel初始化的时候,都会来调用这个,所以我们可以通过调试nacos框架的初始化来排查sentinel这边的哪里出了问题。
在这里插入图片描述
com.alibaba.nacos.client.config.http.ServerHttpAgent#ServerHttpAgent(java.util.Properties)截图
在这里插入图片描述

由于这个地方是在项目启动的时候调用,所以打完断点需要重启一下。

nacos框架初始化securityProxy

进入断点之后,发现nacos框架的这个properties里面是有账号密码配置的(配置文件里面配置了)
在这里插入图片描述

在这里插入图片描述
com.alibaba.nacos.client.security.SecurityProxy构造器里面给账号密码属性赋值(sentinel的那个压根都没有这两个属性,所以也能解释的通了,按道理这么低级的错误不应该的)
在这里插入图片描述
赋值完成之后,调用SecurityProxy里面的login方法,这个方法会发送登录请求,然后拿到token赋值给accessToken属性。
在这里插入图片描述

sentinel整合nacos的初始化securityProxy

com.alibaba.cloud.sentinel.custom.SentinelDataSourceHandler#afterSingletonsInstantiated类继承了SmartInitializingSingleton类,并重写了afterSingletonsInstantiated方法
文心一言:

SmartInitializingSingleton接口用于在Spring容器中所有单例Bean初始化完成后执行一些自定义的初始化逻辑。当所有单例Bean的依赖关系都解析完毕,并且所有单例Bean的实例化与初始化过程完成后,Spring容器会自动回调SmartInitializingSingleton接口的实现类的afterSingletonsInstantiated()方法。这个方法只会被调用一次。

在这个重写的方法内部,会对每个数据源进行初始化。sentinel里面每一个数据源都对应一个bean,这个beansentinel自己的beanFactory创建。
在这里插入图片描述
注册bean的方法。里面有一行BeanDefinitionBuilder.genericBeanDefinition(dataSourceProperties.getFactoryBeanName());代码,用来创建一个bean定义构造器对象,后面要使用这个对象要创建NacosDataSourceFactoryBean类的bean
文心一言:

BeanDefinitionBuilder主要用于在Spring的IoC(Inversion of Control,控制反转)容器中构建和配置Bean定义。Bean定义描述了如何创建一个Bean实例,包括其类名、作用域、初始化方法、属性设置等信息。通过BeanDefinitionBuilder,开发者可以以编程的方式轻松地创建和配置Bean定义,而不需要手动编写冗长的XML配置文件或注解。

在这里插入图片描述
遍历属性集合,然后里面校验一下,就通过BeanDefinitionBuilder builder对象把这些属性添加进去
在这里插入图片描述
注册bean之后又通过beanFactory来获取bean,注册的bean类型是com.alibaba.cloud.sentinel.datasource.factorybean.NacosDataSourceFactoryBean类型
在这里插入图片描述
sentinel自己实现的BeanFactory#getObject方法内,每次都是返回NacosDataSource对象(也就是说前面创建的bean是这个自定义的工厂bean,每次getBean都是获取到NacosDataSource对象,如果想获取到这个bean对象本身,getBean的时候名字前面加一个&)。在初始化Properties的时候,只判断地址是否配置,都没有关于账号密码的代码,所以sentinelnacos数据源在当初设计的时候,就是没有考虑到nacos会改账号或密码的情况,而不是配置文件里面漏了这两个属性。
在这里插入图片描述
因为前面都没有账号密码,所以ServerHttpAgent构造器这里的属性里面只有两个值,肯定也没有用户名和密码的。
在这里插入图片描述
在这里插入图片描述
大致的调用栈
在这里插入图片描述

排查结论

通过排查发现,这个对象所需的属性是从配置文件中拿的,因为nacos框架配置了usernamepassword,所以拿的到。而sentinel并没有提供相应的属性配置,所以就为空,直接导致了后面的403问题。

解决方案

  1. 如开头所说,升级版本就可以了,这是最简单的,当然有的系统可能升级之后会报错,这个就需要自己排查一下了
  2. 把账号密码改成默认的(当我没说,这个应该没人弄)
  3. 重写代码,自己项目main/java下面创建一个全类名一样的类,覆盖原有的类
    com.alibaba.cloud.sentinel.datasource.factorybean.NacosDataSourceFactoryBean类和com.alibaba.cloud.sentinel.datasource.config.NacosDataSourceProperties类,在两个类里面都加上usernamepassword属性,然后在NacosDataSourceFactoryBean里面赋值给属性类。
    或者说不改NacosDataSourceProperties代码直接改NacosDataSourceFactoryBean工厂,在里面获取nacos框架的配置,用那里面的账号密码也可以。

重写的NacosDataSourceProperties类,记得加setget方法,也可以使用Lombok

package com.alibaba.cloud.sentinel.datasource.config;import com.alibaba.cloud.sentinel.datasource.factorybean.NacosDataSourceFactoryBean;
import org.springframework.util.StringUtils;import javax.validation.constraints.NotEmpty;/*** Nacos Properties class Using by {@link DataSourcePropertiesConfiguration} and* {@link NacosDataSourceFactoryBean}.** @author <a href="mailto:fangjian0423@gmail.com">Jim</a>*/
public class NacosDataSourceProperties extends AbstractDataSourceProperties {private String serverAddr;@NotEmptyprivate String groupId = "DEFAULT_GROUP";@NotEmptyprivate String dataId;private String endpoint;private String namespace;private String accessKey;private String secretKey;/*** 自己添加的属性 用户名*/private String username;/*** 自己添加的属性 名称*/private String password;public NacosDataSourceProperties() {super(NacosDataSourceFactoryBean.class.getName());}@Overridepublic void preCheck(String dataSourceName) {if (StringUtils.isEmpty(serverAddr)) {serverAddr = this.getEnv().getProperty("spring.cloud.sentinel.datasource.nacos.server-addr","localhost:8848");}}public String getServerAddr() {return serverAddr;}public void setServerAddr(String serverAddr) {this.serverAddr = serverAddr;}public String getGroupId() {return groupId;}public void setGroupId(String groupId) {this.groupId = groupId;}public String getDataId() {return dataId;}public void setDataId(String dataId) {this.dataId = dataId;}public String getEndpoint() {return endpoint;}public void setEndpoint(String endpoint) {this.endpoint = endpoint;}public String getNamespace() {return namespace;}public void setNamespace(String namespace) {this.namespace = namespace;}public String getAccessKey() {return accessKey;}public void setAccessKey(String accessKey) {this.accessKey = accessKey;}public String getSecretKey() {return secretKey;}public void setSecretKey(String secretKey) {this.secretKey = secretKey;}public void setUsername(String username) {this.username = username;}public String getUsername() {return username;}public void setPassword(String password) {this.password = password;}public String getPassword() {return password;}
}

重写的NacosDataSourceFactoryBean类,太长了,这里就列出部分,直接加进去就行了。别忘了setget方法

    /*** 自己添加的属性 用户名*/private String username;/*** 自己添加的属性 密码*/private String password;@Overridepublic NacosDataSource getObject() throws Exception {Properties properties = new Properties();if (!StringUtils.isEmpty(this.serverAddr)) {properties.setProperty(PropertyKeyConst.SERVER_ADDR, this.serverAddr);} else {properties.setProperty(PropertyKeyConst.ACCESS_KEY, this.accessKey);properties.setProperty(PropertyKeyConst.SECRET_KEY, this.secretKey);properties.setProperty(PropertyKeyConst.ENDPOINT, this.endpoint);}if (!StringUtils.isEmpty(this.namespace)) {properties.setProperty(PropertyKeyConst.NAMESPACE, this.namespace);}// 自己加的逻辑  把账号密码加进去if (!StringUtils.isEmpty(this.username)) {properties.setProperty(PropertyKeyConst.USERNAME, this.username);}if (!StringUtils.isEmpty(this.password)) {properties.setProperty(PropertyKeyConst.PASSWORD, this.password);}return new NacosDataSource(properties, groupId, dataId, converter);}

改造之后效果截图:
在这里插入图片描述
账号密码等属性都有了
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

相关文章:

sentinel集成nacos启动报[check-update] get changed dataId error, code: 403错误排查及解决

整合nacos报403错误 因为平台写的一个限流代码逻辑有问题&#xff0c;所以准备使用sentinel来限流。平台依赖里面已经引入了&#xff0c;之前也测试过&#xff0c;把sentinel关于nacos的配置加上后&#xff0c;启动一直输出403错误 [fixed-10.0.20.188_8848-test] [check-upda…...

[TOTP]android kotlin实现 totp身份验证器 类似Google身份验证器

背景&#xff1a;自己或者公司用一些谷歌身份验证器或者microsoft身份验证器&#xff0c;下载来源不明&#xff0c;或者有广告&#xff0c;使用不安全。于是自己写一个&#xff0c;安全放心使用。 代码已开源&#xff1a;shixiaotian/sxt-android-totp: android totp authenti…...

IDEA+Docker一键部署项目SpringBoot项目

文章目录 1. 部署项目的传统方式2. 前置工作3. SSH配置4. 连接Docker守护进程5. 创建简单的SpringBoot应用程序6. 编写Dockerfile文件7. 配置远程部署 7.1 创建配置7.2 绑定端口7.3 添加执行前要运行的任务 8. 部署项目9. 开放防火墙的 11020 端口10. 访问项目11. 可能遇到的问…...

【发票提取明细+发票号改名】批量提取PDF电子发票明细导出Excel表格并改名技术难点,批量PDF多区域内容识别提取明细并用内容改名的小结

1、图片版的发票提取表格改名 【批量图片发票识别表格】批量图片发票的提取Excel表格和提取字段改名&#xff0c;扫描发票识别表格&#xff0c;拍照发票识别表格&#xff0c;图片发票识别改名我们在工作中很多扫描发票&#xff0c;拍照发票&#xff0c;需要整理成excel表格&am…...

pyQT + OpenCV相关练习

一、设计思路 1、思路分析与设计 本段代码是一个使用 PyQt6 和 OpenCV 创建的图像处理应用程序。其主要功能是通过一个图形界面让用户对图片进行基本的图像处理操作&#xff0c;如灰度化、翻转、旋转、亮度与对比度调整&#xff0c;以及一些滤镜效果&#xff08;模糊、锐化、边…...

石岩路边理发好去处

周末带娃去罗租公园玩&#xff0c;罗租公园旁边就是百佳华和如意豪庭小区&#xff0c;发现如意豪庭小区对面挺多路边理发摊点 理发摊点聚焦在这里的原因是刚好前面城管来了暂时避避&#xff0c;例如还有一个阿姨剪到一半就跟着过来。这里的城管只是拍了一处没有摊位的地方&…...

音视频入门基础:MPEG2-PS专题(2)——使用FFmpeg命令生成ps文件

一、错误的命令 通过FFmpeg命令可以将mp4文件转换为ps文件&#xff0c;PS文件中包含PS流数据。 由于PS流/PS文件对应的FFInputFormat结构为&#xff1a; const FFInputFormat ff_mpegps_demuxer {.p.name "mpeg",.p.long_name NULL_IF_CONFIG_SMALL…...

整合版canal ha搭建--基于1.1.4版本

开启MySql Binlog&#xff08;1&#xff09;修改MySql配置文件&#xff08;2&#xff09;重启MySql服务,查看配置是否生效&#xff08;3&#xff09;配置起效果后&#xff0c;创建canal用户&#xff0c;并赋予权限安装canal-admin&#xff08;1&#xff09;解压 canal.admin-1…...

[python SQLAlchemy数据库操作入门]-15.联合查询,跨表获取股票数据

哈喽,大家好,我是木头左! 在开始探讨如何利用SQLAlchemy实现复杂的联合查询之前,首先需要深入理解其核心组件——对象关系映射(ORM)。ORM允许开发者使用Python类来表示数据库中的表,从而以一种更直观、面向对象的方式来操作数据库。 SQLAlchemy中的JOIN操作详解 在SQLA…...

PTA数据结构作业一

6-1 链表的插入算法 本题要求实现一个插入函数&#xff0c;实现在链表llist中的元素x之后插入一个元素y的操作。 函数接口定义&#xff1a; int InsertPost_link(LinkList llist, DataType x, DataType y); 其中 llist是操作的链表&#xff0c;x是待插入元素y的前驱节点元素…...

前端(九)js介绍(2)

js介绍(2) 文章目录 js介绍(2)一、函数1.1函数的两种形式1.2函数的作用域1.3声明与提升 二、bom操作三、dom操作 一、函数 1.1函数的两种形式 //有参函数 //js中的函数只能返回一个值&#xff0c;如果要返回多个需要放在数组或对象中 function func(a,b){return ab } func(1,…...

CUTLASS:高性能 CUDA 线性代数模板库详解

CUTLASS&#xff1a;高性能 CUDA 线性代数模板库详解 引言什么是 CUTLASS&#xff1f;CUTLASS 的主要特点&#xff1a; CUTLASS 的用途如何安装 CUTLASS1. 环境准备2. 下载 CUTLASS3. 构建 CUTLASS4. 设置环境变量5. 验证安装 使用 CUTLASSCUTLASS 的优势总结 引言 在深度学习…...

关于CISP报名费用详情

CISP即“注册信息安全专业人员”&#xff0c;是中国信息安全测评中心实施的国家认证项目&#xff0c;旨在培养信息安全领域的专业人才。对于有意报考CISP的考生而言&#xff0c;了解报名考试费用是备考过程中不可或缺的一环。 CISP的报名考试费用主要包括培训费用、考试费用、…...

css 关于flex布局中子元素的属性flex

css flex布局中子元素的属性flex 1. flex 是 flex-grow、flex-shrink 和 flex-basis 的简写 语法格式&#xff1a; flex: [flex-grow] [flex-shrink] [flex-basis];各属性解析&#xff1a; flex-grow: 子元素如何按比例分配父元素的 剩余空间。 默认值&#xff1a;0&#…...

功率器件热设计基础(四)——功率半导体芯片温度和测试方法

/ 前言 / 功率半导体热设计是实现IGBT、碳化硅SiC高功率密度的基础&#xff0c;只有掌握功率半导体的热设计基础知识&#xff0c;才能完成精确热设计&#xff0c;提高功率器件的利用率&#xff0c;降低系统成本&#xff0c;并保证系统的可靠性。 功率器件热设计基础系列文章会…...

OpenStack系列第四篇:云平台基础功能与操作(Dashboard)

文章目录 1. 镜像&#xff08;Image&#xff09;添加镜像查看镜像删除镜像 2. 卷&#xff08;Volume&#xff09;创建卷查看卷删除卷 3. 网络&#xff08;虚拟网络&#xff09;创建网络查看网络删除网络 4. 实例类型创建实例类型查看实例类型删除实例类型 4. 密钥对&#xff08…...

WebSocket封装

提示:记录工作中遇到的需求及解决办法 文章目录 前言二、背景三、WebSocket3.1 什么是 WebSocket ?为什么使用他?四、封装 WebSocket4.1 Javascript 版本4.2 Typescript 版本4.3 如何使用?五、我的痛点如何处理前言 本文将介绍 WebSocket 的封装,比如:心跳机制,重连和一…...

面试题解,JVM的运行时数据区

一、请简述JVM运行时数据区的组成结构及各部分作用 总览 从线程持有的权限来看 线程私有区 虚拟机栈 虚拟机栈是一个栈结构&#xff0c;由许多个栈帧组成&#xff0c;一个方法分配一个栈帧&#xff0c;线程每执行一个方法时都会有一个栈帧入栈&#xff0c;方法执行结束后栈帧…...

【Ubuntu使用技巧】Ubuntu22.04无人值守Crontab工具实战详解

一个愿意伫立在巨人肩膀上的农民...... Crontab是Linux和类Unix操作系统下的一个任务调度工具&#xff0c;用于周期性地执行指定的任务或命令。Crontab允许用户创建和管理计划任务&#xff0c;以便在特定的时间间隔或时间点自动运行命令或脚本。这些任务可以按照分钟、小时、日…...

Caffeine Cache Java缓存组件

缓存组件Caffeine Cache 定义介绍整合springboot用法整合spring-boot-starter-cache用法 定义介绍 特性 高性能&#xff1a;基于高效并发设计和 TinyLFU 算法&#xff0c;命中率高。 丰富策略&#xff1a;支持容量限制、过期时间、异步加载、自定义清理策略。 统计监控&#x…...

电子电气架构 --- 什么是自动驾驶技术中的域控制单元(DCU)?

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源,以现象替代逻辑,以情绪代替思考,把消极接受现实的懦弱,伪装成乐观面对不幸的…...

Redis核心技术知识点全集

Redis数据结构和常用命令 1. String字符串2. Hash哈希3. List列表4. Set集合5. Sorted Set有序集合6. Redis常用命令参考Redis事务机制...

【每日学点鸿蒙知识】文件读写、屏幕宽度亮度、扫一扫权限、编码器问题、wlan设置

1、参照文档&#xff0c;在操作文件时&#xff0c;读取不到内容或出现程序闪退&#xff1f; 参照文档&#xff0c;进行文件写入和读取时&#xff0c;出现读取不到或闪退 export function createFile() {// 获取应用文件路径let context getContext(this) as common.UIAbilit…...

后端开发-Maven

环境说明&#xff1a; windows系统&#xff1a;11版本 idea版本&#xff1a;2023.3.2 Maven 介绍 Apache Maven 是一个 Java 项目的构建管理和理解工具。Maven 使用一个项目对象模型&#xff08;POM&#xff09;&#xff0c;通过一组构建规则和约定来管理项目的构建&#xf…...

LiteFlow 流程引擎引入Spring boot项目集成pg数据库

文章目录 官网地址简要项目引入maven 所需jar包配置 PostgreSQL 数据库表使用LiteFlow配置 yml 文件通过 代码方式使用 liteflow数据库sql 数据在流程中周转 官网地址 https://liteflow.cc/ 简要 如果你要对复杂业务逻辑进行新写或者重构&#xff0c;用LiteFlow最合适不过。…...

电子电气架构 --- 汽车电子电器设计概述

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源,以现象替代逻辑,以情绪代替思考,把消极接受现实的懦弱,伪装成乐观面对不幸的…...

API 设计:从基础到最佳实践

https://levelup.gitconnected.com/api-design-101-from-basics-to-best-practices-a0261cdf8886 在本次深入研究中&#xff0c;我们将从基础开始&#xff0c;逐步了解 API 设计&#xff0c;并逐步实现定义卓越 API 的最佳实践。 作为开发人员&#xff0c;您可能熟悉其中的许多…...

简易内存池(中)

提示&#xff1a;文章 文章目录 前言一、背景二、第二版代码用例2用例3用例4用例5 总结 前言 前期疑问&#xff1a; 本文目标&#xff1a; 一、背景 最近 二、 针对上述失败用例&#xff0c;修改代码如下 第二版代码 #include <stdbool.h> #include <stdio.h>…...

svn不能添加.a文件

解决办法 在home目录下有一个.subversion文件夹&#xff0c;文件夹内有个config文件&#xff0c;里面可以修改过滤的文件类型 在使用命令svn add的时候带上参数–no-ignore&#xff0c;这样就会不顾config中的规则&#xff0c;将指定路径的文件都添加到版本库中 rockyrocky:/e…...

PH47代码框架 24241231 重要更新

仪式感一下&#xff1a;2024年最后一天&#xff0c;发布 PH47 代码框架的一次重要更新。当然这并不是有意的&#xff0c;而是直到现在才把更新的所有工作全部做完&#xff08;希望确实如此&#xff09;。 本次更新要点&#xff1a; 1、加入多IMU支持。本次更新正式加入对 MPU65…...

小程序信息收集(小迪网络安全笔记~

免责声明&#xff1a;本文章仅用于交流学习&#xff0c;因文章内容而产生的任何违法&未授权行为&#xff0c;与文章作者无关&#xff01;&#xff01;&#xff01; 附&#xff1a;完整笔记目录~ ps&#xff1a;本人小白&#xff0c;笔记均在个人理解基础上整理&#xff0c;…...

用户界面的UML建模07

4.2 抽象表示层的行为&#xff08;Abstract Presentation Behaviour&#xff09; AbstractForm 类定义了一组如下所示的四种操作&#xff1a; showForm() &#xff0c; getData() &#xff0c; sendConfirmation() 和sendCancellation()。在该阶段的设计过程&#xff08;desig…...

LabVIEW手部运动机能实验系统

在运动科学、人机交互和康复训练等领域&#xff0c;手部运动功能的研究具有重要的应用价值。开发了一个基于LabVIEW的手部运动机能实验系统设计&#xff0c;该系统利用力量作为关键参数&#xff0c;通过实时数据采集和反馈帮助受试者完成精确的手部动作&#xff0c;同时为研究人…...

Java Map 源码解析:核心原理与应用

Java Map 源码解析&#xff1a;核心原理与应用 Java 的 Map 接口是集合框架中一个重要的组成部分&#xff0c;专门用于存储键值对。其强大的功能和灵活的实现使其在各种应用场景中得到了广泛的使用。本文面向对 Java 集合框架有一定了解的开发者&#xff0c;通过对 Map 接口及…...

基于Mosquito源码理解MQTT5.0的属性概念

MQTT 5.0协议相比之前的版本(如MQTT 3.1.1)增加了很多属性,这些属性分布于报文的可变头部(Variable Header)和有效载荷(Payload)中。这些属性大大增强了协议的可扩展性和灵活性,使其能够更好地适应现代物联网应用的复杂需求。 属性的定义在源码包mosquitto-2.0.18/inc…...

easyui textbox使用placeholder无效

easyui textbox使用placeholder无效 在easyui 的textbox控件&#xff0c;请使用data-options 设定 示例 <input type text class easyui-textbox data-options "prompt:请输入您的邮箱"/>...

java AQS

什么是AQS AQS&#xff08;AbstractQueuedSynchronizer&#xff0c;抽象队列同步器&#xff09;是 Java 中并发控制的一种机制&#xff0c;位于 java.util.concurrent.locks 包下&#xff0c;它为构建锁、信号量等同步工具提供了一个框架。AQS 通过 队列 来管理多个线程之间的…...

机器人对物体重定向操作的发展简述

物体重定向操作的发展简述 前言1、手内重定向和外部重定向2、重定向原语3、重定向状态转换网络4、连续任意姿态的重定向5、利用其他环境约束重定向总结Reference 前言 对于一些特殊的任务&#xff08;如装配和打包&#xff09;&#xff0c;对物体放置的位姿由明确的要求&#…...

数据结构与算法之动态规划: LeetCode 72. 编辑距离 (Ts版)

编辑距离 https://leetcode.cn/problems/edit-distance/description/ 描述 给你两个单词 word1 和 word2&#xff0c; 请返回将 word1 转换成 word2 所使用的最少操作数你可以对一个单词进行如下三种操作&#xff1a; 插入一个字符删除一个字符替换一个字符 示例 1 输入&…...

vue3 Teleport瞬移组件

Teleport是瞬移组件&#xff0c;也称为传送门组件 它是一个可以使元素从一个组件转到另一个组件的组件。 如对话框、自定义菜单、警告提示、徽章&#xff0c;以及许多其他需要出现在特殊位置的自定义UI组件。假设现在页面中有两个元素&#xff0c;分别为div元素和button按钮元…...

Go语言学习路线

以下是一个较为系统的Go语言学习路线&#xff1a; 一、基础阶段 环境搭建与工具链熟悉 安装Go语言开发环境。在Go官方网站&#xff08;https://golang.org/dl/&#xff09;下载适合您操作系统的安装包并完成安装。 配置Go环境变量&#xff0c;如GOPATH和GOROOT。GOROOT是Go语…...

摄像头监视脚本

摄像头监视脚本&#xff0c;若检测到摄像头画面有变化&#xff0c;保存这一段视频 一、使用方法 1.运行脚本 默认参数Threshold3, Period3, path./recordings python cam.py --threshold30 --period3 --path./recordings 2.参数说明 threshold:摄像头捕获到的画面变化量阈值…...

【Leecode】Leecode刷题之路第97天之交错字符串

题目出处 97-交错字符串-题目出处 题目描述 个人解法 思路&#xff1a; todo代码示例&#xff1a;&#xff08;Java&#xff09; todo复杂度分析 todo官方解法 97-交错字符串-官方解法 方法1&#xff1a;动态规划 思路&#xff1a; class Solution {public boolean isInte…...

MAC环境安装(卸载)软件

MAC环境安装&#xff08;卸载&#xff09;软件 jdknode安装node&#xff0c;并实现不同版本的切换背景 卸载node从node官网下载pkg安装的node卸载用 homebrew 安装的node如果你感觉删的不够干净&#xff0c;可以再细分删除验证删除结果 jdk 1.下载jdk 先去官网下载自己需要的版…...

Spring Boot + Redisson 封装分布式锁

目标&#xff1a;一行代码调用&#xff0c;简单粗暴。 基操&#xff1a;自动加锁&#xff0c;自动解锁&#xff0c;自动处理异常&#xff0c;自动处理锁超时等。 安装 redis redisson <dependency><groupId>org.springframework.boot</groupId><artifac…...

从零开发一套UWB定位系统需要多长时间?UWB超宽带定位系统源码

从零开发一套UWB定位系统需要多长时间&#xff1f; 从零开发一套UWB定位系统所需的时间会受到多种因素的影响&#xff0c;以下是详细分析&#xff1a; 一、系统复杂度 1、基本功能定位系统 如果只是开发一个简单的UWB定位系统&#xff0c;仅实现基本的定位功能&#xff0c;如在…...

DataCap 2024.4.1 版本发布:MongoDB 驱动支持、工作流引擎升级

尊敬的 DataCap 用户&#xff1a; DataCap 2024.4.1 版本现已正式发布。本次更新包含多项重要功能升级和性能优化&#xff0c;现将主要更新内容公布如下&#xff1a; 核心功能升级 数据库功能增强 (实现功能) 新增数据库管理功能&#xff1a;支持创建、删除和切换数据库完善表…...

常见端口(22、25、53、80、443、110、143、3306、6379、21)和服务的安装与配置手册

文章目录 一、系统初始设置1. 系统与工具的基础配置1.1 系统更新1.2 网络连接测试1.3 工具安装 2. 防火墙配置2.1 启用防火墙服务2.2 检查默认规则2.3 开放常用端口2.4 查看已开放端口 二、常见端口及其用途1. 端口 22&#xff08;SSH&#xff09;2. 端口 25&#xff08;SMTP&a…...

使用maven-mvnd替换maven大大提升编译打包速度

先上结论&#xff01;&#xff01;&#xff01; 多模块清理并打包提升&#xff1a;约3.5倍 多模块不清理打包提升&#xff1a;约5.5倍 单模块提升&#xff1a;约2倍 从计算结果来看&#xff0c;多模块提升的效率更高。在使用mvnd package打包多模块式&#xff0c;可在控制台…...

图像去雾 | 基于Matlab的图像去雾系统(四种方法)

图像去雾 | 基于Matlab的图像去雾系统&#xff08;四种方法&#xff09; 目录 图像去雾 | 基于Matlab的图像去雾系统&#xff08;四种方法&#xff09;效果一览基本介绍程序设计参考资料 效果一览 基本介绍 基于Matlab的图像去雾系统&#xff08;四种方法&#xff09; 关于图像…...