一个创业公司的API网关落地实践

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
云原生 API 网关,700元额度,多规格可选
简介:

HelloFresh是一家食品电商初创公司,用户根据选定的菜谱下单,HelloFresh把菜谱所需要的食材送至用户家中。来自HelloFresh的技术负责人ítalo Lelis在博客上分享了HelloFresh的API网关落地实践,本文为该博文的译文,并已获得原网站的翻译授权。

HelloFresh的规模一直保持着增长的态势:我们的产品在持续改进,新的想法不断涌现出来,我们拥有完全自动化的供应链。持续的增长给我们带来了惊喜,同时也带来了技术方面的挑战。

在这篇文章里,我将会和大家分享我们的基础设施所经历的一次重大迁移,这次迁移保证了以后的路我们可以走得更快、更灵活,也更安全。

挑战

我们最近构建了一个API网关,接下来需要在不停机的情况下对网关后面的主API(单体系统)进行迁移改造,这对我么来说是一个很大的挑战。

架构

API网关处在基础设施的最外层,它每天需要接收大量的请求,所以我们选择了Go语言来构建网关,因为Go性能好、简单易用,而且提供了优雅的并发解决方案。

我们手头已经有很多现成的工具,它们可以简化我们的迁移工作。

服务发现和客户端负载均衡

我们使用Consul作为服务发现工具,它和HAProxy配合起来使用可以帮我们解决微服务架构的两个主要问题:服务发现(新服务上线时会自动注册)和客户端负载均衡(把请求均衡地分发到各个服务器上)。

自动化

我们的工具箱里最有用的工具或许要数基础设施的自动化。我们使用Ansible在云端管理资源,包括单机、网络、DNS、运行持续集成工具的主机,等等。按照我们的惯例,当有新服务被创建,我们的工程师第一件事情就是为这个服务创建Ansible脚本。

日志和监控

从某种程度上说,基础设施里的所有东西都应该被监控起来。在记录日志和监控应用方面,我们有一些最佳实践。

办公室里有仪表盘,我们在任何时候都可以查看系统的运行情况。我们使用ELK技术栈来收集日志,从而可以快速地分析服务的运行情况。我们使用Statsd和Grafana作为监控工具,这些工具总会给我们带来惊喜。
Grafana的仪表盘为性能度量指标提供了非常完美的视角。

理解当前的架构

尽管有了这些工具,我们仍然有一个棘手的问题需要解决:理清当前的架构,然后想清楚如何顺利地进行迁移。我们花了一些时间对遗留系统进行了重构,让它们支持新的网关,同时我们也加入了认证服务。在这个过程中,我们遇到了一些问题。

虽然我们可以对移动应用进行更新,但也要考虑到有些用户可能不愿意升级,所以我们要保持向后兼容,比如DNS,我们要确保旧版本也能正常工作。我们需要整理出所有公开和私有的API端点,并让它们自动地注册到网关上。我们需要把认证工作从主API迁移到新的认证服务上。确保网关和微服务之间通信的安全性。
为了解决这些问题,我们写了一个Go脚本,这个脚本会读取OpenAPI规范(Swagger)文件并为API资源创建规则(比如速率限定、配额、CORS等)代理。

我们在staging环境搭建了整个基础设施,并在上面运行自动化测试,对服务间的通信进行了测试。不得不说,自动化staging测试在整个迁移过程中起到了很大的作用。我们有很多功能测试用例,这些用例保证了主API的功能是完好的。

在确保了staging环境一切正常之后,我们开始考虑如何将它们推到生产环境。

第一次尝试

可以告诉大家的是,我们的第一次尝试简直是灾难性的。尽管我们已经做足了计划,不过仍然不足以把它们推向生产环境。先来看看我们的初始计划。

把最新的API网关部署到staging环境把主API的变更部署到staging环境在staging环境运行自动化功能测试通过网站和移动端进行staging环境的手动测试把最新的API网关部署到生产环境把主API的变更部署到生产环境在生产环境运行自动化功能测试通过网站和移动端进行生产环境的手动测试庆祝胜利
在staging环境一切进展得都很顺利,当我们准备进入生产环境时,问题出现了。

认证服务的数据库过载:我们低估了请求的流量,造成数据库拒绝连接错误的CORS配置:部分端点的CORS规则配置错误,造成请求无法获得资源
数据库被冲垮,我们不得不马上回滚。幸运的是,我们的监控系统捕获到了从认证服务获取令牌的问题。

第二次尝试

从第一次失败中吸取了教训,我们知道我们还没有为进入生产环境做好准备,于是在回滚之后,立即对问题展开诊断。在再次尝试之前,我们做了一些改进。

准备蓝绿(blue-green)部署过程。我们为生产环境创建了一个副本,包括已经部署好的网关,通过一些简单的配置变更就能让整个集群运行起来,如果需要回滚,也只需做一些简单的配置变更。从当前的系统收集更多的度量指标,这样可以帮助我们决定该使用多少机器来处理负载。我们利用第一次尝试时所使用的数据作为探针,并使用Gatling来运行负载测试,确保我们可以应付预期的流量。再次进入生产环境之前,我们对认证服务的已知问题进行了修复,包括一个大小写问题、一个JWT签名的性能问题,并添加了更多的日志和监控。
我们花费了一个礼拜来完成上述的工作,之后的部署进展得很顺利,中间没有停机。不过尽管部署进展得很顺利,我们仍然发现了一些在自动化测试中没有发现的个别问题,不过这些问题最终得到修复,并没有对系统造成太大影响。

