跳转至

Nacos

Nacos 是一个开源的动态服务发现、配置管理和服务管理平台,由阿里巴巴开源。Nacos 是 "Dynamic Naming and Configuration Service" 的缩写,它为微服务架构提供了关键的基础设施支持。

Nacos 的主要功能包括:

  1. 服务发现和服务健康监测
  2. Nacos 可以帮助服务在注册中心进行注册和发现。服务实例可以通过 Nacos 注册自己,并且其他服务可以通过 Nacos 查找这些服务实例。
  3. Nacos 提供了服务健康检查机制,确保服务实例的可用性。

  4. 动态配置管理

  5. Nacos 提供集中化的配置管理功能,允许开发者在一个地方管理所有的配置项。配置的变更可以实时推送到应用程序中。
  6. 支持配置的版本管理和灰度发布,方便进行配置的管理和控制。

  7. 动态 DNS 服务

  8. Nacos 提供 DNS 服务,可以将服务发现和 DNS 解析结合起来,方便服务的调用。

  9. 服务管理

  10. 提供服务的元数据管理、流量管理、熔断降级等功能,帮助提升系统的稳定性和可靠性。

Nacos 支持多种服务发现协议(如 HTTP、gRPC、Dubbo 等)和多种配置格式(如 YAML、Properties、JSON 等),并且可以与 Spring Cloud、Kubernetes 等生态系统集成。

Nacos 的典型应用场景包括微服务架构中的服务注册与发现、配置管理,以及分布式系统中的服务治理。

Nacos通常安装在Linux服务器上。

Nacos有两个作用:

  1. 服务发现中心(注册中心)

​ 微服务将自身注册至Nacos,网关从Nacos获取微服务列表。

  1. 配置中心

​ 微服务众多,它们的配置信息也非常复杂,为了提供系统的可维护性,微服务的配置信息统一在Nacos配置。

Nacos安装

1、docker拉取镜像

docker pull nacos/nacos-server:latest

2、创建容器

针对nacos镜像创建容器

docker run --env MODE=standalone -d --name nacos-server --restart=always -p 8848:8848 -p 9848:9848 -p 9849:9849 nacos/nacos-server:latest
  • docker run 启动容器
  • MODE=standalone 单机版
  • --restart=always 开机启动

3、访问nacos地址:http://192.168.200.130:8848/nacos

搭建Nacos

1、服务发现中心

Spring Cloud :一套规范

Spring Cloud alibaba: nacos服务注册中心,配置中心

首先搭建Nacos服务发现中心。

在搭建Nacos服务发现中心之前需要搞清楚两个概念:namespace和group

  • namespace:用于区分环境、比如:开发环境、测试环境、生产环境。
  • group:用于区分项目,比如:项目A、项目B。

首先在nacos配置namespace:

登录Centos,启动Naocs,使用sh /data/soft/restart.sh将自动启动Nacos。

登录成功,点击左侧菜单“命名空间”进入命名空间管理界面,

点击“新建命名空间”,填写命名空间的相关信息。如下图:

image-20250218104949667

使用相同的方法再创建“测试环境”(test)、"生产环境"(prod)的命名空间。

首先完成各服务注册到Naocs,下边将内容管理服务注册到nacos中。

1) 在xuecheng-plus-parent中添加依赖管理

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>${spring-cloud-alibaba.version}</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>
  1. 在具体微服务模块的接口工程中添加如下依赖

discovery依赖用来向nacos注册微服务

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
  1. 配置nacos的地址

在具体微服务模块的接口工程的配置文件(bootstrap.yml)中配置如下信息:

服务名、nacos地址、namespace、group。

#微服务配置
spring:
  application:
    name: 具体微服务的名称 #向nacos上报哪个服务
  cloud:
    nacos:
      server-addr: 192.168.101.65:8848
      discovery:
        namespace: dev
        group: 项目名称
  1. 重启该微服务模块。

待微服务启动成功,进入Nacos服务管理查看服务列表

在对应命名空间下有该服务这说明该微服务在Nacos注册成功。

点击微服务的“详情”,可以查看微服务实例的地址。

如果项目停止运行,则nacos对应的服务也会消失。

2、配置中心

2.1 配置三要素

搭建Nacos为配置中心,其目的就是通过Nacos去管理项目的所有配置。

正式的环境下,每个服务有多个实例保证容错性,每个实例用一个docker容器管理的话,配置文件会散落在所有的容器中,项目升级修改数据库地址时,需要把所有实例的配置文件修改一遍,不如在nacos统一管理。

