Nacos 完整配置读取与注册项目
项目合同
Nacos 完整示例 先读取 NOTES 组的 reader.properties,校验 request.limit 为正整数,再注册 notes-reader 临时实例,读取一次健康快照,最后主动注销并关闭 NamingService 与 ConfigService。注册的 127.0.0.1:18080 只是独立实验标识,本项目不启动业务监听,因此不能把它用于真实消费者或宣称业务健康。请在完全隔离的测试 namespace 中阅读运行。
源码绑定 client 2.4.3、Server 2.4.x、JDK 17、Maven 3.9。退出码 0 表示配置有效并完成客户端操作,2 表示配置不存在,1 表示认证、连接、解析或清理等错误。HEALTHY_SNAPSHOT=0 仍可退出 0,因为程序只展示注册后的单次观察,不承诺即时传播。完整示例未执行,未安装产品依赖,未使用外部账号。
完整源码与依赖
Nacos 源码依赖 固定在独立 pom.xml,不改本站依赖。环境变量提供 serverAddr、namespace ID 和凭据,避免在源码写密码。程序没有发布或覆盖配置,也不删除现有配置;读者先在自己的测试空间创建示例文本。固定 service/IP/port 会影响相同标识实例,因此不能与别人共用测试空间。
<project xmlns="http://maven.apache.org/POM/4.0.0"><modelVersion>4.0.0</modelVersion><groupId>notes</groupId><artifactId>nacos-reader</artifactId><version>1.0</version><properties><maven.compiler.release>17</maven.compiler.release><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId><version>2.4.3</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.13.0</version></plugin><plugin><groupId>org.codehaus.mojo</groupId><artifactId>exec-maven-plugin</artifactId><version>3.5.0</version><configuration><mainClass>notes.DiscoveryConfig</mainClass></configuration></plugin></plugins></build></project>request.limit=20package notes;
import java.util.Properties;
import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.naming.pojo.Instance;
public class DiscoveryConfig {
static String required(String name) {
String value = System.getenv(name);
if (value == null || value.isBlank()) throw new IllegalArgumentException(name + " required");
return value;
}
public static void main(String[] args) {
int code = 0;
try { code = run(); }
catch (Exception e) { System.err.println(e.getClass().getSimpleName() + ": " + e.getMessage()); code = 1; }
System.exit(code);
}
static int run() throws Exception {
Properties p = new Properties();
p.setProperty("serverAddr", required("NACOS_ADDR"));
p.setProperty("namespace", required("NACOS_NAMESPACE"));
p.setProperty("username", required("NACOS_USERNAME"));
p.setProperty("password", required("NACOS_PASSWORD"));
ConfigService config = null;
NamingService naming = null;
boolean registered = false;
try {
config = NacosFactory.createConfigService(p);
naming = NacosFactory.createNamingService(p);
String content = config.getConfig("reader.properties", "NOTES", 5000);
if (content == null) { System.err.println("CONFIG_MISSING"); return 2; }
Properties app = new Properties();
app.load(new java.io.StringReader(content));
String limit = app.getProperty("request.limit");
if (limit == null || Integer.parseInt(limit) < 1) throw new IllegalArgumentException("request.limit must be positive");
Instance instance = new Instance();
instance.setIp("127.0.0.1"); instance.setPort(18080); instance.setClusterName("DEFAULT"); instance.setEphemeral(true);
naming.registerInstance("notes-reader", "NOTES", instance);
registered = true;
// Snapshot, not a guarantee that the registered instance is already visible.
int count = naming.selectInstances("notes-reader", "NOTES", true).size();
System.out.println("CONFIG_VALID HEALTHY_SNAPSHOT=" + count);
return 0;
} finally {
try { if (registered) naming.deregisterInstance("notes-reader", "NOTES", "127.0.0.1", 18080, "DEFAULT"); }
finally {
try { if (naming != null) naming.shutDown(); }
finally { if (config != null) config.shutDown(); }
}
}
}
}读者自跑与预期
Nacos 示例运行 先由读者准备开启鉴权的独立 2.4.x 环境、namespace 和上述配置,身份具备指定配置读权限、指定服务注册/注销及发现权限。这里不提供服务启动或鉴权初始化脚本;这些操作需要具体部署前提,不能混进客户端最小示例。
cd examples/nacos
export NACOS_ADDR=127.0.0.1:8848
export NACOS_NAMESPACE=replace-with-your-test-namespace-id
export NACOS_USERNAME=reader-lab
export NACOS_PASSWORD=replace-with-your-own-secret
mvn compile exec:javaPowerShell 使用 $env:NACOS_ADDR 等赋值。预期正常输出 CONFIG_VALID HEALTHY_SNAPSHOT=某个非负整数;配置不存在输出 CONFIG_MISSING,程序码 2;request.limit=0 或非整数输出异常,程序码 1;凭据错误或 gRPC 不可达输出客户端异常,程序码 1。Maven 外层可能把非零程序退出包装为插件失败,不能把其 shell 状态码无条件等同程序码;需要原始状态时,读者在已准备完整依赖类路径后用 java -cp "$NACOS_CP" notes.DiscoveryConfig。
程序 finally 尽力注销,再分别关闭两个客户端;退出日志不证明清理一定成功,网络失败时须回到自己的测试空间确认残留实例。没有设置发布配置操作,所以不会清理 reader.properties,读者结束后按自己权限删除实验配置。
阶段实践与参考解答
Nacos 阶段实践 写出三种环境:正确三元组、错误 group、格式错误内容,预测程序是否注册。参考解答:正确配置通过校验后注册;错误 group 得 null,返回 2 且不注册;内容非法抛异常,返回 1 且不注册。再推演“注册成功立即查零实例”:不应把这个短暂观察等同注册丢失,应在隔离环境按客户端订阅与传播时序调查;本示例不通过无限轮询隐藏边界。
核对 2026-10-17,一手来源 2.4 Java SDK。本页不声称 SDK 构建或服务交互已验证。
继续阅读
- 知识专题
- 问题排查