当前位置: 首页 > news >正文

Nacos

简介

是阿里巴巴开源的一个更易于构建云原生应用的生态服务发现,配置管理和服务管理平台、致力于帮助开发者发现、配置和管理微服务。是构建以 “服务” 为中心的现代应用架构(如微服务范式、云原生范式)的重要服务基础设施。

在微服务架构中,各个微服务独立开发,部署和运行,服务之间通过网络进行通信。这时就需要一个机制来管理服务的注册与发现,让服务消费者能够找到对应的服务提供者的地址。同时,配置管理也是一个关键问题,不同环境(开发、测试、生产)下的配置可能不同,而且在运行时也可能需要动态调整配置。Nacos 正好在这些方面发挥了重要作用。

从服务发现角度来看,假设我们有一个电商系统,其中包含商品服务、订单服务、用户服务等多个微服务。商品服务负责提供商品信息,订单服务需要调用商品服务来获取商品详情以完成订单创建。使用 Nacos 后,商品服务启动时会将自己的地址等信息注册到 Nacos 服务注册中心,订单服务则可以从 Nacos 中查询到商品服务的地址,进而进行调用,实现了服务之间的解耦,使得服务的添加、删除、地址变更等操作对调用方透明。

在配置管理方面,通过Nacos,我们可以将数据库连接配置集中存储在Nacos配置中心,应用启动时从Nacos获取配置,并且当数据库地址发生变化时,无需重启应用,Nacos会将新的配置推送给应用,实现配置的动态更新

核心概念

服务(Service)

在Nacos中,服务是指一个可以被其他组件调用的具有特定功能的逻辑单元。在微服务架构中,一个大型应用会被拆分成多个微小服务,每个服务都专注于完成一项具体任务,服务之间通过网络进行通信协作。比如在一个电商系统中,用户服务负责管理用户信息,包括用户注册、登录、信息修改等操作;商品服务负责管理商品信息,如商品的添加、查询、库存管理等。这些不同的功能模块都可以看作是一个个独立的服务。

在微服务架构中,服务实现了业务功能的模块化和独立化,使得每个服务可以独立开发、测试、部署和扩展,降低了系统的耦合度,提高了开发效率和系统的可维护性。

实例(Instance)

实例是服务的具体运行实体,每个服务可以有多个实例。

继续以电商系统的用户服务为例,为了应对高并发的用户请求,可能会部署多个用户服务实例,这些实例分布在不同的服务器上,每个实例都有自己的 IP 地址和端口号 。这些实例共同提供用户服务的功能,通过负载均衡机制,将用户请求分发到不同的实例上进行处理,从而提高系统的并发处理能力和可用性。

实例与服务的关系紧密相连。实例是服务的具体执行者,服务通过多个实例来实现高可用和负责均衡。同时,通过增加或减少实例的数量,可以灵活地调整服务的处理能力,以适应不同的负载均衡

配置(Configuration)

配置是指应用程序在运行时所依赖的各种参数和设置,如数据库连接信息、日志级别、系统参数等。Nacos 的配置管理功能允许将这些配置集中存储和管理,应用程序在启动时可以从 Nacos 获取配置信息,并在运行时动态更新配置,而无需重启应用。

命名空间(Namespace)

命名空间是Nacos用于隔离不同环境下的配置和服务的逻辑概念。在实际的开发和部署中,通常会有开发、测试、生产等多个环境,不同环境之间配置可能存在差异。通过命名空间,可以将不同环境的服务和配置进行隔离

分组(Group)

分组是对配置和服务进行进一步的细分概念,用于将相关的配置或服务组织在一起,方便管理。在一个大型项目中,可能有多个业务模块,每个业务模块都有自己的配置和服务。通过分组,可以将同一业务模块的配置和服务划分到同一个分组中

比如,在一个电商系统中,用户模块的所有配置可以划分到 “user - group” 组,商品模块的配置划分到 “product - group” 组。这样,在管理配置和服务时,可以按照分组进行分类管理,提高管理的效率和便捷性。同时,分组也可以用于实现不同业务模块之间的权限控制和访问隔离,增强系统的安全性和可维护性。

Nacos的主要功能

服务发现与健康检测

允许服务提供者将自己的服务信息注册到Nacos服务器,服务消费者可以通过Nacos服务器获取服务提供者的地址列表,从而实现服务之间的通信。这一过程极大地简化了微服务架构中服务之间的调用关系、避免了硬编码服务地址带来的不便和维护成本。

为了确保服务的可用性,Nacos还提供了健康监测功能,通过该功能,Nacos可以实时监控服务实例的运行状态,防止像不健康的实例发送请求,从而保证系统的稳定性和可靠性。Nacos 支持多种健康检查方式,包括传输层的 PING 或 TCP 检查,以及应用层的 HTTP、MySQL、用户自定义检查等。

动态配置管理

允许将应用程序的配置信息集中存储在Nacos服务器上,实现配置的中心化、外部化和动态化管理。应该程序在启动时可以从Nacos获取配置信息,并在运行时动态更新配置,无需重启应用,大大提高了系统的系统的灵活性和运维效率