先将项目中的配置文件进行分类:

1、每个项目特有的配置

是指该配置只在有些项目中需要配置,或者该配置在每个项目中配置的值不同。

比如:spring.application.name每个项目都需要配置但值不一样,以及有些项目需要连接数据库而有些项目不需要,有些项目需要配置消息队列而有些项目不需要。

2、项目所公用的配置

是指在若干项目中配置内容相同的配置。比如:redis的配置,很多项目用的同一套redis服务所以配置也一样。

另外还需要知道nacos如何去定位一个具体的配置文件,即:namespace、group、dataid.

1、通过namespace、group找到具体的环境和具体的项目。

2、通过dataid找到具体的配置文件,dataid有三部分组成:

比如:content-service-dev.yaml配置文件 由(content-service)-(dev). (yaml)三部分组成

  1. content-service:服务名,${spring.application.name}。
  2. dev:环境名,${spring.profiles.active}。
  3. yaml:扩展名,配置文件的后缀,${spring.cloud.nacos.config.file-extension},nacos支持properties、yaml等格式类型。

所以,如果我们要配置content-service工程的配置文件:

  • 在开发环境中配置content-service-dev.yaml
  • 在测试环境中配置content-service-test.yaml
  • 在生产环境中配置content-service-prod.yaml

我们启动项目中传入spring.profiles.active的参数决定引用哪个环境的配置文件,例如:传入spring.profiles.active=dev表示使用dev环境的配置文件即content-service-dev.yaml。

2.2 配置content-service

下边以开发环境为例对content-service工程的配置文件进行配置,进入nacos,进入开发环境。

06094289-6026-4ce9-bd61-6c5de6cb586d

点击加号,添加一个配置

cd2bd027-980d-4d83-abf6-7a6febb1dd5e

输入Data ID、Group以及配置文件内容。

为什么没在nacos中配置下边的内容 ?

spring:
  application:
    name: content-service

因为刚才说了dataid第一部分就是spring.application.name,nacos 客户端要根据此值确定配置文件名称,所以spring.application.name不在nacos中配置,而是要在工程的本地进行配置。

在content-service工程的test/resources 中添加bootstrap.yaml,内容如下:

spring:
  application:
    name: content-service
  cloud:
    nacos:
      server-addr: 192.168.101.65:8848
      discovery:
        namespace: dev
        group: xuecheng-plus-project
      config:
        namespace: dev
        group: xuecheng-plus-project
        file-extension: yaml
        refresh-enabled: true

    #profiles默认为dev
  profiles:
    active: dev

在内容管理模块的接口工程和service工程配置依赖:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

配置完成,运行content-service工程 的单元测试文件,能否正常测试,跟踪单元测试方法可以正常读取数据库的数据,说明从nacos读取配置信息正常。

通过运行观察控制台打印出下边的信息,NacosRestTemplate.java通过Post方式与nacos服务端交互读取配置信息。

[NacosRestTemplate.java:476] - HTTP method: POST, url: http://192.168.101.65:8848/nacos/v1/cs/configs/listener, body: {Listening-Configs=content-service.yamlxuecheng-plus-projectdevcontent-service-dev.yamlxuecheng-plus-project88459b1483b8381eccc2ef462bd59182devcontent-servicexuecheng-plus-projectdev, tenant=dev}

2.3配置content-api

以相同的方法配置content-api工程的配置文件,在nacos中的开发环境中配置content-api-dev.yaml,内容如下:

server:
  servlet:
    context-path: /content
  port: 63040

# 日志文件配置路径
logging:
  config: classpath:log4j2-dev.xml

# swagger 文档配置
swagger:
  title: "学成在线内容管理系统"
  description: "内容系统管理系统对课程相关信息进行业务管理数据"
  base-package: com.xuecheng.content
  enabled: true
  version: 1.0.0

在content-api工程 的本地配置bootstrap.yaml,内容如下:

#微服务配置
spring:
  application:
    name: content-api
  cloud:
    nacos:
      server-addr: 192.168.101.65:8848
      discovery:
        namespace: dev
        group: xuecheng-plus-project
      config:
        namespace: dev
        group: xuecheng-plus-project
        file-extension: yaml
        refresh-enabled: true
        extension-configs:
          - data-id: content-service-${spring.profiles.active}.yaml
            group: xuecheng-plus-project
            refresh: true
  profiles:
    active: dev

