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

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签名的性能问题,并添加了更多的日志和监控。
我们花费了一个礼拜来完成上述的工作,之后的部署进展得很顺利,中间没有停机。不过尽管部署进展得很顺利,我们仍然发现了一些在自动化测试中没有发现的个别问题,不过这些问题最终得到修复,并没有对系统造成太大影响。

结果

最终的架构如下图所示。

  主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(转载)

时间: 2024-10-09 22:32:38

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

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

HelloFresh最近以零停机的方式将应用迁移到了一个新的API网关,其技术总监ítalo Lelis de Vietro在一篇文章中分享了他们所面临的挑战以及迁移的过程. 在这次迁移之前,HelloFresh已有的API是单体架构的.为了迁移至微服务架构并让微服务的创建更加简单,同时还要与他们的基础设施进行集成,他们构建了一个新的API网关,这个网关会涵盖已有的和新的服务.他们的基础设施已经有了一些组件,包括服务发现.基于Ansible的自动化以及广泛存在的日志和监控,这些组件都会让微服务更

Leo|20页PPT剖析唯品会API网关设计与实践

刘璟宇Leo 唯品会资深研发工程师,在大型高性能分布式系统设计和开发方面有丰富的经验.目前在唯品会平台与架构部负责唯品会API网关和服务安全方面的设计.开发.运营工作. 内容解析 1. 为什么引入网关 唯品会是一家专门做特卖的网站,唯品会网站是一个巨大型的网站,每张页面背后,都有多个服务提供静态资源和动态数据. 这是唯品会网站上一张商品详情页面,内容是一款女式针织衫.页面里,除去静态页面.图片之外,有些动态内容:商品价格.促销提示语.产品介绍.商品库存等.每个部分都会从后端的一个或几个服务拉取数

揭秘ZSearch2.0—基于OpenResty的API网关设计

背景 OpenResty 是一个支持lua的nginx,并且内置了一些常用的lua库.利用lua,我们就可以便捷得扩展nginx能力,甚至可以直接作为Web服务对外提供. 主页链接 由下图可以看出,我们可以在各个阶段进行干预. 设计 本文介绍的API网关设计很简单,主要有路由,过滤器,拦截器三个部分组成. 可以实现权限验证,日志记录,参数改写,限流限速等功能. 实现关键 这套方案实现并不复杂,主要是对nginx的干预要可控,对nginx主要的干预点有三个. init_worker_by_lua_

企业级API网关的设计

一.网关简介 1.1 API网关背景介绍 本文讲的是企业级API网关的设计,API Gateway(APIGW / API 网关),顾名思义,是出现在系统边界上的一个面向API的.串行集中式的强管控服务,这里的边界是企业IT系统的边界,主要起到隔离外部访问与内部系统的作用.在微服务概念的流行之前,API网关的实体就已经诞生了,例如银行.证券等领域常见的前置机系统,它也是解决访问认证.报文转换.访问统计等问题的. API网关的流行,源于近几年来,移动应用与企业间互联需求的兴起.移动应用.企业互联,

独家:阿里巴巴DevOps落地实践玩法及思路解析

互联网时代,随着业务的迅猛发展,企业越来越希望通过实施DevOps来提升研发.运维等IT部门的效率,支撑业务发展.互联网企业如何利用工具让DevOps落地?传统企业如何提升研发效能,更快速的互联网化?这些都是企业面临的问题.   7月26日,阿里巴巴持续集成持续交付平台--云效,在深圳阿里中心举办了一场"业务为王时代,DevOps怎么玩?"主题沙龙,由阿里巴巴技术专家从云效新概念的提出,到阿里巴巴DevOps落地实践.到企业如何利用云效进行高效研发.再到阿里巴巴CI/CD之分层自动化,

专访北京飞搜科技:一个创业公司该怎样在人工智能大潮中成长

  北京邮电大学董远教授指导北京飞搜科技获得VOT2017第二名 作为计算机视觉顶级会议的ICCV2017在美丽的意大利威尼斯成功落幕,40%的投稿来自中国,华人学者继续在AI领域引领一股思潮,无论是对于学术界还是工业界都能带来很多启发.每一届的ICCV workshop比赛都吸引了包括谷歌,微软,FaceBook等巨头公司参加,可谓明星璀璨,而ICCV的workshop更关注算法的某一领域算法的极限性能,因此能在workshop中独占鳌头的队伍代表了该领域的最高水平.在COCO比赛中,以商汤,

使用API网关建立多场景测试环境

        在软件/应用系统开发过程中,系统的好坏不仅取决于架构设计.可行性分析及功能实现,还需要一套完善的测试机制来保证质量,这往往需要变换场景进行多轮测试,以保证每个隐蔽的BUG都能够被发现.那就迫使在实际的开发中有多套测试环境,比如:一套稳定的测试环境,供系统内部系统调用:多套项目环境,并行开发:还需要有一个能模拟线上的测试环境,来模拟测试.         API网关作为系统内外的分水岭,当然也不会忽视对测试环境的支持.可以通过API网关的环境管理功能来实现测试环境的管理.目前每个A

Jenkins和Docker在HULK的落地实践

本文讲的是Jenkins和Docker在HULK的落地实践[编者的话]巧妇难为无米之炊,玩容器,"镜像"就是下锅的米,我们私有云Hulk平台的容器服务,向用户提供UI页面化的一整套的镜像定制.制作.管理.私有镜像仓库的服务,这套服务的背后技术实现,Jenkins算是"引擎",本文简要介绍这其中的技术方案. [3 天烧脑式基于Docker的CI/CD实战训练营 | 北京站]本次培训围绕基于Docker的CI/CD实战展开,具体内容包括:持续集成与持续交付(CI/CD)

API网关遇上容器服务

在API经济和微服务的背景下,如何对服务的API进行管理是大家都很感兴趣的话题.本文通过利用阿里云的容器服务和API网关,构建一个完整的基于Docker的具有API管理功能的服务. API管理 假定我们需要这么一个经典的后端服务,访问如下API接口的时候返回Hello World: $ curl http://apisvc.hostxx/api <p>Hello World</p> 这个服务推出后广受欢迎,但是烦恼总是伴随幸福不期而至: 对API进行计费怎么做? 外界访问API的流