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

使用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 IDGroupNamespace,我们可以利用它来实现更高级的功能。

这三个参数的层级关系,可以用如下图来概括。

每个参数的作用如下:

  • 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.propertiesData 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
  • 配置格式:根据实际情况选择 propertiesyaml
  • 配置内容:输入具体的配置信息,例如在 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.propertiesbootstrap.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.propertiesexample-service-test.propertiesexample-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 作为服务注册中心的使用方式&#xff0c;同时 Nacos 还可以作为服务配置中心&#xff0c;用于集中式维护各个业务微服务的配置资源。 作为服务配置中心的交互流程图如下。 这样设计的目的&#xff0c;有一个明显的好处就是&#xff1a;有利于对各个微服务…...

C++——多态、抽象类和接口

目录 多态的基本概念 如何实现多态 在C中&#xff0c;派生类对象可以被当作基类对象使用 编程示例 关键概念总结 抽象类 一、抽象类的定义 基本语法 二、抽象类的核心特性 1. 不能直接实例化 2. 派生类必须实现所有纯虚函数才能成为具体类 3. 可以包含普通成员函数和…...

模拟实现strncat、qsort、atoi

目录 前言 一、模拟实现strncat 参数 代码演示&#xff1a; 二、模拟实现qsort 参数 代码演示&#xff1a; 前言 本文主要是对strncat&#xff0c;qsort&#xff0c;atoi的模拟实现 一、模拟实现strncat C 库函数 char *strncat(char *dest, const char *src, size_t n…...

记录学习的第三十天

今天终于又开始写博客了。 还是滑动窗口问题&#xff0c;这段时间不出意外都是这了 上面的思路是我自己做的&#xff0c;但是不知道为什么不行&#xff0c;有没有大佬能指点一下我。 接下来这道题是进阶的。不过我之前的基础都做的很艰难&#xff0c;道阻且长啊。...

图像预处理-直方图均衡化

一.什么是直方图 反映图像像素分布的统计图&#xff0c;横坐标就是图像像素的取值&#xff0c;纵坐标是该像素的个数。 二.绘制直方图 histcv2.calcHist(images, channels, mask, histSize, ranges) - images&#xff1a;输入图像列表&#xff08;必须用[ ]包裹&#xff09;&a…...

应用案例|兵器重工:某体系需求视图模型开发

某体系需求视图模型开发 一、项目背景 本项目为某体系的需求视图模型开发&#xff0c;其中体系设计建模过程可以分解为7大部分&#xff0c;即建模前期准备、全景视点模型正向设计、能力视点模型正向设计、作战视点模型正向设计、系统视点模型正向设计、体系模型反向追溯设计以…...

YOLOv8改进:ShapeIoU与InnerShapeIoU损失函数的理论与实践

文章目录 YOLOv8 损失函数概述ShapeIoU 与 InnerShapeIoU 损失介绍ShapeIoU 损失InnerShapeIoU 损失 ShapeIoU 和 InnerShapeIoU 损失函数的实现ShapeIoU 损失函数代码实现InnerShapeIoU 损失函数代码实现损失函数在 YOLOv8 中的应用 实验效果与分析ShapeIoU 和 InnerShapeIoU …...

用Go语言正则,如何爬取数据

文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons&#xff1a;JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram&#xff0c;自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 &#xff1f; 5 IDEA必装的插件&…...

Java中实现单例模式的多种方法:原理、实践与优化

单例模式&#xff08;Singleton Pattern&#xff09;是设计模式中最简单且最常用的模式之一&#xff0c;旨在确保一个类只有一个实例&#xff0c;并提供全局访问点。在 Java 开发中&#xff0c;单例模式广泛应用于配置管理、日志记录、数据库连接池和线程池等场景。然而&#x…...

Pikachu靶场-RCE漏洞

1. RCE漏洞原理 核心问题&#xff1a;应用程序未对用户输入进行严格过滤&#xff0c;直接将输入内容拼接至系统命令、代码执行函数或反序列化过程中。常见触发场景&#xff1a;命令注入&#xff1a;用户输入被拼接到操作系统命令&#xff08;如system()、exec()&#xff09;。代…...

OpenCv高阶(七)——图像拼接

目录 一、图像拼接的原理过程 1. 特征检测与描述&#xff08;Feature Detection & Description&#xff09; 2. 特征匹配&#xff08;Feature Matching&#xff09; 3. 图像配准&#xff08;Image Registration&#xff09; 4. 图像变换与投影&#xff08;Warping&…...

​​电商系统用户需求报告(示例)

