nacos 源码分析-配置服务

本文深入解析了Nacos源码,主要关注注册中心和配置服务的实现。通过启动入口和配置服务的Main类,展示了如何获取和处理配置信息,如`getConfigAdvanceInfo`方法用于根据dataId、group和tenant查询配置详情。文章以传统SpringMVC模式阐述了Nacos的请求处理流程,并提供了相关参考资料。

LD is tigger forever,CG are not brothers forever, throw the pot and shine forever.
Modesty is not false, solid is not naive, treacherous but not deceitful, stay with good people, and stay away from poor people.
talk is cheap, show others the code and KPI, Keep progress,make a better result.
Survive during the day and develop at night。

目录

概 述

注册中心:
在这里插入图片描述
启动入口:
在这里插入图片描述
配置服务:
启动的Main:

@EnableScheduling
@SpringBootApplication(scanBasePackages = {
        "com.alibaba.nacos.config.server",
        "com.alibaba.nacos.core"})
public class Config {
    
    public static void main(String[] args) {
        SpringApplication.run(Config.class, args);
    }
}

扫描底下的bean.
EnableScheduling定时调度:
先进入控制层:ConfigController:
按照这个为例:catalog在这里插入代码片

  @GetMapping("/catalog")
    @Secured(action = ActionTypes.READ, signType = SignType.CONFIG)
    public RestResult<ConfigAdvanceInfo> getConfigAdvanceInfo(@RequestParam("dataId") String dataId,
            @RequestParam("group") String group,
            @RequestParam(value = "tenant", required = false, defaultValue = StringUtils.EMPTY) String tenant) {
        ConfigAdvanceInfo configInfo = persistService.findConfigAdvanceInfo(dataId, group, tenant);
        return RestResultUtils.success(configInfo);
    }
    

前台传送一个dataId,group,tenant等。
调用:

 ConfigAdvanceInfo configInfo = persistService.findConfigAdvanceInfo(dataId, group, tenant);
 ConfigAdvanceInfo findConfigAdvanceInfo(final String dataId, final String group, final String tenant);

看下接口的实现:
其中的一个实现:

@Override
    public ConfigAdvanceInfo findConfigAdvanceInfo(final String dataId, final String group, final String tenant) {
        final String tenantTmp = StringUtils.isBlank(tenant) ? StringUtils.EMPTY : tenant;
        List<String> configTagList = this.selectTagByConfig(dataId, group, tenant);
        
        ConfigAdvanceInfo configAdvance = databaseOperate.queryOne(
                "SELECT gmt_create,gmt_modified,src_user,src_ip,c_desc,c_use,effect,type,c_schema FROM config_info WHERE data_id=? AND group_id=? AND tenant_id=?",
                new Object[] {dataId, group, tenantTmp}, CONFIG_ADVANCE_INFO_ROW_MAPPER);
        
        if (CollectionUtils.isNotEmpty(configTagList)) {
            StringBuilder configTagsTmp = new StringBuilder();
            for (String configTag : configTagList) {
                if (configTagsTmp.length() == 0) {
                    configTagsTmp.append(configTag);
                } else {
                    configTagsTmp.append(',').append(configTag);
                }
            }
            configAdvance.setConfigTags(configTagsTmp.toString());
        }
        return configAdvance;
    }

大概:
//首先进行的意思是:
1.根据dataid 参数
SELECT gmt_create,gmt_modified,src_user,src_ip,c_desc,c_use,effect,type,c_schema FROM config_info WHERE data_id=? AND group_id=? AND tenant_id=?"
查询有关配置信息:

2。将配置信息拼成一个字符串返回到控制层。

 return RestResultUtils.success(configInfo);

其他的配置中心包含如下方法:
publishConfig,

getConfig,detailConfigInfo,deleteConfig,getConfigAdvanceInfo,listener,getListeners,等信息。

其他的模块架构也是如此,传统的Spring MVC 式样的请求和处理方式。

小结

参考资料和推荐阅读

1.链接: link

