大量新老项目接入,服务限流如何排除差异快速落地?
一 、大量地背景
1、新老项目限流场景某一天有一个项目服务突然出现异常 ,接入我们定位到的服务原因是有大量的突发流量进来 ,那么我们会先采取被动的何排临时手段去处理当前故障,接着上线Nginx的除差限流功能进行快速止损,防止二次故障。异快但是速落Nginx的限流功能是比较粗糙的 ,服务器租用所以我们有一个更好的大量地长期措施 ,即项目接入限流功能 ,新老项目限流并实现按维度进行精细化的接入限流,化被动解决为主动防御 、服务主动治理 。何排对于这一个项目来说 ,除差做到这一步应该是异快比较好的效果。

那么我们能否更进一步?更进一步我们需要考虑经验积累 、通用性 、整体效益这三个方面。
经验积累 :有什么经验总结可以被其他项目借鉴 ?通用性 :解决方案其他项目可以直接使用吗?整体效益:可以降低团队的整体成本吗?2 、香港云服务器问题与目标我们的方案设计需要考虑不同项目之间的差异性 ,因为我们需要接入的项目可能有十几个甚至更多,不同项目的差异性会体现在开发语言、请求类型、生命周期、部署环境 、链路节点等方面 。

其中我们特别需要注意的是生命周期,有的项目可能是源码库十几年前就存在的老项目 ,有的可能是最近两三年的较新的项目,还有的可能是以后会建立的全新项目,我们的方案需要能够同时匹配这三种项目,以及需要抹平其他的几种差异。
此外 ,亿华云我们的方案也有一些其他的期望目标 ,比如低成本 、高效率、高质量,以及专业性 、稳定性 、可扩展性、高性能。
低成本 :接入所需的成本是比较低的,包括开发、运维、源码下载硬件等成本 。高效率 :能够快速完成接入落地工作 。高质量 :提供了整套限流的解决方案 ,接入方使用前后都能够得到有效的技术支持和指引。其他几点则比较好理解,那么摆在我们眼前的问题就是项目的数量多,差异性大 ,期望目标和要求也多 ,那么我们应该如何设计这个方案 ?
3、协作方式在介绍具体的技术方案之前,建站模板我简单讲述一下我们的协作方式 。
在公司内部推广一个技术落地,我们通常会采用单项目的方式进行,即单独某个项目了解需求 、设计 、开发,在本项目落地之后再逐步推广到其他项目 ,这种方式虽然没有问题,但是存在几个缺点:
需求的全面性:不能充分兼顾到其他项目的需求 ,方案设计上可能会有缺漏,导致后期推广困难,因为只考虑到了本项目的需求和场景。成本负担 :成本由单一项目承担 ,可能会影响到项目组原本的工作 ,对项目本身也会有比较大的影响。基于以上情况,我们设计了一个专业组机制 ,希望能够让专业的人做专业的事 ,工作流程如下 :
首先从多个有需求的项目组里招募感兴趣或者有经验的成员加入专业组 ,比如图示里从项目组1 、项目组2和项目组3里各抽出一个人成立专业组,然后针对这几个项目设计总体方案 ,以满足他们的需求 ,在项目落地之后,再逐步推广到其他项目。

与单项目推进相比 ,专业组机制的优点如下 :
充分兼顾到了典型场景的需求。因为我们会从原先的三个项目组里去对接需求 ,那么这三个项目组的场景是比较明确的。成本由多个项目分摊。每个项目只需要出1~2个人即可,对项目组原先的工作影响程度较低 。专业组的进出机制可以充分发挥成员的技术积累优势和主观能动性。能够进专业组的成员一般是在专业问题上比较有技术积累的,或者是对该问题很感兴趣 ,会主动研究问题。在解决现有功能上,专业组在整个过程中发挥了很大的作用 。
二 、技术方案
下面我们介绍具体的技术方案 。
1 、限流实现层首先的问题是我们的限流应该做在哪一层?一般来说我们可以在应用层限流,也就是在API服务节点再增加一个web中间件 ,在请求进入API服务时判断请求是否被限流,这是比较常见的方式,对于单个项目而言成本也是最低的。
除了应用层实现限流之外 ,还有接入层实现限流的做法。在原先的LB到API节点之间 ,我们可以增加一个网关层 ,将限流功能做在网关层。

两种方法相比较,应用层限流有以下缺陷:
异常流量依然落在API服务。如果有大量的突发流量进来 ,还是会把压力落在API服务,那么效果相对而言是比较差的。逻辑耦合,无法独立变更限流功能。职责不明确 ,增加服务复杂性。多项目情况下难以复用 ,可行性低,无法达到我们的需求。比如我们前面提到的差异性 ,不同项目的开发语言 、部署方式等不一样 ,如果我们在应用层实现限流,就需要针对每一个项目单独适配,那么成本是比较高的 。基于以上情况我们选择了接入层实现限流 。在接入层实现,我们就需要一个网关作为统一的记录层。
2 、Kong网关按照官方的说法,Kong网关是一个轻量、快速 、灵活的云原生API网关 ,Kong是基于OpenResty和Nginx实现的 。我们在解决这一个问题的情况下,为什么要选择Kong ?也是基于我们常见的高性能、高可用、灵活 、易扩展等方面 。其中我们特别在意以下两点 :
一是轻量灵活 ,在最轻量部署的情况下,仅需一个主进程和一个yaml配置文件 。二是易扩展,Kong的插件机制可以实现在请求生命周期的各阶段执行自定义逻辑 ,也就是我们可以做很多自己需要的工作 。3、Kong插件Kong的插件机制可以支持多种语言 ,如Golang、Lua、Python 、JS 。我们选择了Lua和Golang作为我们的开发插件。两种之间的区别是Lua插件在Kong进程中是直接执行的,也就是它和Kong是同一个进程 ,而每一个Go插件是一个单独的插件 ,和Kong主进程之间的通信需要通过IPC进行。

Lua和Golang相比较 ,在团队技术栈匹配度 、生态、工程化难度、开发维护成本上 ,Golang都占有比较明显的优势 ,而在性能方面Lua会更高。因为Golang在插件每次执行的时候都需要进行IPC通信 ,在IPC通信次数较高的情况下,性能会受到较大影响。但是我们在实践过程中发现,在现有场景下 ,我们的IPC通信次数相对较少 ,对性能的影响也比较低。所以总体上我们是优先使用Golang开发插件