背景

Apache Dubbo 是由阿里巴巴开源并捐赠给 Apache 的微服务开发框架,它提供了 RPC 通信微服务治理两大关键能力。不仅经过了阿里电商场景中海量流量的验证,也在国内的技术公司中被广泛落地。

在实际应用场景中,Apache Dubbo 一般会作为后端系统间 RPC 调用的实现框架,当需要提供 HTTP 接口给到前端时,会通过一个「胶水层」将 Dubbo Service 包装成 HTTP 接口,再交付到前端系统。

Apache APISIX 是 Apache 软件基金会的顶级开源项目,也是当前最活跃的开源网关项目。作为一个动态、实时、高性能的开源 API 网关,Apache APISIX 提供了负载均衡、动态上游、灰度发布、服务熔断、身份认证、可观测性等丰富的流量管理功能。

得益于 Apache Dubbo 的应用场景优势,Apache APISIX 基于开源项目 tengine/mod_dubbo 模块为 Apache Dubbo 服务配备了HTTP 网关能力。通过 dubbo-proxy 插件,可以轻松地将 Dubbo Service 发布为 HTTP 服务。

如何使用

入门篇:安装使用

这里我们建议使用 Apache APISIX 2.11 版本镜像进行安装。该版本的 APISIX-Base 中已默认编译了 Dubbo 模块,可直接使用 dubbo-proxy 插件。

在接下来的操作中,我们将使用dubbo-samples 项目进行部分展示。该项目是一些使用 Apache Dubbo 实现的 Demo 应用,本文中我们采用其中的一个子模块作为 Dubbo Provider。

在进入正式操作前,我们先简单看下 Dubbo 接口的定义、配置以及相关实现。

接口实现一览

public interface DemoService {/*** standard samples dubbo infterace demo* @param context pass http infos* @return Map<String, Object></> pass to response http**/Map<String, Object> apisixDubbo(Map<String, Object> httpRequestContext);}

如上所示,Dubbo 接口的定义是固定的。即方法参数中 Map 表示 APISIX 传递给 Dubbo Provider 关于 HTTP request 的一些信息(如:header、body…)。而方法返回值的 Map 表示 Dubbo Provider 传递给 APISIX 要如何返回 HTTP response 的一些信息。

接口信息之后可通过 XML 配置方式发布 DemoService。

 <!-- service implementation, as same as regular local bean --><bean id="demoService" class="org.apache.dubbo.samples.provider.DemoServiceImpl"/><!-- declare the service interface to be exported --><dubbo:service interface="org.apache.dubbo.samples.apisix.DemoService" ref="demoService"/>

通过上述配置后,Consumer 可通过 org``.apache.dubbo.samples.apisix.DemoService 访问其中的apisix``Dubbo方法。具体接口实现如下:

public class DemoServiceImpl implements DemoService {@Overridepublic Map<String, Object> apisixDubbo(Map<String, Object> httpRequestContext) {for (Map.Entry<String, Object> entry : httpRequestContext.entrySet()) {System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());}Map<String, Object> ret = new HashMap<String, Object>();ret.put("body", "dubbo success\n"); // http response bodyret.put("status", "200"); // http response statusret.put("test", "123"); // http response headerreturn ret;}}

上述代码中,DemoServiceImpl 会打印接收到的 httpRequestContext,并通过返回包含有指定 Key 的 Map 对象去描述该 Dubbo 请求的 HTTP 响应。

操作步骤

  1. 启动 dubbo-samples项目。
  2. config.yaml 文件中进行 dubbo-proxy 插件启用。
# Add this in config.yamlplugins:- ... # plugin you need- dubbo-proxy
  1. 创建指向 Dubbo Provider 的 Upstream。
curl http://127.0.0.1:9180/apisix/admin/upstreams/1  -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '{"nodes": {"127.0.0.1:20880": 1},"type": "roundrobin"}'
  1. 为 DemoService 暴露一个 HTTP 路由。
curl http://127.0.0.1:9180/apisix/admin/routes/1  -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '{"host": "example.org""uris": ["/demo"],"plugins": {"dubbo-proxy": {"service_name": "org.apache.dubbo.samples.apisix.DemoService","service_version": "0.0.0","method": "apisixDubbo"}},"upstream_id": 1}'
  1. 使用 curl 命令请求 Apache APISIX,并查看返回结果。
curl http://127.0.0.1:9080/demo  -H "Host: example.org"  -X POST --data '{"name": "hello"}'< HTTP/1.1 200 OK< Date: Sun, 26 Dec 2021 11:33:27 GMT< Content-Type: text/plain; charset=utf-8< Content-Length: 14< Connection: keep-alive< test: 123< Server: APISIX/2.11.0<dubbo success

上述代码返回中包含了test: 123 Header,以及 dubbo success 字符串作为 Body 体。这与我们在 DemoServiceImpl 编码的预期效果一致。

