26API网关(切面处理网络请求)

395 阅读3分钟

1.API网关的作用

防止爬虫,限流场景、认证、日志、黑白名单....

什么是API网关:将服务的共有功能整合在一起,独立部署为单独的一层,解决服务治理的问题

API网关:入口网关+出口网关

入口网关:部署在负载均衡服务器和应用服务器

作用:

  • 客户端统一接入地址,屏蔽协议不同
  • 可以植入服务治理策略:服务熔断、降级、流量控制和分流等等
  • 客户端的认证和授权
  • 管理黑白名单
  • 日志相关,入参,出参,trace id

image.png

出口网关(流量去别的外部服务):

在依赖第三方,调用外部的API做统一的认证、授权、审计和访问控制

image.png

2.API网关的实现(网络层面的AOP)

需要关注的重点:性能(重点关注IO模型)+功能的热插拔(使用责任链串起来,支持热插拔)+线程池(避免资源无限使用)(一个服务一个线程池+针对不同接口设置不同数量)

Zuul1.0使用同步阻塞,Zuul2.0使用netty server(I/O 多路复用的模型)

image.png

自研API网关:

Kong是在 Nginx 中运行的 Lua 程序。得益于 Nginx 的性能优势,Kong 相比于其它的开源 API 网关来说,性能方面是最好的。由于大中型公司对于 Nginx 运维能力都比较强,所以选择 Kong 作为 API 网关,无论是在性能还是在运维的把控力上,都是比较好的选择;

Zuul是 Spring Cloud 全家桶中的成员,如果你已经使用了 Spring Cloud 中的其他组件,那么也可以考虑使用 Zuul 和它们无缝集成。不过,Zuul1 因为采用同步阻塞模型,所以在性能上并不是很高效,而 Zuul2 推出时间不长,难免会有坑。但是 Zuul 的代码简单易懂,可以很好地把控,并且你的系统的量级很可能达不到 Netfix 这样的级别,所以对于 Java 技术栈的团队,使用 Zuul 也是一个不错的选择;

Tyk是一种 Go 语言实现的轻量级 API 网关,有着丰富的插件资源,对于 Go 语言栈的团队来说,也是一种不错的选择。

3.如何引入API网关

web层=服务层和客户端间

作用:

  • 对服务层接口数据聚合
  • 将HTTP请求转换成PRC请求,流量限制,设备黑名单

流量网关:流量网关+业务网关

独立的服务层:聚合服务

image.png

4.总结

  • 根据类型将网关划分为:入口网关(协议转换、安全策略、认证、限流和熔断)+出口网关(调用外部API做统一认证、授权、审计以及访问控制)
  • 关注重点:性能+扩展性(可插拔)(soter的拦截)
  • 针对不同服务进行线程隔离,不会相互影响
  • Web 层中的协议转换、认证、限流等功能挪入到 API 网关中,将服务聚合的逻辑下沉到服务层