查看原文
其他

Gateway技术革命 - Tengine开源Dubbo功能

吴梦麒 高可用架构 2020-11-06

作者简介:吴梦麒,花名韩述 阿里巴巴中间件技术专家,Alibaba Tengine核心研发。主要负责阿里集团Tengine以及统一接入网关的开发和技术演进,目前关注Nginx、云原生、Service Mesh等领域。


什么是Tengine


Tengine是Alibaba基于Nginx开发并开源的Web服务器,它继承了Nginx所有的功能和特性,并在其基础上做了大量的扩展和增强,其中像动态模块加载,四层负载均衡,reuseport支持等能力,都逐渐被Nginx官方吸收引用。Tengine在开源以后大受欢迎,成为了Nginx最好的替代品之一,官方网站(http://tengine.taobao.org/


Tengine/Nginx目前在各大公司中主要的场景是作为入口网关的反向代理转发组件使用,通常负责如下功能:


什么是Dubbo


Dubbo最早是由Alibaba开发并开源的一个RPC框架,后逐步完善了注册中心、服务治理等能力,目前已成为最受欢迎的服务框架之一,现在Dubbo已经捐赠给Apache基金会继续发展,官方网站(http://dubbo.apache.org/

典型的Dubbo系统架构如下: 


传统网关技术架构


在过去Nginx/Tengine不支持Dubbo的情况下,传统的网关技术架构大致为: 接入网关集群(Nginx或Tengine)-> 业务网关集群(基于Tomcat或者Netty自建)-> 业务服务(暴露Dubbo服务) 类似如下图:

其中,Java业务网关,主要起到将入口的HTTP协议对接到Dubbo协议上的作用,当然一般还会开发一些业务相关的通用功能如限流、鉴权、路由等,但是其核心不可替代的作用还是连接入口的HTTP请求和后端的Dubbo服务。


在实际业务中,传统架构往往会面临两个比较大的挑战: 

  1. 性能:由于很难在Java领域找到能够类比Nginx系的超高性能技术,往往业务网关都面临较大的资源成本压力

  2. 稳定性:由于业务网关处于核心数据链路的关键位置,属于单点强依赖,稍有抖动就很容易引发大型故障


长期以来业务网关的建设和维护团队都在想方设法去和这些挑战做斗争,也总结并沉淀了大量的技术和解决方案。不过下面我们会介绍一种全新的解决思路。


Tengine支持Dubbo


Tengine的Dubbo功能,主要是作为反向代理服务器向后端转发请求时,Tengine能够支持作为Dubbo的Consumer直接调用Dubbo服务,这样Tengine可以完成将入口的HTTP请求,转化为Dubbo调用。有了这项能力,传统的接入网关技术将可以演进为如下架构:

这一功能将对接入网关技术的架构起到很大的颠覆,传统Java业务网关最核心的HTTP->RPC的转换能力可以直接在Tengine侧完成,原有业务网关上的业务功能,可以通过旁路的管控系统向Tengine下发配置文件并结合Lua的能力进行补充,从而大大提升系统资源利用率,并将部分在数据平面串联的依赖(如原Java业务网关)上提到旁路的控制平面中去(如控制中心、规则中心),改为向数据平面的Nginx集群推送规则,从而提升系统稳定性。


目前在阿里巴巴内部,已经有很多业务依托于Tengine对RPC协议的支持,采用类似的架构在运行中,例如直接从接入网关访问阿里内部比较流行的 HSF服务(一种类似Dubbo的服务框架)。


Tengine Dubbo功能的优势


Tengine支持Dubbo主要是给接入网关技术体系架构带来一种新的技术选型方式,这种新的技术选型方式可以将原有的Nginx网关和Java网关进行融合,从资源的利用率和架构的合理性两方面带来好处:


1、架构优化

2、性能优化

以下对比了几种技术方案的架构,压测数据表明,Tengine直接支持Dubbo的架构在CPU消耗和RT上的表现在不同场景下,有28%-73%不等的性能优势 

Tengine Dubbo高性能的原因:

  • Tengine直接在入口网关层支持Dubbo调用,直接减少一层转发调用,从架构上带来性能优势

  • Dubbo作为一个高性能的RPC协议,拥有多路复用,二进制报文等优势,相比于较为冗余的基于文本协议的HTTP协议,拥有较大传输性能优势


Tengine Dubbo实战


Github上,在Apche dubbo-samples中,有一个Tengine使用Dubbo的例子

https://github.com/apache/dubbo-samples/blob/master/java/dubbo-samples-tengine/README.md

或者在Tengine项目中也可以找到这个例子

https://github.com/alibaba/tengine/blob/master/modules/mod_dubbo/README.md

例子可以完成一个如下图的简单Demo:

User tengine (dubbo_pass) Dubbo Service Provider | | | |--- GET github.com:443 -->| | | |--- Dubbo Multiplexing Binary RPC Request -->| | | | | |<-- Dubbo Multiplexing Binary RPC Response ---| |<-- HTTP/1.1 200 ---|
|

有兴趣的朋友可以下载相关例子动手体验一下Tengine的Dubbo功能。


另外我们可以看到,目前Tengine支持了作为Dubbo Consumer的协议层面对接,但是在服务发现层面还暂时只依赖如dyups等Tengine原有的方式,后续需要逐步和Dubbo生态体系做完全的融合打通,包括Zookeeper和Nacos等服务发现方式会逐步支持,此外目前Tengine还不支持自定义Dubbo接口,可能会对老应用的迁移带来额外成本,后续补齐对任意Dubbo接口的调用能力。欢迎大家参与到Tengine和Dubbo社区的共同建设中来!


Tengine RoadMap


当前Tengine社区已经全面完成了对Nginx core代码的升级,目前最新Tengine开源版本完全兼容最新版Nginx所有功能,同时大量新Feature诸如更多的协议支持、比lua更强大的动态能力支持、优秀的负载均衡算法等都在逐步的研发和贡献到社区中。


另外阿里内部正处在整体向云计算演进的攻坚期,阿里内部的Tengine开发团队正在全面向云原生时代进行技术演进,将传统接入网关向云原生K8s体系演进,包括Service Mesh、Ingress、Egress等大量云原生技术在研发和落地中,未来将会向Tengine社区输出更多云原生相关技术方案。


招聘广告


阿里巴巴中间件Tengine团队,负责阿里集团千万QPS量级接入网关的业务和技术演进,当前正值全面拥抱云原生技术的换代时期,大量机会等待Nginx/Golang/K8s/Service Mesh/Devops技术栈的你来把握,共同开创Tengine的云原生时代!(mengqi.wmq@alibaba-inc.com)


参考阅读:


本文作者吴梦麒。技术原创及架构实践文章,欢迎通过公众号菜单「联系我们」进行投稿。


高可用架构

改变互联网的构建方式


长按二维码 关注「高可用架构」公众号


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存