• Nacos服务发现数据模型


    Nacos服务发现数据模型

    1. Namespace 隔离设计

    命名空间**(Namespace)**用于进行租户粒度的隔离,Namespace 的常用场景之一是不同环境的隔离,例如开发测试

    环境和生产环境的资源(如配置、服务)隔离等。

    从一个租户(用户)的角度来看,如果有多套不同的环境,那么这个时候可以根据指定的环境来创建不同的

    namespce,以此来实现多环境的隔离。例如,你可能有开发,测试和生产三个不同的环境,那么使用一套

    nacos 集群可以分别建以下三个不同的 namespace。如下图所示:

    image-20220720085836872

    从多个租户(用户)的角度来看,每个租户(用户)可能会有自己的 namespace,每个租户(用户)的配置数据以及注

    册的服务数据都会归属到自己的 namespace 下,以此来实现多租户间的数据隔离。例如超级管理员分配了三

    个租户,分别为张三、李四和王五。分配好了之后,各租户用自己的账户名和密码登录后,创建自己的命名

    空间。如下图所示:

    image-20220720090229733

    2. 命名空间管理

    前面已经介绍过,命名空间(Namespace)是用于隔离多个环境的(如开发、测试、生产),而每个应用在不同环

    境的同一个配置(如数据库数据源)的值是不一样的。因此,我们应针对企业项目实际研发流程、环境进行规划。

    如某软件公司拥有开发、测试、生产三套环境,那么我们应该针对这三个环境分别建立三个namespace。

    image-20220720090531082

    建立好所有namespace后,在配置管理服务管理模块下所有页面,都会包含用于切换namespace(环境)的tab按钮,如下图:

    image-20220720090841999

    注意: namesace 为 public 是 nacos 的一个保留空间,如果您需要创建自己的 namespace,不要和 public 重名,以一个实际业务场景有具体语义的名字来命名,以免带来字面上不容易区分自己是哪一个 namespace。

    注意:在编写程序获取配置集时,指定的namespace参数一定要填写命名空间ID,而不是名称

    例如:

    image-20220720092658636

    3. 数据模型

    Nacos在经过阿里内部多年生产经验后提炼出的数据模型,则是一种服务-集群-实例的三层模型,这样基本可以满足服务在所有场景下的数据存储和管理。

    nacos服务发现的数据模型如下:

    • 服务:对外提供的软件功能,通过网络访问预定义的接口。

    • 服务名 :服务提供的标识,通过该标识可以唯一确定要访问的服务。

    • 实例:提供一个或多个服务的具有可访问网络地址(IP:Port)的进程,启动一个服务,就产生了一个服务实例。

    • 元信息 :Nacos数据(如配置和服务)描述信息,如服务版本、权重、容灾策略、负载均衡策略、鉴权配置、各种自定义标签 (label),从作用范围来看,分为服务级别的元信息、集群的元信息及实例的元信息。

    • 集群服务实例的集合,服务实例组成一个默认集群, 集群可以被进一步按需求划分,划分的单位可以是虚拟集群,相同集群下的实例才能相互感知。

    通过数据模型可知: 应用通过Namespace、Service、Cluster(DEFAULT)的配置,描述了该服务向哪个环境(如开发环境)的哪个集群

    注册实例。

    如下图所示层级进行配置:

    image-20220720092820227

    具体的应用实例如图下所示:

    假如公司的一些实例分布于全国各地的不同机房,例如:

    xxx.xxx.xxx.xxx:8081,在上海机房
    xxx.xxx.xxx.xxx:8082,在上海机房
    xxx.xxx.xxx.xxx:8083,在杭州机房

    Nacos就将同一机房内的实例 划分为一个集群。也就是说,userService是服务名称,一个服务可以由多个服务集群组成,如杭州集群、上海集群,而每个集群下又可以有多个服务实例,形成分级模型,如图:

    微服务互相访问时,应该尽可能访问 同一集群 下的服务实例,因为处于同一集群下的本地访问速度更快。当本集群内不可用时,才会访问其它集群。例如:

    杭州机房内的orderService应该优先访问同机房的userService,若杭州机房内的的userService服务都不可用了,才会调用上海机房内的userService。

    img

    具体的代码应用实例如图下所示:

    指定namespace的id:f5eec3c1-4f05-40cd-964a-c8d44f342ab4(注意根据自己环境设置namespace的id)

    指定集群名称:DEFAULT表示默认集群,可不填写

    spring:
      application:
        name: transaction‐service
      cloud:
        nacos:
          discovery:
            server-addr: 127.0.0.1:8848
            namespace: f5eec3c1-4f05-40cd-964a-c8d44f342ab4
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    注意: 集群作为实例的隔离,相同集群的实例才能相互感知。

    注意: namespace、cluster-name若不填写都将采取默认值,namespace的默认是public命名空间, cluster-name的默认值为DEFAULT集群。

  • 相关阅读:
    每个开发人员都应该学习的 10 种算法
    eBay限制要求有哪些?如何提升产品权重:掌握自养号测评技巧
    Python利用LCU接口实现LOL(英雄联盟)一键载入自定义天赋(符文)
    C指针笔记
    【面试经典150 | 栈】最小栈
    每日一题——输入某年某月某日,判断是这一年的第几天
    JS数组中删除另一个数组
    如何在 Windows 中安装 PostgreSQL?
    刷题记录:牛客NC17193简单瞎搞题
    安全防御实验2
  • 原文地址:https://blog.csdn.net/weixin_45525272/article/details/125885918