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

Spring Cloud Nacos 配置中心详解:从基础使用到 MyBatis 整合(含多文档配置)

Spring Cloud Nacos 配置中心详解:从基础使用到 MyBatis 整合(含多文档配置)

        结合我们之前学的 Nacos 服务注册、Sentinel 熔断等知识,今天聚焦Nacos 配置中心—— 它解决了微服务架构中 “配置分散、环境难区分、无法实时更新” 的核心痛点。本文会从 “为什么需要配置中心” 切入,详细拆解yml 配置与 Nacos 的对应关系(重点)、分类配置方案,再补充 MyBatis 整合的两种连接池方式(德鲁伊 + 自定义),以及 yml 多文档写法,帮我们建立 “配置统一管理” 的完整认知。

1. 先懂核心痛点:为什么需要 Nacos 配置中心?

        在没使用配置中心前,我们的微服务配置存在 3 个致命问题,这也是 Nacos 配置中心的核心价值所在:

痛点我们的实际困扰Nacos 的解决方案
配置分散每个微服务都有自己的application.yml,10 个服务就要改 10 个配置文件,管理混乱所有配置统一存放在 Nacos,微服务按需拉取,一个地方改全服务生效
环境难区分开发、测试、生产环境的数据库地址不同,每次部署要手动改配置,容易出错用 “命名空间 / Group/DataId” 区分环境,启动时指定环境即可,无需改配置文件
无法实时更新改了配置(如缓存超时时间),必须重启微服务才能生效,影响线上服务可用性配置修改后 Nacos 主动推送给微服务,配合@RefreshScope注解实现实时生效,无需重启

        生活类比:Nacos 配置中心就像 “公司的行政部”—— 所有员工的考勤规则、福利政策(对应配置)都由行政部统一制定(Nacos 存储),员工(微服务)不用自己记规则,规则更新时行政部会主动通知(实时推送),不用员工重新入职(重启)。

2. Nacos Config 基础使用:从项目搭建到配置拉取

        我们先从基础流程入手,新建ConfigCenter子项目,实现 “从 Nacos 拉取配置”,重点理解yml 配置与 Nacos DataId 的对应关系(核心)。

2.1 步骤 1:新建 ConfigCenter 子项目(父项目下)

  1. 父项目右键→New→Module→Maven,项目名:ConfigCenter

  2. 核心是配置pom.xml,引入 Nacos 配置中心、服务发现、bootstrap 依赖(新版本必需)。

2.2 步骤 2:配置 pom.xml(关键依赖)

 <dependencies><!-- 1. Nacos服务发现依赖(可选,若需注册到Nacos) --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>​<!-- 2. Nacos配置中心核心依赖(必需) --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency>​<!-- 3. Bootstrap依赖(必需!新版本Spring Cloud移除了bootstrap,需手动引入) --><!-- 作用:保证项目启动时先拉取Nacos配置,再加载application.yml --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId></dependency>​<!-- 4. Web依赖(用于测试接口) --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>​<!-- 5. FastJSON依赖(返回JSON响应) --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.14</version></dependency></dependencies>

我们的关键提醒spring-cloud-starter-bootstrap绝对不能少!因为 Spring Boot 加载配置的优先级是:bootstrap.yml > application.yml,而 Nacos 配置需要在项目启动初期拉取(否则项目可能因缺少配置启动失败),bootstrap.yml正是负责 “启动初期拉取 Nacos 配置” 的核心。

2.3 步骤 3:配置 yml 文件(bootstrap.yml + application.yml)

        这是最核心的一步 ——bootstrap.yml配置 Nacos 连接信息,决定从 Nacos 拉取哪个配置;application.yml可放本地补充配置(优先级低于 Nacos 配置)。

