在我们的传统业务中,Nginx 在七层网关场景中应用得很广。但是最近几年由于微服务的盛行。Nginx 上的这套生态链也在不断地进化。
2007 年国人章亦春大神在 Nginx 的基础上开发出了 OpenResty。2009 年 marco 又在 OpenResty 上开发出了 kong。截止到写稿时,该项目已经 33 k 的 star 了。
我今天借助腾讯云来带大家学习下 kong 所具备的各种能力。
在传统的互联网服务中,对网关的主要诉求就是反向代理、负载均衡、路由等基础功能。
一个经典的业务的架构图一般是采用四层 LVS 做 对外 IP 收敛,在七层采用 Nginx 来负责七层 HTTPS 协议接入,反向代理、负载均衡、路由。
Nginx 的每个 Worker 进程在底层都使用一个 epoll 对象,高效管理海量的 socket 连接上的网络事件的处理。参见飞哥之前写的搞懂 Nginx 高性能网络工作原理!这篇文章。
性能上的问题是解决了,但是现在随着微服务的发展,服务被拆的非常零散,降低了耦合度的同时也给服务的统一管理增加了难度。
例如服务发现。在 Nginx 中,所有的后端服务都是以静态配置文件的形式记录的。每当后端服务的 IP 发生变化的时候,需要重新修改配置文件。
但在微服务时代,后端都是用容器部署的,每次版本发布都会导致 IP 的变化。而且微服务时代还需要动态的扩缩容,都会导致后端服务 IP 的变化。传统的修改配置文件才能重新分配流量的方式显然已经无法满足需要。
除了服务发现以外,微服务时代对网关还有其他一些新的需求,例如限流、协议转换、身份验证、安全防护等功能,都需要在网关中能够支持。
我们都知道,Nginx 是用 c 语言写的。如果想在 Nginx 的基础上开发这些功能,成本还是挺高的。首先 c 语言的门槛就会比其它语言要高一些。其次,每次功能的修改都需要重新编译发布 Nginx。
好在国人章亦春大神搞出了 OpenResty,将 Lua JIT 内嵌到了 Nginx 的内部,以支持通过 lua 语言对 Nginx 的能力进行方便地扩展开发。这样每当有新功能扩展的时候,只需要将 lua 代码发布一下,然后将 Nginx reload 一下就 ok 了。
飞哥之前所负责的搜狗浏览器在不少的模块中都是采用这种模式开发的,使用 lua 语言对 Nginx 功能进行扩展。既简单方便,还基本接近原生 Nginx 的性能。
有了 OpenResty,网关方便地进行功能扩展的技术路径就算是打通了。后来 Mashape 在 OpenResty 的基础上迭代发布了一个新网关 Kong。
我觉得 kong 最优雅的设计就是它的插件机制。该网关基于通过插件化的方式来支持网关功能的扩展,并提供了 60 多种插件。当对网关有特定需求的时候,直接选择一个或者几个插件就可以轻松在 Nginx 上支持新功能了。
Kong 的插件机制是其高可扩展性的根源,Kong 可以很方便地为路由和服务提供各种插件,网关所需要的基本特性,Kong 都如数支持。如果现有的插件不能满足你的,需求,你也可以使用 lua 语言轻松自己开发一个满足自己需求的插件。
kong 的环境配起来还是有一点点小复杂的。它需要 Postgres 或者 Cassandra 等数据库来管理路由配置,服务配置,upstream 配置等信息。还需要安装 konga(最好的 kong 的管理程序)。
在腾讯云上的微服务引擎中,已经集成了 kong 网关,可以一键配置,非常的方便。我就以腾讯云上的 kong 为例,来给大家展示一下 kong 所具备的功能。
在腾讯云微服务引擎后台一键就可以创建 kong 网关。
当你选择好配置并创建 kong 实例后,其内部依赖的数据库和管理程序 konga 就全都自动一键生成好了。
在 konga 管理后台中,可以通过 service、route 菜单来管理服务以及路由。
接下来几乎所有的工作都可以通过 konga 界面来可视化地完成。比如你想添加一个证书的话,直接点击 “CERTIFICATES” 按钮。填写 Certificate、Key,并填域名到 Server Name Indications 中,单击 SUBMIT CERTIFICATES 提交就完事。
服务是需要监控的。在 Google的网站可靠性工程师小组(SRE)对服务提出了几个需要监控的黄金指标,例如延迟、流量和错误。kong 可以很方便地和 Prometheus 等云原生组件对接起来,以实现这些黄金指标的监控功能。
在腾讯云中,不需要额外的配置,这些功能都自动的配置好了,直接在实例的监控页查看即可。
kong 也可以 ELK 打通,实现日志的查看与检索。
如果想将日志长期存储的话,直接开启 CLS 日志服务的话就可以实现长期保存。
另外在“PLUGINS”菜单中,腾讯云提供了各种内置插件可以直接选用。包含访问鉴权、安全控制、运维支持、报文转换、流量控制等五个大类,几十个插件。
另外在界面上没有展示的是,腾讯云的 kong 还支持无损扩容,同城多活等高可用特性。
在微服务时代,需要在网关上扩展很多功能。但是在 Nginx 里这些功能扩展起来并不是很方便,需要开发熟悉 c 语言,而且发布起来也得重新编译,很费劲。
OpenResty 支持了 lua JIT,使得可以通过简单的 lua 语言来扩展网关的功能。kong 网关根据微服务对网关的需求,通过插件机制对网关进行功能扩展。并开发了许多现成的插件,直接拿来即用。
最后我又借助腾讯云给大家展示了是如何通过 konga 配置网关,对服务的黄金指标进行监控,并进行日志检索的。在部署使用以及运维上,腾讯云也更方便易用,而且也稳定。
总之,在今天的互联网中,kong 可能比 nginx 更加适合业务!