实测Tengine开源版Dubbo功能表现如何?

2026-05-25 13:061阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1140个文字,预计阅读时间需要5分钟。

实测Tengine开源版Dubbo功能表现如何?

原文:本文字已收录+https://github.com/lkxiaolou/lkxiaolou 欢迎star。搜索关注微信公众号捉虫大师,后端技术分享,架构设计、性能优化、源码阅读、问题排查、踩坑实践。

实测Tengine开源版Dubbo功能表现如何?

修改后:本文字已收录,GitHub链接:[lkxiaolou/lkxiaolou](https://github.com/lkxiaolou/lkxiaolou),欢迎star。关注捉虫大师公众号,获取后端技术分享,包括架构设计、性能优化、源码解读、问题排查、实战经验。

本文已收录 github.com/lkxiaolou/lkxiaolou 欢迎star。
搜索关注微信公众号"捉虫大师",后端技术分享,架构设计、性能优化、源码阅读、问题排查、踩坑实践。

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

  • Dubbo是阿里巴巴开源的一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。

2019年9月,Tengine 2.3.2版本发布了dubbo_pass模块,支持HTTP协议到Dubbo协议的转换。Release页面如下:

github.com/alibaba/tengine/releases/tag/2.3.2

意义

《Gateway技术革命 - Tengine开源Dubbo功能》对Tengine支持Dubbo协议的意义讲的比较清楚,总结有如下几点:

  • 架构优化:减少一层转发,降低系统复杂度;
  • 性能优势:文中给出数据,“Tengine直接支持Dubbo的架构在CPU消耗和RT上的表现在不同场景下,有28%-73%不等的性能优势”
实测 Tengine环境搭建

这里我用centos的基础镜像搭了一套Tengine环境,简单说明一下步骤:

  • 进入容器,创建工作目录

mkdir -p /home/roshi && cd /home/roshi/

  • 下载相关源码并解压

wget github.com/alibaba/tengine/archive/2.3.2.zip unzip 2.3.2.zip && cd tengine-2.3.2/ wget ftp.pcre.org/pub/pcre/pcre-8.43.tar.gz tar xvf pcre-8.43.tar.gz wget www.openssl.org/source/openssl-1.0.2s.tar.gz tar xvf openssl-1.0.2s.tar.gz wget www.zlib.net/zlib-1.2.11.tar.gz tar xvf zlib-1.2.11.tar.gz

  • 安装相关依赖

yum install gcc yum install gcc-c++ yum -y install gcc automake autoconf libtool make

  • 编译

./configure --add-module=./modules/mod_dubbo --add-module=./modules/ngx_multi_upstream_module --add-module=./modules/mod_config --with-pcre=./pcre-8.43/ --with-openssl=./openssl-1.0.2s/ --with-zlib=./zlib-1.2.11 make && make install

  • 启动

/usr/local/nginx/sbin/nginx Dubbo例子

这里要提一下之前在《dubbo应用级服务发现初体验》中提到的快速搭建Dubbo调试环境的方法:

  • git clone github.com/apache/dubbo.git
  • 使用/dubbo-demo目录下的例子,本文使用/dubbo-demo/dubbo-demo-api-provider下的例子

由于Tengine有限制,接口的出参和入参必须是Map<String, Object>,所以需要对例子进行修改:

  • DemoService

public interface DemoService { String sayHello(String name); default Map<String, Object> testTengine(Map<String, Object> args) { return null; } default CompletableFuture<String> sayHelloAsync(String name) { return CompletableFuture.completedFuture(sayHello(name)); } }

  • DemoServiceImpl.java

public class DemoServiceImpl implements DemoService { private static final Logger logger = LoggerFactory.getLogger(DemoServiceImpl.class); @Override public String sayHello(String name) { logger.info("Hello " + name + ", request from consumer: " + RpcContext.getContext().getRemoteAddress()); return "Hello " + name + ", response from provider: " + RpcContext.getContext().getLocalAddress(); } @Override public Map<String, Object> testTengine(Map<String, Object> args) { Map<String, Object> res = new HashMap<>(); res.put("body", "hello tengine dubbo\n"); res.put("status", "200"); System.out.println("testTengine"); return res; } @Override public CompletableFuture<String> sayHelloAsync(String name) { return null; } }

为了更好的测试多个provider的情况,可以用同一份代码,在不同的端口起多个服务。

修改Tengine配置
  • vi /usr/local/nginx/conf/nginx.conf

worker_processes 1; events { worker_connections 1024; } 127.0.0.1:8080/dubbo -i -d "hello=roshi"

看一下传参情况

总结

经过测试,总结以下几点:

  • 接口的出参入参固定为Map<String, Object>,否则会报错
  • 使用body传参,到Dubbo侧是byte[],还需要解析
  • 可以控制返回的body和tengine.taobao.org/document_cn/ngx_github.com/apache/dubbo-samples/tree/master/dubbo-samples-tengine

搜索关注微信公众号"捉虫大师",后端技术分享,架构设计、性能优化、源码阅读、问题排查、踩坑实践。

本文共计1140个文字,预计阅读时间需要5分钟。

实测Tengine开源版Dubbo功能表现如何?

原文:本文字已收录+https://github.com/lkxiaolou/lkxiaolou 欢迎star。搜索关注微信公众号捉虫大师,后端技术分享,架构设计、性能优化、源码阅读、问题排查、踩坑实践。

实测Tengine开源版Dubbo功能表现如何?

修改后:本文字已收录,GitHub链接:[lkxiaolou/lkxiaolou](https://github.com/lkxiaolou/lkxiaolou),欢迎star。关注捉虫大师公众号,获取后端技术分享,包括架构设计、性能优化、源码解读、问题排查、实战经验。

本文已收录 github.com/lkxiaolou/lkxiaolou 欢迎star。
搜索关注微信公众号"捉虫大师",后端技术分享,架构设计、性能优化、源码阅读、问题排查、踩坑实践。

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

  • Dubbo是阿里巴巴开源的一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。

2019年9月,Tengine 2.3.2版本发布了dubbo_pass模块,支持HTTP协议到Dubbo协议的转换。Release页面如下:

github.com/alibaba/tengine/releases/tag/2.3.2

意义

《Gateway技术革命 - Tengine开源Dubbo功能》对Tengine支持Dubbo协议的意义讲的比较清楚,总结有如下几点:

  • 架构优化:减少一层转发,降低系统复杂度;
  • 性能优势:文中给出数据,“Tengine直接支持Dubbo的架构在CPU消耗和RT上的表现在不同场景下,有28%-73%不等的性能优势”
实测 Tengine环境搭建

这里我用centos的基础镜像搭了一套Tengine环境,简单说明一下步骤:

  • 进入容器,创建工作目录

mkdir -p /home/roshi && cd /home/roshi/

  • 下载相关源码并解压

wget github.com/alibaba/tengine/archive/2.3.2.zip unzip 2.3.2.zip && cd tengine-2.3.2/ wget ftp.pcre.org/pub/pcre/pcre-8.43.tar.gz tar xvf pcre-8.43.tar.gz wget www.openssl.org/source/openssl-1.0.2s.tar.gz tar xvf openssl-1.0.2s.tar.gz wget www.zlib.net/zlib-1.2.11.tar.gz tar xvf zlib-1.2.11.tar.gz

  • 安装相关依赖

yum install gcc yum install gcc-c++ yum -y install gcc automake autoconf libtool make

  • 编译

./configure --add-module=./modules/mod_dubbo --add-module=./modules/ngx_multi_upstream_module --add-module=./modules/mod_config --with-pcre=./pcre-8.43/ --with-openssl=./openssl-1.0.2s/ --with-zlib=./zlib-1.2.11 make && make install

  • 启动

/usr/local/nginx/sbin/nginx Dubbo例子

这里要提一下之前在《dubbo应用级服务发现初体验》中提到的快速搭建Dubbo调试环境的方法:

  • git clone github.com/apache/dubbo.git
  • 使用/dubbo-demo目录下的例子,本文使用/dubbo-demo/dubbo-demo-api-provider下的例子

由于Tengine有限制,接口的出参和入参必须是Map<String, Object>,所以需要对例子进行修改:

  • DemoService

public interface DemoService { String sayHello(String name); default Map<String, Object> testTengine(Map<String, Object> args) { return null; } default CompletableFuture<String> sayHelloAsync(String name) { return CompletableFuture.completedFuture(sayHello(name)); } }

  • DemoServiceImpl.java

public class DemoServiceImpl implements DemoService { private static final Logger logger = LoggerFactory.getLogger(DemoServiceImpl.class); @Override public String sayHello(String name) { logger.info("Hello " + name + ", request from consumer: " + RpcContext.getContext().getRemoteAddress()); return "Hello " + name + ", response from provider: " + RpcContext.getContext().getLocalAddress(); } @Override public Map<String, Object> testTengine(Map<String, Object> args) { Map<String, Object> res = new HashMap<>(); res.put("body", "hello tengine dubbo\n"); res.put("status", "200"); System.out.println("testTengine"); return res; } @Override public CompletableFuture<String> sayHelloAsync(String name) { return null; } }

为了更好的测试多个provider的情况,可以用同一份代码,在不同的端口起多个服务。

修改Tengine配置
  • vi /usr/local/nginx/conf/nginx.conf

worker_processes 1; events { worker_connections 1024; } 127.0.0.1:8080/dubbo -i -d "hello=roshi"

看一下传参情况

总结

经过测试,总结以下几点:

  • 接口的出参入参固定为Map<String, Object>,否则会报错
  • 使用body传参,到Dubbo侧是byte[],还需要解析
  • 可以控制返回的body和tengine.taobao.org/document_cn/ngx_github.com/apache/dubbo-samples/tree/master/dubbo-samples-tengine

搜索关注微信公众号"捉虫大师",后端技术分享,架构设计、性能优化、源码阅读、问题排查、踩坑实践。