|
|
|
|
移动端

如何使用Redis构建轻量级微服务

Hydra是一个轻量级NodeJS库,用于构建微服务之类的分布式计算应用程序。我们对轻量级的定义是:外部复杂性低、基础设施依赖项少。Hydra之所以基础设施依赖项少,是由于唯一的外部依赖项是Redis。

作者:沈建苗编译来源:51CTO|2018-09-12 09:00

【新品产上线啦】51CTO播客,随时随地,碎片化学习

【51CTO.com快译】Hydra是一个轻量级NodeJS库,用于构建微服务之类的分布式计算应用程序。我们对轻量级的定义是:外部复杂性低、基础设施依赖项少。Hydra之所以基础设施依赖项少,是由于唯一的外部依赖项是Redis。

要是你读到本文,却从未听说过Redis(这种可能性极小),不妨先了解一下redis.io。稍后再回到此文。

Hydra使用Redis丰富的数据结构实现重要的微服务所需要的功能,比如存在、服务发现、负载均衡、消息传送和队列等功能。

Hydra也很轻巧。实际上,轻巧得足以在售价5美元的Raspberry Pi Zero上运行。想了解更多信息,请参阅:https://medium.com/flywheel-tech/embracing-microservices-11750470ba31

除了轻巧外,Hydra还是构建微服务的最简单方法之一。虽然本文不会介绍Hydra,外面已有好多介绍它的资源,但会深入介绍Hydra如何利用Redis构建轻量级微服务。

先声明一下。首先,本文介绍的方法可能不是很适合你的项目。你可能需要较笨重的微服务。那没关系。我介绍的方法已在Flywheel Sports及另外众多公司得到了证实。我之前写过一篇文章,详细叙述了为什么我们构建Hydra、它在构建全国性直播视频流服务中起到的作用。

Hydra简介

Hydra是一个NodeJS模块,可以导入到JavaScript Node应用程序,从而为它们赋予微服务功能。Hydra通过使用Redis做到这一点。

下面我们看到三个微服务,每个都有连接到Redis的Hydra模块。在此模型中,大多数服务不直接与Redis联系,而是底层的Hydra模块充当Redis的代理。

如何使用Redis构建轻量级微服务

图1

该图的另一个要点是,Hydra只是另一个导入的模块,就像图中所示的绿色框。Hydra仅在底部以蓝色显示,表明其存在和与Redis的连接。

Hydra模块公开了一个JS类接口,共有36个成员函数。

如何使用Redis构建轻量级微服务

图2

上图让人大致了解我们所用抽象机制的简易性。findService比sendMessage等成员函数相当简单。

Hydra如何使用Redis?

这张幻灯片显示了许多重要的微服务问题。每个都是重要的微服务所必需的。我们会详细研究Hydra如何使用Redis实现这每项功能。

如何使用Redis构建轻量级微服务

图3

请记住,此处的目的是表明如何可以执行这项任务,不是说每种方法都要你搞清楚如何在自己的服务中实现该功能。一个典型例子是,虽然可以将微服务配置数据存储在Redis中或使用Redis作为日志记录器,但这并不意味着你应该这么做。除非你确切知道自己在做什么、由此带来的缺点,否则别这么做。

另外请记住,你不需要Hydra。Redis使这每一项功能成为可能,你当然可以在自己的应用程序中这么做。

我要表明的另一个要点是,其中一些功能只有结合起来,才有可能实现。比如说,请求和消息路由依赖状态、运行状况、服务发现和负载均衡。

如你所知,可以使用各种基础设施工具来满足这每一项功能。然而,Hydra的一大目标是简化微服务的构建,同时尽量减少对外部基础设施的需求。你在构建生产就绪服务时,要决定需要哪些Hydra功能、可以从其他工具获得哪些功能。这不是非此即彼的选择,而是兼顾你想要实现什么功能、多快可以入手。

话虽如此,看看如何仅使用Redis和你青睐的编程语言实现所有这些功能还是饶有趣味。

键空间组织

想了解Hydra如何使用Redis,第一步是分析它如何组织管理Redis钥空间的使用。

Hydra使用的键由2到4个由冒号字符分隔的段标签组成。段标签名为:Prefix(前缀)、Service name(服务名)、Instance ID(实例ID)和Type(类型)。

如何使用Redis构建轻量级微服务

图4

Prefix段允许过滤Hydra键与非Hydra键。所以如果你频繁使用Redis,能够过滤特定的键很重要。

Service Name段帮助过滤特定服务类型的键。比如授权、用户或图像处理等服务类型。

Instance ID段允许过滤独特服务实例的键。运行微服务时,你通常需要某个服务类型的多个实例在运行。为每个服务实例分配独特的ID,能够区别它们很有用。

最后还有Type段,用于对键的用途进行分类。并非每个键都有全部的段。比如说,一些键不需要Service Name和Instance ID。

下面这个例子显示了用户服务的键。我们看到前缀是hydra:service,后面跟着服务名(这里是“user-svcs”)。接下来,我们看到独特的实例ID。最后,我们看到这个键的类型是存在。所以,我们说存在信息存储在这个键地址中。

如何使用Redis构建轻量级微服务

图5

前面一个令人困惑的地方是,键由名称组成,2到4个段标签由冒号字符分隔。然而,这里我们看到hydra:service也被冒号字符分隔。其想法是,可能还有另外的hydra:other类型,service只是其中之一。还有另一个涉及消息传送的不一致,稍后会讨论。我们打算在Hydra 2.0中解决这些问题,那将是突破性的变化,但内部更整洁。

我们可以输入redis-cli并输入Redis命令来查看各种键。我们将会在该演示文稿的其余部分介绍这方面的示例。

如何使用Redis构建轻量级微服务

图6

简要说一下我们将使用的redis-cli示例:你会看到键命令的使用,Hydra内部使用Redis scan命令。

所以回顾一下,Hydra使用键是按段组织的,这使得查询来得更容易。此外,一致的组织使它们更容易扩展和维护。我们会在下面看到键在组织每个微服务功能中起到的作用。不妨先从存在说起。

存在

在微服务世界,能够发现服务,并了解服务是否健康、可以路由至关重要。那些功能取决于知道特定服务实例确实存在并可供使用。服务发现、路由和负载均衡等功能也需要这种功能。

每隔一秒,Hydra更新服务键的生存时间(TTL)。如果在3秒钟内没有更新将导致键到期失效、主机应用程序被视为不可用。

如何使用Redis构建轻量级微服务

图7

我们在这里可以看到所用的Redis命令是“get”和“setex”,用于设置键和失效日期。

我们可以使用带模式匹配的“keys”命令来查询存在键。请注意有三个键。这告诉我们“asset-svcs”的三个实例在运行。

如果我们尝试检索其中一个键的内容,可以看到它包含实例ID。

而针对该键使用TTL命令可显示,它还有2秒就到期失效。

如何使用Redis构建轻量级微服务

图8

所以回顾一下,可以使用自动到期失效的键来管理微服务存在。Hydra代表主机服务自动更新键。这意味着这不是开发人员做的事情。未能在3秒内更新键导致服务被视为不可用。这可能意味着服务不健康。

这引出了下一个话题......

健康

能够监控微服务的健康状况是另一项重要功能。Hydra每隔5秒就收集并写入健康信息快照。

你可以查看快照,浏览一下各个服务实例的健康状况。另外,HydraRouter