2.3.1 bootstrap.yml(核心:配置 Nacos 拉取规则)
spring:application:# 1. 服务名(对应Nacos DataId的prefix部分,默认值)name: config-centerprofiles:# 2. 当前环境(对应Nacos DataId的spring.profiles.active部分)# 启动时可通过-Dspring.profiles.active=test切换环境active: devcloud:nacos:# Nacos服务注册配置(可选,若需注册到Nacos)discovery:server-addr: 127.0.0.1:8848  # Nacos地址(和注册中心一致)# Nacos配置中心核心配置(必需)config:server-addr: 127.0.0.1:8848  # Nacos配置中心地址(和注册中心一致)file-extension: yaml  # 3. 配置文件类型(对应Nacos DataId的file-extension部分)# group: DEFAULT_GROUP  # 可选,默认DEFAULT_GROUP,后续分类配置会用到# namespace: 760ae4af-1a85-41c7-9db2-44dd58f3f95e  # 可选,默认public,后续分类配置会用到
2.3.2 application.yml(本地补充配置,可选)
 # 本地配置(优先级低于Nacos配置,Nacos配置会覆盖此处相同配置)# 一般放无需动态更新的本地配置,如日志级别logging:level:root: infocom.zh.configcenter: debug

2.4 步骤 4:理解 Nacos DataId 与 yml 的对应关系(重点!)

Nacos 通过DataId唯一标识一个配置文件,其命名规则是:${prefix}-${spring.profiles.active}.${file-extension}

我们用表格明确每个部分与bootstrap.yml的对应关系:

DataId 组成部分对应 bootstrap.yml 配置项示例值说明
prefixspring.application.nameconfig-center默认是服务名,也可通过spring.cloud.nacos.config.prefix自定义
spring.profiles.activespring.profiles.activedev当前环境,若为空,DataId 格式变为${prefix}.${file-extension}
file-extensionspring.cloud.nacos.config.file-extensionyaml配置文件类型,仅支持yamlproperties

我们的示例对应:根据上面的bootstrap.yml,DataId 最终为:config-center-dev.yaml—— 这是我们后续在 Nacos 中创建配置的 “唯一标识”,必须完全一致

2.5 步骤 5:在 Nacos 创建配置文件

  1. 访问 Nacos 控制台→配置管理→配置列表→新建配置;

  2. 按以下信息填写(严格对应 DataId 规则):

    • Data IDconfig-center-dev.yaml(和我们计算的一致);

    • GroupDEFAULT_GROUP(默认,和 bootstrap.yml 一致);

    • 配置格式YAML(和 file-extension 一致);

    • 配置内容(示例:自定义一个配置项):

      config:info: "我是从Nacos配置中心拉取的dev环境配置!"  # 自定义配置项,后续测试用
  3. 点击 “发布”,配置保存到 Nacos。

2.6 步骤 6:测试配置拉取与动态更新

6.1 编写测试 Controller(含动态刷新)
package com.lh.configcenter.controller;​import com.alibaba.fastjson.JSONObject;import org.springframework.beans.factory.annotation.Value;import org.springframework.cloud.context.config.annotation.RefreshScope;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.ResponseBody;import org.springframework.web.bind.annotation.RestController;​// 关键:@RefreshScope 开启Nacos配置动态刷新(配置修改后无需重启,实时生效)@RefreshScope@RestControllerpublic class ConfigCenterController {​// 从Nacos配置中取值:${config.info}对应Nacos中的config.info@Value("${config.info}")private String configInfo;​// 测试接口:返回Nacos拉取的配置@GetMapping("/configInfo")@ResponseBodypublic JSONObject getConfigInfo() {JSONObject ret = new JSONObject();ret.put("code", 0);ret.put("message", "配置拉取成功");ret.put("data", configInfo);  // 返回Nacos中的config.inforeturn ret;}}
6.2 启动项目测试
  1. 启动ConfigCenterApplication主类加@SpringBootApplication@EnableDiscoveryClient);

  2. 访问接口:http://localhost:8080/configInfo(默认端口,若 Nacos 配置了 server.port 会覆盖);

  3. 预期响应:

     {"code": 0,"message": "配置拉取成功","data": "我是从Nacos配置中心拉取的dev环境配置!"}
6.3 测试动态更新
  1. 回到 Nacos 控制台,编辑config-center-dev.yaml,修改config.info为:"我是Nacos修改后的dev配置!"

  2. 点击 “发布”,无需重启ConfigCenter

  3. 再次访问/configInfo,会发现data字段已更新 —— 证明动态刷新生效!

3. Nacos 分类配置:3 种方案区分环境(命名空间 / Group/DataId)

        当项目有多个环境(dev/test/prod)或多个服务时,需要用 Nacos 的 “三维度”(Namespace/Group/DataId)实现配置隔离。我们详细拆解 3 种常用方案:

3.1 方案 1:DataId 方案(最常用,按环境区分 DataId)

核心逻辑:
  • 前提:同一 Namespace(默认 public)、同一 Group(默认 DEFAULT_GROUP);

  • 隔离方式:不同环境用不同 DataId,通过spring.profiles.active切换。

实操步骤:
  1. 在 Nacos 创建 2 个配置(dev/test 环境):

    • DataId1:config-center-dev.yaml(dev 环境,内容:config.info: "dev环境配置");

    • DataId2:config-center-test.yaml(test 环境,内容:config.info: "test环境配置");

  2. 修改bootstrap.yml的spring.profiles.active:

    • 切换到 dev:active: dev→拉取config-center-dev.yaml

    • 切换到 test:active: test→拉取config-center-test.yaml

  3. 测试:启动项目,访问/configInfo,会看到对应环境的配置。

适用场景:

单团队、少环境(如 dev/test/prod),配置隔离简单直观。

3.2 方案 2:Group 方案(按服务分组,同一环境不同服务)

核心逻辑:
  • 前提:同一 Namespace(默认 public)、同一 DataId;

  • 隔离方式:不同服务 / 模块用不同 Group,通过spring.cloud.nacos.config.group指定。

实操步骤:
  1. 在 Nacos 创建 2 个配置(同一 DataId,不同 Group):

    • DataId:config-center-info.yaml(统一 DataId);

    • Group1:DEV_GROUP(dev 环境服务 A,内容:config.info: "DEV_GROUP配置");

    • Group2:TEST_GROUP(test 环境服务 B,内容:config.info: "TEST_GROUP配置");

  2. 修改bootstrap.yml,指定 Group:

    spring:cloud:nacos:config:group: DEV_GROUP  # 拉取DEV_GROUP的config-center-info.yaml
  3. 测试:启动项目,会拉取对应 Group 的配置。

适用场景:

多服务共用同一配置模板(如数据库连接模板),按服务分组隔离。

3.3 方案 3:Namespace 方案(完全隔离,多环境 / 多团队)

核心逻辑:
  • 前提:不同 Namespace(物理隔离),DataId 和 Group 可重复;

  • 隔离方式:每个环境 / 团队对应一个 Namespace,通过spring.cloud.nacos.config.namespace指定(注意:是 Namespace 的ID,不是名称!)。

实操步骤:
  1. 在 Nacos 创建 2 个 Namespace:

    • 新建 Namespace1:名称dev,ID 自动生成(如760ae4af-1a85-41c7-9db2-44dd58f3f95e);

    • 新建 Namespace2:名称test,ID 自动生成(如8d6ba322-4271-430a-9844-31ec3ba614ba);

  2. 在对应 Namespace 下创建配置:

    • devNamespace 下创建config-center-dev.yaml(内容:config.info: "dev Namespace配置");

    • testNamespace 下创建config-center-test.yaml(内容:config.info: "test Namespace配置");

  3. 修改bootstrap.yml,指定 Namespace 的 ID:

     spring:cloud:nacos:config:namespace: 760ae4af-1a85-41c7-9db2-44dd58f3f95e  # dev的Namespace ID
  4. 测试:启动项目,会拉取指定 Namespace 下的配置。

我们的易错点提醒:
  • Namespace 用 ID 不用名称:Nacos 控制台显示 “名称”,但配置时需要填 “ID”(创建时自动生成,可在 Namespace 列表查看),填名称会导致配置拉取失败

4. 进阶:Nacos 配置中心整合 MyBatis(2 种连接池方式)

我们在ConfigCenter项目中整合 MyBatis,重点实现 “数据源配置从 Nacos 拉取”,提供两种连接池方案:德鲁伊(Druid)连接池(常用,带监控)和定义 Hikari 连接池(默认,轻量)

4.1 通用准备:在 Nacos 创建数据源配置

首先在 Nacos 创建数据源配置文件,DataId 遵循规则:config-center-datasource.yaml(prefix=config-center,active=datasource,file-extension=yaml)。

