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
返回一个对象, 其中包含 serviceName
,servicePort
和其他有用值。
日志记录和错误报告
HydraExpress 包含一个 log
成员,允许您输出日志到控制台和日志文件。
hydraExpress.log('error', message);
log
的第一个参数是日志消息的类型:fatal
、error
、debug
或 info
。第二个参数是要存储的字符串消息。强烈建议您利用这个机会创建描述性很强的日志消息,因为此函数不记录堆栈跟踪。
此外,将 fatal
或 error
类型的日志消息发送到 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 连接信息的名称。这允许您为多个环境存储配置设置。例如,您可能已经为您的项目 local
、staging
和 production
存储了设置。
在存储的设置之间切换很容易:
$ hydra-cli use staging
您可以使用 config list
命令查看当前选择的设置。
$ hydra-cli config list
与 hydra 配置文件一起工作
Hydra 配置文件,不要与 hydra-cli 配置设置混淆,服务在初始化 hydra 或 hydra-express 时会使用它们。
这些配置文件通常在运行时加载,并将其内容传递给 Hydra。
在启动过程中,如果 Hydra 看到 HYDRA_REDIS_URL
和 HYDRA_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秒的时间内构建微服务。然后,您可以继续自定义生成的代码以适合您的特定需求。
快速上手
首先全局安装 Yeoman
和 generator
:
$ 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" } } }