hydra-microservice 中文手册(下篇)(二)

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

Hydra Methods(公开导出的方法)



以下是 Hydra 公开导出的方法。

作为一个模块,Hydra 被设计用来隐藏和阻止使用它的内部方法。这有助于确保 Hydra 在越来越多的服务中按照预期的方式运行。


下面的方法列表由以下各节组织。并非所有的应用程序和服务都需要使用列出的所有方法。


  • Setup - 模块设置和服务注册
  • Discovery - 服务发现
  • Presence - 存活状态检查
  • Health - 运行状况(健康)检查和日志记录
  • Messaging - 消息发送
  • Routing - 消息路由


Setup


init

用配置对象初始化 Hydra。


/**
 * @name init
 * @summary Initialize Hydra with config object.
 * @param {object} config - configuration object containing hydra specific keys/values
 * @return {object} promise - resolving if init success or rejecting
 otherwise
 */
init(config)


ready

返回在初始化完成时解析的 promise。


/**
* @name ready
* @summary returns promise that resolves when initialization is complete
* @return {object} promise - resolving if init success or rejecting otherwise
*/
ready()


shutdown

安全关闭 hydra


/**
* @name _shutdown
* @summary Shutdown hydra safely.
*/
shutdown()


registerService

将机器注册为 Hydra 实例。


/**
 * @name registerService
 * @summary Registers this machine as a Hydra instance.
 * @description This is an optional call as this module might just be used to monitor and query instances.
 * @return {object} promise - resolving if registration success or rejecting otherwise
 */
registerService()


Discovery

getServiceName

检索当前实例的服务名称。


/**
 * @name getServiceName
 * @summary Retrieves the service name of the current instance.
 * @throws Throws an error if this machine isn't a instance.
 * @return {string} serviceName - returns the service name.
 */
getServiceName()


getServiceNodes

检索服务列表(即使处于非活动状态)。


/**
 * @name getServiceNodes
 * @summary Retrieve a list of services even if inactive.
 * @return {promise} promise - returns a promise
 */
getServiceNodes()


getServices

检索可用实例服务的列表。


/**
 * @name getServices
 * @summary Retrieve a list of available instance services.
 * @return {promise} promise - returns a promise which resolves to an array of objects.
 */
getServices()


findService

查找服务。


/**
 * @name findService
 * @summary Find a service.
 * @param {string} name - service name - note service name is case insensitive
 * @return {promise} promise - which resolves with service
 */
findService(name)


Presence


getServicePresence

检索服务/实例的状态信息。


/**
 * @name getServicePresence
 * @summary Retrieve a service / instance's presence info.
 * @param {string} name - service name - note service name is case insensitive
 * @return {promise} promise - which resolves with service presence
 */
getServicePresence(name)


hasServicePresence

指示服务是否存在,表示该服务至少在一个节点中运行。


/**
 * @name hasServicePresence
 * @summary Indicate if a service has presence.
 * @description Indicates if a service has presence, meaning the 
 *              service is running in at least one node.
 * @param {string} name - service name - note service name is case insensitive
 * @return {promise} promise - which resolves with TRUE if presence is found, FALSE otherwise
*/
hasServicePresence(name)


getInstanceID

返回此进程的实例 id


/**
* @name getInstanceID
* @summary Return the instance id for this process
* @return {number} id - instanceID
*/
getInstanceID()


Health


sendToHealthLog

将消息记录到服务的运行状况日志队列中。


/**
 * @name sendToHealthLog
 * @summary Log a message to the service instance's health log queue.
 * @private
 * @throws Throws an error if this machine isn't a instance.
 * @param {string} type - type of message ('error', 'info', 'debug' or user defined)
 * @param {string} message - message to log
 */
sendToHealthLog(type, message)


getServiceHealthLog

获取此服务的运行状况日志。


/**
 * @name getServiceHealthLog
 * @summary Get this service's health log.
 * @throws Throws an error if this machine isn't a instance
 * @param {string} name - name of instance, use getName() if current service is the target.
 *                        note service name is case insensitive.
 * @return {promise} promise - resolves to log entries
 */
getServiceHealthLog(name)


getHealth

检索服务运行状况信息。


/**
 * @name getHealth
 * @summary Retrieve service health info.
 * @private
 * @return {object} obj - object containing service info
 */
getHealth()


getServiceHealthAll

检索所有实例服务的运行状况。


/**
 * @name getServiceHealthAll
 * @summary Retrieve the health status of all instance services.
 * @return {promise} promise - resolves with an array of objects containing instance health information.
 */
getServiceHealthAll()


Messaging


createUMFMessage

