网关
网关的职责:网关 = 路由器(基础职能) + 过滤器(可选职能)
对于路由:如果需要对流量的特征进行分析,那必须是要在七层操作,否则直接在四层直接进行流量转发就可以了
不同的网关采用的网络IO模型不同 性能表现也不同
网关的可用性考虑:
- 网关应该轻量 达到功能性与可用性的平衡 职责过多是很危险的
- 选择成熟的网关产品
- 在网关之间加上负载均衡器或者路由器 以便让网关也能进行扩展
主要功能点
- 流量出入口
- API管理中心
- 流量管理
- 认证授权
流量网关
- 全局性流控
- 日志统计
- 防止 SQL 注入
- 防止 Web 攻击
- 屏蔽工具扫描
- 黑白名单控制
- 协议适配
业务网关
- 请求接入:作为所有 API 接口服务请求的接入点,管理所有的接入请求;
- 业务聚合:作为所有后端业务服务的聚合点,所有的业务服务都可以在这里被调用;
- 中介策略:实现安全、验证、路由、过滤、流控,缓存等策略,进行一些必要的中介处理;
- 统一管理:提供配置管理工具,对所有 API 服务的调用生命周期和相应的中介策略进行统一管理。
监控探头网关
sequenceDiagram 监控探头 ->> 网关: 推送数据 网关 ->> 监控探头: 拉取数据 网关 ->> 网关: 过滤/业务操作 网关 ->> OSS: 存储图像、视频数据 网关 ->> 消息队列: 推送结构化的视频图像信息
网关部署架构
- nginx面向服务器
- 网关面向服务
BFF( Backend for frontend)网关
graph TD; A[用户界面] -->|请求| B[BFF 网关] B -->|调用| C[服务 A] B -->|调用| D[服务 B] B -->|调用| E[服务 C] C -->|返回数据| B D -->|返回数据| B E -->|返回数据| B B -->|返回合并数据| A
Spring Cloud Zuul
Spring Cloud Gateway
- 路由
- 断言
- 过滤器
比较
网关 | 限流 | 鉴权 | 监控 | 易用性 | 可维护性 | 成熟度 |
---|---|---|---|---|---|---|
Spring Cloud Gateway | 可以通过IP,用户,集群限流,提供了相应的接口进行扩展 ,gateway不依赖servlet api,所以性能更强,gateway的转发是在tcp层 | 普通鉴权、auth2.0 | Gateway Metrics Filter | 简单易用 | spring系列可扩展强,易配置 可维护性好 | spring社区成熟,但gateway资源较少 |
Zuul2 | 可以通过配置文件配置集群限流和单服务器限流亦可通过filter实现限流扩展 | filter中实现 | filter中实现 | 参考资料较少 | 可维护性较差 | 开源不久,资料少 |
OpenResty | 需要lua开发 | 需要lua开发 | 需要开发 | 简单易用,但是需要进行的lua开发很多 | 可维护性较差,将来需要维护大量lua脚本 | 很成熟资料很多 |
Kong | 根据秒,分,时,天,月,年,根据用户进行限流。可在原码的基础上进行开发 | 普通鉴权,Key Auth鉴权,HMAC,auth2.0 | 可上报datadog,记录请求数量,请求数据量,应答数据量,接收于发送的时间间隔,状态码数量,kong内运行时间 | 简单易用,api转发通过管理员接口配置,开发需要lua脚本 | "可维护性较差,将来需要维护大量lua库 | 相对成熟,用户问题汇总,社区,插件开源 |
不同技术栈网关选型
- 单体时代: apache nginx haproxy
- 微服务: nginx kong
- spring cloud: gateway zuul
- k8s: ingress nginx traefik
- service mesh: envoy mosn istio