hydra-microservice 中文手册(上篇)

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: hydra-microservice 中文手册(上篇)

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 构建的!


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


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

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


$ hydra-cli config
redisUrl: 127.0.0.1
redisPort: 6379
redisDb: 15


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


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


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


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


$ 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'


这是创建的:


.
├── 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行更改为:


result: {}


到:


result: {
  msg: `${hydra.getServiceName()} - ${hydra.getInstanceID()}`
}


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


$ cd hello-service
$ npm install
$ npm start


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


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
  }
]


{
  "hello-service": [
    "[GET]/_config/hello-service",
    "[get]/v1/hello/"
  ]
}


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

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


推荐的后续步骤



  • 使用 hydra 生成器创建您自己的测试项目
  • 查看示例演示项目
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
6月前
|
PHP 开发工具 数据库
laravel系列(二) Dcat admin框架开发工具使用
laravel系列(二) Dcat admin框架开发工具使用
102 0
|
消息中间件 存储 NoSQL
hydra-microservice 中文手册(下篇)(一)
hydra-microservice 中文手册(下篇)(一)
169 0
|
存储 NoSQL 安全
hydra-microservice 中文手册(下篇)(二)
hydra-microservice 中文手册(下篇)(二)
113 0
|
存储 负载均衡 前端开发
hydra-microservice 中文手册(中篇)
hydra-microservice 中文手册(中篇)
207 0
|
消息中间件 存储 NoSQL
hydra-microservice 中文手册(完整篇)(一)
hydra-microservice 中文手册(完整篇)(一)
289 0
|
存储 JSON NoSQL
hydra-microservice 中文手册(完整篇)(二)
hydra-microservice 中文手册(完整篇)(二)
201 0
|
容器
Phalcon如何创建多模块并能进行访问 《Phalcon入坑指南系列 四》(2)
Phalcon如何创建多模块并能进行访问 《Phalcon入坑指南系列 四》
137 0
Phalcon如何创建多模块并能进行访问 《Phalcon入坑指南系列 四》(2)
|
应用服务中间件 nginx
Phalcon如何创建多模块并能进行访问 《Phalcon入坑指南系列 四》(1)
Phalcon如何创建多模块并能进行访问 《Phalcon入坑指南系列 四》
165 0
Phalcon如何创建多模块并能进行访问 《Phalcon入坑指南系列 四》(1)
ReactiveCocoa(FRP)-进阶篇(下)
ReactiveCocoa(FRP)-进阶篇(下)
121 0
ReactiveCocoa(FRP)-进阶篇(下)

热门文章

最新文章