使用Nacos 打造微服务配置中心
一、背景介绍
Nacos 作为服务注册中心的使用方式,同时 Nacos 还可以作为服务配置中心,用于集中式维护各个业务微服务的配置资源。
作为服务配置中心的交互流程图如下。
这样设计的目的,有一个明显的好处就是:有利于对各个微服务的配置资源进行统一维护和管理,尤其是要更新某个配置参数时,能避免大量人肉运维工作。
今天通过一些案例我们一起来了解一下,如何使用 Nacos 来实现服务配置中心的管理。
二、方案实践
2.1、创建配置
Nacos 安装过程与之前介绍的一样,Nacos 服务端启动后,进入到服务端管理页面,在“配置列表”功能页面中,点击右上角的“+”按钮,进入“新建配置”页面,创建配置内容,示例如下:
为了便于演示,在上文中我们创建了一个 dataId 为nacos-config-client.properties
,Group 为DEFAULT_GROUP
,内容为blog.name=张三
的配置信息。
在下文中,我们将会用到它。
2.2、创建客户端应用
首先,创建一个 Maven 工程,命名为nacos-config-client
,并在pom.xml
中引入相关的依赖内容,示例如下:
<properties><spring-boot.version>2.2.5.RELEASE</spring-boot.version><spring-cloud.version>Hoxton.SR3</spring-cloud.version><spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
</properties><dependencies><!-- SpringBoot web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Nacos 配置中心 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency>
</dependencies><dependencyManagement><dependencies><!-- 引入 springBoot 版本号 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency><!-- 引入 spring cloud 版本号 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><!-- 引入 spring cloud alibaba 适配的版本号 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba.version}</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>
接着,创建一个服务启动类。
@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class,args);}
}
然后,创建一个 web 接口,以便测试上文创建的配置变量是否能生效。
@RestController
@RefreshScope
public class HelloController {@Value("${blog.name}")private String name;@RequestMapping("/hello")public String hello() {return name;}
}
最后,在application.properties
配置文件中,添加 Nacos 服务配置中心地址,示例如下:
spring.application.name=nacos-config-client
server.port=9012# 设置Nacos配置中心地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
2.3、服务测试
将nacos-config-client
客户端服务启动起来,在浏览器中访问http://127.0.0.1:9012/hello
,如果不出意外的话,会返回如下结果。
此时说明 SpringBoot 已成功从 Nacos 服务端获取到相关的配置变量。
下面我们在 Nacos 中将blog.name
配置内容稍微修改一下,验证一下客户端的配置变量是否能动态刷新。
再次访问http://127.0.0.1:9012/hello
,返回结果如下图。
说明在 Nacos 中修改配置变量后,SpringBoot 也会自动刷新这个配置信息。
之所以能实现这种效果,主要得益于@RefreshScope
注解,它可以动态的从 Nacos 服务端获取最新的配置信息,并将其注入到 SpringBoot 中。
三、配置规则介绍
在上文中,我们简单的介绍了 Nacos 作为配置中心的使用方式。
例子中我们只配置了 Nacos 的配置中心地址信息,并没有配置任何其他规则就能成功的使用 Nacos 配置中心,它是如何做到的呢?
在 Nacos Spring Cloud 中有 5 个核心配置项,下面我们一起来看看它的作用。
spring.cloud.nacos.config.server-addr
:对应 Nacos 服务端地址spring.cloud.nacos.config.prefix
:对应 DataId 的前缀,默认值为应用名称,即spring.application.name
变量值spring.cloud.nacos.config.file-extension
:对应 DataId 的后缀,同时也是配置内容的文件格式,默认值为properties
spring.cloud.nacos.config.group
:对应 Group 参数,默认值为DEFAULT_GROUP
spring.cloud.nacos.config.namespace
:对应配置的命名空间,默认为空;常用于不同环境的配置隔离,如开发测试环境和生产环境的资源隔离等
默认情况下,Nacos Spring Cloud 加载出来的 dataId 完整格式如下:
${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
因此,在不做任何配置项目的情况下,当 DataId 的前缀和 Spring Boot 应用名称一致,就可以成功加载对应的配置项。
如果我们不想通过应用服务名称来加载 DataId,可以借助spring.cloud.nacos.config.prefix
相关规则来实现指定配置项的加载。
需要特别注意的是:由于 Spring Boot 加载顺序的缘故,自定义的配置项参数必须放在bootstrap.properties
文件或者bootstrap.yaml
文件中才能生效。
下面我们还是通过一个例子,来快速了解 Nacos Spring Cloud 相关配置规则的应用。
3.1、应用实践
下面我们以加载myConfig-dev.yaml
配置项为例,具体实现如下。
首先,创建一个myConfig-dev
配置项。
接着,创建一个bootstrap.properties
文件,并指定相关配置项,内容如下:
spring.application.name=nacos-config-client
server.port=9012# 指定运行环境
spring.profiles.active=dev# 设置Nacos配置中心地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
# 对应 DataId 的前缀,如果不设置默认取【spring.application.name】
spring.cloud.nacos.config.prefix=myConfig
# 对应 DataId 的后缀,同时也是配置内容的文件格式,默认值为properties
spring.cloud.nacos.config.file-extension=yaml
# 对应 Group 参数,默认值为DEFAULT_GROUP
spring.cloud.nacos.config.group=DEFAULT_GROUP
# 对应配置的命名空间,默认为空
spring.cloud.nacos.config.namespace=
然后,创建一个 web 接口,以便验证配置变量是否能生效。
@RestController
@RefreshScope
public class HelloController {@Value("${user.id}")private String id;@Value("${user.name}")private String name;@RequestMapping("/test")public String test() {return "id" + id + ",name:" + name;}
}
最后,再次启动服务,在浏览器中访问http://127.0.0.1:9012/hello
,如果不出意外的话,会返回如下内容。
说明,Spring Boot 已成功加载了指定配置项。
四、高级特性介绍
4.1、多环境配置介绍
在 Nacos 服务端,其实还隐含有三个核心的参数,分别是:Data ID
、Group
、Namespace
,我们可以利用它来实现更高级的功能。
这三个参数的层级关系,可以用如下图来概括。
每个参数的作用如下:
Namespace
:表示命名空间,通常用于不同环境的配置隔离,如开发测试环境和生产环境的资源隔离等Group
:表示分组管理Data ID
:也就是我们常说的配置项,也可以简单理解为我们所说的配置文件
实际上,我们可以利用这些层级概念的关系,根据自己的需要来实现多环境的管理。
下面我们一起来看看,几种常见的环境隔离配置实现。
4.1.1、profiles 隔离实现
在上文中我们也提到了 dataId 完整格式生成规则。
${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
因此,我们可以借助spring.profiles.active
来实现配置资源的隔离。
同时,profiles 隔离实现也在一种最常见的做法。
4.1.2、Group 隔离实现
Group 隔离实现就比较简单了,在 Nacos 服务管理平台新建配置的时候,填写所属分组。
最后,在客户端应用下填写对应的 Group 参数即可。
# 对应 Group 参数
spring.cloud.nacos.config.group=DEFAULT_GROUP
4.1.3、Namespace 隔离实现
Namespace 隔离实现主要通过命名空间来完成,在 Nacos 服务管理平台的命令空间下创建。
创建完成之后,在配置列表的最上方可以看到除了 public 之外,多了一个刚才创建的 Namepsace。
点击test
就可以切换到对应的命名空间,然后新建相关的配置项。
最后,在客户端应用下填写对应的 Namespace 参数即可。
# 对应配置的命名空间
spring.cloud.nacos.config.namespace=0c85c5cf-4421-4839-9998-ace7d8ecf5a8
需要注意的是,这里填写不是命名空间的名称,而是命名空间ID。
4.2、多文件加载介绍
在上文中我们介绍的都是单个配置文件的加载,而在实际的业务开发中,我们常常会碰到多个配置文件一起加载的场景,例如加载 Redis、RabbitMQ 等配置资源。
下面我们一起来看看相关的实现方式。
4.2.1、多个配置加载介绍
对于多个配置的加载,我们只需要做以下两步,就可以实现这个需求。
第一步:在 Nacos 中创建Data ID=redis.properties
和Data ID=rabbitmq.properties
的配置内容。
第二步:在 Spring Cloud 应用bootstrap.properties
文件中,通过spring.cloud.nacos.config.extension-configs
参数配置需要加载的文件,具体如下。
# 设置多文件加载,并支持动态刷新
spring.cloud.nacos.config.extension-configs[0].data-id=redis.properties
spring.cloud.nacos.config.extension-configs[0].group=DEFAULT_GROUP
spring.cloud.nacos.config.extension-configs[0].refresh=true
spring.cloud.nacos.config.extension-configs[1].data-id=rabbitmq.properties
spring.cloud.nacos.config.extension-configs[1].group=DEFAULT_GROUP
spring.cloud.nacos.config.extension-configs[1].refresh=true
当服务启动的时候,Nacos 客户端会自动从服务端获取相关的配置资源加载到 Spring Boot 应用中。
4.2.2、共享配置加载介绍
通过上面加载多个配置文件的例子,我们已经可以实现不同的应用共享配置的需求了。
对于共享配置使用,Nacos 还提供了另一种更便捷的配置方式,比如下面的配置与上面使用的多文件加载配置,作用是等价的。
# 设置多个共享配置文件加载,并支持动态刷新
spring.cloud.nacos.config.shared-configs[0].data-id=redis.properties
spring.cloud.nacos.config.shared-configs[0].group=DEFAULT_GROUP
spring.cloud.nacos.config.shared-configs[0].refresh=true
spring.cloud.nacos.config.shared-configs[1].data-id=rabbitmq.properties
spring.cloud.nacos.config.shared-configs[1].group=DEFAULT_GROUP
spring.cloud.nacos.config.shared-configs[1].refresh=true
4.2.3、配置加载的优先级介绍
当我们加载多个配置的时候,如果存在相同的 key,配置加载的优先级是怎样的呢?
Nacos Config 目前提供了三种配置能力从 Nacos 拉取相关的配置,分别如下:
- A:通过
spring.cloud.nacos.config.shared-dataids
定义的共享配置 - B:通过
spring.cloud.nacos.config.ext-config[n].data-id
定义的扩展配置 - C:通过内部相关规则(
应用名、应用名+ Profile
)生成的配置
当三种方式同时存在的时候,他们的优先级关系为A < B < C
,也就是说优先级高的会覆盖优先级底的配置。
五、小结
最后总结一下,Nacos 是 Spring Cloud Alibaba 体系中最重要的组件之一,既可以用于服务注册中心,也可以用于服务配置中心。在微服务技术体系中,应用非常广泛,因此掌握 Nacos 相关技术的使用,对我们项目的开发会有显著的帮助。
六、实战
1. 安装与启动 Nacos
下载 Nacos
从 Nacos 的 GitHub 仓库(https://github.com/alibaba/nacos/releases)下载适合你系统的版本,解压下载好的压缩包。
启动 Nacos
- Windows 系统:打开命令提示符,进入 Nacos 的
bin
目录,执行以下命令启动 Nacos:
startup.cmd -m standalone
- Linux/Mac 系统:打开终端,进入 Nacos 的
bin
目录,执行以下命令启动 Nacos:
这里的 -m standalone
表示以单机模式启动。启动成功后,在浏览器中访问 http://localhost:8848/nacos
,使用默认用户名 nacos
和密码 nacos
登录 Nacos 控制台。
2. 创建配置
登录 Nacos 控制台
打开浏览器,访问 http://localhost:8848/nacos
,输入用户名 nacos
和密码 nacos
登录。
创建配置文件
在控制台左侧导航栏中选择 “配置管理” -> “配置列表”,点击 “+” 号创建新的配置。填写以下信息
- Data ID:配置文件的唯一标识,通常采用
应用名.properties
或应用名.yml
的格式,例如example-service.properties
。 - Group:配置分组,默认为
DEFAULT_GROUP
。 - 配置格式:根据实际情况选择
properties
或yaml
。 - 配置内容:输入具体的配置信息,例如在
example-service.properties
中可以添加如下内容:
properties
server.port=8081
spring.datasource.url=jdbc:mysql://localhost:3306/example_db
spring.datasource.username=root
spring.datasource.password=123456
3. 在微服务中集成 Nacos 配置中心
添加依赖
以 Spring Boot 项目为例,在 pom.xml
中添加 Nacos 配置中心的依赖:
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
配置 Nacos 客户端
在 src/main/resources
目录下创建 bootstrap.properties
或 bootstrap.yml
文件,添加以下配置:
spring.application.name=example-service
spring.cloud.nacos.config.server-addr=localhost:8848
spring.cloud.nacos.config.file-extension=properties
这里的 spring.application.name
要与在 Nacos 控制台创建的配置文件的 Data ID
中的应用名一致,spring.cloud.nacos.config.server-addr
是 Nacos 服务器的地址,spring.cloud.nacos.config.file-extension
是配置文件的格式。
获取配置信息
在 Spring Boot 项目中,可以使用 @Value
注解或 @ConfigurationProperties
注解来获取配置信息。以下是使用 @Value
注解的示例:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class ConfigController {@Value("${server.port}")private String serverPort;@GetMapping("/config")public String getConfig() {return "Server port: " + serverPort;}
}
4. 动态刷新配置
开启动态刷新
在需要动态刷新配置的类上添加 @RefreshScope
注解,例如:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RefreshScope
public class ConfigController {@Value("${server.port}")private String serverPort;@GetMapping("/config")public String getConfig() {return "Server port: " + serverPort;}
}
测试动态刷新
当在 Nacos 控制台修改配置信息并发布后,无需重启微服务,调用 /config
接口即可获取到最新的配置信息。
5. 多环境配置管理
创建不同环境的配置文件
在 Nacos 控制台分别创建不同环境(如开发、测试、生产)的配置文件,例如 example-service-dev.properties
、example-service-test.properties
、example-service-prod.properties
。
根据环境加载配置
在 bootstrap.properties
中添加 spring.profiles.active
属性来指定当前环境,例如:
spring.application.name=example-service
spring.cloud.nacos.config.server-addr=localhost:8848
spring.cloud.nacos.config.file-extension=properties
spring.profiles.active=dev
这样,微服务将加载 example-service-dev.properties
中的配置信息。
通过以上步骤,你就可以使用 Nacos 打造一个功能完善的微服务配置中心,实现配置的集中管理和动态刷新。
相关文章:
使用Nacos 打造微服务配置中心
一、背景介绍 Nacos 作为服务注册中心的使用方式,同时 Nacos 还可以作为服务配置中心,用于集中式维护各个业务微服务的配置资源。 作为服务配置中心的交互流程图如下。 这样设计的目的,有一个明显的好处就是:有利于对各个微服务…...
C++——多态、抽象类和接口
目录 多态的基本概念 如何实现多态 在C中,派生类对象可以被当作基类对象使用 编程示例 关键概念总结 抽象类 一、抽象类的定义 基本语法 二、抽象类的核心特性 1. 不能直接实例化 2. 派生类必须实现所有纯虚函数才能成为具体类 3. 可以包含普通成员函数和…...
模拟实现strncat、qsort、atoi
目录 前言 一、模拟实现strncat 参数 代码演示: 二、模拟实现qsort 参数 代码演示: 前言 本文主要是对strncat,qsort,atoi的模拟实现 一、模拟实现strncat C 库函数 char *strncat(char *dest, const char *src, size_t n…...
记录学习的第三十天
今天终于又开始写博客了。 还是滑动窗口问题,这段时间不出意外都是这了 上面的思路是我自己做的,但是不知道为什么不行,有没有大佬能指点一下我。 接下来这道题是进阶的。不过我之前的基础都做的很艰难,道阻且长啊。...
图像预处理-直方图均衡化
一.什么是直方图 反映图像像素分布的统计图,横坐标就是图像像素的取值,纵坐标是该像素的个数。 二.绘制直方图 histcv2.calcHist(images, channels, mask, histSize, ranges) - images:输入图像列表(必须用[ ]包裹)&a…...
应用案例|兵器重工:某体系需求视图模型开发
某体系需求视图模型开发 一、项目背景 本项目为某体系的需求视图模型开发,其中体系设计建模过程可以分解为7大部分,即建模前期准备、全景视点模型正向设计、能力视点模型正向设计、作战视点模型正向设计、系统视点模型正向设计、体系模型反向追溯设计以…...
YOLOv8改进:ShapeIoU与InnerShapeIoU损失函数的理论与实践
文章目录 YOLOv8 损失函数概述ShapeIoU 与 InnerShapeIoU 损失介绍ShapeIoU 损失InnerShapeIoU 损失 ShapeIoU 和 InnerShapeIoU 损失函数的实现ShapeIoU 损失函数代码实现InnerShapeIoU 损失函数代码实现损失函数在 YOLOv8 中的应用 实验效果与分析ShapeIoU 和 InnerShapeIoU …...
用Go语言正则,如何爬取数据
文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons:JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram,自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 ? 5 IDEA必装的插件&…...
Java中实现单例模式的多种方法:原理、实践与优化
单例模式(Singleton Pattern)是设计模式中最简单且最常用的模式之一,旨在确保一个类只有一个实例,并提供全局访问点。在 Java 开发中,单例模式广泛应用于配置管理、日志记录、数据库连接池和线程池等场景。然而&#x…...
Pikachu靶场-RCE漏洞
1. RCE漏洞原理 核心问题:应用程序未对用户输入进行严格过滤,直接将输入内容拼接至系统命令、代码执行函数或反序列化过程中。常见触发场景:命令注入:用户输入被拼接到操作系统命令(如system()、exec())。代…...
OpenCv高阶(七)——图像拼接
目录 一、图像拼接的原理过程 1. 特征检测与描述(Feature Detection & Description) 2. 特征匹配(Feature Matching) 3. 图像配准(Image Registration) 4. 图像变换与投影(Warping&…...
电商系统用户需求报告(示例)
目录 电商系统用户需求报告 1. 引言 1.1 目的 1.2 范围 2. 用户角色与核心需求 2.1 消费者 2.2 商家 2.3 平台管理方 3. 非功能性需求 4. 业务流程 4.1 消费者购物流程 4.2 商家入驻流程…...
图像挖掘课程笔记-第一章:了解机器视觉
一、什么是图像挖掘(Image Mining)? 图像挖掘是一种从大量图像中自动提取有用信息、知识或模式的技术,它融合了图像处理、机器学习、数据库、人工智能、数据挖掘等多个领域的内容。 🧠 图像挖掘与图像处理的区别 图像…...
Spring集合注入Bean
Spring框架中实现Bean集合注入的详细方法 1. 基础自动注入方式1.1 使用Autowired注入List1.2 使用Autowired注入Map 2. 更精细的控制方式2.1 使用Qualifier进行筛选2.2 使用自定义注解筛选 3. Java配置类方式4. 排序注入的Bean集合4.1 使用Order注解4.2 实现Ordered接口 5. 条件…...
实验一 进程控制实验
一、实验目的 1、掌握进程的概念,理解进程和程序的区别。 2、认识和了解并发执行的实质。 3、学习使用系统调用fork()创建新的子进程方法,理解进程树的概念。 4、学习使用系统调用wait()或waitpid()实现父子进程同步。 5、学习使用getpid()和getppi…...
[预备知识]4. 概率基础
概率基础 本章节介绍深度学习中的概率基础知识,包括基本概念、概率分布和统计推断。 1. 概率基础 1.1 基本概念 随机变量:可以取不同值的变量,其值由随机试验的结果决定概率分布:描述随机变量取值的可能性分布条件概率&#x…...
第33周JavaSpringCloud微服务 电商进阶开发
一、课程介绍 1. 定时任务 课程主题 :Spring Cloud 电商进阶开发定时任务定义 :学习什么是定时任务。定时任务学习内容 :定时任务实现方法、cron 表达式。定时任务实践 :在 Spring 中使用 schedule 注解,定期关闭过期…...
基于cubeMX的hal库STM32实现硬件IIC通信控制OLED屏
1、通常的方法是使用软件模拟IIC来实现OLED屏的显示控制,这里用STM32单片机的硬件IIC来实现OLED屏的显示,主控芯片为STM32F103RCT6,正点原子mini开发板。 2、cubemx配置过程 (1)配置时钟和下载 (2&#x…...
游戏工作室为何要更换IP进行多开?工作室使用代理IP要注意什么?
在当今的游戏产业中,游戏工作室为了提升效率、规避风险或突破平台限制,常常需要通过更换IP进行多开操作。这一现象背后涉及技术、商业规则和网络安全等多重因素,而代理IP的选择与使用也成为工作室运营中的关键环节。以下是关于游戏工作室为何…...
postgreSQL 如何使用 dblink
SELECT b.id, flow_name, user_id,u.name FROM bpm_form_info b JOIN vrms_user u on b.user_idu.id dblink SELECT b.id, flow_name, user_id,u.name FROM bpm_form_info b – vrms_user u on b.user_idu.id JOIN dblink( ‘dbnameuser_db userpostgres passwordWs199612’,…...
121.在 Vue3 中使用 OpenLayers 实现去掉鼠标右键默认菜单并显示 Feature 信息
🎯 实现效果 👇 本文最终实现的效果如下: ✅ 地图初始化时绘制一个多边形; ✅ 鼠标 右键点击地图任意位置; ✅ 若命中 Feature,则弹出该图形的详细信息; ✅ 移除浏览器默认的右键菜单,保留地图交互的完整控制。 💡 整个功能基于 Vue3 + OpenLayers 完成,采用 Com…...
复盘20250422
深度分析及个股推荐 1. 行业前景与个股逻辑梳理 从提供的股票信息来看,主要涉及以下行业:合成尼古丁(电子烟)、化工、跨境支付、跨境电商、农药、食品饮料、光刻机、电子商务、造纸等。需结合行业景气度、政策支持、公司核心竞争…...
MQ底层原理
RabbitMQ 概述 RabbitMQ 是⼀个开源的⾼性能、可扩展、消息中间件(Message Broker),实现了 Advanced Message Queuing Protocol(AMQP)协议,可以帮助不同应⽤程序之间进⾏通信和数据交换。RabbitMQ 是由 E…...
30分钟编写十大排序算法完成
import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List;//排序算法 public class test_04_22 {public static void swap(int[] nums, int i, int j){int temp nums[i];nums[i] nums[j];nums[j] temp;}//冒泡排序-稳定…...
为什么家电主板采用GND走线而不是整面铺GND铜
不管什么接地方式,本质是为了使得电流的回流路径最短。只要电流的回流路径最短,怎么都可以! 如下图的芯片的一个信号的回流路径,是一个很糟糕的接地!!!!!!&a…...
NVIDIA 自动驾驶技术见解
前言 参与 NVIDIA自动驾驶开发者实验室 活动,以及解读了 NVIDIA 安全报告 自动驾驶 白皮书,本文是我的一些思考和见解。自动驾驶技术的目标是为了改善道理安全、减少交通堵塞,重塑更安全、高效、包容的交通生态。在这一领域,NVI…...
真我推出首款 AI 翻译耳机,支持 32 种语言翻译
2025 年 4 月 22 日,真我手机官微宣布,其首款 AI 翻译耳机 Buds Air7 Pro 将于 4 月 23 日 16 时正式上市1。这款耳机接入了讯飞星火认知大模型 4.0 Ultra,支持中文与 32 种语言面对面翻译,以及同声传译功能。 除了 AI 翻译功能&a…...
如何简化复杂流程提升执行效率
简化复杂流程、提升执行效率的关键在于:聚焦核心目标、减少冗余环节、推动系统自动化、赋能一线决策、流程分级设计。其中,聚焦核心目标 是流程优化的第一步。流程不该为了“流程而流程”,而应服务于业务目标。Gartner在《数字化运营报告》中…...
动态规划算法:完全背包类问题
前言 现在我们考虑下面的问题: (1)小明有一个背包,背包容积为v,有m种物品,其中第i种物品的价值为val[i],体积为t[i],每样物品有无限个,请问背包内物品总价值最大为多少?…...
数据存储方式补码原码反码
1. 关于数据存储(补码、原码、反码) 有符号类型(Signed Types) 存储方式:现代计算机普遍采用 补码(Two’s Complement) 存储有符号整数。 原码:最高位为符号位(0正&…...
【AAudio】A2dp sink创建音频轨道的源码流程分析
一、AAudio概述 AAudio 是 Android 8.0(API 级别 26)引入的 C/C++ 原生音频 API,专为需要低延迟、高性能音频处理的应用设计,尤其适用于实时音频应用(如音频合成器、音乐制作工具、游戏音效等)。 1.1 主要特点 低延迟:通过减少音频数据在内核与用户空间之间的拷贝,直…...
黑马点评之Feed流技术实现关注推送与滚动分页查询
Feed流 关注推送也叫做Feed流,直译为“投喂”。为用户持续的提供“沉浸式体验”,通过无限下拉刷新获取新的信息。 Feed流(信息流)是一种常见的内容分发形式,通过动态更新的内容列表向用户展示个性化或实时信息。典型应…...
vue3+canvas裁剪框样式【前端】
目录 canvas绘制裁剪框:拖拽改变框的大小:圆圈样式:方块样式: canvas绘制裁剪框: // 绘制裁剪框 const drawCropRect (ctx: CanvasRenderingContext2D): void > {if (cropRect.value.width > 0 && crop…...
Python 设计模式:模板模式
1. 什么是模板模式? 模板模式是一种行为设计模式,它定义了一个操作的算法的骨架,而将一些步骤延迟到子类中。模板模式允许子类在不改变算法结构的情况下,重新定义算法的某些特定步骤。 模板模式的核心思想是将算法的固定部分提取…...
usb2.0的硬件知识(一)
一、USB2.0的硬件知识 1.1 USB2.0速率 USB 2.0协议支持3种速率:低速(Low Speed,1.5Mbps)、全速(Full Speed, 12Mbps)、高速(High Speed, 480Mbps);USB Hub、USB设备,也分为低速、全速、高速三种类型。 1.2 USB2.0硬件线序组成 U…...
LangGraph(二)——QuickStart样例中的第二步
目录 1. 添加依赖2. 官网QuickStart——第二步:用工具增强聊天机器人2.1 Tavily Search2.2 简单测试Tavily Search2.3 添加带工具的ChatBot node2.4 添加tool node2.5 添加条件边2.6 可视化StateGraph2.7 构建聊天循环 参考 1. 添加依赖 LangGraph(一)——QuickStar…...
机器学习第二篇 多变量线性回归
数据集:世界幸福指数数据集中的变量有幸福指数排名、国家/地区、幸福指数得分、人均国内生产总值、健康预期寿命、自由权、社会支持、慷慨程度、清廉指数。我们选择GDP per Capita和Freedom,来预测幸福指数得分。 文件一:linear,…...
【MCP Node.js SDK 全栈进阶指南】中级篇(3):MCP高级资源设计
前言 在MCP TypeScript-SDK的初级篇中,我们介绍了资源开发的基础知识,包括静态资源与动态资源的创建、资源模板设计与参数提取,以及基本的资源列表与发现机制。随着应用规模的扩大和复杂性的提高,我们需要更加高级的资源设计方案来应对各种挑战。 本文作为中级篇的第三篇…...
PostgreSQL 常用日志
PostgreSQL 常用日志详解 PostgreSQL 提供了多种日志类型,用于监控数据库活动、排查问题和优化性能。以下是 PostgreSQL 中最常用的日志类型及其配置和使用方法。 一、主要日志类型 日志类型文件位置主要内容用途服务器日志postgresql-<日期>.log服务器运行…...
PostgreSQL认证培训推荐机构
首先来看一张2025年4月份db-engines上的数据库排行情况,前三名是雷打不动的Oracle、MySQL、Microsoft SQL Server,排名第四的就是我们今天的主角 - PostgreSQL数据库,从这张图上可以看出,PostgreSQL数据库的上升超非常明显&#x…...
2025年NISP一级题库试题
NISP一级考试只考50道单选题,难度不算大,话不多说,直接上硬菜! 1、物理销毁的方式不包括() .消磁 B.焚化炉烧毀 C.反复覆写数据 D.机器硏磨粉碎 2、信息安全应该建立贯穿信息系统的整个生命周期…...
pip install pymysql报错
python安装pymysql报错解决 【现象】 很多时候会出现安装pip包报错的问题,看过很多网上教程以及ai都是如下说法: 镜像问题pip版本问题ssh证书问题网络问题… 在遇见这些情况时,上述的各种解决方法都一一实验过但最后都是ERROR。 【解决办…...
达梦官方管理工具 SQLark 更新--不仅支持达梦、Oracle、MySQL,还新增 PostgreSQL 数据库!
SQLark 是一款面向信创应用开发者的数据库开发和管理工具,用于快速查询、创建和管理不同类型的数据库系统,已支持达梦、Oracle、MySQL数据库;在最新的 V3.4 版本中,SQLark 新增了对 PostgreSQL 的支持,兼容 PostgreSQL…...
Windows 同步-互锁变量访问
互锁变量访问 应用程序必须同步对多个线程共享的变量的访问。 应用程序还必须确保对这些变量的作以原子方式执行(完全或根本不执行)。 对正确对齐的 32 位变量的简单读取和写入是原子作。 换句话说,你最终不会只更新变量的一部分;所有位都以…...
前端学习笔记
文章目录 前端主要内容基于脚手架创建前端工程vue的基本使用axios 路由Vue-Router路由组成嵌套路由 状态管理 vuex心得 前端主要内容 HTML、CSS JavaScript axios Vue基础语法(router、vuex、typescript) Element UI 基于脚手架创建前端工程 node.js …...
2025-04-22| Docker: --privileged参数详解
在 Docker 中,--privileged 是一个运行容器时的标志,它赋予容器特权模式,大幅提升容器对宿主机资源的访问权限。以下是 --privileged 的作用和相关细节: 作用 完全访问宿主机的设备: 容器可以访问宿主机的所有设备&am…...
Java八股 深入理解Spring的AOP 面向切面编程 底层 保姆级教程 手写例子
目录 概念 AOP 术语 1. 连接点(Jointpoint): 2. 切入点(Pointcut): 3. 通知(Advice): 4. 方面/切面(Aspect): 5. 引入ÿ…...
macOS安全隐私最佳实践分析
1. 引言 随着数字世界的不断扩展,个人和组织面临的安全与隐私威胁也日益增加。作为专业的安全合规与隐私保护研究团队,Kaamel 对 macOS 系统的安全隐私现状进行了全面分析,并提出了一系列最佳实践建议,旨在帮助用户更好地保护自己…...
WeakSet:JavaScript 中容易被忽视的“弱集合”
目录 WeakSet 详解 基本概念 创建 WeakSet WeakSet 的主要方法 WeakSet 的特性 WeakSet 的使用场景 1. 避免内存泄漏(DOM 元素管理) 2. 临时缓存系统 3. 私有属性模拟 4. 防止循环引用 与其他数据结构的对比 1. WeakSet 没有实例属性 2. We…...
Discuz!+DeepSeek:传统论坛的智能化蜕变之路
在数字化浪潮中,社区论坛作为互联网早期的产物,面临着功能单一、用户体验滞后的发展瓶颈。虎跃办公(https://www.huyueapp.com)通过Discuz!搭建的网址导航网站,在集成DeepSeek的AI能力后,成功实现了从工具导…...