seneca 您所在的位置:网站首页 seneca微服务 seneca

seneca

2023-08-15 08:09| 来源: 网络整理| 查看: 265

塞内卡

将您的Seneca.js微服务融合在一起 – 不再需要服务发现!

seneca-mesh

npm 版本 构建状态 吉特

主要维护者: Richard Rodger 赞助商: nearForm

这个插件允许你使用自动网格连接 Seneca 微服务。它使用SWIM gossip 算法在微服务网络内自动发现服务。

要加入网络,服务所要做的就是联系网络中已有的其他服务。然后网络共享有关哪些服务响应哪些模式的信息。无需在任何地方配置单个服务的位置。

非常感谢 Rui Hu 出色的 游泳模块使这项工作顺利进行。

如果您正在使用此模块并需要帮助,您可以:

发布一个github问题, 推特给@senecajs, 在Gitter上询问。

如果您是 Seneca 的新手,请查看 senecajs.org。我们拥有从教程到示例应用程序的所有内容,可帮助您快速启动和运行。

塞内卡兼容性

支持 Seneca 3.x及以上版本。

安装

要安装,请使用 npm

npm install seneca-balance-clientnpm install seneca-mesh

这 seneca-mesh插件依赖于seneca-balance-client插件。

在你的代码中:

require('seneca')()  .use('mesh', { ... options ... })

使用 Windows? seneca-mesh使用一些本机模块,因此请确保 配置 msbuild。

快速示例

创建微服务。该服务将颜色名称转换为十六进制值。

// color-service.jsvar Seneca = require('seneca') Seneca()  // Uncomment to get detailed logs  // .test('print')    // provide an action for the format:hex pattern  .add('format:hex', function (msg, reply) {     // red is the only color supported!    var color = 'red' === msg.color ? '#FF0000' : '#FFFFFF'     reply({color: color})  })   // load the mesh plugin  .use('mesh', {     // this is a base node    isbase: true,     // this service will respond to the format:hex pattern    pin: 'format:hex'  })

使用以下命令运行服务(并保持运行):

$ node color-service.js

为服务创建一个客户端。这个客户端加入网状网络,执行一个动作,然后离开。

// color-client.jsvar Seneca = require('seneca') Seneca({log: 'test'})   // load the mesh plugin  .use('mesh')   // send a message out into the network  // the network will know where to send format:hex messages  .act({format: 'hex', color: 'red'}, function (err, out) {     // prints #FF0000    console.log(out.color)  })

使用以下命令在单独的终端中运行客户端:

$ node color-client.js

客户端使用网状网络找到服务。在这个简单的例子中,它color-service被配置为一个基本节点,这意味着它侦听预定义的本地 UDP 端口。客户端检查此端口上的基本节点。

请注意,客户端不需要有关服务位置的任何信息。

要加入网络,您确实需要知道基本节点的位置。加入后,您甚至不再需要基地,因为网络让您随时了解新服务。

要找到基节点, seneca-mesh通过配置、多播、服务注册和自定义方法为发现提供支持。基节点不用于服务发现。它们仅作为新节点加入网络的便捷方式。

在上面的示例中,默认使用 UDP 多播。在生产中,您需要选择适合您网络的发现机制。

该实施例证明更复杂的网络配置文件夹中包含的代码对于本例,和其他的方案:

local-dev-mesh:本地开发,包括 Web 服务 API。 多播发现:多播允许基本节点相互发现 – 零配置! consul-discovery:当多播不可用时,使用服务注册表发现基本节点。

作为对基于网格的配置的对比, local-dev示例提醒我们传统服务位置的负担。

开发监控

您可以使用以下monitor选项监控本地开发网络的状态 :

// monitor.js Seneca({tag: 'rgb', log: 'silent'}) .use('mesh', { monitor: true })

这会将已知服务的表打印到终端。使用密钥 Ctrl-C退出,并p修剪失败的服务。在多播发现示例的情况下 ,监视器将输出如下内容:

部署

Seneca-mesh 已经在以下部署配置下进行了测试:

使用localhost(环回网络接口)的单机开发机 多台机器使用 VirtualBox(启用主机网络) 使用主机网络的 Docker 容器 (–net=”host”) 使用覆盖网络的 Docker 群(Docker 不支持多播) 多个实例上的 Amazon Web Services(Amazon 不支持多播)

有关示例代码,请参阅test和test/docker文件夹。

另请参阅部署配置的完整系统示例。

从易于部署的角度来看,多播服务发现是最可取的,因为您不必做任何事情 – 基本节点相互发现,服务发现基本节点。不幸的是,底层网络通常不支持多播网络。

作为最佳实践部署模型,请考虑在每台机器上运行至少一个基本节点。这为加入网络的服务提供了相当多的冗余。

基地发现

一旦服务加入 SWIM 网络,它将找到所有其他服务。SWIM 为您解决了这个问题,这就是它如此出色的原因。

但是您仍然必须最初加入网络。您可以通过将新服务指向任何其他服务来实现这一点,它会“正常工作”。然而,在实践中,将提供引导功能的基本节点的概念作为其主要目的是有用的。然后问题简化为寻找基节点。

注意:并非所有的基本节点都需要存活——您可以提供一个基本节点列表,其中包含已关闭的节点。只要至少有一个节点启动,SWIM 无论如何都会继续。