目录 电商系统用户需求报告​​ ​​1. 引言​​ 1.1 目的 1.2 范围 ​​2. 用户角色与核心需求​​ ​​2.1 消费者​​ ​​2.2 商家​​ ​​2.3 平台管理方​​ ​​3. 非功能性需求​​ ​​4. 业务流程​​ ​​4.1 消费者购物流程​​ ​​4.2 商家入驻流程…...

图像挖掘课程笔记-第一章:了解机器视觉

一、什么是图像挖掘&#xff08;Image Mining&#xff09;&#xff1f; 图像挖掘是一种从大量图像中自动提取有用信息、知识或模式的技术&#xff0c;它融合了图像处理、机器学习、数据库、人工智能、数据挖掘等多个领域的内容。 &#x1f9e0; 图像挖掘与图像处理的区别 图像…...

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、掌握进程的概念&#xff0c;理解进程和程序的区别。 2、认识和了解并发执行的实质。 3、学习使用系统调用fork()创建新的子进程方法&#xff0c;理解进程树的概念。 4、学习使用系统调用wait()或waitpid()实现父子进程同步。 5、学习使用getpid()和getppi…...

[预备知识]4. 概率基础

概率基础 本章节介绍深度学习中的概率基础知识&#xff0c;包括基本概念、概率分布和统计推断。 1. 概率基础 1.1 基本概念 随机变量&#xff1a;可以取不同值的变量&#xff0c;其值由随机试验的结果决定概率分布&#xff1a;描述随机变量取值的可能性分布条件概率&#x…...

第33周JavaSpringCloud微服务 电商进阶开发

一、课程介绍 1. 定时任务 课程主题 &#xff1a;Spring Cloud 电商进阶开发定时任务定义 &#xff1a;学习什么是定时任务。定时任务学习内容 &#xff1a;定时任务实现方法、cron 表达式。定时任务实践 &#xff1a;在 Spring 中使用 schedule 注解&#xff0c;定期关闭过期…...

基于cubeMX的hal库STM32实现硬件IIC通信控制OLED屏

1、通常的方法是使用软件模拟IIC来实现OLED屏的显示控制&#xff0c;这里用STM32单片机的硬件IIC来实现OLED屏的显示&#xff0c;主控芯片为STM32F103RCT6&#xff0c;正点原子mini开发板。 2、cubemx配置过程 &#xff08;1&#xff09;配置时钟和下载 &#xff08;2&#x…...

游戏工作室为何要更换IP进行多开?工作室使用代理IP要注意什么?

在当今的游戏产业中&#xff0c;游戏工作室为了提升效率、规避风险或突破平台限制&#xff0c;常常需要通过更换IP进行多开操作。这一现象背后涉及技术、商业规则和网络安全等多重因素&#xff0c;而代理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. 行业前景与个股逻辑梳理 从提供的股票信息来看&#xff0c;主要涉及以下行业&#xff1a;合成尼古丁&#xff08;电子烟&#xff09;、化工、跨境支付、跨境电商、农药、食品饮料、光刻机、电子商务、造纸等。需结合行业景气度、政策支持、公司核心竞争…...

MQ底层原理

RabbitMQ 概述 RabbitMQ 是⼀个开源的⾼性能、可扩展、消息中间件&#xff08;Message Broker&#xff09;&#xff0c;实现了 Advanced Message Queuing Protocol&#xff08;AMQP&#xff09;协议&#xff0c;可以帮助不同应⽤程序之间进⾏通信和数据交换。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铜

不管什么接地方式&#xff0c;本质是为了使得电流的回流路径最短。只要电流的回流路径最短&#xff0c;怎么都可以&#xff01; 如下图的芯片的一个信号的回流路径&#xff0c;是一个很糟糕的接地&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&a…...

NVIDIA 自动驾驶技术见解

前言 参与 NVIDIA自动驾驶开发者实验室 活动&#xff0c;以及解读了 NVIDIA 安全报告 自动驾驶 白皮书&#xff0c;本文是我的一些思考和见解。自动驾驶技术的目标是为了改善道理安全、减少交通堵塞&#xff0c;重塑更安全、高效、包容的交通生态。在这一领域&#xff0c;NVI…...

真我推出首款 AI 翻译耳机,支持 32 种语言翻译

2025 年 4 月 22 日&#xff0c;真我手机官微宣布&#xff0c;其首款 AI 翻译耳机 Buds Air7 Pro 将于 4 月 23 日 16 时正式上市1。这款耳机接入了讯飞星火认知大模型 4.0 Ultra&#xff0c;支持中文与 32 种语言面对面翻译&#xff0c;以及同声传译功能。 除了 AI 翻译功能&a…...

如何简化复杂流程提升执行效率

