服务注册中心简介

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

在微服务架构下,主要有三种角色:服务提供者(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. 如何基于Jupyter notebook搭建Spark集群开发环境

    摘要:本文介绍如何基于Jupyter notebook搭建Spark集群开发环境. 本文分享自华为云社区<基于Jupyter Notebook 搭建Spark集群开发环境>,作者:apr鹏 ...

  2. 解决VSCODE"因为在此系统上禁止运行脚本"报错

    在VSCODE中使用yarn,结果报错: 找了下原因,是因为PowerShell执行策略的问题. 解决方法:   以管理员身份运行vscode;  执行:get-ExecutionPolicy,显示R ...

  3. 3D渲染

    3d渲染的本质是在三维坐标系中绘制很三角形,用三角形拼成物体,然后投影到二维图像上,所以做渲染就是画好这些三角形;3d渲染输入的是很多三角形的3个顶点和属性,输出的是一张2d图.画好三角形要研究给三角 ...

  4. SpringBoot入门06-Thymeleaf显示作用域对象种的对象

    作用域对象request,session, servletContext中的数据在Thymeleaf中的显示都是相同的 作用域对象中的 List和Set的集合在html中的显示是相同的 作用域对象中的 ...

  5. java设计模式_工厂模式

    关于设计模式 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结,是一种设计思维,使用设计模式的目的:为了代码可重用性.让代码更容易被他人理解.保证 ...

  6. leetcode779 第k个语法符号。

    直接找规律. 第一行 0 第二行 01 第三行 0110 第四行 01101001 可以发现,第n行的数量比第n-1行多了一倍,并且前半部分是和第n-1行一样的,后半部分是前半部分"按位取反 ...

  7. 自动化运维利器Ansible要点汇总

    由于大部分互联网公司服务器环境复杂,线上线下环境.测试正式环境.分区环境.客户项目环境等造成每个应用都要重新部署,而且服务器数量少则几十台,多则千台,若手工一台台部署效率低下,且容易出错,不利后期运维 ...

  8. 初始HTML05

    HTML 表单控件属性 表单控件可设置以下标签属性 属性名 取值 type 设置控件类型 name 设置控件名称,最终与值一并发送给服务器 value 设置控件的值 placeholder 设置输入框 ...

  9. rocketmq优雅停机往事

    1 时间追溯到2018年12月的某一天夜晚,那天我正准备上线一个需求完就回家,刚点下发布按钮,告警就响起,我擦,难道回不了家了?看着报错量只有一两个,断定只是偶发,稳住不要慌. 把剩下的机器发完,又出 ...

  10. 生产环境全链路压测平台 Takin

    什么是Takin? Takin是基于Java的开源系统,可以在无业务代码侵入的情况下,嵌入到各个应用程序节点,实现生产环境的全链路性能测试,适用于复杂的微服务架构系统. Takin核心原理图 Taki ...