具体来说,当应用客户端启动时,会向 Nacos 服务器发起一个长轮询请求,建立一个持久的 HTTP 连接。在没有配置更新时,Nacos 服务器会将这个请求挂起,不立即响应 。一旦数据库连接配置发生变更,Nacos 服务器会立刻唤醒挂起的请求,并将最新的配置信息发送给应用客户端。应用客户端收到通知后,会从 Nacos 服务器拉取最新的配置,并应用到应用中,实现配置的动态更新。同时,为了提高响应速度和减少网络请求,应用客户端会在本地缓存配置信息。当收到配置更新通知时,客户端不仅会更新其本地缓存,还会进行必要的同步和验证,以确保缓存的一致性。

Nacos 还提供了一系列开箱即用的配置管理特性,如配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪等。配置版本跟踪功能可以记录每次配置的变更历史,方便查看配置的修改记录和进行问题排查。金丝雀发布允许将新的配置先发布给一小部分用户或服务实例,进行灰度测试,确保新配置的稳定性后再逐步推广到全部用户或实例。一键回滚配置功能则在新配置出现问题时,可以快速将配置回滚到上一个稳定版本,降低配置变更带来的风险。客户端配置更新状态跟踪可以让管理员实时了解各个应用客户端是否成功更新了配置,便于及时发现和解决配置更新过程中出现的问题。

动态服务路由

指Nacos能够根据不同的业务场景和条件,动态调整服务调用的路由策略,将请求转发到最合适的服务实例上。这种功能使得服务调用更加灵活和智能,能够满足复杂多变的业务需求。

以一个面向全国用户的电商平台为例,平台的商品服务在不同地区部署了多个服务节点,以提高服务的响应速度和用户体验。当用户发起商品查询请求时,Nacos 可以根据用户的地域信息动态选择服务节点。如果用户位于华东地区,Nacos 会将请求路由到位于华东地区的商品服务节点,因为该节点距离用户更近,网络延迟更低,能够更快地响应用户请求。而如果华东地区的服务节点出现故障或负载过高,Nacos 可以自动将请求路由到其他地区(如华南、华北)的健康且负载较低的服务节点上,确保服务的可用性和稳定性。

实现这一功能,Nacos 首先需要获取用户的地域信息。这可以通过用户的 IP 地址解析来实现,Nacos 可以集成 IP 地址库,根据用户请求的源 IP 地址解析出用户所在的地域。然后,Nacos 根据预先配置的路由规则和服务节点的健康状态、负载情况等信息,动态计算出最优的服务节点。在实际路由过程中,Nacos 可以通过修改请求的目标地址或使用负载均衡器的动态配置功能,将请求转发到选定的服务节点上。

除了根据地域信息进行路由,Nacos 还可以根据其他业务场景和条件进行动态服务路由。例如,根据用户的会员等级进行路由,为高级会员提供更优质的服务节点;根据请求的时间进行路由,在业务高峰期将请求路由到性能更强的服务节点上;根据服务的版本号进行路由,实现不同版本服务的灰度发布和版本管理等。通过这些灵活的路由策略,Nacos 能够更好地优化服务调用,提高系统的整体性能和用户满意度

多环境支持

在开发和部署过程中,通常会涉及多个环境,如开发、测试、生产等。不同环境下的应用配置和服务可能存在差异,例如数据库连接信息、日志级别、接口访问权限等。Nacos 的多环境支持功能可以很好地解决这一问题,它通过命名空间和分组的概念,实现不同环境下配置和服务的隔离与管理。

命名空间是 Nacos 用于隔离不同环境的逻辑单元,每个命名空间都有一个唯一的 ID。通过创建不同的命名空间,可以将不同环境的配置和服务分开管理 。例如,创建一个名为 “dev” 的命名空间用于开发环境,一个 “test” 命名空间用于测试环境,以及 “prod” 命名空间用于生产环境。在每个命名空间下,可以独立地进行配置管理和服务注册与发现。

Nacos环境搭建

下载与安装Nacos

