9.7.1 Java/Spring生态客户端集成
Java/Spring 生态接入 Nacos 主要覆盖服务注册发现与配置管理两条链路,目标是把实例元数据、心跳、动态配置纳入统一治理,实现灰度、权重、健康检查与多环境隔离。
一、安装与依赖引入(Spring Boot/Spring Cloud)
1) Maven 依赖(pom.xml)
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2021.0.4.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
</dependencies>
2) 应用配置(bootstrap.yml 优先加载)
spring:
application:
name: order-service
profiles:
active: dev
cloud:
nacos:
discovery:
server-addr: 10.0.0.10:8848
namespace: dev-namespace
group: DEFAULT_GROUP
cluster-name: bj-a
weight: 1.0
metadata:
zone: bj
version: v1
ephemeral: true
config:
server-addr: 10.0.0.10:8848
namespace: dev-namespace
group: DEFAULT_GROUP
file-extension: yaml
refresh-enabled: true
shared-configs:
- data-id: common.yaml
group: DEFAULT_GROUP
refresh: true
3) 运行与验证
# 启动应用
mvn -q -DskipTests spring-boot:run
# 验证服务注册
curl -s "http://10.0.0.10:8848/nacos/v1/ns/instance/list?serviceName=order-service" | jq .
# 验证配置拉取(Spring 会自动注入)
curl -s "http://10.0.0.10:8848/nacos/v1/cs/configs?dataId=order-service-dev.yaml&group=DEFAULT_GROUP&tenant=dev-namespace"
二、纯 Java 客户端示例(不依赖 Spring)
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>2.2.3</version>
</dependency>
// src/main/java/com/demo/NacosDemo.java
Properties p = new Properties();
p.put("serverAddr", "10.0.0.10:8848");
p.put("namespace", "dev-namespace");
p.put("username", "nacos");
p.put("password", "nacos");
NamingService naming = NacosFactory.createNamingService(p);
ConfigService config = NacosFactory.createConfigService(p);
// 注册实例
naming.registerInstance("user-service", "10.0.1.20", 8080, "DEFAULT");
// 配置监听
config.addListener("user-service-dev.yaml", "DEFAULT_GROUP", new Listener() {
public Executor getExecutor() { return null; }
public void receiveConfigInfo(String s) { System.out.println("配置更新:" + s); }
});
// 应用退出前注销
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
try { naming.deregisterInstance("user-service", "10.0.1.20", 8080, "DEFAULT"); }
catch (Exception ignored) {}
}));
三、配置管理示例(动态刷新)
# nacos 配置中心:dataId=order-service-dev.yaml
order:
timeoutMs: 3000
gray:
enable: true
// Spring 注入示例
@RefreshScope
@RestController
public class OrderController {
@Value("${order.timeoutMs:1000}")
private int timeoutMs;
@GetMapping("/timeout")
public int timeout() { return timeoutMs; }
}
变更验证:
# 修改配置后访问接口观察刷新
curl -s http://localhost:8080/timeout
四、关键参数与命令解释
- discovery.ephemeral=true:临时实例,依赖心跳,适合常规微服务
- discovery.cluster-name:同机房优先
- config.shared-configs:共享配置(优先级低于应用配置)
- namespace:环境隔离,避免跨环境误引用
五、常见排错(含命令)
1) 注册失败
# 连通性
nc -vz 10.0.0.10 8848
# 认证
curl -s "http://10.0.0.10:8848/nacos/v1/auth/users?pageNo=1&pageSize=1" -u nacos:nacos
检查 server-addr、namespace、鉴权与版本兼容。
2) 配置不生效
# 确认 dataId/group/namespace 匹配
curl -s "http://10.0.0.10:8848/nacos/v1/cs/configs?dataId=order-service-dev.yaml&group=DEFAULT_GROUP&tenant=dev-namespace"
确认 bootstrap.yml 加载顺序与 file-extension。
3) 动态刷新失效
# 确认 @RefreshScope 生效范围
grep -R "@RefreshScope" -n src/main/java
检查是否使用 @Value 读取并在 Bean 上加 @RefreshScope。
4) 实例频繁剔除
# 查询实例健康
curl -s "http://10.0.0.10:8848/nacos/v1/ns/instance/list?serviceName=order-service&healthyOnly=false" | jq .
调大心跳间隔,检查网络抖动和 JVM GC。
六、练习
1) 新建 service-a/service-b,注册同一 serviceName 但不同 cluster-name,验证同集群优先策略。
2) 使用 shared-configs 提取公共配置,比较应用配置覆盖行为。
3) 将实例从 ephemeral=true 切换为 false,观察控制台心跳与剔除逻辑变化。
4) 模拟网络中断 30 秒,观察实例健康变化与恢复流程。