hydra-microservice 中文手册(上篇)

2021-05-27 19:05:38 浏览数 (1)

Hydras 是什么?

Hydra 是一个 NodeJS 包(技术栈不是重点,思想!思想!思想!),它有助于构建分布式应用程序,比如微服务。

Hydra 提供服务发现(service discovery)、分布式消息传递(distributed messaging)、 消息负载平衡(message load balancing)、日志记录(logging)、呈现(presence)和运行状况(health)监视等功能。Hydra 利用 Redis 的强大力量做到了这一点。

例如,使用 HydrasendMessagemakeAPIRequest 调用, 一个应用程序可以按名称与其他应用程序通信,而无需指定 IP 或端口信息。

在运行命名服务的多个实例的常见用例中, Hydra 将根据可用实例的存在信息对其请求进行负载平衡。如果目标实例没有响应,Hydra 甚至会重新路由请求。

Hydra 项目为 ExpressJS 开发人员提供了 hydra-express 模块。Hydra-express API 路由可以自动注册并提供给 Hydra 项目的 hydra-router service, 它是一种 service 感知的 API 和消息传递路由器。Hydra-router 甚至将接受 WebSocket 消息并将其路由到其相应的服务。

为什么要用 Hydra?

Hydra 提供的大部分功能都可以通过组合使用其他库、框架和基础设施工具来实现。那么,为什么要用 Hydra 呢?

我们创建 Hydra 的目标是创建一个单一的、轻量级的 NPM 包,它为微服务提供解决方案, 而不会迫使开发人员以不同的方式来构建微服务。在很大程度上,我们想让熟悉 ExpressJS 的开发者也能使用 Hydra。另一个目标是,我们相信开发人员不必是 DevOps 专业人员才能开始使用微服务。简而言之,Hydra 降低了构建和部署微服务的门槛。

Hydra 与 Redis

Hydra 项目的主要目标是在不牺牲健壮性和可伸缩性的情况下, 降低构建和部署可伸缩 Node 微服务的障碍。作为轻量级的库,hydra-core 已在从小型 IoT 设备到 Dockerized 云基础架构的各种情况下使用。