可以从 Nacos 官方 GitHub 仓库的 Release 页面(https://github.com/alibaba/nacos/releases )下载编译好的 Nacos 安装包。根据不同的操作系统,选择对应的安装包,如 Windows 系统下载.zip格式的安装包,Linux 系统下载.tar.gz格式的安装包。

Windows系统安装步骤:

  1. 下载完成后,将nacos-server-x.x.x.zip解压到任意非中文目录下,例如D:\nacos。解压后的目录结构如下:
    • bin:包含启动和停止 Nacos 服务的脚本文件,如startup.cmd(启动脚本)和shutdown.cmd(停止脚本)。
    • conf:存放 Nacos 的各种配置文件,如application.properties(主配置文件)、cluster.conf(集群配置文件)等。
    • data:用于存储运行时的数据,如果启用了持久化存储,相关数据会存储在此目录下。
    • logs:存放 Nacos 运行时产生的日志文件,通过查看日志可以了解 Nacos 的运行状态和排查问题。
  2. 解压完成后,Nacos在Windows系统下的安装就已初步完成,接下来可以根据需要对配置文件进行调整

Linux系统安装步骤:

  1. 使用wget命令下载 Nacos 安装包,例如:wget https://github.com/alibaba/nacos/releases/download/2.2.4/nacos-server-2.2.4.tar.gz。
  2. 将下载的安装包上传到 Linux 服务器的指定目录,如/usr/local/nacos。
  3. 在上传目录下执行解压命令:tar -xvf nacos-server-2.2.4.tar.gz。
  4. 解压完成后,删除安装包以释放磁盘空间:rm -rf nacos-server-2.2.4.tar.gz。解压后的目录结构与 Windows 系统类似,同样包含bin、conf、data和logs等目录。

服务启动

Nacos支持单机模式和集群模式启动,不同模式的启动命令和配置略有不同

单机模式启动
  • Windows 系统:进入 Nacos 解压目录下的bin目录,在命令提示符中执行命令startup.cmd -m standalone。执行该命令后,会启动 Nacos 服务,并在控制台输出启动日志信息。如果启动成功,会显示类似 “Nacos started successfully” 的提示信息。
  • Linux 系统:进入 Nacos 解压目录下的bin目录,执行命令sh startup.sh -m standalone。同样,启动过程中会在控制台输出日志信息,启动成功后会有相应提示。
集群模式启动

在集群模式下,需要提前配置好集群节点信息 。假设我们有三个 Nacos 节点,IP 地址分别为192.168.1.101、192.168.1.102和192.168.1.103。

  1. 编辑Nacos解压目录下Conf目录中的cluster.conf文件,添加集群节点信息,格式为IP:端口,例如:

    192.168.1.101:8848
    192.168.1.102:8848
    192.168.1.103:8848
    
  2. 在每个节点的 Nacos 解压目录下的bin目录中,执行启动命令sh startup.sh -m cluster(Linux 系统)或startup.cmd -m cluster(Windows 系统)。启动过程中,各个节点会相互通信,进行集群初始化和同步操作。

启动成功后的验证方法

  • 查看日志:在 Nacos 解压目录下的logs目录中,查看start.out(Linux 系统)或startup.log(Windows 系统)文件。如果启动成功,日志中会包含 “Started NacosServer” 等相关信息。
  • 访问控制台:在浏览器中输入http://localhost:8848/nacos(单机模式或集群模式下任意节点的地址和端口),如果能够打开 Nacos 的登录页面,且默认账号密码nacos/nacos能够正常登录,说明 Nacos 服务已成功启动。

配置Nacos

Nacos的配置主要通过配置文件来完成,其中一些关键的配置项包括服务端口,数据库类型,权限控制等。

基础配置文件:Nacos 的主配置文件是conf/application.properties,该文件包含了 Nacos 运行的各种基础配置。

  • 服务端口:通过server.port配置项来设置 Nacos 服务的端口号,默认值为 8848。如果需要修改端口,例如将端口改为 8849,只需将server.port=8848修改为server.port=8849。
  • 数据库类型:spring.datasource.platform配置项用于指定数据库类型,Nacos 支持mysql和derby两种数据库 。默认情况下,Nacos 使用内嵌的 Derby 数据库,适用于开发和测试环境 。如果在生产环境中使用,建议使用 MySQL 数据库,此时需要将spring.datasource.platform的值设置为mysql,并配置相应的数据库连接信息。
  • 权限控制:通过nacos.core.auth.enabled配置项来启用或禁用权限控制功能,默认值为false,表示不启用权限控制 。如果需要启用权限控制,将其值设置为true,并可以进一步配置nacos.core.auth.default.token来设置默认令牌,用于安全认证。

持久化配置:当使用 MySQL 作为 Nacos 的持久化存储时,需要进行以下配置:

  • 安装 MySQL 数据库,并创建一个新的数据库,例如nacos。

  • 在 Nacos 解压目录下的conf目录中,找到nacos-mysql.sql文件,执行该 SQL 脚本,初始化 Nacos 在 MySQL 数据库中需要的表结构。

  • 编辑application.properties文件,添加或修改以下 MySQL 连接配置:

    spring.datasource.platform=mysql
    db.num=1
    db.url.0=jdbc:mysql://localhost:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
    db.user=root
    db.password=123456
    

    其中,db.url.0配置为 MySQL 数据库的连接地址,db.user和db.password分别为数据库的用户名和密码,需要根据实际情况进行修改。

集群配置

除了在cluster.conf文件中配置集群节点信息外,还可以对集群模式下的一些其他参数进行配置。例如,可以在application.properties文件中配置集群节点间的通信超时时间等参数。以下是一些常见的集群配置参数:

  • nacos.core.rpc.server.thread.pool.size:集群节点间 RPC 通信服务端线程池大小,默认值为 200。可以根据实际的负载情况进行调整,如果集群节点间通信频繁,且数据量较大,可以适当增大该值。
  • nacos.core.rpc.client.thread.pool.size:集群节点间 RPC 通信客户端线程池大小,默认值为 200。同样,可以根据实际情况进行调整。
  • nacos.core.rpc.connection.timeout:集群节点间 RPC 通信连接超时时间,单位为毫秒,默认值为 3000。如果网络环境不稳定,可以适当增大该值,以避免因连接超时导致的通信失败。

Nacos作为服务注册中心

在微服务架构中,服务注册中心是一个关键组件,它负责管理服务的注册与发现,使得服务之间能够相互通信。Nacos作为一款优秀的服务注册中心,提供了简单易用的特性,能够帮助开发者快速搭建可靠的微服务架构

引入依赖

在SpringBoot 项目中使用Nacos作为服务注册中心,首先需要在项目的pom.xml文件中引入Nacos服务发现依赖

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

配置Nacos

引入依赖后需要在项目的配置文件中配置Nacos的地址和服务名等信息。Spring Boot 支持application.properties和application.yml两种格式的配置文件,以下分别给出两种配置文件的示例。

application.properties 配置示例

# 指定当前服务名称,在服务注册到Nacos是会被使用,方便Nacos控制台进行识别和管理
spring.application.name=nacos - service - provider  
# 指定Nacos服务器的地址和端口
spring.cloud.nacos.discovery.server - addr=127.0.0.1:8848

application.yml 配置示例

spring:application:name: nacos - service - providercloud:nacos:discovery:server - addr: 127.0.0.1:8848

启用服务发现

在SpringBoot启动类上添加@EnableDiscoveryClient注解,用于启用服务发现功能。这个注解是 Spring Cloud 提供的,它会触发 Spring Cloud 自动配置服务发现相关的组件,使得应用能够自动注册到 Nacos 服务注册中心,并能够发现其他已注册的服务。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;// springboot 核心注解,它包含了@Configuration、@EnableAutoConfiguration和@ComponentScan等多个注解,用于启用 Spring Boot 的自动配置、组件扫描等功能
@SpringBootApplication
// 专门用于启用服务发现功能,当应用启动时,会根据配置自动向 Nacos 注册服务,并可以从 Nacos 发现其他服务。
@EnableDiscoveryClient
public class NacosServiceProviderApplication {public static void main(String[] args) {SpringApplication.run(NacosServiceProviderApplication.class, args);}
}

服务注册与发现示例

服务提供者示例代码

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class NacosServiceProviderApplication {@Value("${server.port}")private String port;@GetMapping("/hello")public String hello() {return "Hello from Nacos Service Provider, port: " + port;}public static void main(String[] args) {SpringApplication.run(NacosServiceProviderApplication.class, args);}
}

当这个服务启动时,会根据配置将自身的服务信息(包括服务名、IP 地址、端口号等)注册到 Nacos 服务注册中心。

服务消费者示例代码

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class NacosServiceConsumerApplication {// 用于从Nacos中选择一个可用实例,集成了负载均衡功能@Autowiredprivate LoadBalancerClient loadBalancerClient;// Spring 提供的RESTFUL服务的客户端调用工具,用于发送HTTP请求@Autowiredprivate RestTemplate restTemplate;@GetMapping("/invoke")public String invoke() {// 从Nacos中选择一个名为nacos-service-provider的服务实例ServiceInstance instance = loadBalancerClient.choose("nacos - service - provider");if (instance == null) {return "No instances available";}// 构建服务调用的URLString url = "http://" + instance.getHost() + ":" + instance.getPort() + "/hello";// 发送HTTP请求并获取响应return restTemplate.getForObject(url, String.class);}public static void main(String[] args) {SpringApplication.run(NacosServiceConsumerApplication.class, args);}
}

通过以上服务提供者和服务消费者的示例代码,可以清晰地看到 Nacos 作为服务注册中心的服务注册与发现过程。服务提供者将自身信息注册到 Nacos,服务消费者从 Nacos 发现并调用服务提供者的服务,实现了微服务之间的通信和解耦。

Nacos作为配置中心

在微服务架构中,配置管理是一个至关重要的环节。随着服务数量的增加和环境的多样化,配置的集中化、动态化管理变得尤为关键。Nacos 作为一款强大的配置中心,能够有效地解决这些问题,提供便捷的配置管理服务。

引入依赖

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

配置Nacos

引入依赖后,需要在项目的配置文件中配置 Nacos 的相关信息。一般在bootstrap.properties或bootstrap.yml文件中进行配置,因为这些文件的加载优先级较高,能够确保在项目启动初期就获取到 Nacos 的配置。

application.properties 配置示例

spring.profiles.active=dev
spring.application.name=cloud-producer-server
server.port=8080# nacos 配置中心地址
spring.cloud.nacos.config.server-addr=localhost:8848
# 配置文件的类型
spring.cloud.nacos.config.file-extension=properties 

application.yml 配置示例

spring:application:name: nacos - config - clientcloud:nacos:config:server - addr: 127.0.0.1:8848file - extension: properties

创建配置文件

在 Nacos 控制台中创建配置文件的步骤如下:

  1. 登录 Nacos 控制台,默认地址为http://localhost:8848/nacos,使用默认账号nacos/nacos登录。

  2. 点击左侧导航栏的 “配置管理”,然后点击 “配置列表”。

  3. 点击右上角的 “新建配置” 按钮,进入新建配置页面。

  4. 在新建配置页面中,填写以下信息:

    1. Data ID:配置文件的唯一标识,一般遵循${spring.application.name}-${spring.profile.active}.${file-extension}的格式,例如nacos - config - client - dev.properties 。这里的nacos - config - client是服务名,dev是环境标识,properties是配置文件扩展名,与前面在bootstrap配置文件中设置的一致 。

    2. Group:配置分组,用于对配置进行分类管理,默认值为DEFAULT_GROUP。也可以根据实际需求创建不同的分组,例如按照业务模块划分分组。

    3. 配置内容:填写具体的配置信息,例如:

      server.port=8080
      spring.datasource.url=jdbc:mysql://localhost:3306/nacos_db
      spring.datasource.username=root
      spring.datasource.password=123456
      
  5. 填写完上述信息后,点击 “发布” 按钮,配置文件就创建成功了。

配置动态刷新

在 Spring Boot 项目中,实现配置动态刷新非常简单,只需在需要动态刷新配置的类上添加@RefreshScope注解即可。这个注解会使 Spring 容器在配置发生变化时,自动重新加载相关的配置,并刷新使用这些配置的 Bean。

例如,有一个ConfigController类,它使用了 Nacos 配置中心的配置:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RefreshScope //使得ConfigController类能够感知到 Nacos 配置中心的配置变化
public class ConfigController {@Value("${server.port}")private String serverPort;@GetMapping("/config/port")public String getServerPort() {return "Server Port: " + serverPort;}
}

当在 Nacos 控制台中修改了server.port的配置并发布后,无需重启应用,再次访问/config/port接口,就可以获取到最新的server.port配置值。这一特性极大地提高了系统的灵活性和可维护性,减少了因配置变更而导致的服务中断。

Nacos 高级特性

深入命名空间与分组

在实际的企业级应用开发中,多租户和复杂业务场景是非常常见的。命名空间和分组作为Nacos中重要的逻辑隔离和组织工具,在这些场景中发挥着关键作用

在多租户场景下,每个租户都可以看作是一个独立的业务单元,拥有自己的一套服务和配置,并且需要保证租户之间的数据和配置相互隔离,互不干扰。例如,一家提供软件即服务(SaaS)的云平台,为多个企业客户提供在线办公软件服务。每个企业客户就是一个租户,他们都有自己的用户管理服务、文档管理服务等,并且这些服务的配置(如数据库连接信息、服务访问权限等)可能各不相同。通过使用 Nacos 的命名空间,云平台可以为每个租户创建一个独立的命名空间,将该租户的所有服务和配置都存储在对应的命名空间中。这样,不同租户之间的服务和配置就实现了隔离,一个租户的配置变更不会影响到其他租户,提高了系统的安全性和稳定性。

对于复杂业务场景,一个大型的电商系统可能包含多个业务模块,如商品管理、订单管理、用户管理、支付管理等。每个业务模块又可能有不同的环境(开发、测试、生产)和版本。此时,分组就可以发挥重要作用 。可以根据业务模块创建不同的分组,例如 “product - group” 用于商品管理模块的配置和服务,“order - group” 用于订单管理模块。在每个分组下,再通过命名空间来区分不同的环境。比如在 “product - group” 分组下,创建 “dev - namespace” 用于开发环境,“test - namespace” 用于测试环境,“prod - namespace” 用于生产环境 。这样,通过命名空间和分组的组合使用,实现了对复杂业务场景下服务和配置的精细化管理,使得配置的查找、维护和更新更加方便高效。

持久化与备份

Nacos 的持久化配置是确保数据可靠性和稳定性的重要环节。在默认情况下,Nacos 使用内嵌的 Derby 数据库进行数据存储,这种方式适用于开发和测试环境,但在生产环境中,由于数据的重要性和对数据持久性的要求,通常需要将数据存储到外部的关系型数据库中,如 MySQL。

以 MySQL 为例,进行 Nacos 持久化配置的步骤如下:

  1. 安装 MySQL 数据库,并创建一个新的数据库,例如nacos_config。

  2. 在 Nacos 解压目录下的conf目录中,找到nacos - mysql.sql文件,执行该 SQL 脚本,该脚本会在nacos_config数据库中创建 Nacos 所需的表结构,包括服务注册信息表、配置信息表等。

  3. 编辑 Nacos 的conf/application.properties文件,添加或修改 MySQL 连接配置,如下所示:

    spring.datasource.platform=mysql
    db.num=1
    # mysql 数据库的链接地址
    db.url.0=jdbc:mysql://localhost:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
    db.user=root
    db.password=123456
    
  4. 配置完成后,重启Nacos服务,就会将数据存储到MySql数据库

数据备份对于保障 Nacos 数据的安全性和业务的连续性至关重要。如果 Nacos 的数据丢失或损坏,可能会导致服务无法正常注册和发现,配置信息丢失,从而影响整个微服务架构的运行 。实现数据备份可以通过数据库自带的备份工具。以 MySQL 为例,可以使用mysqldump命令进行数据库备份 。示例命令如下:

mysqldump -u root -p123456 nacos_config > /data/backup/nacos_backup_$(date +\%Y\%m\%d\%H\%M\%S).sql

该命令中,-u root指定用户名,-p123456指定密码,nacos_config是要备份的数据库名,/data/backup/nacos_backup_$(date +%Y%m%d%H%M%S).sql指定备份文件的存储路径和文件名,其中$(date +%Y%m%d%H%M%S)会根据当前时间生成一个唯一的时间戳,确保每次备份的文件名不同 。通过定期执行这样的备份命令,可以将 Nacos 的数据备份到指定的文件中,以便在数据丢失或损坏时进行恢复。

集群模式与负载均衡

集群模式:看上文

负载均衡是Nacos集群模式中的关键环节,它可以将客户端的请求均匀地分布到集群中的各个节点上,提高系统的并发处理能力和可用性。Nacos支持多种负载均衡方式,如基于权重的负载均衡,基于随机的负载均衡等。

Nacos与其他组件的集成

与Spring cloud集成

在Spring Cloud 生态中,Nacos作为服务注册中心和配置中心,与Spring Cloud集成可以极大地简化微服务架构的搭建和管理

集成方法:

  1. 引入依赖:

    <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
    
  2. 配置 Nacos:在application.properties或application.yml文件中配置 Nacos 的地址、服务名等信息 。以application.yml为例:

    spring:application:name: nacos - spring - cloud - democloud:nacos:discovery:server - addr: 127.0.0.1:8848config:server - addr: 127.0.0.1:8848file - extension: properties
    
  3. 启用服务发现和配置管理

    在 Spring Boot 主启动类上添加@EnableDiscoveryClient注解启用服务发现功能,在需要动态刷新配置的类上添加@RefreshScope注解实现配置的动态刷新。

集成后的优势

  • 简化服务注册与发现:Nacos 提供了统一的服务注册中心,使得微服务之间的注册与发现变得简单高效。服务提供者只需将自身信息注册到 Nacos,服务消费者就能轻松发现并调用服务,无需手动维护服务地址列表。
  • 动态配置管理:通过 Nacos 与 Spring Cloud 的集成,可以实现配置的集中化、动态化管理。配置的变更能够实时推送到各个微服务实例,无需重启应用,提高了系统的灵活性和可维护性。
  • 多环境支持:利用 Nacos 的命名空间和分组功能,可以方便地管理不同环境(开发、测试、生产)下的配置和服务,实现环境隔离,降低配置管理的复杂性。

集成后的项目结构

├── src
│   ├── main
│   │   ├── java
│   │   │   └── com
│   │   │       └── example
│   │   │           ├── config
│   │   │           │   └── ConfigController.java  // 配置相关的控制器,使用@RefreshScope注解实现配置动态刷新
│   │   │           ├── discovery
│   │   │           │   └── DiscoveryController.java // 服务发现相关的控制器,用于展示服务发现的功能
│   │   │           └── NacosSpringCloudDemoApplication.java // Spring Boot主启动类,添加@EnableDiscoveryClient注解
│   │   └── resources
│   │       ├── application.yml  // 配置文件,配置Nacos相关信息
│   │       └── bootstrap.yml    // 优先级更高的配置文件,用于初始化Nacos配置
│   └── test
│       └── java
│           └── com
│               └── example
│                   └── NacosSpringCloudDemoApplicationTests.java
└── pom.xml  // 项目依赖管理文件,包含Nacos和Spring Cloud相关依赖

与Dubbo集成

Dubbo 是一款高性能的 Java RPC 框架,Nacos 与 Dubbo 的集成可以为 Dubbo 提供强大的服务注册与发现功能,提升 Dubbo 应用的服务治理能力。

集成步骤:

  1. 引入依赖:在Dubbo项目的pom.xml文件中添加dubbo-registry-nacos依赖。

    <dependency><groupId>com.alibaba</groupId><artifactId>dubbo-registry-nacos</artifactId><version>0.0.1</version>
    </dependency>
    <dependency><groupId>com.alibaba</groupId><artifactId>dubbo</artifactId><version>2.6.5</version>
    </dependency>
    
  2. 配置注册中心

    在 Dubbo 的配置文件(如application.properties或dubbo.xml)中配置 Nacos 作为注册中心。以application.properties为例:

    dubbo.application.name = dubbo - nacos - demo
    dubbo.registry.address = nacos://127.0.0.1:8848
    
  3. 启动Dubbo服务

    确保 Nacos 服务已启动,然后启动 Dubbo 服务提供者和消费者,它们会自动向 Nacos 注册服务或从 Nacos 发现服务。

集成后在服务治理方面的作用:

  • 服务注册与发现:Dubbo 服务可以将自身的元数据(如服务接口、版本、地址等)注册到 Nacos,其他服务可以通过 Nacos 快速发现并调用这些服务,实现了服务的自动注册与发现,提高了服务之间的耦合度。
  • 服务健康检查:Nacos 会定期对 Dubbo 服务实例进行健康检查,当发现服务实例不健康时,会将其从服务列表中移除,避免将请求发送到不健康的服务实例,保证了服务调用的可靠性。
  • 动态配置与路由:可以在 Nacos 中对 Dubbo 服务进行动态配置,如调整服务的权重、路由规则等。这些配置的变更会实时同步到 Dubbo 服务,实现了服务治理的动态化和灵活化。

集成后的服务注册和调用示例代码

服务提供者示例代码

import com.alibaba.dubbo.config.annotation.Service;
import com.alibaba.dubbo.rpc.RpcContext;
import org.springframework.stereotype.Component;@Service(version = "1.0.0")
@Component
public class HelloServiceImpl implements HelloService {@Overridepublic String sayHello(String name) {System.out.println("Receive request from consumer: " + RpcContext.getContext().getRemoteAddress());return "Hello, " + name + "! This is Dubbo service provided by Nacos.";}
}

服务消费者示例代码

import com.alibaba.dubbo.config.annotation.Reference;
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;@RestController
public class HelloController {@Reference(version = "1.0.0")private HelloService helloService;@GetMapping("/hello/{name}")public String hello(@PathVariable String name) {return helloService.sayHello(name);}
}

在上述代码中,服务提供者通过@Service注解将HelloServiceImpl注册为 Dubbo 服务,并指定版本为1.0.0。服务消费者通过@Reference注解引用HelloService,并在HelloController中调用该服务的sayHello方法。当服务提供者和消费者启动后,它们会自动与 Nacos 进行交互,完成服务的注册与发现,从而实现服务的调用。

Nacos使用场景案例分析

在电商系统中的应用

在电商系统中,Nacos 发挥着举足轻重的作用,其服务发现、配置管理和服务治理等功能为电商系统的稳定性和扩展性提供了有力保障。

以一个大型电商系统为例,系统包含众多微服务,如商品服务、订单服务、用户服务、支付服务等 。在服务发现方面,当商品服务启动时,它会将自身的服务信息(包括服务名称、IP 地址、端口号等)注册到 Nacos 服务注册中心。假设商品服务有多个实例,分布在不同的服务器上,这些实例都会向 Nacos 注册。当订单服务需要调用商品服务来获取商品详情以完成订单创建时,订单服务会向 Nacos 发送查询请求,Nacos 根据请求返回可用的商品服务实例列表。订单服务通过负载均衡算法(如轮询、随机或权重)从实例列表中选择一个商品服务实例进行调用。这种服务发现机制使得电商系统中的微服务之间能够灵活通信,并且当商品服务实例发生变化(如新增实例、实例故障等)时,Nacos 能够及时更新服务列表,订单服务无需关心商品服务的具体地址变化,保证了系统的高可用性和可扩展性。

在配置管理方面,电商系统中有大量的配置信息,如数据库连接配置、缓存配置、业务规则配置等。通过 Nacos 配置管理,这些配置信息可以集中存储在 Nacos 配置中心。例如,电商系统的数据库连接配置,在不同环境(开发、测试、生产)下可能不同。在开发环境中,数据库连接地址可能是本地测试数据库的地址;在生产环境中,则是正式的数据库地址 。通过 Nacos,我们可以为不同环境创建不同的命名空间,将相应环境的数据库连接配置存储在对应的命名空间中 。应用启动时,根据配置的命名空间从 Nacos 获取相应的数据库连接配置。而且,当数据库连接配置发生变化时,只需在 Nacos 中修改配置,Nacos 会将新的配置推送给相关的微服务,微服务无需重启即可实时应用新的配置,大大提高了系统的运维效率和灵活性。

在服务治理方面,Nacos 的服务健康检查功能可以实时监控电商系统中各个微服务实例的健康状态。以支付服务为例,Nacos 会定期向支付服务实例发送健康检查请求,如果支付服务实例在规定时间内正常响应,Nacos 会认为该实例处于健康状态;如果连续多次未收到正常响应,Nacos 会将该实例标记为不健康,并从服务列表中移除,避免将支付请求发送到不健康的实例上,保证了支付流程的稳定性和可靠性。此外,Nacos 还支持动态服务路由,根据不同的业务场景和条件,如用户地域、用户等级等,将请求路由到最合适的服务实例上。比如,对于高级会员用户,将其订单请求路由到性能更好的订单服务实例上,以提供更优质的服务体验。通过这些服务治理功能,Nacos 有效提升了电商系统的整体性能和用户满意度。

在分布式系统中的应用

作为配置中心,Nacos 为分布式系统提供了集中化、动态化的配置管理能力。在一个分布式的数据分析系统中,各个组件(如数据采集组件、数据处理组件、数据存储组件等)都有各自的配置需求。数据采集组件需要配置数据源地址、采集频率等;数据处理组件需要配置算法参数、资源分配等;数据存储组件需要配置存储地址、存储容量等 。通过 Nacos,这些配置信息可以统一存储和管理 。不同的组件可以根据自身的需求从 Nacos 订阅相应的配置。当配置发生变化时,Nacos 会及时通知订阅的组件,组件可以动态更新配置,无需重启整个系统 。这不仅提高了配置管理的效率,还增强了系统的灵活性和可维护性 。与传统的配置管理方式(如将配置文件分散在各个组件中)相比,Nacos 避免了配置文件的分散管理带来的不便,降低了配置出错的风险,并且方便了跨环境(开发、测试、生产)的配置管理。

在服务注册与发现方面,Nacos 为分布式系统中的微服务提供了高效的注册与发现机制。以一个分布式的社交网络系统为例,系统中包含用户服务、消息服务、好友关系服务等多个微服务。当用户服务启动时,它会向 Nacos 注册自己的服务信息,包括服务名称、IP 地址、端口号以及服务的元数据(如服务版本、服务描述等)。消息服务如果需要与用户服务进行通信,获取用户的相关信息,它可以向 Nacos 查询用户服务的地址列表。Nacos 会根据服务的健康状态、负载情况等因素返回合适的用户服务实例地址。消息服务通过负载均衡策略选择一个用户服务实例进行调用。这种服务注册与发现机制使得分布式系统中的微服务之间能够实现解耦,微服务的添加、删除、升级等操作不会影响到其他微服务的正常运行。同时,Nacos 的服务健康检查功能确保了只有健康的服务实例会被返回给调用方,提高了系统的可靠性。与其他服务注册与发现工具相比,Nacos 具有简单易用、性能高效、支持多种健康检查方式等优势,能够更好地满足分布式系统的需求。

Nacos与Zookeeper对比

Zookeeper和Nacos是两个不同的分布式系统协调组件,它们在设计目标,功能特性和使用方式等方面存在一些区别。以下是主要区别:

  1. 设计目标和适用场景
    • Zookeeper最初是为Hadoop的分布式协调而设计,主要用于服务注册和发现、配置管理、分布式锁等功能。它更适合于传统的分布式系统场景。
    • Nacos则是为微服务架构设计的,除了服务注册和发现,还包括动态配置管理、流量管理、服务降级和熔断等功能。它更适合于微服务架构和云原生场景。
  2. 支持协议
    • Zookeeper使用ZAB(Zookeeper Atomic Broadcast)协议,它是一种基于原子广播的一致性协议。Zookeeper整体遵循一致性(CP)原则,即在任何时候对 Zookeeper 的访问请求能得到一致的数据结果,但是当机器下线或者宕机时,不能保证服务可用性。(这在注册中心这个场景就很要命,注册中心可用性要求高于一致性)
    • Nacos使用RAFT协议,它是一种具有强一致性保证的分布式一致性协议(支持AP也支持CP),相对于ZAB协议具有更强的一致性保证。
  3. 架构模式和节点角色
    • Zookeeper采用主从集群模式,每个节点可以充当领导者(leader)或者跟随者(follower)的角色,并通过主从复制来实现数据的复制和高可用性。
    • Nacos采用主从集群模式,节点根据不同的角色分为服务节点、配置节点和控制节点。每种角色的节点在集群中的功能和复制的数据是不同的。
  4. 功能特性
    • Zookeeper主要提供了服务注册和发现、配置管理、分布式锁等基础功能,它可以作为分布式系统的协调服务。
    • Nacos不仅包含了服务注册和发现、配置管理等基础功能,还提供了流量管理、服务降级、熔断等服务治理能力,更适合于构建和管理微服务架构。

总的来说,Zookeeper更适合于传统的分布式场景,而Nacos则更适合于微服务架构和云原生场景。

http://www.rkmt.cn/news/391.html

相关文章:

  • Python模块之 subprocess 具有可访问I/O流的子流程 子进程管理
  • 因爱而……(和谐版)
  • 初探CTF
  • Python模块之execjs
  • 软工第一次作业-自我介绍
  • Vibe Coding,这种技术面试形式会成为新的趋势吗?
  • qt之捕获键盘组合键事件
  • ???记录?
  • CSP 赛前周记#2
  • Go
  • 做题记录
  • 软工第一次作业
  • WC2024 水镜 bakas trick 记录
  • 吸吸
  • 超越-env-一份成熟的应用程序配置指南
  • 202404_QQ_维纳攻击
  • perf中 的dwarf是什么?
  • 读书笔记:一文搞懂Oracle全局临时表的统计信息管理
  • 故障处理:dul直接抽取exp文件
  • 2025-09-08 uniapp小程序赋值生效了但是页面却没变化?==》使用v-if+变量来控制元素的重新渲染
  • 12.8 类与对象的绑定方法和非绑定方法
  • 9.8
  • nfs服务
  • 低功耗蓝牙BLE与小程序通讯
  • 深度解码你自己看着办:职场新人必须掌握的潜台词破解术
  • 记录一个Windows上的键盘鼠标模拟库和沟子库--Input
  • 数据集和数据系统_AI成为工作中很好用的协同成员了
  • IDM超详细图文安装激活教程,一次安装免费使用 Internet Download Manager
  • 标题
  • 12.5 多态与多态性