  1. 查看 Dubbo Provider 的日志。
Key = content-length, Value = 17Key = host, Value = example.orgKey = content-type, Value = application/x-www-form-urlencodedKey = body, Value = [B@70754265Key = accept, Value = */*Key = user-agent, Value = curl/7.80.0

通过 httpRequestContext 可以拿到 HTTP 请求的 Header 和 Body。其中 Header 会作为 Map 元素,而 Body 中 Key 值是固定的字符串"body",Value 则代表 Byte 数组。

进阶篇:复杂场景示例

在上述的简单用例中可以看出,我们确实通过 Apache APISIX 将 Dubbo Service 发布为一个 HTTP 服务,但是在使用过程中的限制也非常明显。比如:接口的参数和返回值都必须要是 Map<String, Object>

那么,如果项目中出现已经定义好、但又不符合上述限制的接口,该如何通过 Apache APISIX 来暴露 HTTP 服务呢?

操作步骤

针对上述场景,我们可以通过 HTTP Request Body 描述要调用的 Service 和 Method 以及对应参数,再利用 Java 的反射机制实现目标方法的调用。最后将返回值序列化为 JSON,并写入到 HTTP Response Body 中。

这样就可以将 Apache APISIX 的 「HTTP to Dubbo」 能力进一步加强,并应用到所有已存在的 Dubbo Service 中。具体操作可参考下方:

  1. 为已有项目增加一个 Dubbo Service 用来统一处理 HTTP to Dubbo 的转化。
public class DubboInvocationParameter {private String type;private String value;}public class DubboInvocation {private String service;private String method;private DubboInvocationParameter[] parameters;}public interface HTTP2DubboService {Map<String, Object> invoke(Map<String, Object> context)  throws Exception;}@Componentpublic class HTTP2DubboServiceImpl implements HTTP2DubboService {@Autowiredprivate ApplicationContext appContext;@Overridepublic Map<String, Object> invoke(Map<String, Object> context) throws Exception {DubboInvocation invocation = JSONObject.parseObject((byte[]) context.get("body"), DubboInvocation.class);Object[] args = new Object[invocation.getParameters().size()];for (int i = 0; i < args.length; i++) {DubboInvocationParameter parameter = invocation.getParameters().get(i);args[i] = JSONObject.parseObject(parameter.getValue(), Class.forName(parameter.getType()));}Object svc = appContext.getBean(Class.forName(invocation.getService()));Object result = svc.getClass().getMethod(invocation.getMethod()).invoke(args);Map<String, Object> httpResponse = new HashMap<>();httpResponse.put("status", 200);httpResponse.put("body", JSONObject.toJSONString(result));return httpResponse;}}
  1. 通过如下命令请求来发起相关调用。
curl http://127.0.0.1:9080/demo  -H "Host: example.org"  -X POST --data '{"service": "org.apache.dubbo.samples.apisix.DemoService","method": "createUser","parameters": [{"type": "org.apache.dubbo.samples.apisix.User","value": "{'name': 'hello'}"}]}'

总结

本文为大家介绍了如何借助 Apache APISIX 实现 Dubbo Service 的代理,通过引入 dubbo-proxy 插件便可为 Dubbo 框架的后端系统构建更简单更高效的流量链路。

希望通过上述操作步骤和用例场景分享,能为大家在相关场景的使用提供借鉴思路。更多关于 dubbo-proxy 插件的介绍与使用可参考官方文档。


关于 Apache APISIX

Apache APISIX 是一个动态、实时、高性能的开源 API 网关,提供负载均衡、动态上游、灰度发布、服务熔断、身份认证、可观测性等丰富的流量管理功能。

Apache APISIX 可以帮助企业快速、安全地处理 API 和微服务流量,包括网关、Kubernetes Ingress 和服务网格等。目前已被普华永道数据安全团队、腾讯蓝军、平安银河实验室、爱奇艺 SRC 和源堡科技安全团队等专业网络安全机构测试,并给予了高度认可。

Apache APISIX 落地用户(仅部分)

  • Apache APISIX GitHub:https://github.com/apache/apisix
  • Apache APISIX 官网:https://apisix.apache.org/
  • Apache APISIX 文档:https://apisix.apache.org/zh/docs/apisix/getting-started

从原理到操作,让你在 APISIX 中代理 Dubbo 服务更便捷相关推荐

  1. 【Android 应用开发】Google 官方 EasyPermissions 权限申请库 ( 权限申请原理对话框操作回调接口 | 永久拒绝权限后引导设用户置权限 )

    文章目录 一.权限申请原理对话框操作回调接口 RationaleCallbacks 二.永久拒绝权限后引导设用户置权限 一.权限申请原理对话框操作回调接口 RationaleCallbacks 权限申 ...

  2. RDD 与 DataFrame原理-区别-操作详解

    1. RDD原理及操作 RDD (resilientdistributed dataset),指的是一个只读的,可分区的分布式数据集,这个数据集的全部或部分可以缓存在内存中,在多次计算间重用.RDD内 ...

  3. Git理论、原理、操作

    Git理论.原理.操作 Git简介: 一个开源的分布式版本控制系统.用于处理任何大大小小的项目,是一个开放源码的版本控制软件. Git与SVG的区别: 1.git是分布式的 2.git把内容按元数据方 ...

  4. Kong+Konga配置原理、操作 学习分享

    Kong+Konga配置原理.操作 学习分享 一.什么是Kong,为什么使用Kong 1.首先知道为什么要使用网关: 2.什么是Kong? 3.Kong的安装: 4.什么是Konga? 6.怎么判断s ...

  5. 计算机组成原理寄存器的实验原理,计算机组成原理实验报告_寄存器的原理及操作课案.docx...

    <计算机组成原理实验报告_寄存器的原理及操作课案.docx>由会员分享,提供在线免费全文阅读可下载,此文档格式为docx,更多相关<计算机组成原理实验报告_寄存器的原理及操作课案.d ...

  6. 计算机组成原理实验写入怎么,计算机组成原理实验报告_寄存器的原理及操作...

    <计算机组成原理实验报告_寄存器的原理及操作>由会员分享,可在线阅读,更多相关<计算机组成原理实验报告_寄存器的原理及操作(10页珍藏版)>请在人人文库网上搜索. 1.成绩:实 ...

  7. 计算机组成原理r3寄存器,计算机组成原理实验报告-寄存器的原理及操作

    <计算机组成原理实验报告-寄存器的原理及操作>由会员分享,可在线阅读,更多相关<计算机组成原理实验报告-寄存器的原理及操作(10页珍藏版)>请在装配图网上搜索. 1.成绩:实 ...

  8. 深度学习机器学习理论知识:范数、稀疏与过拟合合集(5)Dropout原理,操作实现,为什么可以缓解过拟合,使用中的技巧

    范数.稀疏与过拟合合集(1)范数的定义与常用范数介绍 范数.稀疏与过拟合合集(2)有监督模型下的过拟合与正则化加入后缓解过拟合的原理 范数.稀疏与过拟合合集(3)范数与稀疏化的原理.L0L1L2范数的 ...

  9. 3730-0阀门定位器的工作原理与操作

    3730-0阀门定位器的工作原理与操作 工作原理 电气阀门定位器装配到气动控制阀,接受控制系统或控制器输出的电动控制信号,按预先设置关系辅助气动执行机构调整阀位并实现准确定位.阀门定位器将输入控制信号 ...

最新文章

  1. 学点 C 语言(19): 数据类型 - 数组
  2. Spring的声明式事务管理
  3. 初识spring-boot
  4. 2018 蓝桥杯省赛 B 组模拟赛(五)题 G题
  5. jQuery回调、递延对象总结(中篇) —— 神奇的then方法
  6. php 循环获取分类,PHP 循环删除无限分类子节点
  7. docker 系列 - 基础镜像环境和Docker常用命令整理
  8. GIS地理空间数据免费获取
  9. 大数据学习——Hadoop本地模式搭建
  10. 深度学习入门 FashionMNIST数据集训练和测试(30层神经网路)
  11. 基于WIFI信号的呼吸和心率检测(论文总结)
  12. 各省金融机构存贷款余额、GDP、金融化程度、城镇化率、大专以上人口比重等(2012-2019年)
  13. 【机器学习】当贝叶斯、奥卡姆和香农一起来定义机器学习时
  14. 【随笔】7月休假:粤港澳大湾区旅程记录
  15. osgearth看不见靠近摄像机的物体怎么办
  16. 玩转NPM,搭建私有仓库-姜威-专题视频课程
  17. 一分钟搞懂中小型企业网络架构
  18. 如何利用市场情绪套利
  19. 【程序人生】程序员成长历程的四个阶段
  20. Linux 下文件的查询与搜索

热门文章

  1. 一、SSM整合按步骤详解(清晰的思路加代码)从零开始一步步整合【一】
  2. Southern Subregion Problem I. Plugs and Sockets
  3. 在华硕笔记本(X43B)上安装Debian6声卡驱动
  4. 当鼠标放在图片或文字上,如何让鼠标箭头变成小手
  5. 如何给惠普计算机主机解还原,惠普系统还原,详细教您惠普电脑系统如何还原...
  6. 利用爬虫将PDF的参考文献放在word中
  7. 浅谈消防应急疏散指示系统在综合管廊中的应用
  8. 汤力嘉:秒拍-10秒拍大片!
  9. 高级商务办公软件应用【2】
  10. 如何把电卖给电网?涂鸦智能户用光储方案助你实现用电自由