建设微服务API网关的一些实践

随着这些年微服务的流行,API网关已经成为微服务架构中不可或缺的一环。一方面它承担着服务对外的唯一门户,一方面它提取了许多应用的共性功能。

整体架构
我们的API网关目前的架构如下图所示,可以看到API网关处于一个什么位置,往上承接所有的南北流量,往下会分发流量到微服务应用或者BFF聚合应用,在BFF规范化之前我们仍然将其视为一个普通微服务应用。
目前API网关实现的功能包括请求分发、条件路由、API管理、限流隔离、熔断降级、安全策略、监控报警以及调用链追踪等。
我们的API网关基于RxNetty开发,整个流程是异步响应式的,可以达到较高的单机并发。基于少造轮子的理念,API网关的大部分功能都是结合现有平台实现。包括请求分发、条件路由基于微服务框架,限流隔离、熔断降级基于稳定性平台,监控报警基于监控平台等,安全策略基于大数据分析平台等。注册中心与配置中心则分别负责服务注册核心信息与第三方配置信息的下发。
请求分发
请求的分发路由应该是一个网关最基本的功能,在绝大多数基于Nginx开发的网关上,这部分功能通常基于动态更新代理的upstream。而在我们的实现中,认为网关是一个只订阅不注册的微服务而已,区别是微服务应用发起RPC调用指定了调用服务,而网关接收请求分发只有url信息。这可以通过简单的改造来复用已有微服务框架的服务发现功能。
经过一系列url规范化行动后,我们的url目前不同的应用都会采取不同的前缀,同时这个前缀信息会随着应用注册到注册中心。这样网关进行服务发现时会给不同的url前缀以及微服务应用构建不同的namespace对象,在进行请求匹配时候只需根据url前缀选取到对应的namespace即可匹配到对应微服务应用,后续就是现有微服务框架SDK的功能:路由、负载均衡直至完成整个调用。
这里还涉及到另一个问题,网关选择服务发现的应用是哪些?即我需要拉取哪些应用信息以构建namespace?我们这里对服务发现对象进行了管理,用户可在管控平台上控制微服务应用在网关层的上下线,这会通过我们的配置中心推送到网关并进行一次热更新,刷新内存缓存,这样就做到了请求分发服务的动态增减。
条件路由
条件路由意味着可以对具有特定内容(或者一定流量比例)的请求进行筛选并分发到特定实例组上,是实现灰度发布、蓝绿发布、ABTest等功能的基础。
同样的,在基于Nginx开发的网关中,一般是维护多套upstream列表,然后通过某种策略将不同请求代理到不同upstream。
在我们的实现中,条件路由依然是复用现有的微服务框架,避免重复造轮子。每个应用都可以根据一些规则创建一些分组,分组中有若干实例。在网关进行服务发现初始化时会给每个应用创建Invoker代理对象,Invoker内会根据不同的分组创建不同的Space空间,请求调用时会对这些Space空间进行规则匹配,从而决定是否路由到特定分组上。整个过程都是微服务框架完成的,没有额外的开发工作。
目前我们支持按照特定内容或者流量比例两种方式进行请求来源规则的匹配,特定内容包括http请求的header、attribute等等。我们目前的实例分组主要是根据“版本”这个标来区分的,所以分配规则主要是支持“版本”维度,未来考虑支持到Kubernetes的Pod label。
API管理
API网关为什么前面要有API几个字,我觉得其中一个很重要的原因就是具有API管理功能。当我们的大部分应用还是裸连网关,而不是经过BFF聚合时,我们有必要对每个API接口都进行管理,以区分哪些是微服务间内部调用,哪些是暴露给前端/客户端调用。
实现上和之前的应用上下线类似,额外依赖了DB存储,用户在管控平台进行API发布等操作会先存储在DB中,随后通过配置中心pub/sub通知到网关。我们在namespace匹配前加入了一层filter以过滤删除/未上线的API,所以热更新该filter对象即可。
用户体验方面我们也做了一些工作,包括:
  • 从微服务管控平台直接同步新增的API接口到网关管控平台,而无需手动添加。此外也支持多种格式的文件导入。(我们的微服务注册模型会包括API信息等元数据)

  • 各个环境之间通过流转功能发布API,而无需重复添加

  • 对各个状态的筛选展示

  • 与DevOps平台配合,在应用发布流转时同步提醒进行API管理的发布流转。

