Spring Boot集成Nacos踩的坑

390 阅读1分钟

无法读取public下的配置

因为碰到一个坑,项目中加载远程配置的优先级高于本地配置项,故重新起了一个新的工程和nacos本地环境准备试一把,没想到碰到其他的坑

spring boot使用 2.2.4.RELEASE 版本,nacos使用 2.4.2 版本,nacos-config-spring-boot-starter 工程一直没有更新,最新的2.x版本(即0.2.12)依赖的nacos仍旧是2.1,故对依赖做了排除重新引用,如下

<dependency>
    <groupId>com.alibaba.boot</groupId>
    <artifactId>nacos-config-spring-boot-starter</artifactId>
    <version>0.2.12</version>
    <exclusions>
        <exclusion>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>com.alibaba.nacos</groupId>
    <artifactId>nacos-client</artifactId>
    <version>2.4.2</version>
</dependency>

对 Spring boot的依赖如下

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>5.3.31</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
</dependencies>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.2.4.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

yaml中使用spring boot的配置方式,如下

nacos:
  config:
    server-addr: 127.0.0.1:8848
    context-path: nacos
    namespace: public
    group: DEFAULT_GROUP
    data-id: COMMON
    type: yaml
    bootstrap:
      enable: true
      log-enable: true

问题是死活读不到配置项,检查namespace、group、data-id、type完全没问题,nacos启动无任何报错,代码debug无法获取配置内容,debug位置位于 com.alibaba.nacos.common.remote.client.grpc.GrpcConnection#request最终方法,发送请求无返回内容

public Response request(Request request, long timeouts) throws NacosException {
    Payload grpcRequest = GrpcUtils.convert(request);
    ListenableFuture<Payload> requestFuture = grpcFutureServiceStub.request(grpcRequest);
    Payload grpcResponse;
    try {
        grpcResponse = requestFuture.get(timeouts, TimeUnit.MILLISECONDS);
    } catch (Exception e) {
        throw new NacosException(NacosException.SERVER_ERROR, e);
    }

    return (Response) GrpcUtils.parse(grpcResponse);
}

最终定位到问题是内置的 public 命名空间的命名空间id是空的,也就是在配置里面 namespace 要留空不写,🙂‍↔️

image.png