返回介绍

5.3 Nacos 组件

发布于 2025-04-21 20:58:44 字数 8174 浏览 0 评论 0 收藏

本节将介绍阿里巴巴公司的开源组件 Nacos。它具有简单、易用的特性,可以实现服务的发现、配置和管理等功能。Nacos 的核心功能是服务,可以以此为中心提供配置等服务的基础设施平台。

5.3.1 Nacos 组件简介

Nacos 作为开源的配置管理组件,可以无缝支持 Spring Boot、Spring Cloud、Apache Dubbo 和 Kubernetes 等主流的开源生态。Nacos 的特性主要包括:

  • 服务注册与发现:Nacos 提供了多种方式注册微服务,如 SDK 和 OpenAPI 等,消费者可以通过 API 或 Client 方式进行服务发现与获取。
  • 服务健康检查:Nacos 提供对注册的服务进行实时健康检查的功能,以阻止向不健康服务实例或主机发送请求。Nacos 支持 TCP 或 HTTP 方式的健康检查。对于云环境下的服务健康检查,Nacos 提供了 Agent 上报模式和服务端主动检测两种健康检查模式。此外,Nacos 还提供了健康检查仪表盘,帮助查看管理服务的可用性及流量。
  • 服务可动态配置:Nacos 可以动态管理所有环境下的服务配置。动态的配置方式使配置修改时无须重新部署,让配置管理变得更加方便和高效。Nacos 提供了简单、易用的 UI 界面,可以帮助开发者管理所有的服务或程序的配置数据。管理平台提供了版本跟踪、一键回滚配置等一系列开箱即用的特性,能够更安全地在生产环境中变更配置信息。
  • 动态 DNS 服务:动态 DNS 服务支持权重路由,可以方便地实现中间层负载均衡、路由策略、流量控制以及数据中心内网的简单 DNS 解析服务。
  • 服务的元数据管理:Nacos 管理所有服务的元数据,包括服务的描述信息、健康状态及生命周期等。

Nacos 架构如图 5.14 所示。

095-1

图 5.14 Nacos 架构

Nacos 提供了配置服务与服务管理的功能,同时提供了简单的 UI 界面。想要深入理解 Nacos,还需要理解 Nacos 的一些基本概念。

1. 配置

在开发过程中,开发者通常会将一些固定的或变更的参数与变量从代码中抽离出来,一般是放在独立的文件中,如放在 properties 或 YAML 文件中,这些都属于配置信息。将不同环境的配置信息放在不同的文件中可以起到隔离作用,不会引起开发混乱。

2. 命名空间

命名空间(Namespace)可以粗粒度地配置隔离。不同的命名空间可以存在相同的组(Group)或 Data ID 的配置。Namespace 的常用场景可以区分不同环境的配置,如对开发(dev)环境、测试(test)环境和生产(pro)环境的配置进行隔离。

3. 配置集 ID

配置集 ID(Data ID)也是划分配置的维度之一。Data ID 通常是一个系统或者某个应用下的多个配置项的集合。Data ID 通常采用${prefix}-${spring.profiles.active}. ${file-extension}的命名方式。

4. 配置分组

Nacos 中的一组配置集是组织配置的维度之一。当在 Nacos 上创建一个配置时,默认的配置分组(Group)名称为 DEFAULT_GROUP。配置分组通常以机房为区分粒度。

5. 服务

服务实际上是指一个应用服务。Nacos 支持主流的服务生态,如 Spring Boot、Spring Cloud、gRPC、Dubbo 和 Kubernetes Service。

6. 服务注册中心

服务注册中心是服务及元数据的数据库。服务在启动时会注册到服务注册表中,在关闭时会被注销。消费服务可以通过服务注册表查找服务的可用实例,实现服务的发现与实例获取。

7. 服务元数据

服务元数据是指服务端点(Endpoints)、服务标签、服务版本号、服务实例权重、路由规则和安全策略等描述服务的数据。

5.3.2 快速搭建 Nacos

搭建 Nacos 有两种方式,一种是从 GitHub 上下载源码,另一种是直接下载稳定版本的 zip 包。

下载源码的执行命令如下:

git clone https://github.com/alibaba/nacos.git
cd nacos/
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U
ls -al distribution/target/
cd distribution/target/nacos-server-$version/nacos/bin

直接在官网上下载 nacos-server-$version.zip 包的执行命令如下:

unzip nacos-server-$version.zip
cd nacos/bin

或者用如下命令:

tar -xvf nacos-server-$version.tar.gz
cd nacos/bin

启动命令如下:

sh startup.sh -m standalone

或者采用 JAR 包的方式启动,命令如下:

java -Dnacos.standalone=true -jar nacos-server.jar

启动之后的页面如图 5.15 所示。

097-1

图 5.15 Nacos 主页面

通过主页面左侧的菜单栏可以看到,Nacos 提供了配置管理、服务管理、权限控制、命名空间及集群管理等功能。

5.3.3 Spring Boot 集成 Nacos

Nacos 为 Spring Boot 的使用者提供了 Starter,即 nacos-config-spring-boot-starter 和 nacos-discovery-spring-boot-starter。

下面讲解 Spring Boot 集成 Nacos 的配置管理步骤。

