seneca | 您所在的位置:网站首页 › seneca微服务 › seneca |
将您的Seneca.js微服务融合在一起 – 不再需要服务发现! seneca-mesh主要维护者: 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 实验室设备网 版权所有 |