一种使用 Redis 深度驱动的,为构建轻量级分布式应用程序(Microservices)的工程方案(一)

简介: 一种使用 Redis 深度驱动的,为构建轻量级分布式应用程序(Microservices)的工程方案(一)

Hydra 是一个轻量级的 NodeJS 库,用于构建分布式计算应用程序,比如微服务。我们对轻量级的定义是:轻处理外部复杂性和基础设施依赖 —— 而不是有限的轻处理。 Hydra 声称对基础设施的依赖很轻,这是因为它唯一的外部依赖是 Redis

Hydra 利用 Redis 丰富的数据结构来实现重要的微服务所需的功能。如 presence(在线状态)、service discovery (服务发现)、load balancing (负载平衡)、messaging(消息传递)、queuing(队列)等。


Hydra 到底是什么?


Hydra 是一个 NodeJS 模块,可以将其导入到 JavaScript Node 应用程序中,以使其具有微服务功能。Hydra 通过利用 Redis 做到这一点。


在这里,我们看到三个微服务 - 每个微服务都带有一个连接到 Redis 的 Hydra 模块。在这种模式下,大多数服务不会直接与 Redis 通信。而是底层的 Hydra 模块代理 Redis。


微信图片_20220610212435.png

关于此图的另一点是,Hydra 只是另一个导入的模块 - 如绿色所示。Hydra 在底部仅以蓝色显示,以说明其存在和与 Redis 的关系。

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


微信图片_20220610212446.png

该快照提供了简化抽象的感觉。成员函数(例如 findServicesendMessage)非常简单。


Hydra 如何利用 Redis



这张幻灯片显示了许多重要的微服务问题。每个都是 non-trivial(非平凡的) 微服务所必需的。我们将详细研究 Hydra 如何使用 Redis 来实现所有这些功能。

微信图片_20220610212503.png


请记住,这里的目标是展示如何做到这一点 —— 而不是说每种方法都是您应该如何在自己的服务中实现该特性。一个恰当的例子是,虽然你可以在 Redis 中存储你的微服务配置数据,或者使用 Redis 作为一个 logger —— 但这并不意味着你应该这样做。至少,除非你确切地知道你在做什么,以及需要做哪些权衡。


另外,请记住,您也许不需要Hydra。这些功能都是由 Redis 实现的,您当然可以在自己的应用程序中做到这一点。(如:Golang 来一版)

我将向您展示的一个关键点是,其中一些特性只有在组合时才能实现。例如,请求(request)和消息路由(message routing)依赖于状态(presence)、运行状况(health)、服务发现(service discovery)和负载平衡(load balancing)。


如您所知,这些特性中的每一个都可以使用各种基础设施工具来解决。然而,Hydra 的一个关键目标是简化构建微服务,同时最小化外部基础设施需求。在构建可用于生产的服务时,您需要决定需要哪些 Hydra 特性,以及哪些特性将从其他工具获得。这不是一个非此即彼的命题,而是一个你想要达到的目标和你能多快开始的问题。


就是说,很有趣的是,仅使用 Redis 和您喜欢的编程语言就可以实现所有这些功能。


Key 空间组织



了解 Hydra 如何利用 Redis 的第一步是查看它如何组织对 Redis key 空间的使用。

Hydra 使用的键 —— 由 24 段标签组成,标签之间用冒号分隔。段标签被命名为:前缀(Prefix)、服务名称(Service name)、实例 ID(Instance ID)和类型(type)。


微信图片_20220610212526.png


前缀段允许过滤 Hydra key 和非 Hydra key。因此,如果你大量使用 Redis,那么能够过滤特定的 key 是至关重要的。


服务名称段帮助过滤特定服务类型的 key。例如授权(authorization)、用户(user)或图像处理(image processing)服务类型。

实例ID(Instance ID)段允许过滤唯一服务实例的 key。运行微服务时,通常需要运行一个服务类型的多个实例。每个服务实例都分配有唯一的 ID,并且能够区分它们是有用的。


