服务注册中心简介

在分布式系统中,服务注册中心的作用是将部署服务实例的机器地址以及其它元数据记录到注册中心,服务消费者在有需求的时候,通过查询注册中心,输入提供的服务名,获取到地址,从而发起调用。

在微服务架构下,主要有三种角色:服务提供者(RPC Server)服务消费者(RPC Client)服务注册中心(Registry),三者的交互关系请看下面这张图:

RPC Server 提供服务,在启动时,根据配置文件指定的服务注册中心配置信息,向 Registry 注册自身的服务路由,并向Registry定期发送心跳汇报存活状态。

RPC Client 调用服务,在启动时,根据配置文件指定的服务注册中心配置信息,向 Registry 订阅服务,把Registry返回的服务节点列表缓存在本地内存中,并与 RPC Sever 建立连接。

RPC Server 节点发生变更时,Registry会同步变更,RPC Client 感知后会刷新本地内存中缓存的服务节点列表。

RPC Client 从本地缓存的服务节点列表中,基于负载均衡算法选择一台 RPC Sever 发起调用。

::: tip 提示

  1. 对于一个微服务应用来说,在集群中,它既可以作为RPC Sever,也可能作为RPC Client,主要是看在rpc通信过程中,是提供服务的一方,还是调用服务的一方。

:::

当前, silky微服务框架支持使用 ZookeeperNacosConsul 作为服务注册中心,开发者可以选择熟悉的服务中间件作为服务注册中心。

服务元数据

在silky框架中,服务提供者向服务注册中心注册的数据被称为: 服务元数据 。服务元数据主要四部分组成:

  1. hostName : 用于描述服务提供者的名称,为构建主机的包名称
  2. services : 该服务提供者所提供的应用服务信息,是一个数组,包括:服务Id,服务名称,服务协议,服务条目,元数据等信息
  3. timeStamp : 更新服务元数据的时间戳
  4. endpoints : 该服务实例的终结点,是一个数组。不同服务注册中心注册服务实例的终结点不同

如果使用 Zookeeper 作为服务注册中心, 所有的服务元数据将会被维护到该主机所在节点下, 注册到 Zookeeper 服务注册中心的服务元数据如下:

{
"hostName":"DemoHost",
"services":[
{
"id":"Demo.Application.Contracts.System.ISystemAppService",
"serviceName":"SystemAppService",
"serviceProtocol":0,
"serviceEntries":[
{
"id":"Demo.Application.Contracts.System.ISystemAppService.GetInfo_Get",
"serviceId":"Demo.Application.Contracts.System.ISystemAppService",
"serviceName":"SystemAppService",
"method":"GetInfo",
"webApi":"api/system/demo/info",
"httpMethod":0,
"serviceProtocol":0,
"metadatas":{ },
"prohibitExtranet":false,
"isAllowAnonymous":true,
"isDistributeTransaction":false
}
],
"metadatas":{ }
}
],
"endpoints":[
{
"host":"172.26.144.1",
"port":2200,
"processorTime":2578.125,
"timeStamp":1636464575,
"serviceProtocol":0
}
],
"timeStamp":1636464576
}

如果服务注册中心是 Consul 或是 Nacos, 服务实例的终结点则会单独注册和维护, 服务元数据格式如下:

{
"hostName":"DemoHost",
"services":[
{
"id":"Demo.Application.Contracts.System.ISystemAppService",
"serviceName":"SystemAppService",
"serviceProtocol":0,
"serviceEntries":[
{
"id":"Demo.Application.Contracts.System.ISystemAppService.GetInfo_Get",
"serviceId":"Demo.Application.Contracts.System.ISystemAppService",
"serviceName":"SystemAppService",
"method":"GetInfo",
"webApi":"api/system/demo/info",
"httpMethod":0,
"serviceProtocol":0,
"metadatas":{ },
"prohibitExtranet":false,
"isAllowAnonymous":true,
"isDistributeTransaction":false
}
],
"metadatas":{ }
}
],
"timeStamp":1636464576
}

主机名称(hostName)

hostName 用于描述服务提供者的名称,在向服务注册中心注册服务的过程中,应用会判断服务注册中心是否存在该应用的服务元数据,如果不存在,则创建相应的节点,并添加相应的服务元数据;如果已经存在相应的服务节点,则会更新服务元数据,其他服务提供者的实例从服务注册中心获取到服务元数据,并更新本地内存的服务元数据。