Nacos 配置内容(DataId:config-center-datasource.yaml):
# 服务端口(从Nacos拉取,覆盖本地配置)server:port: 8081​# 数据源配置(MyBatis需要)spring:datasource:# 1. 通用配置(两种连接池都需要)url: jdbc:mysql://localhost:3306/user_db?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=trueusername: rootpassword: ${DB_PASSWORD:root}  # 支持占位符:优先取环境变量DB_PASSWORD,没有则用默认值rootdriver-class-name: com.mysql.cj.jdbc.Driver​# 2. 德鲁伊连接池专用配置(方案1用,方案2注释)druid:initial-size: 5  # 初始化连接数min-idle: 5       # 最小空闲连接数max-active: 20    # 最大活跃连接数max-wait: 60000   # 获取连接的最大等待时间(毫秒)time-between-eviction-runs-millis: 60000  # 检测间隔时间(毫秒)min-evictable-idle-time-millis: 300000    # 连接最小空闲时间(毫秒)validation-query: SELECT 1 FROM DUAL      # 验证SQLtest-while-idle: true                     # 空闲时检测test-on-borrow: false                     # 借用时检测test-on-return: false                     # 返回时检测pool-prepared-statements: true            # 开启预编译max-pool-prepared-statement-per-connection-size: 20  # 预编译语句池大小filters: stat,wall,log4j2  # 启用监控、防SQL注入、日志(需加对应依赖)connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000  # 慢SQL阈值(5秒)​# 3. Hikari连接池专用配置(方案2用,方案1注释)# hikari:#   maximum-pool-size: 20  # 最大连接数#   minimum-idle: 5        # 最小空闲连接数#   idle-timeout: 300000   # 空闲超时时间(毫秒)#   connection-timeout: 20000  # 连接超时时间(毫秒)#   pool-name: MyHikariCP  # 连接池名称

4.2 方案 1:整合德鲁伊(Druid)连接池(推荐,带监控)

步骤 1:加德鲁伊与 MyBatis 依赖

ConfigCenterpom.xml中添加:

 <!-- 1. 德鲁伊连接池依赖(带Spring Boot支持) --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.16</version></dependency>​<!-- 2. MySQL驱动(适配MySQL 8.x) --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.32</version><scope>runtime</scope></dependency>​<!-- 3. MyBatis Spring Boot Starter --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.3.1</version></dependency>​<!-- 4. 德鲁伊监控日志依赖(可选,配合filters: log4j2) --><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.20.0</version></dependency>
步骤 2:配置德鲁伊数据源(绑定 Nacos 配置)

@ConfigurationProperties自动绑定 Nacos 中的spring.datasource.druid配置,无需手动注入参数:

package com.lh.configcenter.config;​import com.alibaba.druid.pool.DruidDataSource;import org.mybatis.spring.SqlSessionFactoryBean;import org.mybatis.spring.annotation.MapperScan;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.core.io.support.PathMatchingResourcePatternResolver;​import javax.sql.DataSource;​@Configuration@MapperScan("com.zh.configcenter.mapper")  // 扫描MyBatis的Mapper接口public class DruidMyBatisConfig {​// 1. 配置德鲁伊数据源:自动绑定Nacos中的spring.datasource.druid配置@Bean@ConfigurationProperties(prefix = "spring.datasource.druid")  // 前缀对应Nacos配置public DataSource druidDataSource() {// DruidDataSource会自动加载Nacos中的url、username、password等配置return new DruidDataSource();}​// 2. 配置SqlSessionFactory(MyBatis核心)@Beanpublic SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) throws Exception {SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();sessionFactory.setDataSource(dataSource);  // 注入德鲁伊数据源​// 配置MyBatis核心参数org.apache.ibatis.session.Configuration config = new org.apache.ibatis.session.Configuration();config.setMapUnderscoreToCamelCase(true);  // 开启驼峰命名转换(user_name→userName)config.setCacheEnabled(true);  // 开启二级缓存sessionFactory.setConfiguration(config);​// 配置Mapper XML文件路径(放在resources/mapper目录下)sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));​return sessionFactory;}​// 3. 配置事务管理器(可选,支持@Transactional)@Beanpublic org.springframework.jdbc.datasource.DataSourceTransactionManager transactionManager(DataSource dataSource) {return new org.springframework.jdbc.datasource.DataSourceTransactionManager(dataSource);}}