Seneca-mesh 提供了以下策略:

定义:基本节点是预定义的,并通过配置或环境变量提供给服务。这并不比在您的系统中拥有其他类型的知名服务(例如数据库)更糟糕。通过遵循一致的方法,您可以动态提供节点列表 – 例如,使用 AWS CLI 列出 VPC 中的所有实例 ( aws ec2 describe-instances)。

custom:您可以提供一个自定义函数,该函数返回由您自己的自定义方法解析的碱基列表。

registry:从键值注册表(例如Consul )加载基础列表。此策略利用了 seneca-registry 插件集,因此您不仅可以使用consul,还可以使用etcd、 ZooKeeper等。

多播:基本节点通过 IP 多播广播它们的存在。新服务短暂地收听广播以获取基本节点列表,然后退出。这将广播流量保持在最低限度。注意:您需要为您的网络获取正确的广播地址 – 运行时间ifconfig -a!

猜测:如果基节点在本地运行,则服务可以通过在默认位置搜索来找到它:UDP 127.0.0.1:39999。如果您为要绑定的服务指定了不同的 IP,则还将检查该 IP。这是本地开发的常用模式。

这些策略按上面列出的顺序执行。默认情况下, seneca-mesh 如果当前策略未能产生任何基础(这是可配置的),则仅转移到下一个策略。

消息流

每个服务使用pin设置指定它关心的消息模式。为方便起见,您可以在选项的顶层使用pin,但更完整的形式是在listen选项中列出的一系列模式规范。

因此

seneca.use('mesh', {  pin: 'foo:bar'})

相当于:

seneca.use('mesh', {  listen: [    {pin: 'foo:bar'}  ]})

listen数组中的每个条目指定给定模式的监听模型。特别是,您可以指定监听模型:

消费:假设消息来自工作队列;消费消息,并生成回复。这是默认设置。 观察:假设消息发布到多个服务;不生成回复

例如,考虑一个生成 HTML 内容的微服务。该get:content消息需要包含 HTML 内容的回复,并且仅用于服务的一个实例,以避免冗余工作。该clear:cache消息被发布到该服务的所有实例表明,对于HTML内容的基础数据已更改,且内容必须再生下一个 get:content消息。定义网格图案如下:

seneca.use('mesh', {  listen: [    {pin: 'get:content'}, // model:consume; the default    {pin: 'clear:cache', model:'observe'}  ]})

Seneca-mesh默认使用 HTTP 传输。要使用其他传输,您可以向 listen 数组的每个条目添加其他选项。这些选项被传递到传输系统,就像您seneca.listen直接调用一样:

seneca.use('redis-transport')seneca.use('mesh', {  listen: [    {pin: 'get:content'}, // model:consume; the default    {pin: 'clear:cache', model:'observe', type:'redis'}  ]}) 消息模式 role:mesh,get:members

您可以将此消息发送到任何节点,响应将是网络中所有已知模式的列表。

这是一个有用的小服务,可让您通过 REPL 向网络提交消息:

require('seneca')({  tag: 'repl',  log: { level: 'none' }})  .use('mesh')  .repl({    port: 10001,    alias: {      m: 'role:mesh,get:members'    }  })

在命令行上:

# telnet localhost 10001 

别名m可以用作快捷方式。

选项

这 seneca-mesh插件接受以下选项集。加载插件时指定这些:

require('seneca')    .use('mesh', {      // options go here    })

选项是:

isbase:使这个节点成为基节点。默认值:假。

bases:一组预定义的基本节点。以以下格式指定字符串:’IP:PORT’。默认: []。

pin : 此服务将响应的操作模式。默认值:空

listen:此服务将响应的一系列操作模式。默认值:空

stop:一旦发现策略提供了建议节点的列表,基本节点发现就会停止。默认值:真

发现:定义基本节点发现选项:

定义:使用定义的基本节点,通过bases 选项指定。

active : 激活这个发现策略。默认值:真

custom:提供一个带有签名的函数,该函数function (seneca, options, bases, next)返回一组基本节点。有关single-custom示例,请参见单元测试。

active : 激活这个发现策略。默认值:真

find : 自定义函数

registry:使用role:registry模式加载基本节点列表。设置为 false 以禁用。默认是一组子选项 – 有关详细信息,请参阅代码。

active : 激活这个发现策略。默认值:真

多播:基本节点通过 IP 多播广播它们的存在。新服务短暂地收听广播以获取基本节点列表,然后退出。这将广播流量保持在最低限度。注意:您需要为您的网络获取正确的广播地址 – 运行时间ifconfig -a!

active : 激活这个发现策略。默认值:真

address:用于多播的网络接口的广播地址。

猜测:假设基地在同一台主机上,猜测基地的位置。默认值:真。

active : 激活这个发现策略。默认值:真 完整的系统

您可以查看这些示例项目的源代码以查看 seneca-mesh 的运行情况:

NodeZoo直播系统 NodeZoo Workshop,迭代 5 ramanajun.io 推特克隆 测试

要运行测试,请使用 npm:

npm run test 贡献

该Seneca.js组织鼓励开放和安全的参与。

行为守则

如果您觉得可以以任何方式提供帮助,无论是文档、示例、额外测试还是新功能,请与我们联系。

执照

版权所有 (c) 2015-2016,Richard Rodger 和其他贡献者。根据麻省理工学院许可。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有