源本科技 | 码上会

SCA Nacos 服务提供者

2026/05/19
1
0

引言

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 查看服务是否注册成功

IDEA 启动多个实例

  • 编辑应用配置