4.3 方案 2:自定义 Hikari 连接池(默认,轻量)

Hikari 是 Spring Boot 默认的连接池(轻量、性能好),适合对监控要求不高的场景。

步骤 1:加 Hikari 与 MyBatis 依赖

Hikari 无需额外依赖(Spring Boot 自带),只需加 MySQL 和 MyBatis 依赖(同方案 1 的步骤 1 中的 2、3)。

步骤 2:自定义 Hikari 数据源(手动注入 Nacos 配置)

通过@Value从 Nacos 拉取数据源参数,手动创建 HikariDataSource:

package com.lh.configcenter.config;​import com.zaxxer.hikari.HikariDataSource;import org.mybatis.spring.SqlSessionFactoryBean;import org.mybatis.spring.annotation.MapperScan;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.core.io.support.PathMatchingResourcePatternResolver;​import javax.sql.DataSource;​@Configuration@MapperScan("com.zh.configcenter.mapper")  // 扫描Mapper接口public class HikariMyBatisConfig {​// 从Nacos配置中注入数据源参数@Value("${spring.datasource.url}")private String url;@Value("${spring.datasource.username}")private String username;@Value("${spring.datasource.password}")private String password;@Value("${spring.datasource.driver-class-name}")private String driverClassName;// Hikari专用参数(从Nacos拉取,可选)@Value("${spring.datasource.hikari.maximum-pool-size:20}")private int maxPoolSize;@Value("${spring.datasource.hikari.minimum-idle:5}")private int minIdle;​// 1. 自定义Hikari数据源@Beanpublic DataSource hikariDataSource() {HikariDataSource dataSource = new HikariDataSource();// 手动设置从Nacos拉取的参数dataSource.setJdbcUrl(url);dataSource.setUsername(username);dataSource.setPassword(password);dataSource.setDriverClassName(driverClassName);// 设置Hikari连接池参数dataSource.setMaximumPoolSize(maxPoolSize);dataSource.setMinimumIdle(minIdle);dataSource.setPoolName("MyHikariCP");  // 连接池名称return dataSource;}​// 2. 配置SqlSessionFactory(和方案1一致)@Beanpublic SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) throws Exception {SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();sessionFactory.setDataSource(dataSource);​org.apache.ibatis.session.Configuration config = new org.apache.ibatis.session.Configuration();config.setMapUnderscoreToCamelCase(true);config.setCacheEnabled(true);sessionFactory.setConfiguration(config);​sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));​return sessionFactory;}}

4.4 步骤 3:修改 bootstrap.yml,拉取数据源配置

spring:application:name: config-centerprofiles:active: datasource  # 对应Nacos的DataId:config-center-datasource.yamlcloud:nacos:discovery:server-addr: 127.0.0.1:8848config:server-addr: 127.0.0.1:8848file-extension: yaml# 若用Namespace/Group,需添加对应配置# group: DEFAULT_GROUP# namespace: 760ae4af-1a85-41c7-9db2-44dd58f3f95e

4.5 测试 MyBatis 整合

  1. 编写 Mapper 接口(如UserMapper.java)和 XML(UserMapper.xml);

  2. 编写 Service 和 Controller 调用 Mapper;

  3. 启动项目,访问接口,若能正常查询数据库,证明整合成功。

5. 实用技巧:yml 多文档配置(用 --- 分隔)

在实际开发中,我们可以在一个bootstrap.yml中用---分隔多个环境的配置,避免创建多个 yml 文件。示例如下:

 # ==================== 公共配置 ====================spring:application:name: config-centercloud:nacos:discovery:server-addr: 127.0.0.1:8848config:server-addr: 127.0.0.1:8848file-extension: yaml​# ==================== dev环境配置 ====================---spring:profiles: dev  # 环境标识:devcloud:nacos:config:group: DEFAULT_GROUP# namespace: 760ae4af-1a85-41c7-9db2-44dd58f3f95e​# ==================== test环境配置 ====================---spring:profiles: test  # 环境标识:testcloud:nacos:config:group: TEST_GROUP# namespace: 8d6ba322-4271-430a-9844-31ec3ba614ba​# ==================== datasource环境配置 ====================---spring:profiles: datasource  # 环境标识:datasourcecloud:nacos:config:group: DEFAULT_GROUP# namespace: 760ae4af-1a85-41c7-9db2-44dd58f3f95e