简化复杂流程、提升执行效率的关键在于&#xff1a;聚焦核心目标、减少冗余环节、推动系统自动化、赋能一线决策、流程分级设计。其中&#xff0c;聚焦核心目标 是流程优化的第一步。流程不该为了“流程而流程”&#xff0c;而应服务于业务目标。Gartner在《数字化运营报告》中…...

动态规划算法:完全背包类问题

前言 现在我们考虑下面的问题&#xff1a; &#xff08;1&#xff09;小明有一个背包&#xff0c;背包容积为v&#xff0c;有m种物品&#xff0c;其中第i种物品的价值为val[i]&#xff0c;体积为t[i]&#xff0c;每样物品有无限个&#xff0c;请问背包内物品总价值最大为多少?…...

数据存储方式补码原码反码

1. 关于数据存储&#xff08;补码、原码、反码&#xff09; 有符号类型&#xff08;Signed Types&#xff09; 存储方式&#xff1a;现代计算机普遍采用 补码&#xff08;Two’s Complement&#xff09; 存储有符号整数。 原码&#xff1a;最高位为符号位&#xff08;0正&…...

【AAudio】A2dp sink创建音频轨道的源码流程分析

一、AAudio概述 AAudio 是 Android 8.0(API 级别 26)引入的 C/C++ 原生音频 API,专为需要低延迟、高性能音频处理的应用设计,尤其适用于实时音频应用(如音频合成器、音乐制作工具、游戏音效等)。 1.1 主要特点 低延迟:通过减少音频数据在内核与用户空间之间的拷贝,直…...

黑马点评之Feed流技术实现关注推送与滚动分页查询

Feed流 关注推送也叫做Feed流&#xff0c;直译为“投喂”。为用户持续的提供“沉浸式体验”&#xff0c;通过无限下拉刷新获取新的信息。 Feed流&#xff08;信息流&#xff09;是一种常见的内容分发形式&#xff0c;通过动态更新的内容列表向用户展示个性化或实时信息。典型应…...

vue3+canvas裁剪框样式【前端】

目录 canvas绘制裁剪框&#xff1a;拖拽改变框的大小&#xff1a;圆圈样式&#xff1a;方块样式&#xff1a; canvas绘制裁剪框&#xff1a; // 绘制裁剪框 const drawCropRect (ctx: CanvasRenderingContext2D): void > {if (cropRect.value.width > 0 && crop…...

Python 设计模式:模板模式

1. 什么是模板模式&#xff1f; 模板模式是一种行为设计模式&#xff0c;它定义了一个操作的算法的骨架&#xff0c;而将一些步骤延迟到子类中。模板模式允许子类在不改变算法结构的情况下&#xff0c;重新定义算法的某些特定步骤。 模板模式的核心思想是将算法的固定部分提取…...

usb2.0的硬件知识(一)

一、USB2.0的硬件知识 1.1 USB2.0速率 USB 2.0协议支持3种速率&#xff1a;低速(Low Speed&#xff0c;1.5Mbps)、全速(Full Speed, 12Mbps)、高速(High Speed, 480Mbps)&#xff1b;USB Hub、USB设备&#xff0c;也分为低速、全速、高速三种类型。 1.2 USB2.0硬件线序组成 U…...

LangGraph(二)——QuickStart样例中的第二步

目录 1. 添加依赖2. 官网QuickStart——第二步&#xff1a;用工具增强聊天机器人2.1 Tavily Search2.2 简单测试Tavily Search2.3 添加带工具的ChatBot node2.4 添加tool node2.5 添加条件边2.6 可视化StateGraph2.7 构建聊天循环 参考 1. 添加依赖 LangGraph(一)——QuickStar…...

机器学习第二篇 多变量线性回归

数据集&#xff1a;世界幸福指数数据集中的变量有幸福指数排名、国家/地区、幸福指数得分、人均国内生产总值、健康预期寿命、自由权、社会支持、慷慨程度、清廉指数。我们选择GDP per Capita和Freedom&#xff0c;来预测幸福指数得分。 文件一&#xff1a;linear&#xff0c;…...

【MCP Node.js SDK 全栈进阶指南】中级篇(3):MCP高级资源设计

前言 在MCP TypeScript-SDK的初级篇中,我们介绍了资源开发的基础知识,包括静态资源与动态资源的创建、资源模板设计与参数提取,以及基本的资源列表与发现机制。随着应用规模的扩大和复杂性的提高,我们需要更加高级的资源设计方案来应对各种挑战。 本文作为中级篇的第三篇…...

PostgreSQL 常用日志

PostgreSQL 常用日志详解 PostgreSQL 提供了多种日志类型&#xff0c;用于监控数据库活动、排查问题和优化性能。以下是 PostgreSQL 中最常用的日志类型及其配置和使用方法。 一、主要日志类型 日志类型文件位置主要内容用途服务器日志postgresql-<日期>.log服务器运行…...

