0%

使用Nacos注册中心

使用 Nacos 作为服务注册中心:快速集成与实战

Nacos 作为 Spring Cloud Alibaba 生态的核心组件,不仅提供了强大的服务注册发现能力,还支持动态配置管理。本文详细介绍如何将 Nacos 集成到微服务中作为注册中心,实现服务的注册与发现。

前期准备:启动 Nacos 服务

在使用 Nacos 作为注册中心前,需确保 Nacos 服务已启动:

  1. 启动单机模式(开发环境):
    进入 Nacos 安装目录的bin文件夹,执行以下命令:

    1
    2
    3
    4
    # Linux/Mac
    sh startup.sh -m standalone
    # Windows
    startup.cmd -m standalone
  2. 验证启动成功
    访问 Nacos 控制台 http://localhost:8848/nacos,使用默认账号密码(nacos/nacos)登录,能看到控制台界面即启动成功。

服务提供者集成 Nacos

1. 引入依赖

在服务提供者的pom.xml中添加 Nacos 服务发现依赖:

1
2
3
4
5
6
7
8
9
10
11
12
<!-- Spring Cloud Alibaba Nacos 服务发现 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<!-- 版本需与Spring Cloud Alibaba版本匹配,如2.2.7.RELEASE -->
</dependency>

<!-- Spring Boot Web(提供REST接口) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

注意:需确保spring-cloud-alibaba-dependencies的版本与 Spring Boot 版本兼容(如 Spring Boot 2.3.x 对应 Alibaba 2.2.x)。

2. 配置 Nacos 注册信息

application.yml中配置服务名称和 Nacos 服务地址:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
server:
port: 8081 # 服务端口

spring:
application:
name: springcloudalibaba-provider-nacos # 服务名称(注册到Nacos的标识)
cloud:
nacos:
discovery:
server-addr: localhost:8848 # Nacos服务地址(集群环境用逗号分隔多个地址)
# 可选配置:命名空间(隔离不同环境,如dev/test/prod)
# namespace: dev
# 可选配置:服务分组(同一环境下的服务分组)
# group: DEFAULT_GROUP

# 暴露健康检查端点(供Nacos检测服务状态)
management:
endpoints:
web:
exposure:
include: '*' # 暴露所有端点,包括/actuator/health
  • 命名空间(namespace):用于隔离不同环境(如开发、测试),默认使用public命名空间;
  • 分组(group):同一命名空间下的服务可进一步分组(如按业务模块),默认DEFAULT_GROUP

3. 编写启动类

通过@EnableDiscoveryClient注解启用服务注册与发现功能:

1
2
3
4
5
6
7
8
9
10
11
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient // 启用服务注册与发现(Nacos自动识别)
public class ProviderNacosApp {
public static void main(String[] args) {
SpringApplication.run(ProviderNacosApp.class, args);
}
}

4. 提供测试接口

编写一个简单的 REST 接口,供消费者调用:

1
2
3
4
5
6
7
8
9
10
11
12
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ProviderController {

@GetMapping("/hello/{name}")
public String hello(@PathVariable String name) {
return "Hello, " + name + "! 我是服务提供者(端口:8081)";
}
}

5. 启动服务并验证注册

启动服务提供者后,登录 Nacos 控制台:

  • 进入「服务管理」→「服务列表」,可看到springcloudalibaba-provider-nacos服务已注册,且状态为「健康」。

服务消费者集成 Nacos

服务消费者通过 Nacos 发现服务提供者,并调用其接口。

1. 引入依赖

与服务提供者相同,需引入 Nacos 服务发现和 Web 依赖:

1
2
3
4
5
6
7
8
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

2. 配置 Nacos 信息

application.yml中配置消费者信息:

1
2
3
4
5
6
7
8
9
10
server:
port: 8082 # 消费者端口

spring:
application:
name: springcloudalibaba-consumer-nacos # 消费者服务名
cloud:
nacos:
discovery:
server-addr: localhost:8848 # Nacos服务地址(与提供者一致)

3. 编写启动类(配置 RestTemplate)

配置RestTemplate用于服务调用,并通过@LoadBalanced启用负载均衡:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@EnableDiscoveryClient
public class ConsumerNacosApp {
public static void main(String[] args) {
SpringApplication.run(ConsumerNacosApp.class, args);
}

// 配置RestTemplate,启用负载均衡
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}

4. 实现服务调用

通过服务名调用服务提供者的接口(无需硬编码 IP 和端口):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class ConsumerController {

@Autowired
private RestTemplate restTemplate;

@GetMapping("/call/{name}")
public String callProvider(@PathVariable String name) {
// 直接使用服务名调用(Nacos会自动解析为具体的IP:端口)
String url = "http://springcloudalibaba-provider-nacos/hello/" + name;
return restTemplate.getForObject(url, String.class);
}
}

5. 测试服务调用

启动消费者服务后,访问 http://localhost:8082/call/World,若返回以下结果,说明服务发现和调用成功:

1
Hello, World! 我是服务提供者(端口:8081)

Nacos 注册中心的核心特性

  1. 服务健康检查
    Nacos 会定期检测服务的/actuator/health端点,若服务不健康(如端口未响应),会将其标记为「不健康」,消费者不会调用该实例。
  2. 负载均衡
    结合@LoadBalanced注解,Nacos 默认集成 Ribbon 实现负载均衡,当服务提供者集群部署时,会自动分发请求。
  3. 动态上下线
    服务提供者下线时,Nacos 会实时感知并通知消费者,避免调用失效实例;新实例上线后,消费者会自动发现并纳入调用列表。
  4. 命名空间隔离
    通过namespace配置不同环境(如devtest),实现服务的环境隔离,避免跨环境调用。

常见问题与解决方案

  1. 服务注册后在 Nacos 控制台看不到
    • 检查server-addr是否正确(默认 8848 端口);
    • 确保服务已引入spring-cloud-starter-alibaba-nacos-discovery依赖;
    • 检查服务是否启动成功,无报错信息。
  2. 消费者调用服务时报错 “找不到服务”
    • 确认服务名(spring.application.name)是否正确(大小写敏感);
    • 检查消费者和提供者是否在同一命名空间(默认public);
    • 确保@LoadBalanced注解已添加到RestTemplate
  3. 如何实现服务分组
    application.yml中配置spring.cloud.nacos.discovery.group,同一分组的服务才能相互发现。

总结

Nacos 作为注册中心,集成过程简单高效,通过少量配置即可实现服务的注册与发现。其核心优势在于:

  • 支持 AP/CP 模式切换,适应不同业务场景;
  • 提供直观的控制台,方便服务管理和监控;
  • 与 Spring Cloud Alibaba 生态无缝融合,支持负载均衡、健康检查等高级特性。

在实际项目中,建议结合命名空间和分组功能,实现服务的环境隔离和精细化管理,提升微服务架构的可维护性

欢迎关注我的其它发布渠道