Vert.x 服务发现

翻译: 白石(https://github.com/wjw465150/Vert.x-Core-Manual)

该组件提供了发布和发现各种资源的基础设施,例如服务代理、HTTP 端点、数据源……这些资源称为servicesservice 是一个可发现的功能。 它可以通过其类型、元数据和位置来限定。 因此,service可以是数据库、服务代理、HTTP 端点和任何其他您可以想象的资源,只要您可以描述、发现并与之交互。 它不必是 vert.x 实体,但可以是任何东西。 每个服务都由一个Record 来描述。

服务发现实现了面向服务计算中定义的交互。 并且在某种程度上,还提供了动态的面向服务的计算交互。 因此,应用程序可以对服务的到达和离开做出反应。

服务提供商可以:

  • 发布服务记录
  • 取消发布已发布的记录
  • 更新已发布服务的状态(关闭、停止服务……)

服务消费者可以:

  • 查找服务
  • 绑定到选定的服务(它得到一个ServiceReference)并使用它
  • 一旦用户使用完服务,就释放它
  • 收听服务的到达、离开和修改。

消费者将

  1. 查找与他们需要匹配的服务记录,
  2. 检索提供访问服务的ServiceReference
  3. 获得访问服务的服务对象,
  4. 一旦完成释放服务对象。

这个过程可以通过使用“服务类型”来简化,如果你知道它是哪种类型,你可以直接检索服务对象(JDBC客户端,Http客户端……)。

如上所述,提供者和消费者共享的核心信息是records

提供者和使用者必须创建他们自己的ServiceDiscovery实例。这些实例在后台协作(分布式结构),以保持服务集同步。

服务发现支持从其他发现技术导入和导出服务的桥梁。

使用服务发现

要使用 Vert.x 服务发现,请将以下依赖项添加到构建描述符的 dependencies 部分:

  • Maven (在你的 pom.xml):
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-service-discovery</artifactId>
<version>4.3.0</version>
</dependency>
  • Gradle (在你的 build.gradle):
compile 'io.vertx:vertx-service-discovery:4.3.0'

整体概念

发现机制基于本节解释的几个概念。

服务记录

服务 Record 是一个描述由服务提供者发布的服务的对象。它包含一个名称、一些元数据、一个位置对象(描述服务在哪里)。这条记录是提供者(已经发布了它)和使用者(在执行查找时检索它)共享的唯一对象。

元数据甚至位置格式取决于 服务类型。

记录在提供者准备使用时发布,在服务提供者停止时撤销。

服务提供者和发布者

服务提供者是提供服务的实体。发布者负责发布描述提供者的记录。它可以是单个实体(提供者发布自身),也可以是不同的实体。

服务消费者

服务消费者在服务发现中搜索服务。 每次查找都会检索 0..nRecord。 从这些记录中,消费者可以检索 ServiceReference ,代表消费者和提供者之间的绑定。 此引用允许消费者检索服务对象(以使用服务)并释放服务。

释放服务引用以清理对象和更新服务使用是很重要的。

服务对象

服务对象是提供对服务的访问权限的对象。 它可以以各种形式出现,例如代理、客户端,甚至对于某些服务类型可能不存在。 服务对象的性质取决于服务类型。

请注意,由于 Vert.x 的多语言特性,如果您从 Java、Groovy 或其他语言检索服务对象,它可能会有所不同。

服务类型

服务只是资源,有很多不同种类的服务。 它们可以是功能服务、数据库、REST API 等。 Vert.x 服务发现具有服务类型的概念来处理这种异构性。 每种类型定义:

  • 服务的位置(URI、事件总线地址、IP / DNS…) - location
  • 服务对象的性质(服务代理、HTTP 客户端、消息消费者……) - client

某些服务类型由服务发现组件实现和提供,但您可以添加自己的。

服务事件

每次发布或撤回服务提供者时,都会在事件总线上触发一个事件。 此事件包含已修改的记录。

此外,为了跟踪谁在使用谁,每次使用 getReference 检索引用或使用 release 释放引用时,都会在事件总线上发出事件以跟踪服务使用情况。

以下是有关这些事件的更多详细信息。

后端

服务发现使用 Vert.x 分布式数据结构来存储记录。 因此,集群的所有成员都可以访问所有记录。 这是默认的后端实现。 您可以通过实现 ServiceDiscoveryBackend SPI 来实现自己的。 例如,我们提供了一个基于 Redis 的实现。

请注意,发现不需要 Vert.x 集群。 在单节点模式下,结构是本地的。 它可以用 ServiceImporter 填充。 从 3.5.0 开始,即使在集群模式下,您也可以通过将系统属性 vertx-service-discovery-backend-local 设置为 true(或环境变量 VERTX-SERVICE-DISCOVERY-BACKEND-LOCALtrue)。

创建服务发现实例

发布者和消费者必须创建自己的ServiceDiscovery实例才能使用发现基础设施:

ServiceDiscovery discovery = ServiceDiscovery.create(vertx);// Customize the configuration
discovery = ServiceDiscovery.create(vertx,new ServiceDiscoveryOptions().setAnnounceAddress("service-announce").setName("my-name"));// Do something...discovery.close();

默认情况下,通知地址(发送服务事件的事件总线地址是:vertx.discovery.announce)。您还可以配置用于服务使用的名称(请参阅有关服务使用的部分)。

当您不再需要服务发现对象时,不要忘记关闭它。 它关闭您已配置的不同发现导入器和导出器并释放服务引用。

Vert.x 服务发现 中文版相关推荐

  1. Eureka 注册中心/服务发现框架

    Eureka 注册中心/服务发现框架 Eureka注册中心/服务发现框架 如何使用构建 Eureka Server ? 加入依赖(此处以Maven为例) 创建Eureka Server 主运行类 单机 ...

  2. android 提供服务,GitHub - FamliarMan/AndroidServiceProvider: 为模块化提供的一个服务发现库...

    AndroidServiceProvider是为了解决模块化过程中各模块服务统一获取的难题而产生的,具体情况请参照这篇文章 Android模块化中的服务发现机制 注意混淆 这里特别强调,所有注册的类都 ...

  3. php etcd 服务发现,confd+etcd+nginx 实现简单服务发现

    一. 项目背景 随着微服务的兴起,大量接口服务化.当新的微服务加入或微服务的信息发生变更时,服务方如何通知周边系统.使用方如何知道这些变更呢? 这时就需要服务的注册配置和发现功能. 服务注册配置--存 ...

  4. spring cloud服务发现注解之@EnableDiscoveryClient与@EnableEurekaClient

    在使用服务发现的时候提到了两种注解,一种为@EnableDiscoveryClient,一种为@EnableEurekaClient,用法上基本一致,今天就来讲下两者,下文是从stackoverflo ...

  5. 服务发现对比:Zookeeper vs. etcd vs. Consul

    欢迎关注方志朋的博客,回复"666"获面试宝典 服务发现工具 手动配置 ZooKeeper ETCD Consul 结论 我们拥有的服务越多,如果我们使用预定义的端口,就会发生冲突 ...

  6. 干掉 ZooKeeper,阿里为什么不用 ZK 做服务发现?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源 | https://urlify.cn/fIjYVb 站在未 ...

  7. 一文详解 Kubernetes 中的服务发现,运维请收藏

    K8S 服务发现之旅 Kubernetes 服务发现是一个经常让我产生困惑的主题之一.本文分为两个部分: 网络方面的背景知识 深入了解 Kubernetes 服务发现 要了解服务发现,首先要了解背后的 ...

  8. 浅谈 Kubernetes 中的服务发现

    原文:https://nigelpoulton.com/blog/f/demystifying-kubernetes-service-discovery Kubernetes 服务发现是一个经常让我产 ...

  9. 干掉 ZooKeeper?阿里为什么不用 ZK 做服务发现?

    -     前言    - 站在未来的路口,回望历史的迷途,常常会很有意思,因为我们会不经意地兴起疯狂的念头,例如如果当年某事提前发生了,而另外一件事又没有发生会怎样?一如当年的奥匈帝国皇位继承人斐迪 ...

最新文章

  1. Java序列化技术与Protobuff
  2. Apache+Tomcat配置方法
  3. 使用ansible 批量分发SSH Key
  4. 前端学习(2956):项目中组件的本地注册
  5. 如何使用社会化媒体网络建立个人品牌(国外篇)
  6. python 动态编译代码_编译Python代码以使用Cython静态链接可执行文...
  7. java mongo忽略大小写_Java Spring Mongo排序忽略大小写问题
  8. Kronos Research推出结合WOO质押机制的新资管产品规模已达1500万美元
  9. 做游戏,学编程(C语言) 21 台球
  10. python 怎么注释_python的代码怎么写注释
  11. # 一点毕设小感悟(SnowNLP+可视化分析)
  12. 浅谈下对volatile的理解
  13. python机器学习教程_从零开始掌握Python机器学习:十四步教程
  14. qq音乐无损下载php源码,QQ音乐无损歌曲地址分析以及多平台源码
  15. pyecharts动态图表嵌入ppt
  16. python抬笔_『怎样在python里让海龟画图抬笔落笔?』
  17. 智商黑洞(门萨Mensa测试)8
  18. video.js视频高度自适应解决方法
  19. fiddle无法抓包小程序解答
  20. python之旅六【第六篇】模块

热门文章

  1. 宝宝的成长脚印10/23
  2. MOTOROLA E6 内核开发手册
  3. 50岁的哆啦A梦撞上63岁的卡西欧,数据中台告诉你火花有多大
  4. 解决第三方邮箱APP登陆QQ、163邮箱无法验证账户名或密码的问题(IOS、MacOS、Windows、Android)
  5. 不用找,你想要的医疗化工海外PPT模板素材都在这里
  6. linux0.12内核---关于内存寻址与4k边界对齐
  7. 逾期用户画像及不良贷款率分析
  8. 不高清,看个球?EGS(弹性GPU服务)助力世界杯高清直播。
  9. OpenCV霍夫变换识别圆
  10. 越小越好: Q8-Chat,在英特尔至强 CPU 上体验高效的生成式 AI