服务列表(services)

该属性包含该应用所支持的服务列表,如果服务注册中心的服务列表被更新,其他服务实例也会从服务注册中心获取,并更新到本地内存。

服务列表包括:服务Id,服务名称,服务协议,服务条目,元数据等信息

字段 说明 备注
id 服务Id 具有唯一性;服务接口定义的完全限定名
serviceName 服务名称
serviceProtocol 服务通信协议 rpc通信框架中,采用的通信协议
serviceEntries 该服务支持的服务条目(即:应用服务定义的方法) 数据类型为数组
serviceEntries.id 服务条目Id 方法的完全限定名 + 参数名 + Http方法名
serviceEntries.serviceId 服务Id
serviceEntries.serviceName 服务名称
serviceEntries.method 服务条目对应的方法名称
serviceEntries.webApi 生成的webapi 地址 如果被禁止访问外网则为空
serviceEntries.httpMethod 生成的webapi的请求地址 如果被禁止访问外网则为空
serviceEntries.serviceProtocol rpc通信框架中,采用的通信协议
serviceEntries.metadatas 服务条目的元数据 可以为服务条目写入(k,v)格式的元数据
metadatas 服务的其他元数据 可以为服务写入(k,v)格式的元数据

::: warning 注意

  1. 在一个微服务集群中,服务条目具有唯一性。也就是说,不允许在同一个微服务集群中, 不同微服务应用中不允许出现两个一模一样的方法(应用服务接口的完全限定名和方法名、参数名一致);
  2. 只有被实现的应用服务才会被注册到服务注册中心。

    :::

终结点

endpoints 是用来描述该微服务的服务实例的地址信息。

一个服务实例可能存在多个终结点,如:使用webhost构建的微服务应用(存在web地址终结点和rpc终结点地址);构建支持websocket服务的微服务应用(存在websocket服务地址终结点和rpc终结点地址)。

使用不同的服务注册中心,注册终结点可能会做不同的处理。

  1. 如果使用 Zookeeper 作为服务注册中心, 服务实例的终结点将被更新到该服务提供者对应节点数据的 endpoints 属性,也就是说,endpoints将作为服务元数据的一个属性。
{
"hostName": "DemoHost",
"services": ["..."],
"timeStamp": 1636464576,
"endpoints":[
{
"host":"localhost",
"port":5000,
"processorTime":2984.375,
"timeStamp":1636464576,
"serviceProtocol":4
},
{
"host":"172.26.144.1",
"port":2200,
"processorTime":2578.125,
"timeStamp":1636464575,
"serviceProtocol":0
}
]
}
  1. 如果使用 Consul 作为服务注册中心, 服务实例将会被注册到 Services 节点,并且只会注册协议为TCP的终结点,服务实例的其他协议的将会以元数据的方式添加到元数据

  1. 如果使用 Nacos 作为服务注册中心, 服务将会被注册到服务列表节点,与使用 Consul 作为服务注册中心相同,只会注册协议为TCP的终结点,服务实例的其他协议的将会以元数据的方式添加到元数据

终结点的属性如下所述:

字段 说明 备注
host 对应的主机地址 微服务应用的Ip内网地址
port 端口号
processorTime CPU使使用率
timeStamp 注册时间戳
serviceProtocol 服务协议

时间戳

timeStamp是指向服务注册中心更新服务元数据的时间戳。

使用Zookeeper作为服务注册中心

silky支持使用 Zookeeper 作为服务注册中心。

silky支持为微服务集群配置多个 Zookeeper 服务注册中心,您只需要在配置服务注册中心的链接字符串registrycenter.connectionStrings中,使用分号;就可以指定微服务框架的多个服务注册中心。

使用 Zookeeper 作为服务注册中心需要在配置文件中,在registrycenter配置节点下,将服务注册中心的类型type设置为: Zookeeper,通过connectionStrings属性配置服务中心的链接。同时可以通过其他属性配置服务注册中心的链接属性。