创建一个 UMF 样式消息。


/**
 * @name createUMFMessage
 * @summary Create a UMF style message.
 * @description This is a helper function which helps format a UMF style message.
 *              The caller is responsible for ensuring that required fields such as
 *              "to", "from" and "body" are provided either before or after using
 *              this function.
 * @param {object} message - optional message overrides.
 * @return {object} message - a UMF formatted message.
 */
createUMFMessage(message)


makeAPIRequest

向 hydra 服务发出 API 请求。


/**
 * @name makeAPIRequest
 * @summary Makes an API request to a hydra service.
 * @description If the service isn't present and the message object has its
 *              message.body.fallbackToQueue value set to true, then the
 *              message will be sent to the services message queue.
 * @param {object} message - UMF formatted message
 * @return {promise} promise - response from API in resolved promise or
 *                   error in rejected promise.
 */
makeAPIRequest(message)


sendMessage

向 Hydra 服务的所有当前实例发送消息。


/**
 * @name sendMessage
 * @summary Sends a message to all present instances of a  hydra service.
 * @param {string | object} message - Plain string or UMF formatted message object
 * @return {promise} promise - resolved promise if sent or
 *                   error in rejected promise.
 */
sendMessage(message)


sendReplyMessage

根据收到的原始消息发送回复消息。


/**
 * @name sendReplyMessage
 * @summary Sends a reply message based on the original message received.
 * @param {object} originalMessage - UMF formatted message object
 * @param {object} messageResponse - UMF formatted message object
 * @return {object} promise - resolved promise if sent or
 *                   error in rejected promise.
 */
sendReplyMessage(originalMessage, messageResponse)


Routing


registerRoutes

注册路由。


/**
* @name registerRoutes
* @summary Register routes
* @note Routes must be formatted as UMF To routes. https://github.com/cjus/umf#%20To%20field%20(routing)
* @param {array} routes - array of routes
* @return {object} Promise - resolving or rejecting
*/
registerRoutes(routes)


getAllServiceRoutes

检索所有服务路由。


/**
* @name getAllServiceRoutes
* @summary Retrieve all service routes.
* @return {object} Promise - resolving to an object with keys and arrays of routes
*/
getAllServiceRoutes()


matchRoute

将路由路径匹配到已注册路由列表。


/**
* @name matchRoute
* @summary Matches a route path to a list of registered routes
* @private
* @param {string} routePath - a URL path to match
* @return {boolean} match - true if match, false if not
*/
matchRoute(routePath)


Message queues


queueMessage

排队一个消息


/**
* @name queueMessage
* @summary Queue a message
* @param {object} message - UMF message to queue
* @return {promise} promise - resolving to the message that was queued or a rejection.
*/
queueMessage(message)


getQueuedMessage

检索排队的消息


/**
* @name getQueuedMessage
* @summary Retrieve a queued message
* @param {string} serviceName who's queue might provide a message
* @return {promise} promise - resolving to the message that was dequeued or a rejection.
*/
getQueuedMessage(serviceName)


markQueueMessage

将排队的消息标记为已完成或未完成


/**
* @name markQueueMessage
* @summary Mark a queued message as either completed or not
* @param {object} message - message in question
* @param {boolean} completed - (true / false)
* @param {string} reason - if not completed this is the reason processing failed
* @return {promise} promise - resolving to the message that was dequeued or a rejection.
*/
markQueueMessage(message, completed, reason)


Hydra Express


Hydra-Express 包使用 Hydra-core,是专门为利用 ExpressJS 的底层功能而设计的。

我们相信这是 ExpressJS 开发人员构建微服务最快最简单的方式。


上手指南


安装


要在另一个项目中安装和使用:


$ npm install hydra-express


用法


'use strict';
const config = require('./config/properties').value;
const version = require('./package.json').version;
const hydraExpress = require('hydra-express');
function registerRoutesCallback() {
  hydraExpress.registerRoutes({
    '/v1/offers': require('./offers-v1-api')
  });
}
function registerMiddlewareCallback() {
  let app = hydraExpress.getExpressApp();
  app.use((req, res, next) => {
    console.log('req.headers', req.headers);
    next();
  });
}
hydraExpress.init(config, version, registerRoutesCallback, registerMiddlewareCallback)
  .then((serviceInfo) => {
    console.log('serviceInfo', serviceInfo);
  })
  .catch((err) => {
    console.log('err', err);
  });


在上面的示例中,then 语句上的 serviceInfo 返回一个对象, 其中包含 serviceNameservicePort 和其他有用值。


日志记录和错误报告


