深入微服务-Nacos 核心概念及服务发现实战

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第8天,点击查看活动详情

微服务系列文章目录


前言

本系列带着大家深入微服务 Spring体系的各个框架的基本使用以及底层原理。上一篇文章介绍了Nacos的基础概念以及Nacos Server的搭建,本节将带着大家学习下Nacos的核心概念以及客户端实现服务发现的功能


Nacos 服务发现核心概念

Nacos 架构图 Nacos架构.png

服务(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 命名空间.png

Nacos 数据模型 Nacos 数据模型.jpeg

Nacos 服务领域模型

Nacos支持服务在所有场景下的数据存储和管理,Nacos 的服务领域模型为 服务-集群-实例的三层模型。

Nacos 服务领域模型.jpeg

Nacos 数据逻辑隔离模型

⼀个用户账号可以新建多个命名空间,每个命名空间对应⼀个客户端实例,这个命名空间对应的注册中心物理集群是可以根据规则进行路由的 实际项目生产中可根据Namespace进行环境隔离(master/develop/test/hotfix),应用可以根据不同的分组进行切换配置,满足实际场景的服务隔离需求

Nacos 数据逻辑隔离模型.png

Nacos 服务发现原理

Nacos服务注册发现原理.png 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 注册发现实战.png

总结

本文主要跟大家介绍了Nacos的核心概念以及服务发现实战,希望多多支持,后续会更深入跟大家讲解Nacos内容。

猜你喜欢

转载自juejin.im/post/7085549819183235086