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 秒,观察实例健康变化与恢复流程。