PostgreSQL认证培训推荐机构

首先来看一张2025年4月份db-engines上的数据库排行情况&#xff0c;前三名是雷打不动的Oracle、MySQL、Microsoft SQL Server&#xff0c;排名第四的就是我们今天的主角 - PostgreSQL数据库&#xff0c;从这张图上可以看出&#xff0c;PostgreSQL数据库的上升超非常明显&#x…...

2025年NISP一级题库试题

NISP一级考试只考50道单选题&#xff0c;难度不算大&#xff0c;话不多说&#xff0c;直接上硬菜&#xff01; 1、物理销毁的方式不包括&#xff08;&#xff09; .消磁 B.焚化炉烧毀 C.反复覆写数据 &#xff24;.机器硏磨粉碎 2、信息安全应该建立贯穿信息系统的整个生命周期…...

pip install pymysql报错

python安装pymysql报错解决 【现象】 很多时候会出现安装pip包报错的问题&#xff0c;看过很多网上教程以及ai都是如下说法&#xff1a; 镜像问题pip版本问题ssh证书问题网络问题… 在遇见这些情况时&#xff0c;上述的各种解决方法都一一实验过但最后都是ERROR。 【解决办…...

达梦官方管理工具 SQLark 更新--不仅支持达梦、Oracle、MySQL,还新增 PostgreSQL 数据库!

SQLark 是一款面向信创应用开发者的数据库开发和管理工具&#xff0c;用于快速查询、创建和管理不同类型的数据库系统&#xff0c;已支持达梦、Oracle、MySQL数据库&#xff1b;在最新的 V3.4 版本中&#xff0c;SQLark 新增了对 PostgreSQL 的支持&#xff0c;兼容 PostgreSQL…...

Windows 同步-互锁变量访问

互锁变量访问 应用程序必须同步对多个线程共享的变量的访问。 应用程序还必须确保对这些变量的作以原子方式执行&#xff08;完全或根本不执行&#xff09;。 对正确对齐的 32 位变量的简单读取和写入是原子作。 换句话说&#xff0c;你最终不会只更新变量的一部分;所有位都以…...

前端学习笔记

文章目录 前端主要内容基于脚手架创建前端工程vue的基本使用axios 路由Vue-Router路由组成嵌套路由 状态管理 vuex心得 前端主要内容 HTML、CSS JavaScript axios Vue基础语法&#xff08;router、vuex、typescript&#xff09; Element UI 基于脚手架创建前端工程 node.js …...

2025-04-22| Docker: --privileged参数详解

在 Docker 中&#xff0c;--privileged 是一个运行容器时的标志&#xff0c;它赋予容器特权模式&#xff0c;大幅提升容器对宿主机资源的访问权限。以下是 --privileged 的作用和相关细节&#xff1a; 作用 完全访问宿主机的设备&#xff1a; 容器可以访问宿主机的所有设备&am…...

Java八股 深入理解Spring的AOP 面向切面编程 底层 保姆级教程 手写例子

目录 概念 AOP 术语 1. 连接点&#xff08;Jointpoint&#xff09;&#xff1a; 2. 切入点&#xff08;Pointcut&#xff09;&#xff1a; 3. 通知&#xff08;Advice&#xff09;&#xff1a; 4. 方面/切面&#xff08;Aspect&#xff09;&#xff1a; 5. 引入&#xff…...

macOS安全隐私最佳实践分析

1. 引言 随着数字世界的不断扩展&#xff0c;个人和组织面临的安全与隐私威胁也日益增加。作为专业的安全合规与隐私保护研究团队&#xff0c;Kaamel 对 macOS 系统的安全隐私现状进行了全面分析&#xff0c;并提出了一系列最佳实践建议&#xff0c;旨在帮助用户更好地保护自己…...

WeakSet:JavaScript 中容易被忽视的“弱集合”

目录 WeakSet 详解 基本概念 创建 WeakSet WeakSet 的主要方法 WeakSet 的特性 WeakSet 的使用场景 1. 避免内存泄漏&#xff08;DOM 元素管理&#xff09; 2. 临时缓存系统 3. 私有属性模拟 4. 防止循环引用 与其他数据结构的对比 1. WeakSet 没有实例属性 2. We…...

Discuz!+DeepSeek:传统论坛的智能化蜕变之路

在数字化浪潮中&#xff0c;社区论坛作为互联网早期的产物&#xff0c;面临着功能单一、用户体验滞后的发展瓶颈。虎跃办公&#xff08;https://www.huyueapp.com&#xff09;通过Discuz!搭建的网址导航网站&#xff0c;在集成DeepSeek的AI能力后&#xff0c;成功实现了从工具导…...