HelloFresh迁移至新的API网关,实现微服务架构

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介:

HelloFresh最近以零停机的方式将应用迁移到了一个新的API网关,其技术总监ítalo Lelis de Vietro在一篇文章中分享了他们所面临的挑战以及迁移的过程。

在这次迁移之前,HelloFresh已有的API是单体架构的。为了迁移至微服务架构并让微服务的创建更加简单,同时还要与他们的基础设施进行集成,他们构建了一个新的API网关,这个网关会涵盖已有的和新的服务。他们的基础设施已经有了一些组件,包括服务发现、基于Ansible的自动化以及广泛存在的日志和监控,这些组件都会让微服务更加易于实现。为了解决零停机以及向后兼容的难题,团队编写了一个代理脚本将旧服务转换为新的模式。迁移过程的第一次尝试失败了,然而第二次尝试按照预期得到了成功。

HelloFresh已有的基础设施使用Consul来实现服务发现,并使用HAProxy实现客户端的负载均衡。这两个因素促使他们转向了微服务。团队还有一个约定,那就是所有的新服务必须要从Ansible自动化开始着手。这种自动化几乎涵盖了整个技术栈,包括网络、DNS、CI以及机器的供应。在分布式系统多个服务存在交互的场景下,可见性(Visibility)是至关重要的,HelloFresh存在着广泛的日志和监控功能。Statsd和Grafana用于实现监控和仪表盘, ELK则被用来详细分析服务的行为,它们组成了这方面的技术栈。

除了新的网关,新的认证服务也已经进行了规划,它将会代替旧API中的认证模块。这需要旧应用进行重构。

团队预迁移的挑战在于要向后兼容移动应用,确保所有的服务通过新的网关调用,所有的调用能够安全传输,已有的API规则在新的API网关中能够继续得到遵循。不能对用户强制要求移动应用的更新,因此API要保持向后的兼容性。正在使用的API同时包含公开的和私有的端点,所有的这些端点必须要使用新的网关进行注册。微服务和网关之间的服务调用传输必须是安全的。API按照 OpenAPI格式进行文档化,这是用于描述REST API的一个标准。这样的话,团队就能够使用Go来编写导入脚本,它会在旧API和新API间进行转换,并保持像配额(quotas)、CORS设置以及限速这样的规则。

迁移的第一次尝试包括将旧的API替换为新的,首先在staging环境,然后是在生产环境,每一步都有相关的测试用例。这次尝试最终失败了,因为认证数据库由于大量的请求出现负荷超载了。团队低估了负载,数据库开始拒绝连接。另外,在导入脚本方面有一些CORS错误配置。监控系统能够捕获到问题,迁移过程被回滚了。

第二次部署尝试基于第一次所学习到的经验教训。团队规划了一个蓝绿(blue-green)部署,预先准备了一个使用新网关的生产环境副本。这种设置使得新旧环境的切换变得更加容易,所需要的是配置的变更。机器的容量进行了重新的规划,这基于正在运行的应用的指标以及第一次部署的负载指标所确定的。他们使用了一个开源的负载测试工具Gatling来运行性能测试。认证服务中一些已知的issue也进行了修正。

迁移之后,基础设施如下图所示:

20170413113546476.jpg

图片来源:http://highscalability.com/blog/2017/2/20/scaling-hellofresh-api-gateway.html

API网关是HelloFresh基础设施的前沿。团队为什么要构建自己的网关,而不是采用已有的解决方案呢?de Vietro在评论区是这样回应的:

我们曾经尝试Amazon API网关和Tyk,但是我们有自己的认证提供商(provider),将它与AWS网关集成的效果并不理想。我们必须要处理lambdas(AWS的云服务——译注)来添加自定义的认证提供商。将相关指标数据集成到grafana也会更加复杂一些,另外一点就是我们会锁定到相同的供应商上面。Tyk并没有在自定义认证提供商方面给出什么方案(至少当时如此),我们必须要使用他们的内置策略、用户管理以及ACL,这并不是我们想要的结果。我觉得现在的产品已经有了很大的不同,但这就是当时的原因所在。另外,借助我们自己的网关,可以版本化git上的路由配置文件,为其保留变更日志对我们来说至关重要。



   


 


  

本文转自d1net(转载)