限流隔离/熔断降级
API网关作为南北流量的唯一入口,一般具有较高并发度,以及流量复杂性。所以对入口流量进行整治管理是很有必要的。
我们的限流隔离/熔断降级均基于稳定性平台与配置中心实现,稳定性平台是我们基于Sentinel二次开发的。整个结构如下图所示:
稳定性相关的功能主要包括限流隔离以及熔断降级。限流隔离主要是作用在流入方向服务端测的流量控制,其中限流主要是控制QPS,隔离主要是控制并发数。熔断降级则是作用在流出方向客户端测的流量控制,可以配置在一定错误率情况下进行熔断,并配合降级数据快速返回。
以上规则均可以通过稳定性平台配置,然后由配置中心分发到API网关,再进行热更新刷新内存缓存。每次请求时sentinel sdk都会帮我们做好数据统计并判断是否符合规则,同时被限流隔离、熔断降级的流量都会通过相关SDK(基于Prometheus)暴露Metrics数据给监控平台,以便我们随时观察到流量控制水平。
安全策略
时常我们会遇见一些异常流量,典型的就是恶意爬虫,所以完善一些基础的安全策略是必要的。
整个安全策略的结构如上所示。用户可以在网关管控平台手动进行规则配置,经由配置中心下发到API网关的securityControl进行热更新。在请求来临时由securityControl判断是否符合规则,被封禁的流量同样暴露metrics数据给监控平台供我们随时查看。
此外,手动配置封禁规则在某些场景可能比较低效。我们同时还会将网关日志实时采集至大数据分析平台,经分析后如果判断某个IP或者用户存在异常情况,会自动配置安全策略规则至网关管控平台,同时触发一个报警提醒业务owner。
在安全策略目标方面,我们目前支持包括根据客户端IP、用户ID、其余http header/attribute等。策略行为方面目前支持快速失败以及验证码,后者用户会在前端被跳转到一个人机验证码的页面。
监控报警/调用链追踪
与其他微服务应用一样,我们的API网关也有完善的监控报警、调用链追踪、日志查询等功能。这里监控主要指的是查询Metrics信息,调用链主要指查询tracing信息,日志顾名思义就是logging,三者是监控领域很典型的信息了:
报警这块除了针对Metrics信息/错误日志的报警,还可以支持主机层面的报警。
得益于监控平台以及调用链埋点SDK,API网关几乎不需要改造成本即可接入。整体结构如下所示,API网关内嵌了Metrics SDK暴露Metrics信息到Endpoint供监控中心拉取,tracing sdk负责埋点打印tracing日志,tracing日志和业务日志均会通过日志采集器输入监控中心处理。在监控平台上,用户可以查询调用链、监控、日志信息,API网关发生的主机异常或者业务异常也会报警给owner。
这里值得一提的是,当网关调用后端微服务应用发生异常时,例如超时、连接池耗尽等,这些错误发生在客户端即API网关,所以触发的报警只会报给API网关的owner。但是API网关仅仅作为一个转发服务,其超时很大程度是因为后端微服务rt过高,所以报警应该同时报给后端微服务owner,为此我们开发了双端告警,一份告警会同时发送给客户端和服务端双方。
一些总结
当然API网关还有许多没有展开说的:
  • 我们还支持websocket协议,本次没有详细说。

  • 在多云部署环境下,网关承载了一个多云流量调度服务的角色。

以及未来可以优化的地方:
  • 首先是我们的高并发能力并未怎么经过实际验证,由于tob商业模式公司没有太多高并发的场景。

  • 考虑引入规则引擎来应付各种下发的规则,包括安全策略、稳定性、路由规则等。

  • 安全策略考虑会支持更多一些,例如IP网段,及支持各种逻辑与或非。

(0)

