nacos-client源码分析

说明:本篇文章部分内容参考了网上的文章(在下文已给出原文链接),由于本人能力有限,如果有书写错误的地方,欢迎各位大佬批评指正!我们互相交流,学习,共同进步!

该项目的地址:https://github.com/xiaoheng1/nacos_read

nacos-client 源码分析

IConfigRequest 的作用,我理解是配置请求.

void putParameter(String key, Object value);

Object getParameter(String key);

IConfigContext getConfigContext();

ConfigRequest 中的 param 和 contextConfig 有啥区别?

IConfigFilterChain filter 链.

ConfigFilterChainManager 实现 IConfigFilterChain 接口,在构造 ConfigFilterChainManager 的时候,通过 SPI 加载 IConfigFilter 的所有实现, 并将 filter 加入到 filters 中.

filter 链的设计:

1.将 filter 构造成用指针连接起来的结构,相当于俄罗斯套娃那种结构,例如 dubbo.

经典代码:

private static Invoker buildInvokerChain(final Invoker invoker, String key, String group) {
Invoker last = invoker;
List filters = ExtensionLoader.getExtensionLoader(Filter.class).getActivateExtension(invoker.getUrl(), key, group);

if (!filters.isEmpty()) {
    for (int i = filters.size() - 1
我在根目录进行打包,打包出来的包是一个个微服务而不是大包,这是我什么地方做错了呢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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值