HydraExpress 包含一个 log 成员,允许您输出日志到控制台和日志文件。


hydraExpress.log('error', message);


log 的第一个参数是日志消息的类型:fatalerrordebuginfo。第二个参数是要存储的字符串消息。强烈建议您利用这个机会创建描述性很强的日志消息,因为此函数不记录堆栈跟踪。


此外,将 fatalerror 类型的日志消息发送到 hydra-core, 以便在服务运行状况检查(health check)日志中进行日志记录。


服务静态 Web 内容


hydra-express 服务可以服务静态 Web 内容。只需创建一个名为 public 的文件夹,然后将网站文件复制到其中即可。可以在 demo/webserver 文件夹中找到一个示例。


Hydra Cli


上手指南


首先,您需要安装 hydra-cli


$ sudo npm install -g hydra-cli


您只需在终端中输入程序名称即可查看 hydra-cli 的所有选项。


$ hydra-cli
hydra-cli version 0.5.7
Usage: hydra-cli command [parameters]
See docs at: https://github.com/flywheelsports/hydra-cli
A command line interface for Hydra services
Commands:
  help                         - this help list
  cfg pull label               - download configuration file
  cfg push label filename      - update configuration file
  cfg list serviceName         - display a list of config versions
  config instanceName          - configure connection to redis
  config list                  - display current configuration
  use instanceName             - name of redis instance to use
  health [serviceName]         - display service health
  healthlog serviceName        - display service health log
  message create               - create a message object
  message send message.json    - send a message
  nodes [serviceName]          - display service instance nodes
  refresh node list            - refresh list of nodes
  rest path [payload.json]     - make an HTTP RESTful call to a service
  routes [serviceName]         - display service API routes
  services [serviceName]       - display list of services
  shell                        - display command to open redis shell


如您所见,hydra-cli 可以做很多事情。


配置 hydra-cli


要使用大多数 hydra-cli 命令,您首先需要对其进行配置,方法是将其指向您正在使用的 Redis 实例。


$ hydra-cli config local


config 命令需要一个你想要关联到 Redis 连接信息的名称。这允许您为多个环境存储配置设置。例如,您可能已经为您的项目 localstagingproduction 存储了设置。


在存储的设置之间切换很容易:


$ hydra-cli use staging


您可以使用 config list 命令查看当前选择的设置。


$ hydra-cli config list


与 hydra 配置文件一起工作


Hydra 配置文件,不要与 hydra-cli 配置设置混淆,服务在初始化 hydra 或 hydra-express 时会使用它们。


这些配置文件通常在运行时加载,并将其内容传递给 Hydra。


在启动过程中,如果 Hydra 看到 HYDRA_REDIS_URLHYDRA_SERVICE 环境变量, 则 Hydra 会向指定的 Redis 实例询问其配置文件的副本。

应该通过以下方式定义环境变量:


HYDRA_REDIS_URL='redis://10.0.0.2:6379/15'
HYDRA_SERVICE='myservice:0.12.1'


这通常用于 Docker 容器中启用 hydra 的应用。

Hydra-cli 提供 cfg 命令,用于列出(listing)、加载(loading)和上传(uploading)配置文件数据到 Redis。

你可以使用下面的命令来获取配置列表:


$ hydra-cli cfg list myservice


为了存储配置,您必须指定由冒号和服务版本分隔的服务名称。


$ hydra-cli cfg pull myservice:0.12.1


使用上面的 cfg pull 命令,检索到的配置将显示在终端中。要将调出的配置保存到一个文件中,你可以使用:


$ hydra-cli cfg pull myservice:0.12.1 
>
 config.json


要上传一个配置,你可以使用 cfg push 命令:


$ hydra-cli cfg push myservice:0.12.2 config.json


列出配置,检索一个配置并将其保存到文件中——然后在上传之前修改它,这就是管理服务配置的方法。


列出服务信息


Hydra 的一个非常好的特性是, 运行 Hydra 的每个应用程序都会发出运行状况(health)和存活状态(presence)信息。使用 hydra 的任何应用程序都可以检查这些信息。


hydra-cli 程序实际上只是一个运行 Hydra 的命令行客户端——它的大部分功能都是由 Hydra 提供的。

我们可以使用 nodes 命令查看节点列表:


$ hydra-cli nodes


许多 Hydra 驱动的应用程序导出 API 路由。我们可以使用以下方法查看服务路由列表:


hydra-cli routes


您可以使用 health 命令检索服务的健康状态。


$ hydra-cli health


如果指定了服务名称,则只能看到该服务的运行状况信息。


$ hydra-cli health myservice


节点列表清理