相关推荐

  • 微服务架构师的道、法、术

    作者:李鑫 | 天弘基金移动直销平台技术负责人 出品:百林哲 导语: 这几年微服务的热度持续居高不下,企业纷纷向微服务架构转型.但微服务架构会对整个研发体系,包括开发.运维.团队协同.组织架构都带来冲 ...

  • .Net Core with 微服务 - 架构图

    dotNET跨平台 今天 以下文章来源于馒哥不光会玩当耐特 ,作者MJZHOU上一次我们简单介绍了什么是微服务(.NET Core with 微服务 - 什么是微服务).介绍了微服务的来龙去脉,一些基 ...

  • 微服务治理与统计分析

    引言: 微服务架构下,服务拆得越细,服务的粒度越小,可组装性就越好:与之相对的服务之间的调用关系就会变复杂,为了保证服务更好的运行,需要对这些服务进行监控和管理.本文大家介绍下EOS微服务平台如果对微 ...

  • 基于ESB和API网关的服务运行监控分析和实践

    今天准备谈下基于ESB或API网关的服务运行监控分析,对于服务运行分析和监控本身也属于服务治理或微服务治理的一个关键内容. 为何基于ESB或API网关? 当所有的接口服务和API接入到ESB或API网 ...

  • 爱奇艺微服务标准技术架构实践「转」

    原文地址:https://www.infoq.cn/article/AJj3lKQyaKVeA08Bgj9e 背景 为数以亿计的用户提供优质的视频服务的爱奇艺技术产品团队,为了适应业务的快速迭代和创新 ...

  • 亿级流量架构之网关设计思路、常见网关对比

    本文准备围绕七个点来讲网关,分别是网关的基本概念.网关设计思路.网关设计重点.流量网关.业务网关.常见网关对比,对基础概念熟悉的朋友可以根据目录查看自己感兴趣的部分. 什么是网关 网关,很多地方将网关 ...

  • 使用 Node.js 搭建一个 API 网关(助力微服务)

    外部客户端访问微服务架构中的服务时,服务端会对认证和传输有一些常见的要求.API 网关提供共享层来处理服务协议之间的差异,并满足特定客户端(如桌面浏览器.移动设备和老系统)的要求. 微服务和消费者 微 ...

  • spring cloud微服务快速教程之(五) ZUUL API网关中心

    0-前言 我们一个个微服务构建好了,外部的应用如何来访问内部各种各样的微服务呢?在微服务架构中,后端服务往往不直接开放给调用端,而是通过一个API网关根据请求的url,路由到相应的服务.当添加API网 ...

  • 微服务和API网关限流熔断实现关键逻辑思路

    作者:人月神话,新浪博客同名 简介:多年SOA规划建设,私有云PaaS平台架构设计经验,长期从事一线项目实践 今天准备谈下微服务架构和API网关中的限流熔断,当前可以看到对于Spring Cloud框 ...

  • 通过API网关实现微服务管控-限流,熔断和降级

    今天准备谈下基于API网关来实现微服务治理管控中的服务限流,熔断和降级方面的内容.在前面谈微服务架构的时候也谈到过类似通过Hystrix,Sentinel来是服务限流熔断.包括也不断地在谈去中心化架构 ...

  • 微服务实践之分布式定时任务

    承接上篇:上篇文章讲到改造 go-zero 生成的 app module 中的 gateway & RPC .本篇讲讲如何接入 异步任务 以及 log的使用. Delay Job 日常任务开放 ...

  • 微服务架构下的API接口驱动开发,设计和集成

    今天谈下在微服务架构下,接口设计和开发方面的思考. 对于微服务架构,SOA和Http Rest API接口设计,在我前面的头条文章中均有专门的说明,因此对于基础方面的解释在本文不再重复.对于今天要写的 ...

  • ASP.NET Core微服务最佳实践eShopOnContainers

    为了推广.Net Core,微软为我们提供了一个开源Demo-eShopOnContainers,这是一个使用Net Core框架开发的,跨平台(几乎涵盖了所有平台,windows.mac.linux ...

  • 微服务网关 zuul 替代者 gateway 网关路由

    简述 Spring Cloud Gateway 是 Spring Cloud 的一个子项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技 ...