服务注册中心原理

在分布式系统里的注册中心。原理是将部署服务的机器地址记录到注册中心,服务消费者在有需求的时候,只需要查询注册中心,输入提供的服务名,就可以得到地址,从而发起调用。

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

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

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

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

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

提示

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

服务路由

在lms框架中,服务提供者将会以服务路由为单位向服务注册中心注册路由信息。每一个被实现了的应用服务接口方法(服务条目)都会生成一条服务路由

服务路由的格式如下:

{
"serviceDescriptor":{
"id":"IAnotherApplication_IAnotherAppService_DeleteTwo_name",
"serviceProtocol":0,
"metadatas":{ }
},
"addressDescriptors":[
{
"address":"172.19.16.1",
"port":2202,
"serviceProtocol":0
}
],
"timeStamp":1623254897
}

服务路由主要由三部分组成,分别为:服务描述符(serviceDescriptor)地址描述符(addressDescriptors)时间戳(timeStamp)

服务描述符(serviceDescriptor)

每一个服务条目对应生成一条服务路由,服务路由通过服务描述符标识其唯一性。服务描述符由如下三部分组成:

字段 说明 备注
id 服务路由(描述符)Id 具有唯一性; 生成规则:通过服务条目对应的方法的完全限定名 + 参数名
serviceProtocol 服务通信协议 rpc通信框架中,采用的通信协议
metadatas 其他元数据 可以为服务路由写入(k,v)格式的元数据

注意

    1. 在一个微服务集群中,服务路由具有唯一性。也就是说,不允许在同一个微服务集群中, 不同微服务应用中不允许出现两个一模一样的方法(应用服务接口的完全限定名和方法名、参数名一致);

地址描述符(addressDescriptors)

地址描述符是一个数组,用于存放该服务路由(服务条目)存在的微服务应用实例的IP地址信息。

字段 说明 备注
address ip地址 微服务应用实例的IP地址
port rpc通信端口号 微服务应用通信中指定的rpc端口号
serviceProtocol 服务通信协议 rpc通信框架中,采用的通信协议

warning 注意

    1. 只有被实现的应用服务接口才会生成服务路由。
    1. 在微服务应用向服务注册中心注册路由时,首先会从服务注册中心获取最新的路由信息,在内存中更新该服务路由的服务路由地址(将该微服务应用的地址更新到地址描述符中),并将更新后的服务路由地址注册到服务注册中心,其他微服务应用根据从服务注册中心订阅到更新后的服务路由信息后,会将服务路由信息更新到微服务的内存中缓存起来。
    1. 为防止同一个微服务应用同时伸缩服务实例,在微服务应用获取或是注册服务路由的过程中会加分布式锁。

时间戳

timeStamp是指向服务注册中心更新服务路由的最后时间。

使用zookeeper作为服务注册中心

当前,lms支持使用zookeeper作为服务注册中心。

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

为方便以后扩展其他服务作为服务注册中心,您需要在为微服务应用指定配置时,显式的指定微服务注册中心类型为(registrycenter.registryCenterType):Zookeeper

为微服务配置服务注册中心如下所示:


registrycenter: // 服务注册中心配置节点
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 // 服务配置中心链接
registryCenterType: Zookeeper // 注册中心类型
connectionTimeout: 1000 // 链接超时时间(单位:ms)
sessionTimeout: 2000 // 会话超时时间(单位:ms)
operatingTimeout: 4000 // 操作超时时间(单位:ms)
routePath: /services/serviceroutes

除此之外,使用zookeeper作为服务注册中心,还必须要依赖ZookeeperModule模块。

注意

  • 默认启动服务模块(NormHostModuleWebHostModuleWsHostModule)均已经依赖ZookeeperModule模块。

开源地址与文档

github: https://github.com/liuhll/lms

gitee: https://gitee.com/liuhll2/lms

开发者文档: http://docs.lms-fk.com/

加入我们

qq群: 934306776

