一、Nacos简介
Spring Cloud Alibaba Nacos是一个用于动态服务发现、配置管理和服务管理的平台,是阿里巴巴开源的一个项目,旨在简化微服务架构中的服务治理。Nacos 提供了一组简单易用的特性集,可以快速的实现动态服务发现、服务配置、服务元数据及流量管理。
二、Nacos基本概念
- 命名空间(Namespace):命名空间是用来隔离不同租户或不同环境的配置和服务的逻辑区域。在一个Nacos集群中可以定义多个命名空间,不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。
- 集群(Cluster):集群是指一组协同工作的Nacos服务器实例,可以提供高可用性。
- 配置(Configuration):配置是指应用程序运行所需的外部参数,如数据库连接字符串、外部服务地址等。Nacos提供了中心化的配置管理,允许动态地更改和分发配置。
- 配置数据ID(Configuration Data ID):配置数据ID是配置的唯一标识符,用于区分不同的配置集合。
- 配置分组(Configuration Group):配置分组用于将配置信息分组,便于管理。
- 配置管理(Configuration Management):Nacos提供配置的动态管理,包括配置的创建、获取、修改和删除等操作。
- 配置监听(Configuration Listen):应用可以订阅配置变更事件,当配置更新时,应用可以得到通知并重新加载配置。
- 服务(Service):服务是指一组提供相同功能的服务实例的集合,是微服务架构中的基本单位。
- 服务实例(Service Instance):服务实例指服务的一个具体运行实例,每个实例都有唯一的标识,并向Nacos注册自己的信息。
- 分组(Group):分组是服务实例的逻辑分类,可以根据不同的需求将服务实例划分为不同的组。
- 动态服务发现(Dynamic Service Discovery):服务实例可以动态地向Nacos注册和注销,其他服务可以动态地发现这些服务实例。
- 服务元数据(Service Metadata):服务元数据是关于服务实例的附加信息,如版本号、权重等。
- 动态DNS服务(Dynamic DNS):Nacos提供动态DNS服务,当服务实例的IP地址或端口号发生变化时,DNS记录会自动更新。
- 服务健康检查(Service Health Check):Nacos定期检查服务
三、数据模型
Nacos 数据模型 Key 由三元组(Namespace、Group、Data ID)唯一确定,Namespace默认是空串,公共命名空间(public),分组默认是 DEFAULT_GROUP。
四、Nacos的核心功能
- 服务注册与发现:服务提供者在启动时将自己的信息注册到Nacos服务器上,服务消费者可以通过Nacos查询到可用的服务实例列表,并据此进行调用。
- 配置管理:Nacos支持配置的集中管理和动态刷新。服务提供者和消费者可以订阅配置的变化,当配置发生变更时,无需重启应用即可实时更新配置。
- 动态DNS服务:Nacos提供了动态DNS服务,使得服务提供者和消费者可以通过服务名来解析服务的IP地址,从而实现服务之间的通信。
- 流量管理:Nacos支持流量管理功能,如权重路由、流量分割等,帮助实现复杂的流量控制策略。
- 服务元数据管理:除了服务名称和IP地址外,Nacos还允许存储和管理额外的服务元数据。
五、Nacos 使用前提条件
5.1 环境准备
Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行Nacos,还需要为此配置 Maven环境,请确保是在以下版本环境中安装使用:
- 64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。
- 64 bit JDK 1.8+;
- Maven 3.2.x+;
5.2 启动Nacos服务器
可以通过 Github下载nacos-server-$version.zip 包,再将其解压出来启动。在2.2.0.1和2.2.1版本时,必须修改conf目录下的application.properties文件,设置其中的nacos.core.auth.plugin.nacos.token.secret.key
值,否则无法启动。
5.3 登录Nacos管理页面
在Nacos server 成功启动后,可以通过在浏览器中输入http://ip:8848/nacos,使用默认账号密码:nacos/nacos 登录管理平台。
六、服务注册与发现
如果只是启动 Nacos server 的话,在Naocs的管理平台里面是没有管理的服务列表数据的。如果想要将某个服务注册到Nacos上管理的话,需要对客户端服务进行如下修改:
- 在pom文件中添加依赖,注意与 Spring Boot 版本之间的对应关系。
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><version>${latest.version}</version>
</dependency>
- 在application.properties或application.yml文件中配置 Nacos server 的地址,以便指定客户端服务需要注册到哪个Nacos server 上。
server.port=8070
spring.application.name=your-service-name
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
- 在启动类上添加Spring Cloud 原生注解
@EnableDiscoveryClient
开启服务注册发现功能。
@SpringBootApplication
@EnableDiscoveryClient
public class NacosClientApplication {public static void main(String[] args) {SpringApplication.run(NacosClientApplication.class, args);}
}
- 启动客户端服务,当客户端服务成功启动后,便可以在Nacos管理平台服务列表中看到这个服务的相关状态信息。
七、配置管理
如果还想要在 Nacos 上实现客户端配置的管理的话,需要在客户端服务进行如下修改:
- 在pom文件中添加依赖
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId><version>${latest.version}</version>
</dependency>
<!-- bootstrap 配置加载 -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
- 将application.properties或application.yml文件改成bootstrap.properties或bootstrap.yml,再增加以下配置:
spring:application:name: snowy-web-appprofiles:active: devcloud:nacos:config:server-addr: localhost:8848namespace: snowy-cloud-2x-ent-${spring.profiles.active}group: ${spring.profiles.active}prefix: ${spring.application.name}file-extension: yamlusername: nacospassword: nacos
在上面的配置中,由${prefix}-${spring.profiles.active}.${file-extension}
共同组成Nacos管理页面中配置列表中的Data Id,这个Data Id也是服务配置信息的唯一标识。其中:
- prefix:默认为 spring.application.name 的值,也就是当前的服务名,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
- spring.profiles.active:即为当前环境对应的 profile,上面配置中就是dev。当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,Data Id 的拼接格式变成
${prefix}.${file-extension}
。 - file-exetension:为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。
- 在Nacos控制台中创建配置文件,要保证创建的配置文件的Data Id 与上面
${prefix}-${spring.profiles.active}.${file-extension}
组成的一致,否则服务启动时读取不到Nacos上的配置信息。再填写相应的配置内容,配置内容的格式主要有Properties、YAML、HTML、XML、JSON、TEXT。一般使用YAML格式,更加美观一点,下面是Nacos上配置内容相关属性的设置:
iam:key: JLB6L6MJVIT5Z7ILusername: njhpassword: 123456
- 在客户端代码中可以使用
@Value
注解来获取Nacos上的配置属性。同时可以使用@RefreshScope
注解来实现配置自动更新,即在Nacos管理平台修改服务的配置信息后,无需重启服务就能获取到最新修改的配置属性值。
@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController {@Value("${iam.key}")private String key;
}
八、服务元数据管理
在Spring Cloud Nacos中,服务元数据管理是指对服务实例附加额外的键值对信息,以便在服务注册和发现过程中提供更多的上下文信息。服务元数据可以用于多种场景,例如区分服务版本、配置服务特定属性或者实现基于元数据的服务路由。要在Spring Cloud Nacos中管理服务元数据,你可以按照下面的步骤操作:
- 注册服务时设置元数据:当服务实例注册到Nacos时,可以在服务实例的配置中添加元数据。例如,在bootstrap.properties或application.properties文件中,可以定义元数据键值对,如下所示:
spring:cloud:nacos:discovery:metadata:my-key: my-value
- 通过Nacos控制台设置元数据:登录到Nacos控制台,手动编辑已注册服务的元数据。在服务列表中选择特定的服务实例,然后在“编辑”界面可以添加或编辑元数据。
- 查询服务实例的元数据:当需要获取服务实例的元数据时,可以使用Nacos客户端API查询。例如,在Spring Cloud应用程序中,可以注入NamingService接口,并使用它来检索服务实例的元数据:
@Autowired
private NamingService namingService;public void getServiceInstanceMetadata(String serviceName) throws NacosException {List<Instance> instances = namingService.getAllInstances(serviceName);for (Instance instance : instances) {Map<String, String> metadata = instance.getMetadata();// 处理元数据}
}
- 使用元数据进行服务发现和路由:在服务消费方,可以根据服务实例的元数据来决定调用哪个实例。例如,可以编写代码仅选择具有特定版本元数据的服务实例。
- 动态更新元数据:元数据可以动态更新,无需重启服务。当你通过控制台或API更新了服务实例的元数据后,服务消费者会立即看到这些变化。