网关
网关是一种高性能、低延迟的流量负载均衡服务,是大型分布式系统中用来保护内部服务的一道安全屏障。它可以对请求实施统一拦截,并帮助开发人员轻松地向外界提供服务,使得开发人员不必考虑路由、版本、缓存、认证、授权、身份验证、限流、熔断、灰度、过滤、转换、计费、审计、脱敏、日志和监控等事情,只需要专注于业务的实现即可。另外,除了将网关应用于常见的代理服务之外,还可以将之广泛应用于WAF(Web应用防火墙)、CDN(内容分发网络)、边缘计算(Edge Computing)、IoT(物联网)、在线聊天、在线直播等多个领域。
微服务
传统的单体架构模式有架构臃肿、边界模糊、迭代缓慢、耦合度高、定位问题困难、无法独立上线、可靠性和稳定性较差以及牵一发而动全身的缺点。而新兴的微服务分布式架构模式则提倡将单一的应用程序划分成一组微小的服务。在这种模式下,可以将应用程序按照业务划分解耦为多个独立的服务单元。这些服务单元分别部署、运行在互相隔离的进程或容器环境中,它们之间采用轻量级的通信机制相互调用,不同的微服务可以采用不同的开发语言和存储技术。各个微服务通过相互协调、互相配合来满足企业越来越复杂的业务需求,并最终为用户提供价值。
比如对于一个电商系统来说,可以按照业务将其垂直划分为用户、产品、价格、促销、订单、库存、评论和推荐等不同的微服务子系统,这些微服务子系统可以由不同的团队来维护,可以采用不同的跨平台系统和技术。另外,一个成熟的微服务体系还会涉及部署、运维、监控、报警、日志、链路、熔断、限流、降级、注册发现和负载均衡等。
不同的微服务可以由不同的语言开发而成,并通过Restful的方式通过网关向外提供服务接口,各个微服务既可以独立部署运行,也可以根据不同的业务场景进行再组合。其中,客户端和服务器之间的流量叫作南北流量,不同服务器之间的流量叫作东西流量。
Nginx
Nginx是一个高性能、高并发、轻量级的Web服务器,采用模块化的架构设计,提供通用的标准模块功能。可以通过C语言开发自定义模块来扩展Nginx的功能,从而将它打造成一个全能的应用服务器。
Nginx是互联网应用的标配组件,其主要的使用场景包括负载均衡、反向代理、代理缓存和限流等。Nginx内核设计小巧、简洁,内部采用的是多进程模型,即单个主进程(master)对应多个工作进程(worker),其中主进程负责处理外部信号、读取配置文件以及初始化工作进程,工作进程则采用异步非阻塞的epoll事件模型来处理网络请求,该模型可以轻松地同时处理成千上万个请求(C10K)
OpenResty
OpenResty是一个基于Nginx与LuaJIT的高性能Web平台,其内部集成了大量精良的Lua库、第三方模块以及大部分依赖项。它是由赫赫有名的agentzh创立并发起的,用于搭建能够处理超高并发、扩展性极高的动态Web应用服务和动态网关。
下图展示Nginx Lua在执行阶段的顺序,可以使用Lua脚本语言在Nginx请求处理的各个阶段实施拦截并执行各种Lua代码,调用Nginx支持的各种C以及Lua模块来实现各种个性化的业务需求。总之,OpenResty使你不再需要用C、C++编写复杂的扩展模块,使用Lua就能快速地构建出高性能网关系统。
Kong
Kong是由位于美国旧金山加利福尼亚的Kong公司开发的API网关和API服务管理层。它基于Nginx和OpenResty,是一个具有分布式、高性能、高并发、可伸缩、可扩展,提供动态负载均衡、散列负载均衡、动态配置、服务注册、服务发现、服务熔断、健康检测、故障恢复、授权认证、速率限制、缓存处理、指标监控、日志收集、插件扩展、亚毫秒级延迟等特性和功能的微服务抽象层。
Kong提供了7大类60多种插件模块作为支持,包括身份验证、安全防护、流量控制、分析监控、信息转换器、日志记录等,这些插件模块在集群中支持热加载、即插即用。还可以通过Kong所具有的灵活强大的扩展机制,自定义个性化的插件模块。
由于Kong的内部设计为插拔体系结构,在这种体系结构中,外部Lua脚本插件可以独立存在于Kong的主代码库之外,与Kong完全解耦,因此只需要实现标准的插件模块接口,就可以将自定义逻辑注入从请求到响应的整个生命周期。
下图是传统的设计架构,业务的API接口无论是私有的、公开的还是合作伙伴的,每个业务所需的身份验证、限速、日志、监控、缓存等功能,都需要开发人员自主实现(不同的语言体系),再内嵌耦合到应用程序中,这些将会给后期的维护升级以及管理工作带来一系列负面反应,耗费大量的人力和物力成本。
Kong的设计则完全不同,Kong采用插件的方式统一收纳管控这些业务通用的功能,使它们之间边界清晰、彼此隔离、互不影响。Kong提供了最基础的服务框架,从而使每个业务微服务团队可以专注于自己的业务领域,最终实现了快速敏捷的开发,减少了运维和管理成本,提升了整个团队的迭代效率。
服务网格(Service Mesh)是一个基础设施层,用于处理服务之间的通信,负责向结构复杂的云原生应用程序传递可靠的网络请求。在实践中,服务网格通常被实现为一组和应用程序部署在一起的轻量级网络代理,对于应用程序和使用者来说是透明的、无感的。
服务网格提供代理功能:路由、熔断、负载均衡、服务发现、健康检测、重试、身份验证、限流、限频、监控、度量和灰度等。
客户端侵入式代理模式(intrude proxy):如果一个系统采用多种语言开发,那么这些代理功能的调用库需要用每种语言度实现一遍,再与业务系统耦合在一起,这种代理模式开发、维护和管理成本都是巨大的。
集中代理模式(center proxy):通过Nginx、OpenResty、Kong进行集中式的集群部署,然后所有请求都通过此代理被统一管理和实现。
边车代理模式(sidecar proxy):在这种模式下,代理功能既不是耦合在应用程序种,也不是集中式的集群部署,而是作为独立进程被部署在应用程序的旁边,即每一个服务器上或Pod中,这样一个服务器上的多个应用程序就能共享这个代理,然后通过控制平面(control plane)和数据平面(data plane)进行统一管理。
控制平面:节点以控制平面的角色运行,会将最新配置信息更新给数据平面的节点。
数据平面:节点以数据平面的角色运行,会从控制平面的节点接收最新的配置信息并提供代理服务。
参考资料:
《Kong入门与实战-基于Nginx和OpenResty的云原生微服务网关》–闫观涛