浅析如何设计一个亿级网关

2023-11-12

1.背景

1.1 什么是API网关

API网关可以看做系统与外界联通的入口,我们可以在网关进行处理一些非业务逻辑的逻辑,比如权限验证,监控,缓存,请求路由等等。

1.2 为什么需要API网关

  • RPC协议转成HTTP。

由于在内部开发中我们都是以RPC协议(thrift or dubbo)去做开发,暴露给内部服务,当外部服务需要使用这个接口的时候往往需要将RPC协议转换成HTTP协议。

  • 请求路由

在我们的系统中由于同一个接口新老两套系统都在使用,我们需要根据请求上下文将请求路由到对应的接口。

  • 统一鉴权

对于鉴权操作不涉及到业务逻辑,那么可以在网关层进行处理,不用下层到业务逻辑。

  • 统一监控

由于网关是外部服务的入口,所以我们可以在这里监控我们想要的数据,比如入参出参,链路时间。

  • 流量控制,熔断降级

对于流量控制,熔断降级非业务逻辑可以统一放到网关层。

有很多业务都会自己去实现一层网关层,用来接入自己的服务,但是对于整个公司来说这还不够。

1.3 统一API网关

统一的API网关不仅有API网关的所有的特点,还有下面几个好处:

  • 统一技术组件升级

在公司中如果有某个技术组件需要升级,那么是需要和每个业务线沟通,通常几个月都搞不定。举个例子如果对于入口的安全鉴权有重大安全隐患需要升级,如果速度还是这么慢肯定是不行,那么有了统一的网关升级是很快的。

  • 统一服务接入

对于某个服务的接入也比较困难,比如公司已经研发出了比较稳定的服务组件,正在公司大力推广,这个周期肯定也特别漫长,由于有了统一网关,那么只需要统一网关统一接入。

  • 节约资源

不同业务不同部门如果按照我们上面的做法应该会都自己搞一个网关层,用来做这个事,可以想象如果一个公司有100个这种业务,每个业务配备4台机器,那么就需要400台机器。并且每个业务的开发RD都需要去开发这个网关层,去随时去维护,增加人力。如果有了统一网关层,那么也许只需要50台机器就可以做这100个业务的网关层的事,并且业务RD不需要随时关注开发,上线的步骤。

2.统一网关的设计

2.1 异步化请求

对于我们自己实现的网关层,由于只有我们自己使用,对于吞吐量的要求并不高所以,我们一般同步请求调用即可。

对于我们统一的网关层,如何用少量的机器接入更多的服务,这就需要我们的异步,用来提高更多的吞吐量。对于异步化一般有下面两种策略:

  • Tomcat/Jetty+NIO+servlet3

这种策略使用的比较普遍,京东,有赞,Zuul,都选取的是这个策略,这种策略比较适合HTTP。在Servlet3中可以开启异步。

  • Netty+NIO

Netty为高并发而生,目前唯品会的网关使用这个策略,在唯品会的技术文章中在相同的情况下Netty是每秒30w+的吞吐量,Tomcat是13w+,可以看出是有一定的差距的,但是Netty需要自己处理HTTP协议,这一块比较麻烦。

对于网关是HTTP请求场景比较多的情况可以采用Servlet,毕竟有更加成熟的处理HTTP协议。如果更加重视吞吐量那么可以采用Netty。

2.1.1 全链路异步

对于来的请求我们已经使用异步了,为了达到全链路异步所以我们需要对去的请求也进行异步处理,对于去的请求我们可以利用我们rpc的异步支持进行异步请求所以基本可以达到下图:

由在web容器中开启servlet异步,然后进入到网关的业务线程池中进行业务处理,然后进行rpc的异步调用并注册需要回调的业务,最后在回调线程池中进行回调处理。

2.2 链式处理

在设计模式中有一个模式叫责任链模式,他的作用是避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。通过这种模式将请求的发送者和请求的处理者解耦了。在我们的各个框架中对此模式都有实现,比如servlet里面的filter,springmvc里面的Interceptor。

在Netflix Zuul中也应用了这种模式,如下图所示:

这种模式在网关的设计中我们可以借鉴到自己的网关设计:

  • preFilters:前置过滤器,用来处理一些公共的业务,比如统一鉴权,统一限流,熔断降级,缓存处理等,并且提供业务方扩展。

  • routingFilters: 用来处理一些泛化调用,主要是做协议的转换,请求的路由工作。

  • postFilters: 后置过滤器,主要用来做结果的处理,日志打点,记录时间等等。

  • errorFilters: 错误过滤器,用来处理调用异常的情况。

这种设计在有赞的网关也有应用。

2.3 业务隔离

上面在全链路异步的情况下不同业务之间的影响很小,但是如果在提供的自定义FiIlter中进行了某些同步调用,一旦超时频繁那么就会对其他业务产生影响。所以我们需要采用隔离之术,降低业务之间的互相影响。

2.3.1 信号量隔离

信号量隔离只是限制了总的并发数,服务还是主线程进行同步调用。这个隔离如果远程调用超时依然会影响主线程,从而会影响其他业务。因此,如果只是想限制某个服务的总并发调用量或者调用的服务不涉及远程调用的话,可以使用轻量级的信号量来实现。有赞的网关由于没有自定义filter所以选取的是信号量隔离。

2.3.2 线程池隔离

最简单的就是不同业务之间通过不同的线程池进行隔离,就算业务接口出现了问题由于线程池已经进行了隔离那么也不会影响其他业务。在京东的网关实现之中就是采用的线程池隔离,比较重要的业务比如商品或者订单 都是单独的通过线程池去处理。但是由于是统一网关平台,如果业务线众多,大家都觉得自己的业务比较重要需要单独的线程池隔离,如果使用的是Java语言开发的话那么,在Java中线程是比较重的资源比较受限,如果需要隔离的线程池过多不是很适用。如果使用一些其他语言比如Golang进行开发网关的话,线程是比较轻的资源,所以比较适合使用线程池隔离。

2.3.3 集群隔离

如果有某些业务就需要使用隔离但是统一网关又没有线程池隔离那么应该怎么办呢?那么可以使用集群隔离,如果你的某些业务真的很重要那么可以为这一系列业务单独申请一个集群或者多个集群,通过机器之间进行隔离。

2.4 请求限流

流量控制可以采用很多开源的实现,比如阿里最近开源的Sentinel和比较成熟的Hystrix。

一般限流分为集群限流和单机限流:

  • 利用统一存储保存当前流量的情况,一般可以采用Redis,这个一般会有一些性能损耗。

  • 单机限流:限流每台机器我们可以直接利用Guava的令牌桶去做,由于没有远程调用性能消耗较小。

2.5 熔断降级

这一块也可以参照开源的实现Sentinel和Hystrix,这里不是重点就不多提了。

2.6 泛化调用

泛化调用指的是一些通信协议的转换,比如将HTTP转换成Thrift。在一些开源的网关中比如Zuul是没有实现的,因为各个公司的内部服务通信协议都不同。比如在唯品会中支持HTTP1,HTTP2,以及二进制的协议,然后转化成内部的协议,淘宝的支持HTTPS,HTTP1,HTTP2这些协议都可以转换成,HTTP,HSF,Dubbo等协议。

2.6.1泛化调用

如何去实现泛化调用呢?由于协议很难自动转换,那么其实每个协议对应的接口需要提供一种映射。简单来说就是把两个协议都能转换成共同语言,从而互相转换。


一般来说共同语言有三种方式指定:

  • json:json数据格式比较简单,解析速度快,较轻量级。在Dubbo的生态中有一个HTTP转Dubbo的项目是用JsonRpc做的,将HTTP转化成JsonRpc再转化成Dubbo。

比如可以将一个 www.baidu.com/id = 1 GET 可以映射为json:

代码块

{
  “method”: "getBaidu"
  "param" : {
    "id" : 1
  }
}
  • xml:xml数据比较重,解析比较困难,这里不过多讨论。

  • 自定义描述语言:一般来说这个成本比较高需要自己定义语言来进行描述并进行解析,但是其扩展性,自定义个性化性都是最高。例:spring自定义了一套自己的SPEL表达式语言

对于泛化调用如果要自己设计的话JSON基本可以满足,如果对于个性化的需要特别多的话倒是可以自己定义一套语言。

2.7 管理平台

上面介绍的都是如何实现一个网关的技术关键。这里需要介绍网关的一个业务关键。有了网关之后,需要一个管理平台如何去对我们上面所描述的技术关键进行配置,包括但不限于下面这些配置:

  • 限流

  • 熔断

  • 缓存

  • 日志

  • 自定义filter

  • 泛化调用

3.总结

最后一个合理的标准网关应该按照如下去实现:

640?wx_fmt=png

4.参考

  • 京东:http://www.yunweipai.com/archives/23653.html

  • 有赞网关:https://tech.youzan.com/api-gateway-in-practice/

  • 唯品会:https://mp.weixin.qq.com/s/gREMe-G7nqNJJLzbZ3ed3A

  • Zuul:http://www.scienjus.com/api-gateway-and-netflix-zuul/

如果你觉得这篇文章对你有文章,可以关注我的技术公众号,也可以加入我的技术交流群进行更多的技术交流。你的关注和转发是对我最大的支持,O(∩_∩)O。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

浅析如何设计一个亿级网关 的相关文章

随机推荐

  • xlsx模块 前端_web前端:nodejs的xlsx模块批量解析与导出excel数据表简单使用

    ode js是一个基于ChromeV8引擎的Javascript运行环境 Node js使用了一个事件驱动 非阻塞式I O的模型 Node是一个让JavaScript运行在服务端的开发平台 它让JavaScript成为与php Python
  • python大一知识点汇总-python知识点汇总

    1 反编译 1 1Windows下生成pyd文件 加密 Windows下安装Python扩展提示 Unable to find vcvarsall bat https www cnblogs com yyds p 7065637 html
  • Spring Security的方法授权 用户授权 Fegin拦截器的使用

    1 业务流程 方法授权要完成的是资源服务根据jwt令牌完成对方法的授权 具体流程如下 1 生成Jwt令牌时在令牌中写入用户所拥有的权限 我们给每个权限起个名字 例如某个用户拥有如下权限 course find list 课程查询 cours
  • C++中后置++运算符重载(可链式操作)

    include
  • Qt布局中自定义控件大小而不是平均分配

    qt初学者 最近在用qt做界面时 发现在一个窗口里用了布局后 窗口里所有的控件的尺寸都平均分配了 而我的实际需求是想要一个控件固定大小另一个控件随窗口自适应变化 比如我现在有一个窗口 给他设置了竖直布局 里面有两个控件A和B 我想让A控件的
  • windows pcapng文件抽出udp负载

    wireshark收下的流是pcapng格式的 需要另存为pcap格式 依赖Npcap SDK 不同的需求抽取负载的方法不同 主要是负载的起始位置不同 我的需求 UDP传输 端口为10005 绑定的IP为192 168 178 1 所以设置
  • mysql 替换语句 替换字段内容(全部或部分)

    mysql 替换语句 替换字段内容 全部或部分 将cdb pms表subject字段中的Welcom to替换成 欢迎光临 UPDATE cdb pms SET subject REPLACE subject Welcome to 欢迎光临
  • 如何开启 Microsoft Dynamics 365(OP) 部署级别跟踪

    最近服务器有问题 需要开启一下D365 CRM的部署级别跟踪 查询官方文档 部署级别跟踪通过 Windows PowerShell 命令进行设置且在 MSCRM CONFIG 数据库中进行维护 部署级别跟踪只能在拥有 Dynamics 36
  • 阿里云DataWorks开发UDF函数,自定义一周开始时间

    今天使用阿里云套件quick bi开发一个报表 需求是自定义上周六到本周五为自然周来统计周指标 常规日期函数已经不能满足此需求 需自定义UDF函数来实现 具体解决过程如下 知识储备 我们知道hive有一个日期转周函数 weekofyear
  • MySQL高级语句(二):VIEW视图、正则及常见计算

    目录 一 VIEW 视图 1 1 概念 1 2 创建 查看和删除视图 二 联集 2 1 UNION 2 1 UNION ALL 三 交集值 3 1 两表没有单独重复的行 并且确实有交集的时候用 3 2 取两个SQL语句结果的交集 且没有重复
  • 环境搭建:Win 10 + Eclipse 搭建 C/C++ 开发环境

    Win 10 Eclipse 搭建 C C 开发环境 最近想利用 Eclipse 搭建一个 C C 开发环境 本以为是件很容易的事情 毕竟很久之前也搭建过 没想到耗了半天的时间 踩了好久的坑 在此记录一下实验过程 为什么用 Eclipse
  • Connect-The-Dots靶场

    靶场下载 https www vulnhub com entry connect the dots 1 384 一 信息收集 探测存活主机 netdiscover r 192 168 16 161 24 nmap sP 192 168 16
  • spring 多租户_使用Spring Security的多租户应用程序的无状态会话

    spring 多租户 从前 我发表了一篇文章 解释了构建无状态会话的原理 巧合的是 我们再次为多租户应用程序执行同一任务 这次 我们将解决方案集成到Spring Security框架中 而不是自己构建身份验证机制 本文将解释我们的方法和实现
  • 马斯克强制员工重返办公室:每周至少40小时,不然就走人

    据称特斯拉公司首席执行官埃隆 马斯克给该司员工发了一封电子邮件 要求他们要么回来到岗上班 要么离开公司 目前这封邮件被流传出来 引起了不少人的热议 网传邮件截图如下 或许是第一封邮件未能表达出全部讯息 马斯克很快又追加了第二封内部邮件 除了
  • 指定GPU运行python程序

    一 命令行运行python程序时 1 首先查看哪些GPU空闲 nvidia smi显示当前GPU使用情况 nvidia smi 2 然后指定空闲的GPU运行python程序 CUDA VISIBLE DEVICES 0 2 3 python
  • Python Intro - ipdb debug install

    1 build and install setuptools 1 1 download setuptools setuptools 15 0 tar gz 1 2 unzip setuptools tar xf setuptools 15
  • DFX分析 包括DFM等

    DFX 面向产品生命周期各个环节的设计 可制造 可装配 可靠性 可服务 可测试等等 DFX基于并行设计的思想 在产品的概念设计和详细设计阶段就综合考虑到制造过程中的工艺要求 测试要求和组装合理性 同时还考虑到维修要求 售后服务要求和可靠性要
  • 快手小铃铛跳转微信扫描技术多少钱教学

    快手小铃铛跳转微信扫描技术多少钱教学 快手小铃铛 快手小铃铛跳转微信 小铃铛跳转微信 宝贝 平台上的变现方案你都有参加吗 光合计划手气福袋拉新活动 我以前都跟大家分享了一下 今天介绍一下磁力精英小铃铛的变现 这也是一项大的变现 点来看 这是
  • /sys/module 模块信息与 /proc/modules

    看到一篇关于 proc moduels 以及 sys module 相关介绍 转载一下 http linux chinaunix net techdoc system 2008 07 18 1018163 shtml 在编译模块的时候 如果
  • 浅析如何设计一个亿级网关

    1 背景 1 1 什么是API网关 API网关可以看做系统与外界联通的入口 我们可以在网关进行处理一些非业务逻辑的逻辑 比如权限验证 监控 缓存 请求路由等等 1 2 为什么需要API网关 RPC协议转成HTTP 由于在内部开发中我们都是以