hydra-microservice 中文手册(中篇)

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
日志服务 SLS,月写入数据量 50GB 1个月
简介: hydra-microservice 中文手册(中篇)

Core



Hydra(core) 是为 Hydra 项目提供动力的 NPM 包。如果您正在使用 ExpressJS 构建您的服务, 您应该检查看 Hydra-Express package 包, 它是专门为利用 ExpressJS 的底层功能而设计的。


本节介绍了核心 Hydra 模块,该模块旨在使微服务的构建和/或使非服务(non-service)应用程序能够发现和利用微服务。因此,Hydra 在构建分布式应用程序时可帮助解决各种问题。


虽然 Hydra 是为 NodeJS 实现的,但它支持的功能也可以在其他平台上实现。

核心服务依赖于共享的 Redis 实例或集群,比如 Amazon 的 ElasticCache


  • 要了解更多关于 Redis 的信息,请查看我们的快速入门教程 并访问 Redis.io

作为一个 Node module,Hydra 提供了嵌入式(drop-in)功能,旨在解决以下微服务问题:

  • 服务注册(Service Registration:允许服务在上线时注册自己并发布它们的 HTTP API 路由。
  • API 可路由性(API Routability:允许将API调用路由到微服务。
  • 消息传递通信(Messaging Communication:通过发布和订阅通道以及消息队列进行的服务间通信。
  • 服务负载平衡(Service Load Balancing:基于可用的(现有的)微服务实例自动平衡请求。
  • 服务发现(Service Discovery:在不需要硬编码其IP地址和端口信息的情况下定位服务。
  • 运行状况报告(Health Reporting:自动运行状况检查报告,用于回答以下问题:应用程序是否健康?它运作正常吗?
  • 存在状态报告(Presence Reporting:服务实例实际可用吗?


在本文档中,我们将引用服务(services)和服务实例(service instances)。服务实例和服务节点指的是同一件事。服务只是赋予一个或多个服务实例的名称,将其视为服务的一类。例如,我们可能有一个服务来处理图像大小调整,而我们可以简单地调用该服务 image-resizer。在我们的云基础架构中,为了响应高需求,我们可能会运行三个 image-resizer 服务实例。每个实例都是服务实例或节点。


在 Hydra 中,服务实例仅仅是使用 Hydra 处理微服务问题的过程。


安装和初始化 Hydra



要从另一个项目中使用 Hydra


$ npm install hydra


导入 Hydra


const hydra = require('hydra');


初始化


导入时,会加载 Hydra 模块,但必须先将其初始化才能使用。


hydra.init(initObject);


初始化对象包含以下字段:


{
  serviceName: 'hydramcp',
  serviceDescription: 'Hydra Master Control Program',
  serviceIP: '',
  servicePort: 0,
  serviceType: 'mcp',
  redis: {
    host: '127.0.0.1',
    port: 6379,
    db: 0
  }
}


所有显示的字段都是必需的。但是,如果您的应用程序不打算作为服务运行,那么下面的值可以为空并将被忽略。如果您不打算使用这些值,那么最好将它们空白。但是,此时 serviceName 不能为空。


serviceDescription: '',
serviceDNS: '',
serviceIP: '',
servicePort: 0,
serviceType: '',


重要:


  • Hydra 在一个服务中使用时,如果 serviceIP 等于一个空字符串(''),那么将使用该机器的本地IP,否则需要一个四段IP地址(52.9.201.160)。如果 servicePort 等于 0,那么 Hydra 将选择一个随机端口。在需要微服务使用特定端口地址的情况下设置 servicePort
  • hydra.serviceDNS 条目允许您指定服务 DNS 而不是 IP 地址。

这使您可以将服务放置在外部负载平衡器(例如 NginxDocker Swarm 的内部 DNS)之后。存在值时,serviceDNS 条目将忽略 serviceIP 字段-即使它包含一个值。


  • 对于集群中的所有网络服务,必须将 hydra.redis.dbvalue 设置为相同的值。

不这样做会影响服务的可发现性和监视。在 Hydra 中未对 redis 数据库值进行硬编码的原因是, 不能保证 Redis 实例上存在的数据库数量在提供商之间是相同的。因此,最终服务实现者(您?)需要设置此值的灵活性,从而承担责任。

在一个实际的生产系统中 Hydra JSON 可能被嵌入到一个更大的配置文件中,比如 properties.js 文件:


exports.value = {
  appServiceName: 'hydramcp',
  cluster: false,
  environment: 'development',
  maxSockets: 500,
  logPath: '',
  hydra: {
    serviceName: 'hydramcp',
    serviceDescription: 'Hydra Master Control Program',
    serviceVersion: '1.0.0',
    serviceIP: '',
    serviceDNS: '',
    servicePort: 0,
    serviceType: 'mcp',
    serviceWorker: false,
    redis: {
      host: '127.0.0.1',
      port: 6379,
      db: 0
    }
  }
};


当使用这种方法时,只需在初始化过程中传递 hydra 分支:


hydra.init(config.hydra);


如果要在要初始化文件的同一文件中使用 hydra, 则可以先等待 hydra.init() 返回的 promise,然后再使用其他 hydra 方法。


// index.js
hydra.init({...})
  .then(...);


但是,如果从单独的文件导入 hydra 实例,则需要调用 hydra.ready() 方法。

hydra.ready() 返回与 hydra.init() 完全相同的 promise,尽管这样做无需重新初始化 hydra 实例。


// my-hydra.js
import hydra from 'hydra';
hydra.init({...});
export default hydra;


// service.js
import hydra from './my-hydra.js';
hydra.ready().then(...);


调用 hydra.init() 之后,可以随时使用 hydra.ready() 来等待初始化完成。


Redis 配置



除了 hostportdb,你可以通过 node redis client createClient 方法支持的任何选项。


retry_strategy 是一个例外,它在 redis.createClient 中带有一个函数参数。 Hydra 提供了 retry_strategy(hydra._redisRetryStrategy),它是通过hydra.redis.retry_strategy 选项配置的,而不是直接传递给 redis.createClient


redis: {
  host: "127.0.0.1",
  port: 6379,
  db: 15,
  retry_strategy: {
    maxReconnectionPeriod: 15,
    maxDelayBetweenReconnections: 5
  }
}


您还可以选择使用 url 参数代替 hostportdbpassword。有关详细信息,请参见 IANA registration。以下等效于上面的 host/port/db


redis: {
  url: 'redis://127.0.0.1:6379/15'
}


注意:如果你传入一些 hostportdbpassword 的组合,url 中的值会被更具体的条目覆盖:


redis: {
  url: 'redis://127.0.0.1:6379/15',
  db: 10
}


这将连接到数据库 10,而不是数据库 15


通过 unix socket 连接


{
   "redis": {
      "path": "/tmp/redis.sock"
   }
}


Hydra 模式



Hydra 可配置为两种使用模式之一:

  • 服务模式(Service mode)—— 充当服务和其他服务的消费者。
  • 消费者模式(Consumer mode)—— 只能充当服务消费者,而不能成为服务。


服务模式(Service mode


要在 Service mode 下使用 Hydra,您必须先使用以下方式注册:


hydra.registerService();


注意:如果您的应用程序不需要成为服务,那么您就不需要执行此注册。

注册服务后,hydra 会在生成日志事件或消息到达时发出 NodeJS 事件。您可以按以下方式监听这些事件:


hydra.registerService();
hydra.on('log', function(entry) {});
hydra.on('message', function(message) {});


消费者模式(Consumer mode



如果消费者模式应用程序调用与服务模式相关的方法, 将导致异常(exception)或 promise 失败。每个调用都在本文档的最后被清楚地记录下来,以帮助避免误用。但是始终要确保您的应用程序经过了充分的测试。


Service Discovery(服务发现)



服务(Service)和消费者(Consumer)模式应用程序都可以发现其他服务。但是请记住,消费者模式应用程序本身无法被发现。只能发现注册的服务。

使用 findService() 方法发现服务(Services)。 findService() 方法接受服务名称,并返回一个 promise, 该 promiseresolve 为服务信息对象;如果找不到该服务,则返回一个被拒绝的 promise


hydra.findService('imageprocessor')
  .then((service) => {
    console.log(service);
  })
  .catch((err) => {
    console.log('catch err', err);
  });


返回的服务对象可能如下所示:


{
  "serviceName": "imageprocessor",
  "processID": 25246,
  "registeredOn": "2016-03-26T18:26:31.334Z",
  "ip": "10.0.0.4",
  "port": 9001,
  "type": "image:processing"
}


然后,应用程序可以使用 ipport 信息来调用 imageprocessor 服务上的 API


Presence(存活状态)



仅仅因为可以找到服务并不意味着它当前已在线且处于活动状态。在不幸的情况下,所讨论的服务可能会失败和/或暂时不可用。


Hydra 提供了 getServicePresence() 方法来确定服务当前是否可用。如果可用,则返回这样的对象:


{
  "updatedOn": "2016-03-28T01:43:45.756Z"
}


如果不可用,则 getservicepresence() 返回一个被拒绝的 promise


健康检查(Health)与存活状态(Presence



Hydra 配置为服务模式(service mode)后, 它将自动在指定的 Redis 服务器中记录机器和应用程序级别的信息。此外,Hydra 还发送存活状态(Presence)信息。不幸的是,如果主机应用程序崩溃,那么 Hydra 自然会停止更新存活状态信息。

此外,Hydra 会维护一个内部日志,用于存储检测到的问题。我们可以将其视为黑匣子飞行记录器(flight recorder)。


尽管所有这些都是自动发生的, 但是您的应用程序可以使用 HydrasendToHealthLog() 方法来扩充存储的信息。您还可以使用 getServiceHealthLog() 方法检索日志。


记住,您还可以通过在服务注册期间注册日志事件侦听器,在这些日志条目发生时直接接收它们。

相关文章
|
Java 数据库
Springboot 根据数据库表自动生成实体类和Mapper,只需三步
Springboot 根据数据库表自动生成实体类和Mapper,只需三步
8012 2
Springboot 根据数据库表自动生成实体类和Mapper,只需三步
|
监控 Kubernetes Cloud Native
浅谈基于 OpenStack 和 k8s 建设云原生研发基础设施
建设公司云原生研发基础设施,为研发部门提供安全、可靠、高效的基础资源、数据存储服务、DevOps 流水线以及运维自动化服务等。
5207 4
浅谈基于 OpenStack 和 k8s 建设云原生研发基础设施
|
7月前
|
人工智能 自然语言处理 Cloud Native
Bolt.diy 评测方案:从部署到创意实践的全方位探索
Bolt.diy 是阿里云推出的低代码开发平台,基于函数计算(FC)与百炼大模型服务构建。它通过自然语言交互、全栈开发支持及快速云端部署,让开发者和非技术人员能轻松实现创意落地。本文详细解析了 Bolt.diy 的部署流程、功能实践与应用场景,并结合测试案例探讨其价值与优化方向。无论是在教育、企业内部工具定制还是个人兴趣开发中,Bolt.diy 均展现出高效便捷的优势,但复杂业务需求仍需传统工具补充。未来,随着大模型能力升级,Bolt.diy 将进一步推动 AI 辅助开发的发展。
|
存储 自然语言处理 Oracle
Oracle数据库字符集概述及修改方式
【8月更文挑战第15天】Oracle 数据库字符集定义了数据的编码方案,决定可存储的字符类型及其表示方式。主要作用包括数据存储、检索及跨系统传输时的正确表示。常见字符集如 AL32UTF8 支持多语言,而 WE8MSWIN1252 主用于西欧语言。修改字符集风险高,可能导致数据问题,需事先备份并评估兼容性。可通过 ALTER DATABASE 语句直接修改或采用导出-导入数据的方式进行。完成后应验证数据完整性。此操作复杂,须谨慎处理。
713 5
|
4月前
|
存储 安全 Linux
Proxmox VE 9.0 Beta - 开源虚拟化管理平台
Proxmox VE 9.0 Beta - 开源虚拟化管理平台
553 0
Proxmox VE 9.0 Beta - 开源虚拟化管理平台
|
Rust 前端开发 JavaScript
Tauri 开发实践 — Tauri 日志记录功能开发
本文介绍了如何为 Tauri 应用配置日志记录。Tauri 是一个利用 Web 技术构建桌面应用的框架。文章详细说明了如何在 Rust 和 JavaScript 代码中设置和集成日志记录,并控制日志输出。通过添加 `log` crate 和 Tauri 日志插件,可以轻松实现多平台日志记录,包括控制台输出、Webview 控制台和日志文件。文章还展示了如何调整日志级别以优化输出内容。配置完成后,日志记录功能将显著提升开发体验和程序稳定性。
687 1
Tauri 开发实践 — Tauri 日志记录功能开发
|
存储 Oracle 关系型数据库
【数据库-DB2】深入了解DB2 reorg
本文介绍了DB2数据库中reorg操作的重要性,旨在通过重组表数据来消除数据碎片、压缩信息并提高数据访问速度。reorg操作能够根据索引关键字重新排序数据,减少查询I/O次数,提升查询性能。文章详细讲解了reorg的操作步骤、适用场景及注意事项,强调了在执行reorg前后更新统计信息的必要性。
796 2
|
Java Android开发 UED
理解SurfaceFlinger在Android中的作用
理解SurfaceFlinger在Android中的作用
|
人工智能 Cloud Native 数据管理
媒体声音|重磅升级,阿里云发布首个“Data+AI”驱动的一站式多模数据平台
在2024云栖大会上,阿里云瑶池数据库发布了首个一站式多模数据管理平台DMS:OneMeta+OneOps。该平台由Data+AI驱动,兼容40余种数据源,实现跨云数据库、数据仓库、数据湖的统一数据治理,帮助用户高效提取和分析元数据,提升业务决策效率10倍。DMS已服务超10万企业客户,降低数据管理成本高达90%。
580 19
|
算法 安全 网络安全
网络安全&密码学—python中的各种加密算法
数据加密是一种保护数据安全的技术,通过将数据(明文)转换为不易被未经授权的人理解的形式(密文),以防止数据泄露、篡改或滥用。加密后的数据(密文)可以通过解密过程恢复成原始数据(明文)。数据加密的核心是密码学,它是研究密码系统或通信安全的一门学科,包括密码编码学和密码分析学。