Nacos服务发现与配置中心:微服务注册中心实战
**作者洛水石** | **更新日期2026-05-11** | **标签Nacos | Spring Cloud | 微服务 | 服务治理**前言上周二早上9点线上告警炸了服务A调用服务B失败500错误。查了半天发现是服务B重启后IP变了服务A还在用旧的IP调用。这不是个案。在微服务架构中**服务实例是动态的**IP会变、端口会变、数量会动态伸缩。传统的配置文件方式根本无法应对这种变化。Nacos就是来解决这个问题的——**服务注册与发现、配置管理、服务健康监测**让你告别硬编码拥抱动态服务治理。一、Nacos核心概念1.1 服务注册与发现原理▲ Nacos服务注册发现架构**核心流程**服务提供者启动时向Nacos注册自己的信息服务消费者从Nacos获取服务提供者的实例列表Nacos感知到服务变化时主动通知消费者1.2 命名空间与隔离隔离级别说明使用场景**Namespace**顶级隔离不同环境dev/test/prod**Group**服务分组业务线/团队划分**DataID**具体配置配置文件二、快速部署2.1 Docker Compose部署# docker-compose.ymlversion: 3.8services:nacos:image: nacos/nacos-server:v2.2.3container_name: nacosenvironment:MODE: standaloneSPRING_DATASOURCE_PLATFORM: embeddedports:- 8848:8848- 9848:9848volumes:- ./data:/home/nacos/data- ./logs:/home/nacos/logsrestart: unless-stopped# 启动docker-compose up -d# 访问控制台# http://localhost:8848/nacos# 默认账号密码: nacos / nacos2.2 Kubernetes部署# nacos.yamlapiVersion: v1kind: ConfigMapmetadata:name: nacos-standalone-configdata:MODE: standalone---apiVersion: apps/v1kind: StatefulSetmetadata:name: nacosspec:serviceName: nacosreplicas: 1selector:matchLabels:app: nacostemplate:metadata:labels:app: nacosspec:containers:- name: nacosimage: nacos/nacos-server:v2.2.3ports:- containerPort: 8848name: client- containerPort: 9848name: grpcenv:- name: MODEvalueFrom:configMapKeyRef:name: nacos-standalone-configkey: MODEresources:requests:memory: 1Gicpu: 500mlimits:memory: 2Gicpu: 1000m三、Spring Boot集成3.1 依赖配置!-- pom.xml --dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactIdversion2022.0.0.0/version/dependencydependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-config/artifactIdversion2022.0.0.0/version/dependency3.2 application.yml# bootstrap.yml (注意是bootstrap不是application)spring:application:name: order-servicecloud:nacos:server-addr: 192.168.1.100:8848username: nacospassword: nacosdiscovery:namespace: devgroup: DEFAULT_GROUPmetadata:version: v1config:namespace: devgroup: DEFAULT_GROUPfile-extension: yamlrefresh-enabled: trueshared-configs:->group: GLOBALrefresh: true3.3 服务注册SpringBootApplicationEnableDiscoveryClient // 启用服务发现public class OrderServiceApplication {public static void main(String[] args) {SpringApplication.run(OrderServiceApplication.class, args);}}// 服务启动后自动注册到NacosRestControllerpublic class HealthController {GetMapping(/health)public String health() {return OK;}}3.4 服务调用Servicepublic class OrderService {Autowiredprivate RestTemplate restTemplate;// 方式1服务名直接调用Ribbon负载均衡BeanLoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}public Order createOrder(Long productId, Integer quantity) {// 通过服务名调用不需要知道IP和端口Product product restTemplate.getForObject(http://product-service/api/products/ productId,Product.class);// ... 创建订单return order;}}3.5 使用Feign调用// 定义Feign客户端FeignClient(name product-service, path /api/products)public interface ProductClient {GetMapping(/{id})Product getProduct(PathVariable(id) Long id);GetMapping(/{id}/stock)Integer getStock(PathVariable(id) Long id);}// 使用Servicepublic class OrderService {Autowiredprivate ProductClient productClient;public Order createOrder(Long productId) {Product product productClient.getProduct(productId);// ... 创建订单return order;}}四、配置中心4.1 在Nacos创建配置▲ 配置中心工作流程# Data ID: order-service.yaml# Group: DEFAULT_GROUP# Namespace: devspring:datasource:url: jdbc:mysql://mysql:3306/orders?useSSLfalseusername: rootpassword: ${DB_PASSWORD:default123}driver-class-name: com.mysql.cj.jdbc.Driverserver:port: ${SERVER_PORT:8080}order:timeout: 5000max-retry: 3payment-url: http://payment-service/api/pay4.2 动态获取配置RestControllerRefreshScope // 启用动态刷新public class OrderConfig {Value(${order.timeout:3000})private Integer timeout;Value(${order.max-retry:3})private Integer maxRetry;GetMapping(/config)public MapString, Object getConfig() {MapString, Object config new HashMap();config.put(timeout, timeout);config.put(maxRetry, maxRetry);return config;}}4.3 配置监听ComponentSlf4jpublic class NacosConfigListener {NacosConfigListener(dataId order-service.yaml, groupId DEFAULT_GROUP)public void onConfigChange(String config) {log.info(配置变更: {}, config);// 处理配置变更// 例如重新初始化连接池、刷新缓存等}}4.4 共享配置# 共享配置 - 多个服务共用# Data ID: common.yaml# Group: GLOBAL# 日志配置logging:level:root: INFOcom.example: DEBUGpattern:console: %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n# Swagger配置swagger:enabled: truetitle: API文档version: 1.0五、服务治理5.1 负载均衡权重// 服务实例级别设置权重Configurationpublic class RibbonConfig {Beanpublic IRule ribbonRule() {// 权重负载均衡 - 根据权重分配流量return new WeightedResponseTimeRule();}}5.2 熔断降级FeignClient(name product-service, fallback ProductClientFallback.class)public interface ProductClient {GetMapping(/{id})Product getProduct(PathVariable(id) Long id);}// 降级实现ComponentSlf4jpublic class ProductClientFallback implements ProductClient {Overridepublic Product getProduct(Long id) {log.warn(Product服务调用失败返回降级数据);Product fallbackProduct new Product();fallbackProduct.setId(id);fallbackProduct.setName(降级商品);fallbackProduct.setPrice(BigDecimal.ZERO);return fallbackProduct;}}5.3 命名空间隔离# bootstrap.ymlspring:cloud:nacos:discovery:namespace: ${NACOS_NAMESPACE} # 指定命名空间group: ${SERVICE_GROUP} # 指定分组// Java中获取某命名空间的服务Autowiredprivate NamingService namingService;public ListInstance getInstances(String serviceName) {try {return namingService.selectInstances(serviceName, true);} catch (NacosException e) {log.error(获取服务实例失败, e);return Collections.emptyList();}}六、生产最佳实践6.1 高可用部署▲ Nacos高可用集群架构# nacos-cluster.yamlversion: 3.8services:nacos1:image: nacos/nacos-server:v2.2.3container_name: nacos1environment:MODE: clusterNACOS_SERVERS: nacos1:8848 nacos2:8848 nacos3:8848MYSQL_HOST: mysqlMYSQL_DB_NAME: nacosMYSQL_USER: nacosMYSQL_PASSWORD: nacos123ports:- 8848:8848depends_on:- mysqlnacos2:image: nacos/nacos-server:v2.2.3container_name: nacos2environment:MODE: clusterNACOS_SERVERS: nacos1:8848 nacos2:8848 nacos3:8848MYSQL_HOST: mysqlMYSQL_DB_NAME: nacosMYSQL_USER: nacosMYSQL_PASSWORD: nacos123ports:- 8849:8848nacos3:image: nacos/nacos-server:v2.2.3container_name: nacos3environment:MODE: clusterNACOS_SERVERS: nacos1:8848 nacos2:8848 nacos3:8848MYSQL_HOST: mysqlMYSQL_DB_NAME: nacosMYSQL_USER: nacosMYSQL_PASSWORD: nacos123ports:- 8850:8848mysql:image: mysql:8.0environment:MYSQL_ROOT_PASSWORD: root123MYSQL_DATABASE: nacosvolumes:- mysql_data:/var/lib/mysqlvolumes:mysql_data:6.2 配置加密// 配置属性加密Configurationpublic class NacosConfig {NacosConfigurationProperties(prefix spring.datasource)public DataSourceProperties dataSourceProperties() {return new DataSourceProperties();}}// 使用加密配置spring:datasource:password: {cipher}xxx加密后的密码xxx七、常见问题Q1: 服务注册后发现实例不存在# 检查网络连通性curl http://192.168.1.100:8848/nacos/v1/ns/instance/list?serviceNameorder-service# 检查服务实例元数据curl http://192.168.1.100:8848/nacos/v1/ns/instance/metadata?serviceNameorder-serviceQ2: 配置更新后没有生效// 检查是否添加了 RefreshScopeRestControllerRefreshScope // 必须添加public class ConfigController {Value(${custom.config})private String config;}Q3: 服务下线后仍被调用// 确保正确下线PreDestroypublic void deregister() {try {nacosServiceManager.getNamingService().deregisterInstance(serviceName, ip, port);} catch (NacosException e) {log.error(服务注销失败, e);}}总结Nacos核心能力一览能力说明收益**服务注册**自动注册、心跳检测免去手动维护服务列表**服务发现**动态获取、实时通知告别硬编码IP**配置管理**集中管理、动态刷新配置变更无需重启**命名空间**环境隔离、逻辑分区支持多环境部署**高可用**集群模式、数据持久化生产环境必备**下一步建议**集成Sentinel实现流量控制接入SkyWalking实现链路追踪配置Prometheus监控*微服务架构Nacos让服务治理变得简单。*