Hydra 利用 Redis 的强大功能来解决以下微服务问题:

  • 存在(presence)和健康(health)监测
  • 服务发现(service discovery
  • 路由发现(route discovery
  • 服务间消息传递(inter-service messaging

让我们检查每一个关注点。

存活状态(presence)和健康(health)监测

微服务需要传达其存在状态,以便可以对其进行监视并通过网络与之可靠地进行通信。将消息发送到不正常的服务可能会导致级联的结果,具体取决于应用程序体系结构的健壮性。

应用程序需要在调用它们之前了解对等微服务的状态。这样路由软件可以避免不健康的服务,并在问题致命之前将其报告出来。

使用 Hydra 的微服务将其状态和运行状况存储在 Redis 中, 该信息可供对等服务和监视代理使用。

服务发现(service discovery

分布式应用程序通过相互发送消息来协同工作。大多数情况下,这些消息采用 HTTP Restful API 的形式。另一种常见的方法是基于套接字(socket-based)的消息传递。

为了彼此合作,应用程序需要知道对等服务的位置。也就是说,他们需要知道目标 IP 和端口地址。使用 DNS 条目或反向代理服务器(例如 Nginx )可以部分解决此问题。但是,这种方法的缺点是这些解决方案需要管理。意思是,没有自动或动态发现发生。

由 Hydra 提供支持的服务可以使用 Redis 注册其服务名称(service name),IP地址和端口。结合注册和服务存在信息,可以使对等服务彼此发现。

路由发现(route discovery

使用 Hydra 的应用程序可以注册其 Restful API 路由,以便对等应用程序可以发现它们。 Hydra-Router 是一种动态且可感知服务的路由器, 它使用存储的路由信息将外部请求定向到云或集群环境中的服务。

服务间消息传递(inter-service messaging

Redis 提供消息传递服务,以允许应用程序发布和订阅消息。这种通信是基于套接字的(socket-based),并且性能很高。Hydra 在 Redis 消息传递之上添加了一层, 以通过发送包含路由信息(例如命名服务 named services)的JSON消息,使应用程序彼此通信。您无需考虑IP地址或端口,也无需考虑哪个服务实例将收到消息。

Redis 的灵活性

Redis 是理想的,其原因有很多,Redis 在开发人员中的受欢迎程度持续上升。在在线民意调查中,它的排名也很高。

Redis 可能已经在您的环境中,因为它通常是智能缓存的首选解决方案。

在 Redis 之上构建 Hydra 的一个关键原因是因为 Redis 可在 IoT 设备, 笔记本电脑,云基础架构上使用,并受到 RedisLabs 等托管环境的良好支持。这确实使开发人员能够将 Node 微服务构建和部署到任何这些环境。

Hydra Express-快速教程

Hydra 是一个 NPM 模块,用于快速构建 Node-based 的微服务。Hydra-express 是包装 Hydra 和 ExpressJS 的模块。在本指南中,我们将着眼于创建一个 hydra-express 应用程序,并了解它可以做什么。

第 1 步-获取 Redis

Hydra 需要使用 Redis 服务器。如果您从未使用过 Redis,我们认为这将是一次改变生活的开发人员经验, 希望这是最终尝试它的一个很好的理由!

如果您已经在使用 Redis,那么恭喜您已经升级了,请随时跳至第2步!

有很多方法可以访问 Redis 服务器。最简单的方法之一是通过 RedisLabs 等提供商注册免费套餐。

如果你喜欢 Docker,你可以在几分钟内安装官方的 Redis 镜像。对于 PC 用户来说,这也是一个不错的选择。

在 Mac 上,您可以使用一个简单的命令通过 Homebrew 安装Redis:brew install redis

如果您不介意从源代码构建 Redis,请查看《Redis快速入门指南》

但最简单的方法是第一种选择,它不需要安装——只需登录免费的云服务提供商。

这里强烈建议使用 Docker

第 2 步-Hyda CLI 工具

有了 Redis 的访问权限,您现在应该安装 hydra 工具:

确保您使用的是 NodeJS 6.2.1 或更高版本-Hydra 是使用 ES6 构建的!

代码语言:javascript复制
sudo npm install -g yo generator-fwsp-hydra hydra-cli

这样就安装了方便的 Yeoman 和 hydra 生成器以及命令行客户端。

让我们配置Hydra命令行客户端。

代码语言:javascript复制
$ hydra-cli config
redisUrl: 127.0.0.1
redisPort: 6379
redisDb: 15

上面的例子假设你已经在本地安装了 redis。如果没有,只需提供云服务提供的 redisUrlredisDb 即可。

现在我们都准备好了。让我们构建一个微服务!

第 3 步-构建和测试微服务

让我们构建一个名为 hello的服务。我们将使用方便的 Hydra生成器,大多数情况下选择默认设置。

代码语言:javascript复制
$ yo fwsp-hydra
? Name of the service (`-service` will be appended automatically) hello
? Host the service runs on? 
? Port the service runs on? 0
? What does this service do? Says hello
? Does this service need auth? No
? Is this a hydra-express service? Yes
? Set up a view engine? No
? Enable CORS on serverResponses? No
? Run npm install? No
   create hello-service/.editorconfig
   create hello-service/.eslintrc
   create hello-service/.gitattributes
   create hello-service/.nvmrc
   create hello-service/.jscsrc
   create hello-service/specs/test.js
   create hello-service/specs/helpers/chai.js
   create hello-service/.gitignore
   create hello-service/package.json
   create hello-service/README.md
   create hello-service/hello-service.js
   create hello-service/config/sample-config.json
   create hello-service/config/config.json
   create hello-service/routes/hello-v1-routes.js

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

这是创建的:

代码语言:javascript复制
.
├── README.md
├── config
│   ├── config.json
│   └── sample-config.json
├── hello-service.js
├── node_modules
├── package.json
├── routes
│   └── hello-v1-routes.js
└── specs
    ├── helpers
    └── test.js

编辑 routes/hello-v1-routes.js,使事情变得更有趣。

将第18行更改为:

代码语言:javascript复制
result: {}

到:

代码语言:javascript复制
result: {
  msg: `${hydra.getServiceName()} - ${hydra.getInstanceID()}`
}

按照上述说明,我们可以继续构建我们的服务。

代码语言:javascript复制
$ cd hello-service
$ npm install
$ npm start

启动服务后,我们看到它使用随机端口启动。

代码语言:javascript复制
serviceInfo { serviceName: 'hello-service',
  serviceIP: '10.1.1.163',
  servicePort: 8891 }

您可以通过 curl 访问该服务:

代码语言:javascript复制
$ curl 10.1.1.163:8891/v1/hello
{"statusCode":200,"statusMessage":"OK","statusDescription":"Request succeeded without error","result":{"msg":"hello-service - 50bf4346dd492c2036cfd57ad8bd2844"}}

或通过浏览器:http://10.1.1.163:8891/v1/hello

我们还可以使用已安装的 hydrai-cli app 获取有关我们服务的信息:

代码语言:javascript复制
$ hydra-cli nodes
[
  {
    "serviceName": "hello-service",
    "serviceDescription": "Says hello",
    "version": "0.0.1",
    "instanceID": "b1554f404acc3268c1511dc84ae43c50",
    "updatedOn": "2016-11-15T18:18:56.438Z",
    "processID": 20542,
    "ip": "10.1.1.163",
    "port": 8891,
    "elapsed": 4
  }
]
代码语言:javascript复制
{
  "hello-service": [
    "[GET]/_config/hello-service",
    "[get]/v1/hello/"
  ]
}

此信息由我们的服务发出,它使服务可以彼此发现并相互发送消息。与 Hydra-Router 结合使用,您可以构建整个微服务网络。

要了解如何使用新的微服务,请参见 Hydra 方法。

推荐的后续步骤

  • 使用 hydra 生成器创建您自己的测试项目
  • 查看示例演示项目

0 人点赞