如果您启动和停止服务,最终将看到不再处于活动状态的服务。这出现在 hydra-cli 节点命令期间。这个列表没有被自动清除的关键原因是它对于调试和监视非常有用。您必须使用 refresh 命令手动清除死服务列表。


$ hydra-cli refresh


快速连接到 Redis


如果需要,您可以要求 hydra-cli 提供与 redis-cli 客户端一起使用的连接字符串。


$ hydra-cli shell


在运行 Mac 或 Linux 的计算机上,您可以发出以下命令来自动调用 redis-cli


$(hydra-cli shell)


下一步


hydra-cli。我们发现它是使用 Hydra 应用程序时必不可少的工具。

阅读项目仓库中的完整文档


Hydra 生产器


Hydra Generator 是一个命令行工具,可让您快速构建 Hydra 或 Hydra-Express 应用程序的完整脚手架。生成器依赖于称为 Yeoman 的工具。

生成器的伟大之处在于,您可以在不到15秒的时间内构建微服务。然后,您可以继续自定义生成的代码以适合您的特定需求。


快速上手


首先全局安装 Yeomangenerator


$ sudo npm install -g yo generator-fwsp-hydra


要使用生成器,只需使用生成器的名称调用 yeoman 即可。在我们的案例中,hydra-generator 被称为 fwsp-hydra。您收到的第一个提示要求您为服务命名。


$ yo fwsp-hydra
? Name of the service (`-service` will be appended automatically) hello


在出现许多其他问题(您可以选择 default )之后,该过程以关于如何构建和启动新项目的说明结束。


Done!
'cd example-service' then 'npm install' and 'npm start'


请记住 Hydra 服务需要使用 Redis 实例。所以在你运行你的应用程序之前,你需要 redis 可用。默认情况下,Hydra 生成器将创建一个配置文件,该文件需要一个本地的 Redis 实例。


{
  "environment": "development",
  "hydra": {
    "serviceName": "hello-service",
    "serviceIP": "",
    "servicePort": 5000,
    "serviceType": "hello",
    "serviceDescription": "says hello",
    "redis": {
      "url": "redis://127.0.0.1:6379/15"
    }
  }
}



相关实践学习
部署Stable Diffusion玩转AI绘画(GPU云服务器)
本实验通过在ECS上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。
相关文章
|
7月前
|
Java 程序员 Maven
【C/C++ CommonAPI入门篇】深入浅出:CommonAPI C++ D-Bus Tools 完全使用教程指南
【C/C++ CommonAPI入门篇】深入浅出:CommonAPI C++ D-Bus Tools 完全使用教程指南
227 0
Ngnix03 Ngnix的官方简介,Ngnix作者是俄罗斯人发明的,about可以获取官方统计下载页面,download是下载页面,documentation是Ngnix下载官方文档,books是官
Ngnix03 Ngnix的官方简介,Ngnix作者是俄罗斯人发明的,about可以获取官方统计下载页面,download是下载页面,documentation是Ngnix下载官方文档,books是官
|
自然语言处理
Wix 安装部署教程(十四) -- 多语言安装包之用户许可协议
原文:Wix 安装部署教程(十四) -- 多语言安装包之用户许可协议          在上一篇中,留下了许可协议的问题,目前已经解决。感谢网友武全的指点! 问题          一般我们是用WixVariable 来设定许可协议。
1075 0
|
Web App开发
Chrome操作指南——入门篇(十一)network
Chrome操作指南——入门篇(十一)network
Chrome操作指南——入门篇(十一)network
|
消息中间件 存储 NoSQL
hydra-microservice 中文手册(下篇)(一)
hydra-microservice 中文手册(下篇)(一)
208 0
|
负载均衡 NoSQL JavaScript
hydra-microservice 中文手册(上篇)
hydra-microservice 中文手册(上篇)
203 0
|
存储 负载均衡 前端开发
hydra-microservice 中文手册(中篇)
hydra-microservice 中文手册(中篇)
271 0
|
消息中间件 存储 NoSQL
hydra-microservice 中文手册(完整篇)(一)
hydra-microservice 中文手册(完整篇)(一)
372 0
|
存储 JSON NoSQL
hydra-microservice 中文手册(完整篇)(二)
hydra-microservice 中文手册(完整篇)(二)
268 0
|
C# C++ Windows
Wix 安装部署教程(十五) --CustomAction的七种用法
原文:Wix 安装部署教程(十五) --CustomAction的七种用法       在WIX中,CustomAction用来在安装过程中执行自定义行为。比如注册、修改文件、触发其他可执行文件等。这一节主要是介绍一下CustomAction的7种用法。
2027 0