registrycenter: // 服务注册中心配置节点
type: Zookeeper
connectionStrings: 127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183;127.0.0.1:2184,127.0.0.1:2185,127.0.0.1:2186 // 服务配置中心链接
connectionTimeout: 1000 // 链接超时时间(单位:ms)
sessionTimeout: 2000 // 会话超时时间(单位:ms)
operatingTimeout: 4000 // 操作超时时间(单位:ms)
routePath: /services/serviceroutes

一般地,使用 Zookeeper 作为服务注册中心我们只需要指定服务注册中心类型和链接字符串即可,其他属性(如链接超时时间、会话时间、操作超时时间、注册的路由地址等)均提供了缺省值。


registrycenter: // 服务注册中心配置节点
type: Zookeeper
connectionStrings: 127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183;127.0.0.1:2184,127.0.0.1:2185,127.0.0.1:2186 // 服务配置中心链接

silky框架提供了使用 docker-compose 来编排 Zookeeper 的 编排文件, 开发者在获取 silky源代码后,进入到 ./samples/docker-compose/infrastr 目录后,执行如下命令,就可以构建一个 Zookeeper 服务集群。

docker-compose -f docker-compose.zookeeper.yml up -d

使用Nacos作为服务注册中心

silky支持使用 Nacos 作为服务注册中心。

如果使用 Nacos 作为服务注册中心,需要将 registrycenter:type 配置设置为:Nacos,再加上 Nacos 的其他配置属性。开发者可以参考Nacos文档以及nacos-sdk-csharp 来熟悉 Nacos 的配置和使用。

使用 Nacos 作为服务注册中心的配置如下:

registrycenter:
type: Nacos
namespace: silky
serverAddresses:
- http://127.0.0.1:8848/
- http://127.0.0.1:8849/
- http://127.0.0.1:8850/
userName: nacos
password: nacos
groupName: DEFAULT_GROUP
clusterName: DEFAULT
registerEnabled: true
instanceEnabled: true
namingUseRpc: true

关于 Nacas服务的搭建可以参考Nacos Docker 快速开始。当然, silky框架也提供了使用 docker-compose 来编排 Nacos 服务的文件,开发者在获取源代码后,进入到 ./samples/docker-compose/infrastr 目录后,执行如下命令,就可以构建一个 Nacos 服务集群。

docker-compose -f docker-compose.nacos.cluster-hostname.yaml up -d

使用Consul作为服务注册中心

silky支持使用 Consul 作为服务注册中心。

如果使用 Consul 作为服务注册中心,需要将 registrycenter:type 配置设置为:Consul,再加上 Consul 的其他配置属性。开发者可以参考Consul文档以及consuldotnet 来熟悉 Consul 的配置和使用。

使用 Consul 作为服务注册中心的配置如下:

registrycenter:
type: Consul
address: http://127.0.0.1:8500
datacenter: dc1 # 缺省值为 dc1
token:"" # 如果consul服务设置了token,则需要配置token
waitTime: 1000 # 缺省值为空
heartBeatInterval: 10 # 缺省值为10,单位为秒

搭建consul服务集群的方式开发者可以参考。同样地,silky框架提供了使用 docker-compose 部署 Consul 集群的编排文件,开发者在获取源码后,进入到 ./samples/docker-compose/infrastr 目录后,执行如下命令,就可以构建一个 Consul 服务集群。

docker-compose -f docker-compose.consul.yaml up -d

开源地址

在线文档

在线示例

