SpringCloudAlibaba之Nacos

目录

前言

一、环境准备

[1. Nacos 安装与启动](#1. Nacos 安装与启动)

[2. 环境检查](#2. 环境检查)

[二、项目集成(版本对齐 + 依赖细化)](#二、项目集成(版本对齐 + 依赖细化))

[1. 版本兼容性说明](#1. 版本兼容性说明)

[2. 依赖配置(pom.xml 细化)](#2. 依赖配置(pom.xml 细化))

[三、配置文件(分层 + 优先级说明)](#三、配置文件(分层 + 优先级说明))

[1. bootstrap.yml(核心配置,启动优先级最高)](#1. bootstrap.yml(核心配置,启动优先级最高))

[2. application.yml(本地默认配置,优先级低于 Nacos)](#2. application.yml(本地默认配置,优先级低于 Nacos))

[四、功能实现(细化 + 避坑)](#四、功能实现(细化 + 避坑))

[1. 服务注册与发现](#1. 服务注册与发现)

(1)启动类注解

[(2)服务调用(3 种方式)](#(2)服务调用(3 种方式))

[2. 配置中心(进阶用法)](#2. 配置中心(进阶用法))

[(1)Nacos 控制台配置规则](#(1)Nacos 控制台配置规则)

(2)配置读取与动态刷新

五、验证与调试

[1. 服务注册验证](#1. 服务注册验证)

[2. 配置中心验证](#2. 配置中心验证)

[3. 服务调用验证](#3. 服务调用验证)

六、生产级优化建议

[1. Nacos 集群部署](#1. Nacos 集群部署)

[2. 配置加密](#2. 配置加密)

[3. 服务健康检查](#3. 服务健康检查)

[4. 配置灰度发布](#4. 配置灰度发布)

[5. 日志与监控](#5. 日志与监控)

七、常见问题与解决方案


前言

Nacos(Dynamic Naming and Configuration Service)是阿里巴巴开源的一款动态服务发现、配置管理和服务管理平台,致力于帮助开发者快速构建云原生应用和微服务架构。

一、环境准备

1. Nacos 安装与启动
  • 下载建议 :生产环境推荐下载稳定版(如 2.3.2),避免使用快照版。

  • 单机启动 :Linux/Mac:

    bash

    运行

    复制代码
    # 进入Nacos bin目录
    cd nacos/bin
    # 单机模式启动(嵌入式数据库 Derby)
    sh startup.sh -m standalone

    Windows:

    bash

    运行

    复制代码
    cd nacos\bin
    startup.cmd -m standalone
  • 控制台访问 :地址:http://localhost:8848/nacos默认账号 / 密码:nacos/nacos(生产环境务必修改!)

2. 环境检查

启动后通过 curl http://localhost:8848/nacos/v1/ns/instance?serviceName=nacos-test 验证 Nacos 服务是否正常(返回 JSON 即表示可用)。

二、项目集成(版本对齐 + 依赖)

1. 版本兼容性说明
Spring Boot 版本 Spring Cloud Alibaba 版本 Nacos 版本
2.7.x 2021.0.5.0 2.0.x+
2.6.x 2021.0.4.0 2.0.x+
2.5.x 2021.0.1.0 2.0.x+

注意 :版本不匹配会导致启动报错(如 NoSuchMethodError),务必严格对齐!

2. 依赖配置(pom.xml)

xml

复制代码
<!-- 父工程依赖管理(锁定版本) -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.12</version>
    <relativePath/>
</parent>

<dependencyManagement>
    <dependencies>
        <!-- Spring Cloud Alibaba 依赖管理 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2021.0.5.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!-- Spring Cloud 依赖管理(若需) -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>2021.0.5</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<!-- 核心依赖 -->
<dependencies>
    <!-- Nacos 服务发现(必选) -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>

    <!-- Nacos 配置中心(可选,需配置中心则加) -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>

    <!-- Web 容器(测试接口用) -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- 健康检查(可选,监控用) -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
</dependencies>

三、配置文件(分层 + 优先级说明)

1. bootstrap.yml(核心配置,启动优先级最高)

yaml

复制代码
spring:
  application:
    name: nacos-demo  # 服务名(关键!配置中心DataId默认前缀)
  profiles:
    active: dev  # 激活环境(dev/test/prod)
  cloud:
    nacos:
      # 服务发现配置
      discovery:
        server-addr: 127.0.0.1:8848  # Nacos集群可配置:127.0.0.1:8848,127.0.0.1:8849
        namespace: dev-namespace-id  # 命名空间ID(非名称!)
        group: DEFAULT_GROUP  # 分组(默认DEFAULT_GROUP)
        username: nacos  # Nacos 2.2.0+需配置账号密码
        password: nacos
        metadata:  # 服务元数据(自定义标签,用于路由)
          version: v1
          env: dev
      # 配置中心配置
      config:
        server-addr: ${spring.cloud.nacos.discovery.server-addr}
        namespace: ${spring.cloud.nacos.discovery.namespace}
        group: ${spring.cloud.nacos.discovery.group}
        username: ${spring.cloud.nacos.discovery.username}
        password: ${spring.cloud.nacos.discovery.password}
        file-extension: yaml  # 配置文件格式(yaml/yml/properties)
        # 扩展配置(多DataId加载)
        extension-configs:
          - data-id: common.yaml  # 公共配置(所有服务共享)
            group: DEFAULT_GROUP
            refresh: true  # 是否动态刷新
          - data-id: redis-${spring.profiles.active}.yaml  # 环境隔离的Redis配置
            group: DEFAULT_GROUP
            refresh: true
2. application.yml(本地默认配置,优先级低于 Nacos)

yaml

复制代码
server:
  port: 8080  # 服务端口

# 暴露Actuator端点(监控服务健康状态)
management:
  endpoints:
    web:
      exposure:
        include: '*'
  endpoint:
    health:
      show-details: always

四、功能实现

1. 服务注册与发现
(1)启动类注解

java

运行

复制代码
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * @EnableDiscoveryClient:激活服务发现(Spring Cloud通用注解)
 * 注:Spring Cloud Alibaba 2021.x+ 可省略此注解(自动装配)
 */
@SpringBootApplication
@EnableDiscoveryClient
public class NacosDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(NacosDemoApplication.class, args);
    }
}
(2)服务调用(3 种方式)
  • 方式 1:RestTemplate + @LoadBalanced

    java

    运行

    复制代码
    import org.springframework.cloud.client.loadbalancer.LoadBalanced;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.client.RestTemplate;
    
    @Configuration
    public class RestTemplateConfig {
        @Bean
        @LoadBalanced  // 开启负载均衡(核心!通过服务名调用)
        public RestTemplate restTemplate() {
            return new RestTemplate();
        }
    }

    使用示例:

    java

    运行

    复制代码
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.client.RestTemplate;
    
    @RestController
    public class DemoController {
        @Autowired
        private RestTemplate restTemplate;
    
        @GetMapping("/call-provider")
        public String callProvider() {
            // 服务名必须与提供者的spring.application.name一致
            return restTemplate.getForObject("http://nacos-provider/hello", String.class);
        }
    }
  • **方式 2:OpenFeign(声明式调用)**新增依赖:

    xml

    复制代码
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>

    启动类添加 @EnableFeignClients

    java

    运行

    复制代码
    @SpringBootApplication
    @EnableFeignClients  // 启用Feign
    public class NacosDemoApplication { ... }

    编写 Feign 接口:

    java

    运行

    复制代码
    import org.springframework.cloud.openfeign.FeignClient;
    import org.springframework.web.bind.annotation.GetMapping;
    
    @FeignClient(name = "nacos-provider")  // 目标服务名
    public interface ProviderFeignClient {
        @GetMapping("/hello")
        String hello();
    }

    使用示例:

    java

    运行

    复制代码
    @RestController
    public class FeignDemoController {
        @Autowired
        private ProviderFeignClient feignClient;
    
        @GetMapping("/feign-call")
        public String feignCall() {
            return feignClient.hello();
        }
    }
  • 方式 3:LoadBalancerClient(手动负载均衡)

    java

    运行

    复制代码
    import org.springframework.cloud.client.ServiceInstance;
    import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class LoadBalancerController {
        @Autowired
        private LoadBalancerClient loadBalancerClient;
    
        @GetMapping("/manual-call")
        public String manualCall() {
            // 获取服务实例
            ServiceInstance instance = loadBalancerClient.choose("nacos-provider");
            String url = String.format("http://%s:%s/hello", instance.getHost(), instance.getPort());
            return new RestTemplate().getForObject(url, String.class);
        }
    }
2. 配置中心(进阶用法)
(1)Nacos 控制台配置规则
场景 Data ID 命名规则 示例
默认环境配置 ${spring.application.name}.${file-extension} nacos-demo.yaml
指定环境配置 ${spring.application.name}-${profile}.${file-extension} nacos-demo-dev.yaml
公共配置 common.${file-extension} common.yaml
环境隔离公共配置 common-${profile}.${file-extension} common-dev.yaml

创建配置示例

  • Data ID:nacos-demo-dev.yaml

  • Group:DEFAULT_GROUP

  • 配置内容: yaml

    复制代码
    business:
      title: "Nacos配置中心测试(DEV)"
      switch: true
    db:
      url: jdbc:mysql://localhost:3306/dev_db
      username: root
      password: 123456
(2)配置读取与动态刷新
  • 方式 1:@Value + @RefreshScope

    java

    运行

    复制代码
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.cloud.context.config.annotation.RefreshScope;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    @RefreshScope  // 关键!开启配置动态刷新
    public class ConfigController {
        // 直接读取配置项
        @Value("${business.title:默认标题}")  // 冒号后为默认值(配置不存在时使用)
        private String title;
    
        @Value("${db.url}")
        private String dbUrl;
    
        @GetMapping("/config/get")
        public String getConfig() {
            return "Title: " + title + "<br/>DB URL: " + dbUrl;
        }
    }
  • 方式 2:@ConfigurationProperties(对象绑定)

    java

    运行

    复制代码
    import lombok.Data;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.stereotype.Component;
    
    @Data  // Lombok简化getter/setter
    @Component
    @ConfigurationProperties(prefix = "db")  // 绑定前缀为db的配置
    public class DbProperties {
        private String url;
        private String username;
        private String password;
    }

    使用示例:

    java

    运行

    复制代码
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.cloud.context.config.annotation.RefreshScope;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    @RefreshScope
    public class DbConfigController {
        @Autowired
        private DbProperties dbProperties;
    
        @GetMapping("/db/config")
        public String getDbConfig() {
            return "DB配置:" + dbProperties.toString();
        }
    }
  • 方式 3:Environment 对象(原生读取)

    java

    运行

    复制代码
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.core.env.Environment;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class EnvController {
        @Autowired
        private Environment environment;
    
        @GetMapping("/env/get")
        public String getEnv() {
            return "Business Switch: " + environment.getProperty("business.switch", "false");
        }
    }

五、验证与调试

1. 服务注册验证
  • Nacos 控制台 :「服务管理」→「服务列表」→ 查看 nacos-demo 是否在列,健康实例数是否为 1。
  • 接口验证 :访问 http://localhost:8080/actuator/service-registry,返回 {"status":"UP"} 表示注册成功。
2. 配置中心验证
  • 读取验证 :访问 http://localhost:8080/config/get,返回 Nacos 配置的内容。
  • 动态刷新验证:修改 Nacos 控制台的配置并发布 → 再次访问接口,配置值已更新(无需重启服务)。
3. 服务调用验证
  • 启动 nacos-provider 服务(提供 /hello 接口)→ 访问 http://localhost:8080/call-provider,返回提供者响应。

六、生产级优化建议

1. Nacos 集群部署
  • 至少 3 个节点,配置 MySQL 集群存储(避免嵌入式 Derby)。
  • 客户端配置多个 Nacos 地址:server-addr: 192.168.1.100:8848,192.168.1.101:8848,192.168.1.102:8848
2. 配置加密
  • 使用 Nacos 配置加密插件(如 nacos-config-crypto),对敏感配置(如密码)加密存储。
3. 服务健康检查
  • 配置自定义健康检查: yaml

    复制代码
    spring:
      cloud:
        nacos:
          discovery:
            health-check-enabled: true  # 开启健康检查
            health-check-type: HTTP     # 检查类型(HTTP/TCP/CUSTOM)
            health-check-path: /actuator/health  # 健康检查接口
4. 配置灰度发布
  • 通过 Nacos 控制台的「配置管理」→「灰度发布」,指定 IP / 实例进行配置灰度推送。
5. 日志与监控
  • 集成 Prometheus + Grafana 监控 Nacos 指标(如服务注册数、配置变更次数)。

  • 开启 Nacos 客户端日志: xml

    复制代码
    <logger name="com.alibaba.nacos.client" level="INFO"/>

七、常见问题与解决方案

问题现象 原因分析 解决方案
服务无法注册 Nacos 地址错误 / 端口不通 / 命名空间 ID 错误 检查 server-addr、网络连通性,确认命名空间为ID而非名称
配置无法加载 Data ID 不匹配 / Group/Namespace 不一致 核对 Data ID 命名规则,确保配置分组、命名空间与客户端一致
动态刷新不生效 未加 @RefreshScope 注解 在需要刷新的类上添加 @RefreshScope
Feign 调用失败 服务名错误 / Feign 依赖缺失 检查 @FeignClient 名称与提供者一致,引入 spring-cloud-starter-openfeign
Nacos 控制台登录失败 2.2.0 + 版本默认关闭简单认证 nacos/application.properties 中配置 nacos.core.auth.enabled=false(测试环境)

通过以上细化步骤,可实现 Nacos 在 Spring Cloud Alibaba 项目中的生产级集成,覆盖服务发现、配置管理的核心场景及进阶用法。

相关推荐
seeyoutlb1 小时前
微服务全局日志处理
java·python·微服务
serendipity_hky3 小时前
互联网大厂Java面试故事:核心技术栈与场景化业务问题实战解析
java·spring boot·redis·elasticsearch·微服务·消息队列·内容社区
阿拉斯攀登4 小时前
深入微服务配置中心:Nacos注册中心的实操细节
java·微服务·云原生·springcloud
wangmengxxw7 小时前
微服务-服务配置
java·运维·微服务·云计算·服务配置
少许极端9 小时前
Redis入门指南:从零到分布式缓存(一)
redis·分布式·缓存·微服务
沐浴露z10 小时前
如何应对服务雪崩?详解 服务降级与服务熔断
java·微服务
zhou_gai13 小时前
供应链计划系统架构实战(四):架构蓝图--支持全球业务的微服务架构设计
微服务·架构·系统架构
二宝15213 小时前
黑马商城day11-微服务面试
微服务·面试·架构