(1)在 pom.xml 文件中添加依赖,代码如下:

<dependency>
    <groupId>com.alibaba.boot</groupId>
    <artifactId>nacos-config-spring-boot-starter</artifactId>
    <version>${latest.version}</version>
</dependency>

(2)在 application.yml 文件中添加 Nacos Server 的地址,具体配置如下:

nacos:
  config:
    server-addr: 127.0.0.1:8848

(3)在 Nacos 的后台管理页面中添加 Data ID 为 user 的配置,配置数据为 userName=zhangsan。具体配置详情如图 5.16 所示。

098-1

图 5.16 配置详情

(4)使用 @NacosPropertySource 注解加载 Data ID 为 user 的配置源并开启自动更新功能,代码如下:

@SpringBootApplication
@NacosPropertySource(dataId = "user", autoRefreshed = true)
public class SpringBootExampleApplication {
        public static void main(String[] args) {
                SpringApplication.run(SpringBootExampleApplication.class,
args);
        }
}

(5)通过 Nacos 的 @NacosValue 注解设置属性值,代码如下:

@RestController
@RequestMapping("/hi")
public class HiController{
        //获取 Nacos 配置的属性值
    @NacosValue(value = "${userName:default}", autoRefreshed = true)
    private String userName;
    @GetMapping("/nacos/query")
    public String nacosQuery() {
        return userName;
    }
}

启动服务后访问 http://localhost:8080/hi/nacos/query,将返回配置值 zhangsan。

接下来讲解 Spring Boot 集成 Nacos 的服务发现步骤。

(1)调用 Nacos 提供的通用 API 向 Nacos Server 注册一个名为 configService 的服务。

curl -X PUT 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName
=configService&ip=127.0.0.1&port=8080'

Nacos 管理页面中出现的服务列表如图 5.17 所示。

099-1

图 5.17 服务列表

(2)为应用添加依赖 nacos-discovery-spring-boot-starter。

(3)修改 application.yml 文件,添加配置如下:

nacos:
  discovery:
    server-addr: 127.0.0.1:8848

(4)使用注解 @NacosInjected 注入 Nacos 的 NamingService 实例,代码如下:

@RestController
@RequestMapping("/hi")
public class HiController{
        //注入 NamingService
    @NacosInjected
    private NamingService namingService;

    @GetMapping("/nacos/service")
    public List<Instance> nacosService(String serviceName) throws
NacosException {
        return namingService.getAllInstances(serviceName);
    }
}

启动服务,访问接口 http://localhost:8080/hi/nacos/service?serviceName=config Service 即可返回服务详情。

5.3.4 Spring Cloud 集成 Nacos

使用 Spring Cloud 的开发人员如果要集成 Nacos,则需要使用 Spring Cloud 的依赖包:spring-cloud-starter-alibaba-nacos-config 和 spring-cloud-starter-alibaba-nacos-discovery。下面详细讲解 Spring Cloud 集成 Nacos 实现配置与服务发现的具体步骤。

(1)在 pom.xml 文件中添加依赖包,代码如下:

<dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        <version>0.2.1.RELEASE</version>
</dependency>
        <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery
</artifactId>
        <version>0.2.2.RELEASE</version>
</dependency>

(2)新建 bootstrap.yml 配置文件,并配置 Nacos 属性值,具体配置如下:

spring:
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        file-extension: properties
        namespace: 08bf3070-fd90-4daa-aa2b-2cbd2140355c
        group: config
      discovery:
        server-addr: 127.0.0.1:8848
        ip: ${HOST:}
        port: ${PORT_80:${server.port:}}
        namespace: 08bf3070-fd90-4daa-aa2b-2cbd2140355c
        group: config
        heart-beat-timeout: 30

在 Nacos Spring Cloud 中,Data ID 的完整格式如下:

${prefix}-${spring.profiles.active}.${file-extension}
  • prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud. nacos.config.prefix 来配置。
  • spring.profiles.active 为当前环境对应的 profile,详情可以参考 Spring Boot 文档。注意,当 spring.profiles.active 为空时,对应的连接符“-”将不存在,Data ID 的拼接格式变成${prefix}.${file-extension}。
  • file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置,目前只支持 properties 和 YAML 两种类型。

在 Nacos 后台管理页面上需要新建一个 dev 的命名空间,并新建一个 Data ID 为 configService. properties、Group 为 config 的配置项,如图 5.18 所示。

100-1

图 5.18 Nacos 配置

(3)使用 @EnableDiscoveryClient 注解实现服务发现。服务启动后,Nacos 管理后台自动进行服务发现,如图 5.19 所示。

101-1

图 5.19 Nacos 服务发现

(4)使用 @RefreshScope 注解可以自动实现配置更新,使用 @Value 注解可以获取配置项的数据值,代码如下:

@RestController
@RequestMapping("/hi")
@RefreshScope  //自动刷新配置
public class HiController{

    @Value("${userName:default}")
    private String userName;

    @GetMapping("/nacos/query")
    public String nacosQuery() {
        return userName;
    }
}

此时,访问接口 http://localhost:8080/hi/nacos/query 将返回 zhangsan。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。