silky微服务框架服务注册中心介绍的更多相关文章

  1. Taurus.MVC 微服务框架 入门开发教程:项目集成:1、服务端:注册中心、网关(提供可运行程序下载)。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...

  2. 【微服务】- Nacos - 注册中心

    微服务 - 注册中心 - Nacos 生命不息,写作不止 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! 上一 ...

  3. Dubbo(三):深入理解Dubbo源码之如何将服务发布到注册中心

    一.前言 前面有说到Dubbo的服务发现机制,也就是SPI,那既然Dubbo内部实现了更加强大的服务发现机制,现在我们就来一起看看Dubbo在发现服务后需要做什么才能将服务注册到注册中心中. 二.Du ...

  4. SpringCloud微服务实战一:Spring Cloud Eureka 服务发现与注册中心(高可用实列为两个注册中心)

    微服务架构: 微服务架构的核心思想是,一个应用是由多个小的.相互独立的.微服务组成,这些服务运行在自己的进程中,开发和发布都没有依赖.不同服务通过一些轻量级交互机制来通信,例如 RPC.HTTP 等, ...

  5. Consul 注册中心介绍

    在 Spring Cloud 体系中,几乎每个角色都会有两个以上的产品提供选择,比如在注册中心有:Eureka.Consul.zookeeper.etcd 等:网关的产品有 Zuul.Spring C ...

  6. dubbo注册中心介绍

    作者:微子Lee链接:https://www.jianshu.com/p/2f4cfb6ed048 Dubbo的注册中心有好多种,包括Multicast.Zookeeper.Redis.Simple等 ...

  7. 微服务SpringCloud之注册中心Consul

    Consul 介绍 Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其它分布式服务注册与发现的方案,Consul 的方案更“一站式”,内置了服务注册与发 ...

  8. 服务注册发现与注册中心对比-Eureka,Consul,Zookeeper,Nacos对比

    服务注册发现与注册中心对比-Eureka,Consul,Zookeeper,Nacos对比 注册中心简介 流程和原理 基础流程 核心功能 1.Eureka.Consul.Zookeeper三者异同点 ...

  9. SpringCloud(一)之微服务核心组件Eureka(注册中心)的介绍和使用

    一 Eureka服务治理体系1.1 服务治理服务治理是微服务架构中最为核心和基础的模块,它主要用来实现各个微服务实例的自动化注册和发现. Spring Cloud Eureka是Spring Clou ...

随机推荐

  1. EF Core Sequence contains no elements

    一.在.Net Core中使用Ef的聚合函数报错: 类似函数: 1,使用FirstOrDefault() 来代替 First() 2.使用SingleOrDefault 来代替 Single 3.使用 ...

  2. Spring自动装配歧义性笔记

    Spring自动装配歧义性笔记 如果系统中存在两个都实现了同一接口的类,Spring在进行@Autowired自动装配的时候,会选择哪一个?如下: // 一下两个类均被标记为bean @Compone ...

  3. keeplived高可用配置

    前提:关闭防火墙,关闭selinux 1.主备配置 主 vim keeplived-lb01.confglobal_defs { router_id LVS_01 } vrrp_instance VI ...

  4. Jmeter使用问题记录

    Jmeter下载安装,设置中文,返回值乱码处理,下载接口测试 下载地址 解压后,在Jmeter的bin文件夹下启动 修改默认启动为中文简体:打开bin目录下的jmeter.properties文件,在 ...

  5. 前端必会的Javascript经典面试题

    这是前端最基础的问题,也是在面试中难倒无数同学的经典问题 01. Javascript 数据类型 Javascript 数据类型 = 基本类型 + 引用类型 ES6 之前 5 + 1 = 6 种 ES ...

  6. 洛谷3769[CH弱省胡策R2]TATT (KDTree)(四维LIS)

    真是一个自闭的题目(调了一个上午+大半个下午) 从\(WA\)到\(WA+TLE\)到\(TLE\)到\(AC\) 真的艰辛. 首先,这个题,我们可以考虑直接上四维KDTree来解决. 对于kdtre ...

  7. Redis 基础数据类型重温

    有一天你突然收到一条线上告警:Redis 内存使用率 85%.你吓坏了赶紧先进行扩容然后再去分析 big key.等你进行完这一系列操作之后老板叫你去复盘,期间你们聊到了业务的数据存储在 Redis ...

  8. windows右键菜单自动打包发布nuget,没有CI/CD一样方便!

    构建现代的 .Net 应用离不开 Nuget 的支持,而快速打包 Nuget 成了提高生产率的有效方法.没有CI/CD?来试试使用windows右键菜单吧 先看右键效果图 有时候我们可能没有CI/CD ...

  9. Unity——EasyTouch摇杆插件使用

    EasyTouch摇杆插件使用 Demo展示 双指缩放在电脑端无法掩饰,竖屏将就看看吧: 插件名叫EasyTouch,有需要给我留言,不想开仓库传了: 创建摇杆点这里: 初始化 On_Joystick ...

  10. 第四代富士X100F操作学习

    前言 本文为自己通过B站的UP主[阿布垃机手册]整理.原视频地址:[阿布垃机手册][布瞎BB]富士 X100F 相机外部按键 拍人像自己的设置 [X100F相机光圈大小支持F2到F16+Auto]光圈 ...