在一个大型的互联网架构中,网关是一个不可或缺的组成部分,往往与大流量、高并发的技术直接相关。本文介绍了网关技术的背景知识以及设计网关的基本原则和方法。
一、序
天猫精灵设备网关是阿里巴巴人工智实验室专门为天猫精灵提供的统一接入网关,涉及天猫精灵设备的上下行数据都会经过该网关,包括但不限于各设备模块状态变化(系统、闹钟、播放器、IoT设备等等)、用户唤醒天猫精灵后的语音流、以及云端对天猫精灵的控制指令、TTS音频流等。为什么需要设备网关?设备网关有哪些职责?设计设备网关时需要关注哪些问题?
二、为什么需要设备网关
随着互联网的发展,业务场景越来越复杂,单一Web应用已无法满足业务的发展诉求,微服务架构逐渐成为了主流。为了对客户端屏蔽服务端架构,实现服务端的快速迭代,API 网关基本成为了微服务架构的标配组件。API 网关作为客户端访问服务端的唯一入口,内部服务只需专注于业务逻辑,与业务无关的通用功能都提取到API 网关统一处理,使得搭建一个内部服务变得更加简单、高效。天猫精灵发展速度非常快,设备类型较多,认证鉴权方式有好几种,应用协议也有数个版本,如果没有网关,每个内部服务都需要支持多种认证鉴权方式、理解多个版本的应用协议,内部服务的开发成本会急剧上升。
天猫精灵设备既支持用户主动语音交互使用,也支持用户通过APP进行远程点播、远程控制。为保障用户体验,响应需要及时,设备端和服务端需要能够全天候全双工的通信通道。设备端可以主动给服务端发送数据,服务端也可以主动推送数据给设备端。如果没有网关,每个内部服务都需要与设备端维持这么一条全双工通道,对服务端、设备端的资源成本都是极大的浪费。
从安全性来看,如果没有网关,每个内部服务都需要对外部网络暴露以提供访问,大大增加了被黑客扫描攻击的几率,不利于内部服务的安全保障。
三、设备网关职责
设备网关也是一种API网关,API网关具有的职责也适用于设备网关,除此之外设备网关也有自己的一些特有职责,总的来看设备网关具备这些职责:
1.认证鉴权
作为服务端对外暴露的唯一入口,认证鉴权是非常必要的。通过认证鉴权,确保请求的用户、设备是合法的,请求的资源是有权限的,将不合法的设备请求在入口处就进行拦截丢弃,保障了内部服务、内部资源的访问安全。
2.协议适配
内部服务之间通常是基于高效RPC的方式进行通信,而对外与设备端交互使用的可能是其他协议。网关提供了协议适配的能力,将设备端的请求数据转成内部RPC的数据格式后再分发给内部服务,将内部服务下发的RPC数据转成设备端可理解的协议后再转发给设备端。另外,协议随着业务的发展在不断迭代,同一个功能的接口可能迭代了数个版本,数据结构可能也进行了调整,而设备端一旦流通出去后不一定能得到及时升级,可能还有相当一部分设备端在使用着旧版本的接口,为了减少内部服务的维护成本,网关也会提供新旧版本协议的适配翻译。
3.路由分发
路由分发可以说是网关最核心的职责,一个无法做路由分发的网关根本就称不上是个网关。设备端发送过来的请求,网关需要能根据请求信息进行正确的路由,将请求分发给合适的后端服务;后端服务发送过来的数据(对请求的响应或后端服务主动推送),网关需要能正确路由分发给指定的设备。路由分发通常还会具备负载均衡、流量灰度的特性,根据后端服务的健康状态、负载信息、机器权重、灰度分组等进行请求分发。
4.限流熔断
限流和熔断也是网关比较重要的能力。每个功能接口、每个内部服务都有自己正常合理的访问频次区间,超过阈值的通常是非授权使用,可能会导致内部服务超过安全水位影响服务的稳定性,网关提供通用的限流能力,将超过阈值的请求进行拦截处理。内部服务也可能因为各种原因临时出现不稳定的情况,比如某台机器可能因宿主机临时负载飙升导致响应时间拉长,若请求继续分发到这台有问题的机器上可能会使情况加剧恶化,严重时甚至形成雪崩效应。网关提供的熔断能力可以在机器或服务异常时自动将该机器该服务屏蔽,避免情况继续恶化,在机器服务恢复正常时,网关自动将该机器服务纳入到正常服务分组中。
5.日志审计
既然网关是设备端访问服务端的唯一入口,进出数据都会经过网关,网关进行日志审计也是顺理成章的。请求和响应都进行打点记录,服务访问的数据情况都可自动采集分析,如QPS、RT、成功率、设备端分布等,根据这些数据可以进行业务分析、监控告警、自动运维等等。
6.连接管理
前面提到了天猫精灵需要有全天候全双工的连接通道,网关作为设备端与服务端的唯一出入口,是连接通道的提供方。设备连接到哪一台网关机器上、当前连接是否存活都需要由网关进行管理。
7.音频流分发处理
天猫精灵是个智能语音设备,输入输出有很大一部分是语音流,而后端服务大部分不具备语音流处理的能力,网关还需要进行语音流的分发处理能力,例如将语音流转成文本、将文本转成语音流等。
四、如何设计一个网关
设计一个网关时,除上面提到的功能需求外,还需要考虑到运营需求、运维需求、性能需求。
功能需求
功能需求上面已经介绍过,这里不太细述。
运营需求
何为网关的运营需求呢?后端服务是会不断增加不断扩展的,面向开发者提供的平台能力我称之为网关的运营需求。
1、API生命周期管理
从API的定义、测试、灰度、上线到最终下线,支持日常管理、版本管理、快速回滚等,提供完善的平台管理能力。
2、流量控制
业务流量不是一成不变的,随着业务的发展、促销活动的投入等,流量可能时有变化;服务的优先等级也可能各有不同,在资源受限的情况下,优先保障高优先级的服务。在这些情况下,需要有能力提供给后端服务进行动态的流量控制。
3、拦截器管理
随着业务发展,功能接口可能需要不断迭代,前置参数校验、协议适配转换、错误处理等都可能会变化调整,网关平台需要能够让业务方自助修改拦截器,否则每次变动都需要依赖网关发布,网关会成为业务瓶颈,网关频繁发布对服务稳定性也有较大影响。
4、开发支持
提供在线调试工具,自动生成API文档、SDK,大大降低开发者的接入难度,提高开发效率。
5、监控告警
给业务方提供在线实时查询、订阅服务访问数据的能力,并可配置规则进行业务告警,让业务方随时掌握自己服务的运行情况。
运维需求
网关的运维需求主要表现在网关的稳定性、高可用上。网关作为设备端与服务端的唯一出入口,是逻辑上的单点,一旦发生故障将造成整个系统的不可用,对企业来说可能是致命的。如何保证网关能够7X24稳定运行就是必须考虑的问题。
1、水平扩展
业务访问量与发展情况、促销活动等高度相关,网关需要能够根据业务情况、负载情况进行动态扩缩容。
2、流量迁移
机器是不可靠的,在出现故障时或即将下线维护时,需要有机制能够将流量进行平滑迁移,避免用户受到影响。
3、优雅上线
服务刚上线时,可能会需要一段时间进行初始化准备工作(缓存加载预热、JIT等),在此期间服务可能负载会较高,若刚上线就分配太多流量可能会导致服务被压垮。为了避免这种情况,网关需要支持优雅上线的能力,即通过一段时间逐渐加量的方式加到预设的正常流量。
4、动态更新
网关的每一次变更都可能会对服务可用性带来影响,尽量将功能做成插件的形式支持热更新,可避免对网关的频繁改动,确保服务的稳定性。
性能需求
作为设备端与服务端的唯一出入口,所有流量都会经过网关,可想而知网关的压力是极大的。如果不能保证网关的高性能,随着业务的快速增长,网关可能会需要跟随后端服务的机器同步增长,带来成本的极大上升,这对企业是无法忍受的。