本文介绍: 微服务背景下,一个系统被拆分为多个服务,但是像安全认证流量控制日志监控功能每个服务需要的,没有网关的话,我们需要每个服务中单独实现,这使得我们做了很多重复的事情并且没有一个全局视图统一管理这些功能。一般情况下,网关可以我们提供请求转发安全认证身份/权限认证)、流量控制负载均衡降级熔断日志监控参数校验协议转换功能。。由于引入网关之后,会多一步网络转发,因此性能会有一点影响(几乎可以忽略不计,尤其是内网访问的情况下)。

API网关

什么网关

服务背景下,一个系统被拆分为多个服务,但是像安全认证,流量控制,日志监控等功能是每个服务需要的,没有网关的话,我们需要在每个服务中单独实现,这使得我们做了很多重复的事情并且没有一个全局视图统一管理这些功能。

网关示意图

一般情况下,网关可以我们提供请求转发安全认证(身份/权限认证)、流量控制、负载均衡、降级熔断日志监控参数校验协议转换等功能。

上面介绍了这么多功能,实际上,网关主要做了两件事情:请求转发 + 请求过滤

由于引入网关之后,会多一步网络转发,因此性能会有一点影响(几乎可以忽略不计,尤其是内网访问的情况下)。 另外,我们需要保障网关服务的高可用,避免单点风险

下图所示,网关服务外层通过 Nginx(其他负载均衡设备/软件也行) 进⾏负载转发以达到⾼可⽤。Nginx部署时候,尽量也要考虑可用,避免单点风险。

基于 Nginx 的服务端负载均衡

网关能提供哪些功能?

绝大部分网关可以提供下面这些功能(有一些功能需要借助其他框架或者中间件):

OpenResty

根据官方介绍

OpenResty 是一个基于 Nginx 与 Lua高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发扩展性极高的动态 Web 应用、Web 服务和动态网关。

OpenResty 和 Nginx 以及 Lua 的关系

OpenResty 基于 Nginx,主要还是看中了其优秀的高并发能力。不过,由于 Nginx 采用 C 语言开发二次开发门槛较高。如果想在 Nginx 上实现一些自定义逻辑或功能,就需要编写 C 语言模块,并重新编译 Nginx

为了解决这个问题,OpenResty 通过实现 ngx_luastream_lua 等 Nginx 模块,把 Lua/LuaJIT 完美地整合进了 Nginx,从而让我们能够在 Nginx 内部嵌入 Lua 脚本,使得可以通过简单的 Lua 语言来扩展网关的功能,比如实现自定义路由规则过滤器、缓存策略等。

Lua 是一种非常快速动态脚本语言,它的运行速度接近于 C 语言。LuaJIT 是 Lua 的一个即时编译器,它可以显著提高 Lua 代码执行效率。LuaJIT 将一些常用的 Lua 函数工具库预编译缓存,这样在下次调用时就可以直接使用缓存字节码,从而大大加快执行速度

关于 OpenResty 的入门以及网关安全实战推荐阅读篇文章每个后端都应该了解的 OpenResty 入门以及网关安全实战open in new window

Kong

Kong 是一款基于 OpenRestyopen in new window (Nginx + Lua)的高性能、云原生、可扩展、生态丰富的网关系统,主要由 3 个组件组成:

img

由于默认使用 Apache Cassandra/PostgreSQL 存储数据,Kong 的整个架构比较臃肿,并且会带来高可用问题

Kong 提供了插件机制来扩展其功能,插件在 API 请求响应循环生命周期中被执行。比如在服务上启用 Zipkin 插件

$ curl -X POST http://kong:8001/services/{service}/plugins 
    --data "name=zipkin"  
    --data "config.http_endpoint=http://your.zipkin.collector:9411/api/v2/spans" 
    --data "config.sample_ratio=0.001"

Kong 本身就是一个 Lua 应用程序,并且是在 Openresty 的基础之上做了一层封装应用。归根结底就是利用 Lua 嵌入 Nginx 的方式,赋予了 Nginx编程能力,这样以插件的形式在 Nginx一层能够做到无限想象的事情。例如限流、安全访问策略、路由、负载均衡等等。编写一个 Kong 插件就是按照 Kong 插件编写规范,写一个自己定义的 Lua 脚本,然后加载到 Kong 中,最后引用即可

img

除了 Lua,Kong 还可以基于 Go 、JavaScript、Python 等语言开发插件,得益于对应的 PDK(插件开发工具包)。

关于 Kong 插件的详细介绍,推荐阅读官方文档:https://docs.konghq.com/gateway/latest/kong-plugins/open in new window,写的比较详细

APISIX

APISIX 是一款基于 OpenResty 和 etcd高性能、云原生、可扩展的网关系统。

etcd 是使用 Go 语言开发的一个开源的、高可用分布式 keyvalue 存储系统,使用 Raft 协议分布式共识。

传统 API 网关相比,APISIX 具有动态路由和插件热加载,特别适合微服务系统下的 API 管理。并且,APISIX 与 SkyWalking(分布式链路追踪系统)、Zipkin(分布式链路追踪系统)、Prometheus(监控系统) 等 DevOps 生态工具对接都十分方便。

APISIX 架构图

作为 Nginx 和 Kong 的替代项目,APISIX 目前已经是 Apache 顶级开源项目,并且是最快毕业的国产开源项目国内目前已经有很多知名企业比如金山、有赞、爱奇艺、腾讯、贝壳)使用 APISIX 处理核心的业务流量。

根据官网介绍:“APISIX 已经生产可用,功能、性能、架构全面优于 Kong”。

APISIX 同样支持定制化的插件开发开发者除了能够使用 Lua 语言开发插件,还能通过下面两种方式开发来避开 Lua 语言的学习成本

Wasm 是基于堆栈虚拟机二进制指令格式,一种低级汇编语言,旨在非常接近已编译机器代码,并且非常接近本机性能。Wasm 最初是为浏览器构建的,但是随着技术的成熟,在服务器端看到了越来越多的用例

img

Shenyu

Shenyu 是一款基于 WebFlux 的可扩展、高性能、响应式网关,Apache 顶级开源项目

Shenyu 架构

Shenyu 通过插件扩展功能,插件是 ShenYu 的灵魂,并且插件也是可扩展和热插拔的。不同的插件实现不同的功能。Shenyu 自带了诸如限流、熔断、转发、重写重定向、和路由监控等插件。

Github 地址: https://github.com/apache/incubator-shenyuopen in new window

官网地址: https://shenyu.apache.org/

如何选择

上面介绍的几个常见的网关系统,最常用的是 Spring Cloud Gateway、Kong、APISIX 这三个。

对于公司业务以 Java 为主要开发语言的情况下,Spring Cloud Gateway 通常是个不错的选择,其优点有:简单易用、成熟稳定、与 Spring Cloud 生态系统兼容、Spring 社区成熟等等。不过,Spring Cloud Gateway 也有一些局限性和不足之处, 一般还需要结合其他网关一起使用比如 OpenResty。并且,其性能相比较于 Kong 和 APISIX,还是差一些。如果对性能要求比较高的话,Spring Cloud Gateway 不是一个好的选择。

Kong 和 APISIX 功能更丰富,性能更强大,技术架构更贴合云原生。Kong 是开源 API 网关的鼻祖,生态丰富,用户群体庞大。APISIX 属于后来者,更优秀一些,根据 APISIX 官网介绍:“APISIX 已经生产可用,功能、性能、架构全面优于 Kong”。下面简单对比一下二者

作者声明

如有问题欢迎指正!

原文地址:https://blog.csdn.net/weixin_45247019/article/details/134810214

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_49028.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注