一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第8天,点击查看活动详情。
微服务系列文章目录
- 深入微服务-SpringBoot 自动装配原理
- 深入微服务-SpringCloud调用组件Feign
- 深入微服务-服务注册与发现 SpringCloud Eureka之基础
- 深入微服务-服务注册与发现 SpringCloud Eureka之高可用以及核心原理
- 深入微服务之Nacos 基础及Nacos Server搭建
- 深入微服务-Nacos 核心概念及服务发现实战
前言
本系列带着大家深入微服务 Spring体系的各个框架的基本使用以及底层原理。上一篇文章介绍了Nacos的基础概念以及Nacos Server的搭建,本节将带着大家学习下Nacos的核心概念以及客户端实现服务发现的功能
Nacos 服务发现核心概念
Nacos 架构图
服务(Service) 服务是指一个或一组软件功能(例如特定信息的检索或一组操作的执行),其目的是不同的客户端可以为不同的目的重用(例如通过跨进程的网络调用)
服务注册中心 (Service Registry) 服务注册中心,它是服务,其实例及元数据的数据库。底层为Map(namespace, Map(group::serviceName, Service))
,服务实例在启动时注册到服务注册表,并在关闭时注销。服务和路由器的客户端查询服务注册表以查找服务的可用实例。服务注册中心可能会调用服务实例的健康检查 API 来验证它是否能够处理请求。
服务元数据 (Service Metadata) 服务元数据是指包括服务端点(endpoints)、服务标签、服务版本号、服务实例权重、路由规则、安全策略等描述服务的数据
服务提供方 (Service Provider) 是指提供可复用和可调用服务的应用方
服务消费方 (Service Consumer) 是指会发起对某个服务调用的应用方
名字服务 (Naming Service) 提供分布式系统中所有对象(Object)、实体(Entity)的“名字”到关联的元数据之间的映射管理服务,例如 ServiceName -> Endpoints Info, Distributed Lock Name -> Lock Owner/Status Info, DNS Domain Name -> IP List, 服务发现和 DNS 就是名字服务的2大场景
Nacos 数据模型
Nacos 数据模型 Key 有三部分组成,Namespace默认是空串,公共命名空间(public),分组默认是 DEFAULT_GROUP
详见 com.alibaba.cloud.nacos.NacosConfigProperties
/**
* namespace, separation configuration of different environments.
*/
private String namespace;
/**
* nacos config group, group is config data meta info.
*/
private String group = "DEFAULT_GROUP";
复制代码
spring:
application:
name: AppName
cloud:
nacos:
config:
server-addr: nacos:8848
namespace: namespaceId # 命名空间id
group: GroupName # 分组名称 默认为DEFAULT_GROUP
discovery:
server-addr: nacos:8848
复制代码
Nacos 命名空间界面,支持新增,删除,编辑等操作
Nacos 数据模型
Nacos 服务领域模型
Nacos支持服务在所有场景下的数据存储和管理,Nacos 的服务领域模型为 服务-集群-实例的三层模型。
Nacos 数据逻辑隔离模型
⼀个用户账号可以新建多个命名空间,每个命名空间对应⼀个客户端实例,这个命名空间对应的注册中心物理集群是可以根据规则进行路由的 实际项目生产中可根据Namespace进行环境隔离(master/develop/test/hotfix),应用可以根据不同的分组进行切换配置,满足实际场景的服务隔离需求
Nacos 服务发现原理
Nacos服务发现核心概念:
- 服务注册:Nacos Client 启动的时候会发送REST 请求(1.0默认为http,2.0为grpc)向Nacos Server注册服务并提供元数据信息,包含服务的别名、host、端口等信息。NacosServer接收到Client注册请求会讲实例信息存储到自身的注册表(底层为
Map
)中 - 服务心跳:Nacos Client启动之后会启动一个定时任务每隔一段时间进行心跳通知Nacos Server(默认5s发送一次心跳),防止自身服务被剔除
- 服务发现:Nacos Client在进行服务调用时会向Nacos Server发起REST请求拉取服务列表,并缓存到本地,为防止缓存与实际服务数据不一致,Nacos Client会启动一个定时任务从Nacos Server拉取最新的注册表信息更新到本地缓存
- 服务健康检查:Nacos Server会启动一个定时任务检测Nacos Client的健康状态,若15s内没有收到客户端的心跳事件,会将实例的health属性设置为false,如果实例超过30s没有收到心跳事件,会从Nacos Server注册表中剔除该实例
实例的health属性为Nacos Client 健康状态,默认为true
上述的机制会在后续的源码解析详细讲解
Nacos 服务发现实战
1.引入Maven
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
复制代码
2.启动类加上注解@EnableDiscoveryClient
@SpringBootApplication
@EnableFeignClients({ "com.jany" })
@EnableDiscoveryClient
public class NacosClientApplication {
public static void main(String[] args) {
SpringApplication.run(NacosClientApplication.class, args);
}
}
复制代码
3.配置文件bootstrap.yml
根据实际情况更改 nacos 为Nacos Server地址 username默认为nacos,密码默认为nacos
spring:
application:
name: nacos-client-demo
cloud:
nacos:
discovery:
server-addr: nacos:8848
username: nacos
password: nacos
复制代码
4.启动之后可在Nacos控制台看到注册上来的服务
总结
本文主要跟大家介绍了Nacos的核心概念以及服务发现实战,希望多多支持,后续会更深入跟大家讲解Nacos内容。