结果

最终的架构如下图所示。


image

  主API

10多个主API部署在装配了高端CPU的主机上主从MySQL(3个副本)
认证服务

4个应用服务器主从PostgreSQL(2个副本)RabbitMQ用于异步地处理用户的更新操作
API网关

4个应用服务器主从MongoDB(4个副本)
其它

使用Ansible批量管理远程服务器使用Amazon CloudFront作为CDN/WAF使用Consul和HAProxy作为服务发现和客户端负载均衡工具使用Stasd和Grafana收集系统度量指标并触发告警使用ELK技术栈从不同的服务收集日志使用Concourse CI作为持续集成工具

本文转自d1net(转载)

相关文章
|
4天前
|
缓存 测试技术 API
构建高效后端API:实践与哲学
【9月更文挑战第36天】在数字世界的浪潮中,后端API成为了连接用户、数据和业务逻辑的桥梁。本文将深入探讨如何构建一个既高效又灵活的后端API,从设计理念到实际代码实现,带你一探究竟。我们将通过具体示例,展示如何在保证性能的同时,也不失安全性和可维护性。
|
19天前
|
存储 JSON API
深入解析RESTful API设计原则与实践
【9月更文挑战第21天】在数字化时代,后端开发不仅仅是编写代码那么简单。它关乎于如何高效地连接不同的系统和服务。RESTful API作为一套广泛采用的设计准则,提供了一种优雅的解决方案来简化网络服务的开发。本文将带你深入了解RESTful API的核心设计原则,并通过实际代码示例展示如何将这些原则应用于日常的后端开发工作中。
|
1天前
|
缓存 数据挖掘 API
商品详情API接口的应用实践
本文探讨了商品详情API接口在电商领域的应用实践,介绍了其作为高效数据交互方式的重要性,包括实时获取商品信息、提升用户体验和运营效率。文章详细描述了API接口的特点、应用场景如商品展示、SEO优化、数据分析及跨平台整合,并提出了缓存机制、分页加载、异步加载和错误处理等优化策略,旨在全面提升电商运营效果。
|
8天前
|
XML JSON API
深入浅出:RESTful API 设计实践与最佳应用
【9月更文挑战第32天】 在数字化时代的浪潮中,RESTful API已成为现代Web服务通信的黄金标准。本文将带您一探究竟,了解如何高效地设计和维护一个清晰、灵活且易于扩展的RESTful API。我们将从基础概念出发,逐步深入到设计原则和最佳实践,最终通过具体案例来展示如何将理论应用于实际开发中。无论您是初学者还是有经验的开发者,这篇文章都将为您提供宝贵的指导和灵感。
|
18天前
|
JSON API 网络架构
掌握RESTful API设计的艺术:从理论到实践
【9月更文挑战第22天】在数字化时代,API已成为连接不同软件和服务的桥梁。本文将引导你了解如何设计高效、可扩展且易于使用的RESTful API,涵盖从基础概念到高级最佳实践的全方位知识。我们将一起探索REST原则、HTTP方法的正确应用、资源命名策略等关键元素,并配以实际代码示例,让你能够将理论转化为实际操作,构建出既符合标准又能应对复杂业务需求的API。
|
1天前
|
消息中间件 缓存 API
构建高性能RESTful API的策略与实践
构建高性能RESTful API的策略与实践
7 0
|
1月前
|
监控 负载均衡 应用服务中间件
探索微服务架构下的API网关设计与实践
在数字化浪潮中,微服务架构以其灵活性和可扩展性成为企业IT架构的宠儿。本文将深入浅出地介绍微服务架构下API网关的关键作用,探讨其设计原则与实践要点,旨在帮助读者更好地理解和应用API网关,优化微服务间的通信效率和安全性,实现服务的高可用性和伸缩性。
44 3
|
1月前
|
前端开发 API 数据安全/隐私保护
打造高效后端API:RESTful设计原则与实践
【9月更文挑战第4天】在数字化时代的浪潮中,后端API作为连接数据和前端的桥梁,其设计质量直接影响着应用的性能和扩展性。本文将深入探讨RESTful API的设计哲学、核心原则以及如何在实际开发中应用这些原则来构建一个高效、易于维护的后端系统。我们将通过代码示例,揭示如何将理论转化为实践,从而为开发者提供一条清晰的道路,去创造那些能够在不断变化的技术环境中茁壮成长的API。
|
1月前
|
存储 JSON API
构建高效后端API:实践与思考
【8月更文挑战第31天】本文深入探讨如何打造一个高效、可靠的后端API。我们将通过实际案例,揭示设计原则、开发流程及性能优化的关键步骤。文章不仅提供理论指导,还附带代码示例,旨在帮助开发者构建更优的后端服务。
|
2月前
|
JavaScript 前端开发 API
深入浅出:使用Node.js搭建RESTful API的实践之旅
【8月更文挑战第31天】本文将带你踏上一次Node.js的探险之旅,通过实际动手构建一个RESTful API,我们将探索Node.js的强大功能和灵活性。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供宝贵的实践经验和深刻的技术洞见。