目录
相关文章
|
11天前
|
API 数据库 开发者
构建高效可靠的微服务架构:后端开发的新范式
【4月更文挑战第8天】 随着现代软件开发的复杂性日益增加,传统的单体应用架构面临着可扩展性、维护性和敏捷性的挑战。为了解决这些问题,微服务架构应运而生,并迅速成为后端开发领域的一股清流。本文将深入探讨微服务架构的设计原则、实施策略及其带来的优势与挑战,为后端开发者提供一种全新视角,以实现更加灵活、高效和稳定的系统构建。
18 0
|
10天前
|
Kubernetes 安全 Java
构建高效微服务架构:从理论到实践
【4月更文挑战第9天】 在当今快速迭代与竞争激烈的软件市场中,微服务架构以其灵活性、可扩展性及容错性,成为众多企业转型的首选。本文将深入探讨如何从零开始构建一个高效的微服务系统,覆盖从概念理解、设计原则、技术选型到部署维护的各个阶段。通过实际案例分析与最佳实践分享,旨在为后端工程师提供一套全面的微服务构建指南,帮助读者在面对复杂系统设计时能够做出明智的决策,并提升系统的可靠性与维护效率。
|
1天前
|
机器学习/深度学习 运维 Prometheus
探索微服务架构下的系统监控策略
【4月更文挑战第18天】在当今快速迭代和持续部署盛行的软件工程实践中,微服务架构因其灵活性和可扩展性受到企业青睐。然而,随着服务的细粒度拆分和网络通信的增加,传统的监控手段已不再适用。本文将探讨在微服务环境中实施有效系统监控的策略,包括日志聚合、性能指标收集、分布式追踪以及异常检测等关键技术实践,旨在为读者提供构建稳定、可靠且易于维护的微服务系统的参考指南。
7 0
|
2天前
|
负载均衡 Java 开发者
细解微服务架构实践:如何使用Spring Cloud进行Java微服务治理
【4月更文挑战第17天】Spring Cloud是Java微服务治理的首选框架,整合了Eureka(服务发现)、Ribbon(客户端负载均衡)、Hystrix(熔断器)、Zuul(API网关)和Config Server(配置中心)。通过Eureka实现服务注册与发现,Ribbon提供负载均衡,Hystrix实现熔断保护,Zuul作为API网关,Config Server集中管理配置。理解并运用Spring Cloud进行微服务治理是现代Java开发者的关键技能。
|
3天前
|
API
阿里云微服务引擎及 API 网关 2024 年 3 月产品动态
阿里云微服务引擎及 API 网关 2024 年 3 月产品动态。
|
4天前
|
监控 JavaScript 安全
构建微服务架构下的API网关
【4月更文挑战第15天】在微服务架构中,API网关扮演着至关重要的角色。它作为系统的唯一入口,不仅负责请求的路由、负载均衡和认证授权,还涉及到监控、日志记录和服务熔断等关键功能。本文将探讨如何构建一个高效且可靠的API网关,涵盖其设计原则、核心组件以及实现策略,旨在为后端开发人员提供一套实用的指导方案。
19 4
|
5天前
|
监控 负载均衡 API
构建高性能微服务架构:后端开发的最佳实践
【4月更文挑战第14天】 在当今快速发展的软件开发领域,微服务架构已成为构建可扩展、灵活且容错的系统的首选方法。本文深入探讨了后端开发人员在设计和维护高性能微服务时需要遵循的一系列最佳实践。我们将从服务划分原则、容器化部署、API网关使用、负载均衡、服务监控与故障恢复等方面展开讨论,并结合实际案例分析如何优化微服务性能及可靠性。通过本文的阅读,读者将获得实施高效微服务架构的实用知识与策略。
|
7天前
|
运维 监控 自动驾驶
构建可扩展的应用程序:Apollo与微服务架构的完美结合
构建可扩展的应用程序:Apollo与微服务架构的完美结合
30 10
|
25天前
|
负载均衡 测试技术 持续交付
高效后端开发实践:构建可扩展的微服务架构
在当今快速发展的互联网时代,后端开发扮演着至关重要的角色。本文将重点探讨如何构建可扩展的微服务架构,以及在后端开发中提高效率的一些实践方法。通过合理的架构设计和技术选型,我们可以更好地应对日益复杂的业务需求,实现高效可靠的后端系统。
|
25天前
|
监控 持续交付 API
构建高效可扩展的微服务架构
在当今快速迭代和竞争激烈的软件市场中,构建一个高效、可扩展且易于维护的后端系统变得尤为重要。微服务架构作为一种流行的分布式系统设计方式,允许开发者将应用程序划分为一系列小型、自治的服务,每个服务负责执行特定的业务功能。本文将探讨如何利用现代技术栈搭建一个符合这些要求的微服务架构,并讨论其潜在的挑战与解决方案。我们将涵盖服务划分策略、容器化、服务发现、API网关、持续集成/持续部署(CI/CD)以及监控和日志管理等关键主题,以帮助读者构建出既可靠又灵活的后端系统。