lms框架服务注册中心的更多相关文章

  1. silky微服务框架服务注册中心介绍

    目录 服务注册中心简介 服务元数据 主机名称(hostName) 服务列表(services) 终结点 时间戳 使用Zookeeper作为服务注册中心 使用Nacos作为服务注册中心 使用Consul ...

  2. 使用Spring Cloud搭建服务注册中心

    我们在之前的博客中已经介绍过阿里的分布式服务框架dubbo[Linux上安装Zookeeper以及一些注意事项][一个简单的案例带你入门Dubbo分布式框架],但是小伙伴们应该也看到了,阿里的dubb ...

  3. 服务注册中心之ZooKeeper系列(一)

    一.服务注册中心介绍 分布式服务框架部署在多台不同的机器上.例如服务A是订单相关的处理服务,服务B是订单的客户的相关信息服务.此时有个需求需要在服务A中获取订单客户的信息.如下图: 此时就面临以下几个 ...

  4. spring cloud(二)服务(注册)中心Eureka

    Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Service Registry和Service Discovery实现.也是springcloud体系中最重要最核心的组 ...

  5. springboot+cloud 学习(一)高可用服务注册中心(Eureka)

    先说说Eureka Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的.SpringClo ...

  6. 服务注册中心Eureka vs Zookeeper vs Consul

    前言 在现在云计算和大数据快速发展的今天,业务快速发展和变化.我们以前的单一应用难以应对这种快速的变化, 因此我们需要将以前单一的大应用不断进行差分,分成若干微小的应用或者服务,这就是微服务的思想.但 ...

  7. SpringCloud学习(3)——Eureka服务注册中心及服务发现

    Eureka概述: Eureka是Netflix的一个子模块, 也是核心模块之一.Eureka是一个基于REST的服务, 用于定位服务, 以实现云端中间层服务发现和故障转移.服务注册与发现对于微服务框 ...

  8. SpringCloud IDEA 教学 (一) Eureka的简介与服务注册中心的建立

    写在开头 SpringCloud进来成为业界排名靠前的微服务框架,最核心功能就是搭建微服务,并在此基础上衍生出一系列功能,如断路器(Hystrix).断路监控.管理配置.Zuul.OAuth2等功能. ...

  9. Spring cloud Eureka 服务治理(搭建服务注册中心)

    服务之类是微服务架构中最为核心的基础模块,它主要用来实现各个微服务实例的自动化注册和发现. 1. 服务注册 在服务治理框架中,通常会构建一个注册中心,每个服务单元向注册中心登记自己提供的服务,将主机. ...

随机推荐

  1. 设置vue全局配置

    全局配置 创建全局配置文件 vue.config.js 添加配置项

  2. 2017-11-20 崂应工作总结,含LTC3780模块分析,含运放原理

    学习了运算放大器的分类 运放的单点输入 差动模式 共模抑制输入模式 反相位比例运放 正相比例运放 电压跟随器 运放的放大比例计算 LTC3780模块的原理 因为: R19  这个电阻不确定他的接法 暂 ...

  3. java学习之旅2——set

    var set = Collections.synchronizedSet(new HashSet<Integer>()); 可以这样来获得一个同步的集合. 对于HashSet, for循 ...

  4. urllib2连接超时设置

    #urllib2设置超时 #获取网页的源码 def getHtml(url,i): if i > 2: return try: req = urllib2.Request(url) time.s ...

  5. Mysql索引创建及删除

    1.索引 MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度. 打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的My ...

  6. 人工智能训练云燧T10

    人工智能训练云燧T10 基于邃思芯片打造的面向云端数据中心的人工智能训练加速产品,具有高性能.通用性强.生态开放等优势,可广泛应用于互联网.金融.教育.医疗.工业及政务等人工智能训练场景. 超强算力 ...

  7. CVPR2020:三维点云无监督表示学习的全局局部双向推理

    CVPR2020:三维点云无监督表示学习的全局局部双向推理 Global-Local Bidirectional Reasoning for Unsupervised Representation L ...

  8. Jmeter(五十二) - 从入门到精通高级篇 - jmeter之跨线程组传递参数(详解教程)

    1.简介 之前分享的所有文章都是只有一个线程组,而且参数的传递也只在一个线程组中,那么如果需要在两个线程组中传递参数,我们怎么做呢?宏哥今天就给小伙伴或者童鞋们讲解一下,如何实现在线程组之间传递参数. ...

  9. Linkerd 2.10(Step by Step)—4. 如何配置外部 Prometheus 实例

    Linkerd 2.10 系列 快速上手 Linkerd v2 Service Mesh(服务网格) 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traefik2 ...

  10. 使用 Docker 部署 Node 应用

    容器将应用与环境打包整合,解决了应用外部依赖的痛点,打包后通过窗口可方便地部署到任意环境,用过就知道很香. 创建示例应用 以 NestJS 为例,先创建一个示例应用. $ npm i -g @nest ...