1. 概述
元信息:Nacos
数据(如配置和服务)描述信息,如服务版本、权重、容灾策略、负载均衡策略、鉴权配置、各种自定义标签 (label
),从作用范围来看,分为服务级别的元信息、集群的元信息及实例的元信息。
从Nacos
架构图中,可以看到关于元数据的相关能力:
- 元数据管理:提供元数据
CURD
和打标能力 CMDB
:解决元数据存储,与三方cmdb
系统对接问题,解决应用,人,资源关系
2. 元数据管理
本篇文档主要讲解元数据管理,关于CMDB
的相关内容后续介绍,元数据管理主要包含了以下两个主要功能:
CRUD
:元数据的增删改查操作- 打标服务:定义标签,可根据标签实现自定义访问策略,也可用于添加描述信息,为实现上层流量和服务灰度非常关键
2.1 服务元数据
服务元数据 (Service Metadata
):服务元数据是指包括服务端点(endpoints
)、服务标签、服务版本号、服务实例权重、路由规则、安全策略等描述服务的数据。
服务的定义只是为服务设置了⼀些基本的信息,用于描述服务以及方便快速的找到服务,而服务的元数据是进⼀步定义了 Nacos
中服务的细节属性和描述信息。
主要包含:
- 健康保护阈值(
ProtectThreshold
):为了防止因过多实例故障,导致所有流量全部流入剩余实例,继而造成流量压力将剩余实例被压垮形成的雪崩效应。应将健康保护阈值定义为⼀个0
到1
之间的浮点数。当域名健康实例数占总服务实例数的比例小于该值时,无论实例是否健康,都会将这个实例返回给客户端。这样做虽然损失了⼀部分流量,但是保证了集群中剩余健康实例能正常工作。 - 实例选择器(
Selector
):用于在获取服务下的实例列表时,过滤和筛选实例。该选择器也被称为路由器,目前Nacos
支持通过将实例的部分信息存储在外部元数据管理CMDB
中,并在发现服务时使用CMDB
中存储的元数据标签来进行筛选的能力。 - 拓展数据(
extendData
):用于用户在注册实例时自定义扩展的元数据内容,形式为K-V
。可以在服务中拓展服务的元数据信息,方便用户实现自己的自定义逻辑。
进入服务列表菜单,点击详情:
服务详情中,可以看下服务级别的元数据:
点击右上角的编辑服务,可以进行元数据的CRUD
操作:
新增元数据的格式为JSON
,示例中添加了标签、服务名称:
{
"lable.address": "changsha",
"name": "order"
}
2.2 实例元数据
和服务元数据不同,实例的元数据主要作用于实例运维相关的数据信息。
主要包含:
- 权重(
Weight
):实例级别的配置。权重为浮点数,范围为0-10000
。权重越大,分配给该实例的流量越大。 - 上线状态(
Enabled
):标记该实例是否接受流量,优先级大于权重和健康状态。用于运维人员在不变动实例本身的情况下,快速地手动将某个实例从服务中移除。 - 拓展数据(
extendData
):不同于实例定义中的拓展数据,这个拓展数据是给予运维人员在不变动实例本身的情况下,快速地修改和新增实例的扩展数据,从而达到运维实例的作用。
可以通过以下几种方式进行管理:
- 控制台
Open API
- 客户端生成
2.2.1 控制台
进入服务列表菜单,点击详情,在下方可以看到注册的实例信息:
使用Spring Cloud Nacos
框架集成时,默认会添加一个注册来源的元数据:
preserved.register.source=SPRING_CLOUD
点击编辑按钮,可以对实例的元数据进行CRUD
操作:
可以根据元数据进行实例的条件查询:
2.2.2 客户端
客户端在注册时可以添加元数据,这在实际开发中是否有用,比如添加当前实例的启动时间、版本、服务描述等信息,方便运维管理。
可以在application.yml
文件中添加元数据,示例如下:
spring:
application:
name: order-demo
cloud:
nacos:
# 服务端用户名密码
username: nacos
password: nacos
# 服务发现
discovery:
# 命名空间
namespace: 0faa0970-1179-4143-8aa2-cac3ee6b42ec
# 服务端地址,默认:127.0.0.1:8848
server-addr: 127.0.0.1:8848
metadata:
name: 订单服务
version: ${project.version}
build.time: ${maven.build.timestamp}
示例中获取获取Maven
中的信息,所以需要添加相应的构建插件:
<build>
<finalName>${project.artifactId}-${project.version}</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>3.0.10</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
<configuration>
<encoding>UTF-8</encoding>
<useDefaultDelimiters>true</useDefaultDelimiters>
</configuration>
</plugin>
</plugins>
</build>
也可以自定义注册NacosDiscoveryProperties
配置类添加元数据,示例如下:
@Configuration
public class NacosConfig {
@Bean
public NacosDiscoveryProperties nacosProperties(Environment environment) {
NacosDiscoveryProperties discoveryProperties = new NacosDiscoveryProperties();
Map<String, String> metadata = discoveryProperties.getMetadata();
metadata.put("startup.time",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
metadata.put("java.version",environment.getProperty("java.version"));
metadata.put("os.name",environment.getProperty("os.name"));
metadata.put("pid",environment.getProperty("pid"));
return discoveryProperties;
}
}
启动服务后台,查看控制台:
2.2.3 Open API
在Nacos Open API 指南中,也提供了实例元数据的API
: