优秀网关应该具备的功能

基础功能:

1 路由转发

  路由转发是网关最最基础的功能,没有之一,一个不具备转发功能的网关不具备任何使用价值。转发功能的优劣取决于转发策略的丰富度,常用的转发策略有基于host转发、path转发、加权轮询、根据自己业务场景在request中根据header内容进行转发等等。在实现这些逻辑时我们要注意一些网关层的“潜规则”,例如最长匹配规则(当host或path同时满足多个匹配规则时要把请求路由到匹配度最精确的目的地)、IpSource规则(尽量将同一客户端ip请求路由到同一个目的地)。

2 过滤增强

  之所以叫增强,是借鉴了AOP中的概念,分为前置增强、后置增强、环绕增强、异常增强等等,在网关层就是指对request或response报文的修改。通过给增强器设置order来协调它们之间的优先级。过滤增强是网关层与业务息息相关的核心功能,如果一个网关层不具备过滤增强,那我们也没有使用它的必要。

3 限流保护

  限流保护虽然不是网关层最核心的功能,但往往是业务部门愿意接入网关层的最重要原因,因为在代码设计上并不是所有的服务节点都开发了自我流量保护,所以躲在网关层下面是个不错的选择。限流保护的策略也很多,按不同的维度也可以拆分为不同的策略。按南向是否动态扩容缩容可以分为静态限流和动态限流。静态限流是固定了限流的阈值,常用于物理机房或包年包月机器;动态限流会根据真实服务能力做动态的阈值变更,常用于云平台具备弹性能力的服务节点。按统计方式可以分为信号量限流和连接数限流,前者可以理解为打点器,后者是维护连接数。

4 XFF维护

  该功能在网关层虽然可有可无,但是这是Http协议中规定作为网关层必须要遵守的“潜规则”,网络中每一层代理都要在X-Forwarded-For中追加自己的ip,这一点很容易被忽视。

 

辅助功能:

1 动态配置

  网关不同于其他产品可以随时更新,稳定性永远是网关的第一要求,所以尽最大可能通过配置来影响网关并且支持热更新,否则频繁的迭代或重启是一个生产级别网关不能容忍的。动态配置框架推荐netfix的archaius,支持很多种动态加载方式。

2 灰度策略

  这个功能点是紧接着动态配置来讲的,因为网关的任何一次配置的变更影响的不仅是网关层本身,而是整个网关覆盖到的所有业务,极端情况下一次配置错误可能会引起所有业务的崩溃!所以势必需要一个灰度的过程来避免全网瘫痪,所以网关层配置更新、新版本发布等都必须要支持灰度策略,先少量机器尝试下,确定安全无害后再全网点更新。

3 自我保护

  网关层作为所有流量的唯一入口,自我保护也是相当重要的。

  第一,限流保护。此处的限流不是南向的限流,而是北向的限流,保证网关层自身不被洪峰压垮。常用的限流策略是令牌桶,优先保证拿到令牌的http请求,溢出部分不予理会。

  第二,超时服务剔除。网关层的资源是所有业务公用的,如果有响应超时、南向无返回、一直等待等情况出现会导致网关资源无法释放。虽然新一代的NIO网关中开销可以小的忽略不计,但“勿以恶小而为之”,假如没有一套剔除机制整个网关处理能力越来越差,最终资源耗尽引发重大故障。

4 访问日志

  访问日志看似可有可无,对整个网关服务没任何价值,但这是日常运维中链路分析的数据依据,否则你连自己对一次请求处理了多少时长、request是什么、response是什么、http方法是什么、返回code是什么都清楚。

  日志不要洛本地,不要洛本地,不落本地,重要的事情说三遍,因为日志量会大到你根本落不下。

5 请求重试

  该功能不强求,因为重试需要建立在南向提供服务的节点具备幂等性,否则重试不但不会带来任何收益,还会造成灾难。一般来讲"GET", "HEAD", "OPTIONS"这三种http方法的请求是需要重试的。

6 统计与监控

  网关层一般需要提供入网流量波动图、频响图等统计报表,还需要配合监控系统提供监控数据,例如Prometheus的exporter,虽然这些通过访问日志也可以在日志收集端清洗出来,但无论是从时效性还是成本上考虑都不如网关层直接提供来的方便。

 

高阶功能:

1 扩展性

  扩展性是任何产品从设计初就应该作为第一优先考虑的部分,一般分为水平扩展和垂直扩展两个维度。水平扩展是通过更多的服务器来提供更高的并发,垂直扩展是通过写入更多的代码逻辑来提供更广的服务。

2 性能调优

  优秀的网关响应时间一定要足够的低,个人认为要控制在10ms以内,不能让南向感知到明显的延时,否则就是失败品。调优的策略基本就是算力与存储的平衡,也就是时间和空间的交换。是牺牲时间换空间,还是牺牲空间换时间,如果网关层部署在云平台,理论上可以采购到任何你需要的机型,那么一定要把响应时间作为唯一参考。因为响应时间越低,相同并发下qps就越高。

3 动态过滤器

  这一点我认为是网关层的加分项吧,并不是必须的,但随着混沌工程这一理念的兴起,动态过滤器这个加分项的分值会越来越高。我们把常驻的过滤器称为静态过滤器,把需要随便创建并只使用一段时间的过滤器称为动态过滤器。例如混沌工程要模拟某种故障,计算节点上从http请求的header中是否存在该故障的标签为启动故障的判断依据,那么就可以创建一个动态过滤器为满足一定需求的http请求打上混沌工程需要的标签,混沌测试结束或达到超时时间点时该过滤器自动删除。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章