注意:因为api接口工程依赖了service工程 的jar,所以这里使用extension-configs扩展配置文件的方式引用service工程所用到的配置文件。

如果添加多个扩展文件,继续在下添加即可,如下:

        extension-configs:
          - data-id: content-service-${spring.profiles.active}.yaml
            group: xuecheng-plus-project
            refresh: true
          - data-id: 填写文件 dataid
            group: xuecheng-plus-project
            refresh: true           

启动content-api工程,查询控制台是否打印出了请求nacos的日志,如下:

[NacosRestTemplate.java:476] - HTTP method: POST, url: http://192.168.101.65:8848/nacos/v1/cs/configs/listener

并使用Httpclient测试课程查询接口是否可以正常查询。

3 公用配置

还有一个优化的点是如何在nacos中配置项目的公用配置呢?

nacos提供了shared-configs可以引入公用配置。

在content-api中配置了swagger,所有的接口工程都需要配置swagger,这里就可以将swagger的配置定义为一个公用配置,哪个项目用引入即可。

单独在xuecheng-plus-common分组下创建xuecheng-plus的公用配置,进入nacos的开发环境,添加swagger-dev.yaml公用配置

0b378ef5-1c7d-4532-a82b-69e83a80752c

删除接口工程中对swagger的配置。

再以相同的方法配置日志的公用配置。

485c92fd-cead-467e-9fed-36dfdf91e46f

项目使用shared-configs可以引入公用配置。在接口工程的本地配置文件中引入公用配置,如下:

在接口工程和业务工程,引入loggin-dev.yaml公用配置文件

#微服务配置
spring:
  application:
    name: content-api #服务名content-api-dev.yaml
  cloud:
    nacos:
      server-addr: 192.168.101.65:8848
      discovery: #服务注册相关配置
        namespace: ${spring.profiles.active}
        group: xuecheng-plus-project
      config: #配置文件相关配置
        namespace: ${spring.profiles.active}
        group: xuecheng-plus-project
        file-extension: yaml
        refresh-enabled: true
        extension-configs:
          - data-id: content-service-${spring.profiles.active}.yaml
            group: xuecheng-plus-project
            refresh: true
        shared-configs:
          - data-id: swagger-${spring.profiles.active}.yaml
            group: xuecheng-plus-common
            refresh: true
          - data-id: logging-${spring.profiles.active}.yaml
            group: xuecheng-plus-common
            refresh: true
          - data-id: freemarker-config-dev.yaml
            group: xuecheng-plus-common
            refresh: true
          - data-id: feign-${spring.profiles.active}.yaml
            group: xuecheng-plus-common
            refresh: true  #profiles默认为dev
  profiles:
    active: dev   #环境名

配置完成,重启content-api接口工程,访问http://localhost:63040/content/swagger-ui.html 查看swagger接口文档是否可以正常访问,查看控制台log4j2日志输出是否正常。

4 配置优先级

到目前为止已将所有微服务的配置统一在nacos进行配置,用到的配置文件有本地的配置文件 bootstrap.yaml和nacos上的配置文件,SpringBoot读取配置文件的顺序如下:

b281cd6d-a532-425d-be1d-49b23a11b468

引入配置文件的形式有:

1、以项目应用名方式引入

2、以扩展配置文件方式引入

3、以共享配置文件方式引入

4、本地配置文件

各配置文件的优先级:项目应用名配置文件 > 扩展配置文件 > 共享配置文件 > 本地配置文件。

有时候我们在测试程序时直接在本地加一个配置进行测试,比如下边的例子:

我们想启动两个内容管理微服务,此时需要在本地指定不同的端口,通过VM Options参数,在IDEA配置启动参数

ea9e7119-7b3f-4001-ac93-014fb87ad8a0

通过-D指定参数名和参数值,参数名即在bootstrap.yml中配置的server.port。

36941e6f-b558-419f-ba69-bb43d6baedb3

启动ContentApplication2,发现端口仍然是63040,这说明本地的配置没有生效。

这时我们想让本地最优先,可以在nacos配置文件 中配置如下即可实现:

#配置本地优先
spring:
 cloud:
  config:
    override-none: true

再次启动ContentApplication2,端口为63041。

spring-cloud2021.0.3之后版本的配置

2021.0.5版本的 Spring Cloud 默认不再启用 bootstrap 包,因此应该将配置文件写在 application.yml 中,或手动在 maven 中导入 bootstrap 包。

#微服务配置
spring:
  config:
    import: nacos:bootstrap.yml