SpringCloud--Nacos解析

一、Nacos简介

Spring Cloud Alibaba Nacos是一个用于动态服务发现、配置管理和服务管理的平台,是阿里巴巴开源的一个项目,旨在简化微服务架构中的服务治理。Nacos 提供了一组简单易用的特性集,可以快速的实现动态服务发现、服务配置、服务元数据及流量管理。

二、Nacos基本概念

  1. 命名空间(Namespace):命名空间是用来隔离不同租户或不同环境的配置和服务的逻辑区域。在一个Nacos集群中可以定义多个命名空间,不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。
  2. 集群(Cluster):集群是指一组协同工作的Nacos服务器实例,可以提供高可用性。
  3. 配置(Configuration):配置是指应用程序运行所需的外部参数,如数据库连接字符串、外部服务地址等。Nacos提供了中心化的配置管理,允许动态地更改和分发配置。
  4. 配置数据ID(Configuration Data ID):配置数据ID是配置的唯一标识符,用于区分不同的配置集合。
  5. 配置分组(Configuration Group):配置分组用于将配置信息分组,便于管理。
  6. 配置管理(Configuration Management):Nacos提供配置的动态管理,包括配置的创建、获取、修改和删除等操作。
  7. 配置监听(Configuration Listen):应用可以订阅配置变更事件,当配置更新时,应用可以得到通知并重新加载配置。
  8. 服务(Service):服务是指一组提供相同功能的服务实例的集合,是微服务架构中的基本单位。
  9. 服务实例(Service Instance):服务实例指服务的一个具体运行实例,每个实例都有唯一的标识,并向Nacos注册自己的信息。
  10. 分组(Group):分组是服务实例的逻辑分类,可以根据不同的需求将服务实例划分为不同的组。
  11. 动态服务发现(Dynamic Service Discovery):服务实例可以动态地向Nacos注册和注销,其他服务可以动态地发现这些服务实例。
  12. 服务元数据(Service Metadata):服务元数据是关于服务实例的附加信息,如版本号、权重等。
  13. 动态DNS服务(Dynamic DNS):Nacos提供动态DNS服务,当服务实例的IP地址或端口号发生变化时,DNS记录会自动更新。
  14. 服务健康检查(Service Health Check):Nacos定期检查服务

三、数据模型

Nacos 数据模型 Key 由三元组(Namespace、Group、Data ID)唯一确定,Namespace默认是空串,公共命名空间(public),分组默认是 DEFAULT_GROUP。
在这里插入图片描述

四、Nacos的核心功能

  1. 服务注册与发现:服务提供者在启动时将自己的信息注册到Nacos服务器上,服务消费者可以通过Nacos查询到可用的服务实例列表,并据此进行调用。
  2. 配置管理:Nacos支持配置的集中管理和动态刷新。服务提供者和消费者可以订阅配置的变化,当配置发生变更时,无需重启应用即可实时更新配置。
  3. 动态DNS服务:Nacos提供了动态DNS服务,使得服务提供者和消费者可以通过服务名来解析服务的IP地址,从而实现服务之间的通信。
  4. 流量管理:Nacos支持流量管理功能,如权重路由、流量分割等,帮助实现复杂的流量控制策略。
  5. 服务元数据管理:除了服务名称和IP地址外,Nacos还允许存储和管理额外的服务元数据。

五、Nacos 使用前提条件

5.1 环境准备

Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行Nacos,还需要为此配置 Maven环境,请确保是在以下版本环境中安装使用:

  1. 64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。
  2. 64 bit JDK 1.8+;
  3. 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上管理的话,需要对客户端服务进行如下修改:

  1. 在pom文件中添加依赖,注意与 Spring Boot 版本之间的对应关系。
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>${latest.version}</version>
</dependency>
  1. 在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
  1. 在启动类上添加Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能。
@SpringBootApplication
@EnableDiscoveryClient
public class NacosClientApplication {

  public static void main(String[] args) {
    SpringApplication.run(NacosClientApplication.class, args);
  }
}
  1. 启动客户端服务,当客户端服务成功启动后,便可以在Nacos管理平台服务列表中看到这个服务的相关状态信息。
    在这里插入图片描述

七、配置管理

如果还想要在 Nacos 上实现客户端配置的管理的话,需要在客户端服务进行如下修改:

  1. 在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>
  1. 将application.properties或application.yml文件改成bootstrap.properties或bootstrap.yml,再增加以下配置:
spring:
  application:
    name: snowy-web-app
  profiles:
    active: dev
  cloud:
    nacos:
      config:
        server-addr: localhost:8848
        namespace: snowy-cloud-2x-ent-${spring.profiles.active}
        group: ${spring.profiles.active}
        prefix: ${spring.application.name}
        file-extension: yaml
        username: nacos
        password: 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 类型。
  1. 在Nacos控制台中创建配置文件,要保证创建的配置文件的Data Id 与上面${prefix}-${spring.profiles.active}.${file-extension}组成的一致,否则服务启动时读取不到Nacos上的配置信息。再填写相应的配置内容,配置内容的格式主要有Properties、YAML、HTML、XML、JSON、TEXT。一般使用YAML格式,更加美观一点,下面是Nacos上配置内容相关属性的设置:
iam:
  key: JLB6L6MJVIT5Z7IL
  username: njh
  password: 123456
  1. 在客户端代码中可以使用@Value注解来获取Nacos上的配置属性。同时可以使用@RefreshScope注解来实现配置自动更新,即在Nacos管理平台修改服务的配置信息后,无需重启服务就能获取到最新修改的配置属性值。
@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController {

    @Value("${iam.key}")
 	private String key;
}

八、服务元数据管理

在Spring Cloud Nacos中,服务元数据管理是指对服务实例附加额外的键值对信息,以便在服务注册和发现过程中提供更多的上下文信息。服务元数据可以用于多种场景,例如区分服务版本、配置服务特定属性或者实现基于元数据的服务路由。要在Spring Cloud Nacos中管理服务元数据,你可以按照下面的步骤操作:

  1. 注册服务时设置元数据:当服务实例注册到Nacos时,可以在服务实例的配置中添加元数据。例如,在bootstrap.properties或application.properties文件中,可以定义元数据键值对,如下所示:
spring:
  cloud:
    nacos:
      discovery:
        metadata:
          my-key: my-value
  1. 通过Nacos控制台设置元数据:登录到Nacos控制台,手动编辑已注册服务的元数据。在服务列表中选择特定的服务实例,然后在“编辑”界面可以添加或编辑元数据。
  2. 查询服务实例的元数据:当需要获取服务实例的元数据时,可以使用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();
        // 处理元数据
    }
}
  1. 使用元数据进行服务发现和路由:在服务消费方,可以根据服务实例的元数据来决定调用哪个实例。例如,可以编写代码仅选择具有特定版本元数据的服务实例。
  2. 动态更新元数据:元数据可以动态更新,无需重启服务。当你通过控制台或API更新了服务实例的元数据后,服务消费者会立即看到这些变化。
  • 22
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值