Nacos 是阿里巴巴开源的云原生中间件项目,核心目的是简化分布式、云原生应用的服务治理流程。它整合了服务发现、配置管理、动态 DNS 三大核心能力,降低分布式系统的搭建、部署与维护门槛,帮助开发者快速构建稳定、易管控的微服务架构。
服务注册与发现是微服务架构的核心基础能力。在分布式环境中,所有服务独立部署,服务之间无法直接感知彼此位置。因此需要依靠注册中心统一管控:
服务提供者启动后主动上报自身网络信息,完成服务注册;
服务消费者在需要调用服务时,从注册中心拉取可用服务实例,完成服务发现与远程调用。
服务提供者专注业务功能实现,启动后主动向 Nacos 注册中心提交注册信息,由 Nacos 统一维护实例状态,同时持续检测服务健康度,剔除异常实例,保障服务可用性。完整流程如下:
启动服务提供者:服务项目启动,自动向 Nacos 服务端发送注册请求,携带服务名、IP 地址、端口等核心信息;
注册信息持久化存储:Nacos 服务端接收注册请求,校验信息合法后,将服务实例数据存入内置数据库;
定时健康检查:Nacos 以固定时间间隔主动探测已注册服务,检测服务运行状态,自动下线宕机、异常的服务实例。

服务消费者无需硬编码服务地址,调用接口前向 Nacos 拉取服务列表,结合负载均衡策略挑选实例发起调用,实现服务无感访问,降低服务耦合度。完整流程如下:
查询服务实例:消费者需要远程调用时,向 Nacos 发送查询请求,指定目标服务名称;
返回可用实例列表:Nacos 筛选健康存活的服务实例,整理实例列表并返回给消费者;
发起远程调用:消费者依据内置负载均衡策略,随机、轮询或按权重挑选实例,完成服务调用。

创建一个名为 sca-service 的模块pom.xml 如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.lusifer</groupId>
<artifactId>sca</artifactId>
<version>${revision}</version>
</parent>
<artifactId>sca-service</artifactId>
<packaging>pom</packaging>
<name>${project.artifactId}</name>
<description>服务模块</description>
<dependencies>
<!-- 注意这里的服务发现相关依赖包 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
<modules>
<module>sca-service-provider</module>
</modules>
</project>在该模块下再创建一个名为 sca-service-provider 的子模块pom.xml 如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.lusifer</groupId>
<artifactId>sca-service</artifactId>
<version>${revision}</version>
</parent>
<artifactId>sca-service-provider</artifactId>
<packaging>jar</packaging>
<name>${project.artifactId}</name>
<description>服务提供者</description>
<dependencies>
<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>
<build>
<finalName>${project.artifactId}</finalName>
</build>
</project>编写启动类 com.lusifer.sca.service.provider.ProviderApplication
package com.lusifer.sca.service.provider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
// 注意这里的服务发现注解
@EnableDiscoveryClient
@SpringBootApplication
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}编写控制器 com.lusifer.sca.service.provider.controller.EchoController
package com.lusifer.sca.service.provider.controller;
import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
import jakarta.annotation.Resource;
import java.util.Map;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class EchoController {
@Resource private NacosDiscoveryProperties nacosDiscoveryProperties;
@GetMapping("/echo/{string}")
public String echo(@PathVariable String string) {
return "Hello Nacos Discovery " + string;
}
@GetMapping("/divide")
public String divide(@RequestParam Integer a, @RequestParam Integer b) {
if (b == 0) {
return String.valueOf(0);
} else {
return String.valueOf(a / b);
}
}
@GetMapping("/zone")
public String zone() {
Map<String, String> metadata = nacosDiscoveryProperties.getMetadata();
return "provider zone " + metadata.get("zone");
}
}编写 application.yml 配置文件
server:
# 配置服务端口,设置为 0 表示由系统自动分配一个可用端口
port: 0
spring:
application:
# 应用名称
name: service-provider
cloud:
nacos:
discovery:
# 服务器地址
server-addr: 192.168.203.200:8848
# 开启服务发现功能
enabled: true
username: nacos
password: 123456
management:
endpoints:
web:
exposure:
include: '*' # 暴露所有管理端点
endpoint:
health:
show-details: always # 始终显示健康检查详情
运行 ProviderApplication,再通过 Nacos 查看服务是否注册成功

编辑应用配置