最后,还有“类型(Type)”部分,用于对 key 的用途进行分类。并非每个 key 中都存在所有段。例如,某些 key 中不需要服务名称(Service name)和实例ID(instance ID)。


这是用户服务(user service) key 的示例。我们看到前缀 hydra:service 后跟服务名称,在本例中为 “user-svcs”。接下来,我们看到唯一的实例ID(unique instance ID)。最后,我们看到此 key 的类型为 presence(presence)。因此,我们说 presence 信息存储(presence information)在此 key 地址中。


微信图片_20220610212541.png

在前面的描述中,一个令人困惑的地方是,key 由名称组成,名称中有24个段标签,用冒号分隔。然而,在这里我们看到 hydra:service 也用冒号分隔。当时的想法是,可能还有另一种 hydra:other 类型,service 只是其中之一。关于消息传递还有另一个不一致的地方,稍后我们将对此进行讨论。

我们可以输入 redis-cli 和输入 Redis 命令来查看各种键。在接下来的演示中我们会看到一些例子。


微信图片_20220610212554.png

image.gif

一个关于我们将使用的 redis-cli 示例的快速说明:你将看到 keys 命令的使用 —— 这是为了方便 —— Hydra 内部使用 Redis scan 命令。


所以重述一下 —— Hydra 使用的 key 是按段组织的,这使它们更容易查询。此外,一致的组织使它们更容易扩展和维护。随着我们继续,我们将看到 key 在每个微服务特性的组织中所扮演的角色。让我们从检查 presence(examining presence)开始。


Presence(呈现 type)



在微服务领域中,发现服务、了解服务是否正常以及是否可以路由到该服务的能力至关重要。这些特性依赖于知道某个特定的服务实例确实存在并可供使用。对于服务发现(service discovery)、路由(routing)和负载平衡(load balancing)等特性,这也是必需的。


每隔一秒钟,Hydra 就会更新它的服务 key 的生存时间(TTL)。在三秒钟的时间内这样做失败将导致 key 过期,主机应用程序被视为不可用。


微信图片_20220610212624.png

image.gif

在这里我们可以看到使用的 Redis 命令是 “get”“setex”,它们设置了一个 key 和一个到期时间。


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


如果我们尝试检索其中一个 key 的内容,我们会看到它包含实例ID(instance ID)。

并对键使用 TTL 命令可以向我们显示,它还有 2 秒钟的剩余时间。


微信图片_20220610212646.png

image.gif

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

这将我们带入下一个主题…


Health(健康 type)



能够监视微服务的运行状况是另一个重要功能。Hydra 每 5 秒钟收集并写入一个健康信息快照。


您可以检查快照以快速查看单个服务实例的运行状况。并且,快照可以由监控工具(例如 HydraRouter 仪表板)使用。


这就是健康 key 的样子。请注意,唯一的新位是标识 key 为关于 health“type” 段。


微信图片_20220610212704.png

image.gif

当我们查看密钥的内容时,我们看到它包含一个字符串化的 JSON 对象。在这种情况下,它用于 “project-svcs”


微信图片_20220610212717.png

image.gif

JSON 解串可以更容易地查看存储的内容。它包含了很多有用的信息。


微信图片_20220610212741.png

image.gif

因此,可以按服务实例存储运行状况(health)信息。使用包含字符串化的JSON文本的字符串 key 进行管理。而且这些信息可以通过监视应用程序来使用。