我在根目录进行打包,打包出来的包是一个个微服务而不是大包,这是我什么地方做错了呢PS D:\nacoscode\nacos-2.2.2> [INFO] Compiling 13 proto file(s) to D:\nacoscode\nacos-2.2.2\istio\target\generated-sources\protobuf\java Get-ChildItem -Recurse -Filter *.jar | Select-Object FullName FullName -------- D:\nacoscode\nacos-2.2.2\address\target\nacos-address-2.2.2-sources.jar D:\nacoscode\nacos-2.2.2\address\target\nacos-address-2.2.2.jar D:\nacoscode\nacos-2.2.2\api\target\nacos-api-2.2.2-sources.jar D:\nacoscode\nacos-2.2.2\api\target\nacos-api-2.2.2.jar D:\nacoscode\nacos-2.2.2\auth\target\nacos-auth-2.2.2-sources.jar D:\nacoscode\nacos-2.2.2\auth\target\nacos-auth-2.2.2.jar D:\nacoscode\nacos-2.2.2\client\target\nacos-client-2.2.2-sources.jar D:\nacoscode\nacos-2.2.2\client\target\nacos-client-2.2.2.jar D:\nacoscode\nacos-2.2.2\cmdb\target\nacos-cmdb-2.2.2-sources.jar D:\nacoscode\nacos-2.2.2\cmdb\target\nacos-cmdb-2.2.2.jar D:\nacoscode\nacos-2.2.2\common\target\nacos-common-2.2.2-sources.jar D:\nacoscode\nacos-2.2.2\common\target\nacos-common-2.2.2.jar D:\nacoscode\nacos-2.2.2\config\target\nacos-config-2.2.2-sources.jar D:\nacoscode\nacos-2.2.2\config\target\nacos-config-2.2.2.jar D:\nacoscode\nacos-2.2.2\consistency\target\nacos-consistency-2.2.2-sources.jar D:\nacoscode\nacos-2.2.2\consistency\target\nacos-consistency-2.2.2.jar D:\nacoscode\nacos-2.2.2\core\target\nacos-core-2.2.2-sources.jar D:\nacoscode\nacos-2.2.2\core\target\nacos-core-2.2.2.jar D:\nacoscode\nacos-2.2.2\naming\target\nacos-naming-2.2.2-sources.jar D:\nacoscode\nacos-2.2.2\naming\target\nacos-naming-2.2.2.jar D:\nacoscode\nacos-2.2.2\plugin\auth\target\nacos-auth-plugin-2.2.2-sources.jar D:\nacoscode\nacos-2.2.2\plugin\auth\target\nacos-auth-plugin-2.2.2.jar D:\nacoscode\nacos-2.2.2\plugin\control\target\nacos-contrl-plugin-2.2.2-sou... D:\nacoscode\nacos-2.2.2\plugin\control\target\nacos-contrl-plugin-2.2.2.jar D:\nacoscode\nacos-2.2.2\plugin\datasource\target\nacos-datasource-plugin-2.... D:\nacoscode\nacos-2.2.2\plugin\datasource\target\nacos-datasource-plugin-2.... D:\nacoscode\nacos-2.2.2\plugin\encryption\target\nacos-encryption-plugin-2.... D:\nacoscode\nacos-2.2.2\plugin\encryption\target\nacos-encryption-plugin-2.... D:\nacoscode\nacos-2.2.2\plugin\environment\target\nacos-custom-environment-... D:\nacoscode\nacos-2.2.2\plugin\environment\target\nacos-custom-environment-... D:\nacoscode\nacos-2.2.2\plugin\trace\target\nacos-trace-plugin-2.2.2-source... D:\nacoscode\nacos-2.2.2\plugin\trace\target\nacos-trace-plugin-2.2.2.jar D:\nacoscode\nacos-2.2.2\plugin-default-impl\target\nacos-plugin-default-imp... D:\nacoscode\nacos-2.2.2\plugin-default-impl\target\nacos-plugin-default-imp... D:\nacoscode\nacos-2.2.2\sys\target\nacos-sys-2.2.2-sources.jar D:\nacoscode\nacos-2.2.2\sys\target\nacos-sys-2.2.2.jar PS D:\nacoscode\nacos-2.2.2> Get-ChildItem -Path .\distribution\target\ -Recurse 目录: D:\nacoscode\nacos-2.2.2\distribution\target Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 2025/6/23 17:42 89 checkstyle-cachefile -a---- 2025/6/23 17:42 9837 checkstyle-checker.xml -a---- 2025/6/23 17:42 84 checkstyle-result.xml PS D:\nacoscode\nacos-2.2.2> 情况是这样的
最新发布
08-26
<think>我们正在处理一个关于Nacos 2.2.2打包的问题。用户期望在根目录执行打包命令后生成一个整体的可部署包,但实际上生成了多个微服务模块的jar包。这通常意味着打包方式不符合用户的预期,用户可能期望生成一个包含所有模块的单一可执行包(例如Spring Boot的fat jar),而当前项目可能是多模块项目,每个模块独立打包。 可能的原因分析: 1. 项目结构问题:项目可能是多模块的(Maven或Gradle),每个子模块被配置为独立的可执行jar包,而根目录没有配置聚合打包。 2. 打包命令问题:用户可能在根目录执行了错误的命令,例如执行了`mvn package`(会打包所有模块)而不是针对特定模块的打包。 3. 打包插件配置问题:在根项目的pom.xml中,可能没有正确配置Spring Boot的打包插件(或其他构建插件)来生成一个可执行的fat jar。 解决方案: 1. 检查项目结构:确认项目是否为多模块项目。在根目录的pom.xml中,应该用`<modules>`指定了各个子模块。如果每个子模块都有自己的`<build>`配置,那么它们会独立打包。 2. 调整打包方式:如果用户想要一个整体的包,那么可能需要创建一个新的模块(例如使用`spring-boot-maven-plugin`)来将其他模块作为依赖打包在一起。或者,如果已经有一个主模块,确保该模块被正确打包成可执行jar,而其他模块作为依赖库打包成普通jar。 3. 修改根目录的打包配置:通常,根目录的pom.xml的打包类型(packaging)为pom,它不会生成任何包,只是管理子模块。所以,在根目录执行`mvn package`会依次构建所有子模块,每个子模块生成自己的jar包。因此,用户应该到主应用模块(即包含主类的模块)中执行打包,并确保该模块配置了生成可执行jar。 具体步骤: - 确认主模块:找到包含Spring Boot主类的模块。 - 在该模块的pom.xml中,确保配置了Spring Boot Maven Plugin: ```xml <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> ``` - 然后在该模块目录下执行`mvn package`,或者从根目录执行针对该模块的打包命令:`mvn package -pl 模块名 -am`。 如果用户希望将所有微服务打包成一个整体,这通常不是微服务架构的推荐做法(微服务通常独立部署)。但如果是想打包成一个应用(比如单体应用),那么需要确保所有其他模块作为依赖被主模块引入,然后由主模块的打包插件生成一个包含所有依赖的fat jar。 另一种情况:用户可能误解了Nacos项目的打包结果。Nacos本身是一个微服务架构的项目,它包含多个模块(如nacos-config, nacos-naming等),在构建时会生成多个jar包。如果用户是在构建Nacos源码,那么这是正常现象。用户需要根据官方文档的部署说明,选择其中一个模块(通常是console模块)作为启动模块,或者使用官方提供的启动脚本(startup.cmd/startup.sh)来启动整个Nacos服务。 因此,需要明确用户是在构建自己的项目还是Nacos源码: - 如果是构建自己的项目,则按照上述调整主模块打包配置- 如果是构建Nacos源码,那么生成多个jar包是正常的,Nacos的启动脚本会同时启动多个模块(每个模块是一个独立的进程?实际上Nacos目前是单体应用,多个模块是同一个进程,但打包时确实会生成多个jar,但启动时只需要启动console模块,它会依赖其他模块)。具体可参考Nacos官方文档的部署部分。 根据用户描述“根目录打包生成多个微服务jar”,我猜测用户是在构建Nacos源码。如果是这样,那么正确的做法是: 1. 在根目录执行`mvn -Prelease-nacos clean install -U`(Nacos官方构建命令)[^1]。 2. 构建完成后,进入`distribution/target`目录,会生成一个压缩包(如nacos-server-2.2.2.tar.gz),这个压缩包就是可部署的整体包。 3. 解压该压缩包,然后运行里面的启动脚本即可。 所以,用户可能没有注意到Nacos的构建结果在`distribution/target`下,而是直接查看了各子模块的target目录。 总结: 根据用户是在构建自己的项目还是Nacos源码,我们给出不同的解决方案。 为了进一步帮助用户,我们需要明确: - 用户是在构建自己的项目还是Nacos源码? - 项目的结构是怎样的? 但根据问题描述,用户提到“Nacos 2.2.2 根目录打包”,所以很可能是用户在构建Nacos源码。因此,我们建议用户查看distribution模块生成的压缩包。 如果用户是在构建自己的项目,则按照主模块打包的方式调整。 因此,回答如下: 您好!关于您在Nacos 2.2.2根目录打包生成多个微服务jar而不是整体包的问题,可能的原因和解决方案如下: ### 原因分析 1. **项目结构为多模块项目**:Nacos项目本身是一个多模块的Maven项目,根目录的pom.xml的打包类型为`pom`,它不会生成可执行jar,而是管理子模块的构建。当在根目录执行`mvn package`时,每个子模块都会独立打包,因此您会看到多个jar包。 2. **整体包的位置**:Nacos项目在构建时,会有一个专门的`distribution`模块,该模块负责将各个子模块的jar包以及配置文件、启动脚本等打包成一个完整的可部署包(通常是一个压缩包格式,如.tar.gz或.zip),这个包才是您需要的整体包。 ### 解决方案 1. **使用Nacos官方推荐的构建命令**: 在根目录执行以下命令: ```bash mvn -Prelease-nacos clean install -U ``` 注意:`-Prelease-nacos`是激活release-nacos profile,这是Nacos官方指定的构建profile[^1]。 2. **查找生成的完整包**: 构建完成后,整体包位于`distribution/target`目录下,文件名为`nacos-server-2.2.2.tar.gz`(或类似,版本号可能不同)。您可以将这个压缩包部署到服务器上,解压后运行其中的启动脚本(如`bin/startup.sh`或`bin/startup.cmd`)即可启动Nacos服务。 3. **如果您是在构建自己的微服务项目**: 如果您的问题实际上是关于您自己的微服务项目(而不是Nacos源码),那么您需要: - 确认您的主模块(包含Spring Boot主类的模块)。 - 在该模块的pom.xml中配置`spring-boot-maven-plugin`插件,以生成可执行的fat jar。 - 然后在该模块下执行`mvn package`,或者在根目录执行针对该模块的打包命令(如`mvn package -pl 主模块名 -am`)。 ### 额外建议 - 如果您是构建Nacos源码,建议详细阅读Nacos官方文档中的[构建与部署部分](https://nacos.io/zh-cn/docs/quick-start.html) [^1]。 - 确保构建环境满足要求(如JDK版本、Maven版本等)。 希望以上解答能帮助您解决问题! §§相关问题§§ 1. 如何配置Spring Boot项目生成可执行fat jar? 2. Maven多模块项目如何正确打包? 3. Nacos的启动脚本是如何工作的?</think>### Nacos 2.2.2 根目录打包生成多个微服务JAR的原因分析 在Nacos 2.2.2根目录执行打包命令(如 `mvn clean package`)后生成多个微服务模块的JAR而非单一可部署包,主要与**项目结构设计**和**打包配置**有关: #### 根本原因 1. **多模块项目结构** Nacos采用标准的Maven多模块架构([查看GitHub源码](https://github.com/alibaba/nacos)): ``` nacos-root ├── core // 核心模块 ├── config // 配置服务模块 ├── naming // 命名服务模块 ├── console // 控制台模块 └── distribution // 最终打包模块 ``` 在根目录执行 `mvn package` 会为**每个子模块独立生成JAR**,这是Maven多模块项目的标准行为。 2. **缺失最终打包配置** 真正的可部署包需要由专门的打包模块(通常是 `distribution` 模块)生成。该模块在 `pom.xml` 中配置了 `maven-assembly-plugin` 或 `maven-shade-plugin`,负责将依赖和配置文件整合成单一压缩包(如 `tar.gz`/`zip`)。 #### 验证步骤 1. 检查打包输出目录 执行 `mvn package` 后: - 各子模块的 `target/` 目录下会有独立JAR(如 `nacos-config-2.2.2.jar`) - **整体部署包应在 `distribution/target/` 下**(如 `nacos-server-2.2.2.tar.gz`) 2. 确认打包命令(关键) 生成完整部署包需**激活特定Profile**: ```bash # 正确命令(包含 -Prelease-nacos) mvn -Prelease-nacos clean package -U ``` 若缺少 `-Prelease-nacos`,则不会触发最终打包流程[^1]。 #### 解决方案 1. **使用完整构建命令** ```bash cd nacos-source-root # 进入Nacos源码目录 mvn -Prelease-nacos clean install -U # 官方推荐命令 ``` 2. **获取部署包** 构建完成后,在以下路径获取完整包: ``` distribution/target/nacos-server-2.2.2.tar.gz ``` 3. **部署验证** 解压后通过启动脚本运行: ```bash tar -zxvf nacos-server-2.2.2.tar.gz cd nacos/bin sh startup.sh -m standalone # 单机模式启动 ``` > **补充说明**:若您希望将自己的微服务项目打包为单一JAR,需在主模块配置 `spring-boot-maven-plugin` 插件,并确保其他模块作为依赖引入[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

迅捷的软件产品制作专家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值