silky微服务框架服务注册中心介绍
服务注册中心简介
在分布式系统中,服务注册中心的作用是将部署服务实例的机器地址以及其它元数据记录到注册中心,服务消费者在有需求的时候,通过查询注册中心,输入提供的服务名,获取到地址,从而发起调用。
在微服务架构下,主要有三种角色:服务提供者(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 提示
- 对于一个微服务应用来说,在集群中,它既可以作为RPC Sever,也可能作为RPC Client,主要是看在rpc通信过程中,是提供服务的一方,还是调用服务的一方。
:::
当前, silky微服务框架支持使用 Zookeeper 、 Nacos 、 Consul 作为服务注册中心,开发者可以选择熟悉的服务中间件作为服务注册中心。
服务元数据
在silky框架中,服务提供者向服务注册中心注册的数据被称为: 服务元数据 。服务元数据主要四部分组成:
- hostName : 用于描述服务提供者的名称,为构建主机的包名称
- services : 该服务提供者所提供的应用服务信息,是一个数组,包括:服务Id,服务名称,服务协议,服务条目,元数据等信息
- timeStamp : 更新服务元数据的时间戳
- 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 注意
- 在一个微服务集群中,服务条目具有唯一性。也就是说,不允许在同一个微服务集群中, 不同微服务应用中不允许出现两个一模一样的方法(应用服务接口的完全限定名和方法名、参数名一致);
- 只有被实现的应用服务才会被注册到服务注册中心。
:::
终结点
endpoints 是用来描述该微服务的服务实例的地址信息。
一个服务实例可能存在多个终结点,如:使用webhost构建的微服务应用(存在web地址终结点和rpc终结点地址);构建支持websocket服务的微服务应用(存在websocket服务地址终结点和rpc终结点地址)。
使用不同的服务注册中心,注册终结点可能会做不同的处理。
- 如果使用 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
}
]
}
- 如果使用 Consul 作为服务注册中心, 服务实例将会被注册到 Services 节点,并且只会注册协议为
TCP的终结点,服务实例的其他协议的将会以元数据的方式添加到元数据


- 如果使用 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
开源地址
- github: https://github.com/liuhll/silky
- gitee: https://gitee.com/liuhll2/silky
在线文档
在线示例
silky微服务框架服务注册中心介绍的更多相关文章
- Taurus.MVC 微服务框架 入门开发教程:项目集成:1、服务端:注册中心、网关(提供可运行程序下载)。
系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...
- 【微服务】- Nacos - 注册中心
微服务 - 注册中心 - Nacos 生命不息,写作不止 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! 上一 ...
- Dubbo(三):深入理解Dubbo源码之如何将服务发布到注册中心
一.前言 前面有说到Dubbo的服务发现机制,也就是SPI,那既然Dubbo内部实现了更加强大的服务发现机制,现在我们就来一起看看Dubbo在发现服务后需要做什么才能将服务注册到注册中心中. 二.Du ...
- SpringCloud微服务实战一:Spring Cloud Eureka 服务发现与注册中心(高可用实列为两个注册中心)
微服务架构: 微服务架构的核心思想是,一个应用是由多个小的.相互独立的.微服务组成,这些服务运行在自己的进程中,开发和发布都没有依赖.不同服务通过一些轻量级交互机制来通信,例如 RPC.HTTP 等, ...
- Consul 注册中心介绍
在 Spring Cloud 体系中,几乎每个角色都会有两个以上的产品提供选择,比如在注册中心有:Eureka.Consul.zookeeper.etcd 等:网关的产品有 Zuul.Spring C ...
- dubbo注册中心介绍
作者:微子Lee链接:https://www.jianshu.com/p/2f4cfb6ed048 Dubbo的注册中心有好多种,包括Multicast.Zookeeper.Redis.Simple等 ...
- 微服务SpringCloud之注册中心Consul
Consul 介绍 Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其它分布式服务注册与发现的方案,Consul 的方案更“一站式”,内置了服务注册与发 ...
- 服务注册发现与注册中心对比-Eureka,Consul,Zookeeper,Nacos对比
服务注册发现与注册中心对比-Eureka,Consul,Zookeeper,Nacos对比 注册中心简介 流程和原理 基础流程 核心功能 1.Eureka.Consul.Zookeeper三者异同点 ...
- SpringCloud(一)之微服务核心组件Eureka(注册中心)的介绍和使用
一 Eureka服务治理体系1.1 服务治理服务治理是微服务架构中最为核心和基础的模块,它主要用来实现各个微服务实例的自动化注册和发现. Spring Cloud Eureka是Spring Clou ...
随机推荐
- LINUX系统入侵排查
当企业发生黑客入侵.系统崩溃或其它影响业务正常运行的安全事件时,急需第一时间进行处理,使企业的网络信息系统在最短时间内恢复正常工作,进一步查找入侵来源,还原入侵事故过程,同时给出解决方案与防范措施,为 ...
- ajax 中文参数乱码问题不一定是编码格式问题。
代码要修改用户的信息,写了三个ajax,第一个写完测试没有问题,后面俩逻辑一样的就直接复制粘贴了.到第二个ajax测试的时候发现中文会乱码 如下 $.ajax({//中文参数乱码 url: '/edi ...
- 基于python深度学习的apk风险预测脚本
基于python深度学习的apk风险预测脚本 为了有效判断安卓apk有无恶意操作,利用python脚本,通过解包apk文件,对其中xml文件进行特征提取,通过机器学习构建模型,预测位置的apk包是否有 ...
- pycharm输入代码后,没有补全提示
安装pycharm后,输入代码后,没有补全提示 首先检查是否关闭了代码提示,如下图,将红框中"Power Save Mode"前的勾去掉 第二步,如果在输入某些代码时还是没有补全提 ...
- HTTP状态码 详细解析汇总
一.状态码的类别: 类别 原因短语1XX Informational(信息性状态码) 接受的请求正在处理2XX Success(成功状态码) 请求正常处理完毕3XX Redirection(重定向状态 ...
- Kubernetes-Service介绍(三)-Ingress(含最新版安装踩坑实践)
前言 本篇是Kubernetes第十篇,大家一定要把环境搭建起来,看是解决不了问题的,必须实战. Kubernetes系列文章: Kubernetes介绍 Kubernetes环境搭建 Kuberne ...
- Install WSL
Install WSL Prerequisites You must be running Windows 10 version 2004 and higher (Build 19041 and hi ...
- 款阿里开源的 Java 诊断工具Arthas
Arthas是什么鬼? Arthas是一款阿里巴巴开源的 Java 线上诊断工具,功能非常强大,可以解决很多线上不方便解决的问题. Arthas诊断使用的是命令行交互模式,支持JDK6+,Linux. ...
- Spring Cloud Gateway GatewayFilter的使用
Spring Cloud Gateway GatewayFilter的使用 一.GatewayFilter的作用 二.Spring Cloud Gateway内置的 GatewayFilter 1.A ...
- 震惊,hzoi的考试竟然折磨简单,活到爆!
众所周知,hzoi的考试题非常"简单",那么究竟有多简单呢?最近,一位外国小哥开发出了hzoi的考试竟然折磨简单,活到爆!的方法,这究竟是怎么一回事呢?快和小编一起来看看吧- 满分 ...