相关文章
|
8月前
|
人工智能 Java Nacos
基于 Spring AI Alibaba + Nacos 的分布式 Multi-Agent 构建指南
本文将针对 Spring AI Alibaba + Nacos 的分布式多智能体构建方案展开介绍,同时结合 Demo 说明快速开发方法与实际效果。
5306 102
|
9月前
|
存储 Kubernetes 微服务
Dapr:用于构建分布式应用程序的便携式事件驱动运行时
Dapr 是一个可移植、事件驱动的运行时,简化了分布式应用程序的开发。它支持多语言、多框架,适用于云和边缘计算环境,提供服务调用、状态管理、消息发布/订阅等构建模块。通过 sidecar 模式,Dapr 帮助开发者轻松应对微服务架构的复杂性,实现弹性、可扩展的应用部署。
561 9
Dapr:用于构建分布式应用程序的便携式事件驱动运行时
|
8月前
|
关系型数据库 Apache 微服务
《聊聊分布式》分布式系统基石:深入理解CAP理论及其工程实践
CAP理论指出分布式系统中一致性、可用性、分区容错性三者不可兼得,必须根据业务需求进行权衡。实际应用中,不同场景选择不同策略:金融系统重一致(CP),社交应用重可用(AP),内网系统可选CA。现代架构更趋向动态调整与混合策略,灵活应对复杂需求。
|
10月前
|
监控 Java API
Spring Boot 3.2 结合 Spring Cloud 微服务架构实操指南 现代分布式应用系统构建实战教程
Spring Boot 3.2 + Spring Cloud 2023.0 微服务架构实践摘要 本文基于Spring Boot 3.2.5和Spring Cloud 2023.0.1最新稳定版本,演示现代微服务架构的构建过程。主要内容包括: 技术栈选择:采用Spring Cloud Netflix Eureka 4.1.0作为服务注册中心,Resilience4j 2.1.0替代Hystrix实现熔断机制,配合OpenFeign和Gateway等组件。 核心实操步骤: 搭建Eureka注册中心服务 构建商品
1458 3
|
9月前
|
消息中间件 缓存 NoSQL
Redis各类数据结构详细介绍及其在Go语言Gin框架下实践应用
这只是利用Go语言和Gin框架与Redis交互最基础部分展示;根据具体业务需求可能需要更复杂查询、事务处理或订阅发布功能实现更多高级特性应用场景。
519 86
|
8月前
|
消息中间件 运维 监控
《聊聊分布式》BASE理论 分布式系统可用性与一致性的工程平衡艺术
BASE理论是对CAP定理中可用性与分区容错性的实践延伸,通过“基本可用、软状态、最终一致性”三大核心,解决分布式系统中ACID模型的性能瓶颈。它以业务为导向,在保证系统高可用的同时,合理放宽强一致性要求,并借助补偿机制、消息队列等技术实现数据最终一致,广泛应用于电商、社交、外卖等大规模互联网场景。
|
8月前
|
负载均衡 Java API
《深入理解Spring》Spring Cloud 构建分布式系统的微服务全家桶
Spring Cloud为微服务架构提供一站式解决方案,涵盖服务注册、配置管理、负载均衡、熔断限流等核心功能,助力开发者构建高可用、易扩展的分布式系统,并持续向云原生演进。
|
9月前
|
消息中间件 缓存 监控
中间件架构设计与实践:构建高性能分布式系统的核心基石
摘要 本文系统探讨了中间件技术及其在分布式系统中的核心价值。作者首先定义了中间件作为连接系统组件的"神经网络",强调其在数据传输、系统稳定性和扩展性中的关键作用。随后详细分类了中间件体系,包括通信中间件(如RabbitMQ/Kafka)、数据中间件(如Redis/MyCAT)等类型。文章重点剖析了消息中间件的实现机制,通过Spring Boot代码示例展示了消息生产者的完整实现,涵盖消息ID生成、持久化、批量发送及重试机制等关键技术点。最后,作者指出中间件架构设计对系统性能的决定性影响,
|
10月前
|
数据采集 存储 NoSQL
Scrapy 框架实战:构建高效的快看漫画分布式爬虫
Scrapy 框架实战:构建高效的快看漫画分布式爬虫
|
9月前
|
存储 缓存 监控
Redis分区的核心原理与应用实践
Redis分区通过将数据分散存储于多个节点,提升系统处理高并发与大规模数据的能力。本文详解分区原理、策略及应用实践,涵盖哈希、范围、一致性哈希等分片方式,分析其适用场景与性能优势,并探讨电商秒杀、物联网等典型用例,为构建高性能、可扩展的Redis集群提供参考。
472 0