本文已收录 https://github.com/lkxiaolou/lkxiaolou 欢迎star。

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

背景

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

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

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

https://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 https://github.com/alibaba/tengine/archive/2.3.2.zip
unzip 2.3.2.zip && cd tengine-2.3.2/ wget https://ftp.pcre.org/pub/pcre/pcre-8.43.tar.gz
tar xvf pcre-8.43.tar.gz wget https://www.openssl.org/source/openssl-1.0.2s.tar.gz
tar xvf openssl-1.0.2s.tar.gz wget http://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调试环境的方法:

由于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;
} http {
include mime.types;
default_type application/octet-stream; sendfile on; server {
listen 8080;
server_name localhost; #pass the Dubbo to Dubbo Provider server listening on 127.0.0.1:20880
location / {
dubbo_pass_all_headers on;
# dubbo_pass_set args $args;
dubbo_pass_set args hello;
dubbo_pass_set uri $uri;
dubbo_pass_set method $request_method; dubbo_pass org.apache.dubbo.demo.DemoService 0.0.0 testTengine dubbo_backend;
}
} #pass the Dubbo to Dubbo Provider server listening on 127.0.0.1:20880
upstream dubbo_backend {
multi 1;
server host.docker.internal:20880;
server host.docker.internal:20881;
}
}
  • 修改配置后reload配置,使其生效
/usr/local/nginx/sbin/nginx -s reload

测试

使用如下命令测试

curl -X POST http://127.0.0.1:8080/dubbo -i -d "hello=roshi"

看一下传参情况

总结

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

  • 接口的出参入参固定为Map<String, Object>,否则会报错
  • 使用body传参,到Dubbo侧是byte[],还需要解析
  • 可以控制返回的body和http状态码,其中返回的body可以是String,也可以是byte[]类型,状态码是String类型
  • 具备Tengine原生的负载均衡算法
  • 具备故障摘除,Tegine与Dubbo Provider会建立长连接,断开则摘除
  • 未实现version、group分组功能,文档中的version实测没有任何效果

最后

正如《Gateway技术革命 - Tengine开源Dubbo功能》文中所说,Tengine只是完成了作为Dubbo Consumer的协议支持,像服务发现、自定义接口、服务分组、容错降级等其他功能暂未实现,暂时还离生产有些距离。

最后吐槽一下Tengine官网的文档

参考


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

实测Tengine开源的Dubbo功能的更多相关文章

  1. DUBBO功能使用说明

    DUBBO功能使用说明 1 DUBBO概述 DUBBO是阿里巴巴公司的一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案. 相比于其他服务框架,DUBBO有如 ...

  2. Twproject Gantt开源甘特图功能扩展

    1.Twproject Gantt甘特图介绍 Twproject Gantt 是一款基于 jQuery 开发的甘特图组件,也可以创建其它图表,例如任务树(Task Trees).内置编辑.缩放和 CS ...

  3. iOS开源项目MobileProject功能点介绍

    一:MobileProject简介 MobileProject项目是一个以MVC模式搭建的开源功能集合,基于Objective-C上面进行编写,意在解决新项目对于常见功能模块的重复开发,MobileP ...

  4. 讲解开源项目:功能强大的 JS 文件上传库

    本文作者:HelloGitHub-kalifun HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...

  5. [开源] FreeSql.AdminLTE 功能升级

    前言 FreeSql 发布至今已经有9个月,功能渐渐完善,自身的生态也逐步形成,早在几个月前写过一篇文章<ORM 开发环境之利器:MVC 中间件 FreeSql.AdminLTE>,您可以 ...

  6. 开源、免费功能全面的Chart图

    简介: 每个前端都有一个Chart梦,至于真正去做的寥寥无几,无怪乎几个原因: 浏览器兼容问题 数据处理的一些算法,如自动计算坐标轴.自动排列文本等 流畅的动画 丰富的交互功能 去年一年的时间里,我一 ...

  7. 阿里分布式开源框架DUBBO 入门+ 进阶+ 项目实战视频教程

    史诗级Java/JavaWeb学习资源免费分享 欢迎关注我的微信公众号:"Java面试通关手册"(坚持原创,分享各种Java学习资源,面试题,优质文章,以及企业级Java实战项目回 ...

  8. .NET开源免费的功能强大控件库

    通信工具IM控件: http://www.cnblogs.com/hubro/p/4316315.html 360安全卫士及QQ部分控件经典皮肤下载 http://www.sufeinet.com/t ...

  9. [开源] FreeSql AOP 功能模块

    前言 FreeSql 是一个功能强大的 .NETStandard 库,用于对象关系映射程序(O/RM),支持 .NETCore 2.1+ 或 .NETFramework 4.6.1+(QQ群:4336 ...

随机推荐

  1. redis的使用场景和优缺点

    使用场景和优缺点: 2 Redis用来做什么? 通常局限点来说,Redis也以消息队列的形式存在,作为内嵌的List存在,满足实时的高并发需求.而通常在一个电商类型的数据处理过程之中,有关商品,热销, ...

  2. 一篇文章带你搞懂DEX文件的结构

    *本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 DEX文件就是Android Dalvik虚拟机运行的程序,关于DEX文件的结构的重要性我就不多说了.下面,开练! 建议:不要只看 ...

  3. 龙芯 3A4000 安装 Debian stable

    2022-01-17 版权声明:原创文章,未经博主允许不得转载 3A5000 开始,龙芯转向 loongarch ,新的架构虽然甩掉了历史包袱,但也需要一段时间来积累生态.在这半年多的时间里, loo ...

  4. Go语言测试:testing

    学习参考来源:https://www.liwenzhou.com/posts/Go/16_test/ go test工具 必须导入包: import "testing" go te ...

  5. 图片不清晰?Graphics 高质量绘制

    Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; Graphics ...

  6. 【Azure 应用服务】Azure Mobile App (NodeJS) 的服务端部署在App Service for Windows中出现404 Not Found -- The resource you are looking for has been removed, had its name changed, or is temporarily unavailable.

    问题描述 使用NodeJS的后端应用,开发一个Mobile App的服务端,手机端通过REST API来访问获取后端数据.在本地编译好后,通过npm start启动项目,访问效果如下: 但是,当把项目 ...

  7. mysql加强(4)~多表查询

    mysql加强(4)~多表查询:笛卡尔积.消除笛卡尔积操作(等值.非等值连接),内连接(隐式连接.显示连接).外连接.自连接 一.笛卡尔积 1.什么是笛卡尔积: 数学上,有两个集合A={a,b},B= ...

  8. JavaScripts之变量作用域提升问题(var、let、const)

    变量提升(Hoisting) var: 使用var在函数或全局内任何地方声明变量相当于在其内部最顶上声明它,这种行为称为Hoisting(提升) 注意:变量赋值的位置不会改变 function fn( ...

  9. 如何在pyqt中实现亚克力磨砂效果的QLabel

    前言 Windows10 在 UWP 应用中支持亚克力画刷,可以在部件的底部绘制亚克力效果的背景图.下面我们使用 QLabel 来模拟这个磨砂过程. 实现方法 MSDN 文档中介绍了亚克力材料的配方, ...

  10. 计算机网络再次整理————tcp例子[五]

    前言 本文介绍一些tcp的例子,然后不断完善一下. 正文 服务端: // See https://aka.ms/new-console-template for more information us ...