Hydras 是什么?
Hydra 是一个 NodeJS 包(技术栈不是重点,思想!思想!思想!
),它有助于构建分布式应用程序,比如微服务。
Hydra 提供服务发现(service discovery
)、分布式消息传递(distributed messaging
)、 消息负载平衡(message load balancing
)、日志记录(logging
)、呈现(presence
)和运行状况(health
)监视等功能。Hydra 利用 Redis 的强大力量做到了这一点。
例如,使用 Hydra
的 sendMessage
和 makeAPIRequest
调用, 一个应用程序可以按名称与其他应用程序通信,而无需指定 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 构建的!
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
。如果没有,只需提供云服务提供的 redisUrl
和 redisDb
即可。
现在我们都准备好了。让我们构建一个微服务!
第 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
访问该服务:
$ 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 获取有关我们服务的信息:
$ 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 生成器创建您自己的测试项目
- 查看示例演示项目