使用方式:启动时通过-Dspring.profiles.active=dev指定环境,例如:

java -jar ConfigCenter-1.0-SNAPSHOT.jar -Dspring.profiles.active=datasource

6. 重点 & 易错点总结(避坑指南)

重点 / 易错点我们的解决方案
bootstrap 依赖缺失新版本 Spring Cloud 必须手动引入spring-cloud-starter-bootstrap,否则无法拉取 Nacos 配置
DataId 命名错误严格遵循${prefix}-${active}.${extension}规则,确保与 bootstrap.yml 的配置完全一致
Namespace 用名称不用 IDNacos 配置中namespace需填 “ID”(控制台可查),填名称会导致配置拉取失败
动态刷新不生效必须在 Controller 上加@RefreshScope注解,且@Value取值的配置项在 Nacos 中存在
德鲁伊监控不生效确保 Nacos 中配置了spring.datasource.druid.filters=stat,且加了 log4j2 依赖
MyBatis Mapper 扫描不到在配置类上加@MapperScan("com.zh.configcenter.mapper"),指定 Mapper 接口路径

7. 总结

Nacos 配置中心是微服务架构的 “配置大脑”,核心价值在于 “统一管理、环境隔离、实时更新”。我们需要重点掌握:

  1. yml 与 Nacos 的对应关系:DataId 的命名规则是核心,错一个字符都会导致配置拉取失败;

  2. 分类配置方案:根据团队规模和环境数量选择 DataId/Group/Namespace 方案;

  3. MyBatis 整合:两种连接池方式按需选择,德鲁伊适合需要监控的场景,Hikari 适合轻量场景;

  4. 多文档配置:用---分隔环境,简化配置文件管理。

后续学习中,我们可以进一步探索 Nacos 的 “配置加密”(敏感配置如密码加密存储)、“灰度发布”(配置仅推送给部分服务)等高级功能,让配置管理更安全、灵活。

http://www.dtcms.com/a/426719.html

相关文章:

  • 去出海做产品吧,亚马逊爆款产品 属于电子类的消费产品。用全志A733完胜--
  • 设计配色网站租房合同范本下载word
  • 安卓生态进化史:从手机系统到全场景智能
  • 自适应网站开发工具网站优化排名提升
  • 中国建材网:重构建材行业生态的数字力量
  • 【有源码】基于Hadoop+Spark的豆瓣电影数据分析与可视化系统-基于大数据的电影评分趋势分析与可视化系统
  • 模板匹配算法原理
  • Matplotlib子图布局与响应式设计实战:GridSpec与CSS框架深度结合
  • 【图像处理进阶】边缘检测算法深度优化与复杂场景实战
  • yolov12 onnx导出tensorrt
  • 【Java学习】定时器Timer(源码详解)
  • 【数据结构】二叉树的数组表示推导
  • 前端版本更新,错误监控,解决方案 error / unhandledrejection,同步异步错误监控方案
  • 2023 美赛C Predicting Wordle Results(上)
  • 微退休(Micro-retirement)介绍
  • LeetCode热题100(1-7)
  • 想让图片可以在Word和WPS文档中自由移动?修改文字环绕
  • 连云港网站设计北京seo优化分析
  • PostgreSQL WAL 日志发展史 - pg9
  • 企业自有网站全国加盟网站大全
  • 做金融网站看那些素材怎样联系自己建设网站
  • Java的任务调度框架之 Quartz 以及 CronTrigger,CronScheduleBuilder 和 Cron表达式 笔记250930
  • 联想乐享重构智能搜索生态:ThinkPad T14p 2025升级信息首触“企业智能双胞胎”
  • 明远智睿 SSD2351 核心板:64 位四核含税不足 50 元,批量采购新选择
  • Flutter 自定义 View 权威指引
  • AWS | Linux 硬盘挂载综合教程
  • ntdll.pdb 包含查找模块 ntdll.dll 的源文件所需的调试信息
  • 精读C++20设计模式——行为型设计模式:策略模式
  • Spark专题-第三部分:性能监控与实战优化(1)-认识spark ui
  • 汕头网站设计哪家好鞍山制作网站哪家好