从原理到操作,让你在 APISIX 中代理 Dubbo 服务更便捷
背景
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 响应。
操作步骤
- 启动 dubbo-samples项目。
- 在
config.yaml
文件中进行dubbo-proxy
插件启用。
# Add this in config.yamlplugins:- ... # plugin you need- dubbo-proxy
- 创建指向 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"}'
- 为 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}'
- 使用 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
编码的预期效果一致。
- 查看 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 中。具体操作可参考下方:
- 为已有项目增加一个 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;}}
- 通过如下命令请求来发起相关调用。
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 服务更便捷相关推荐
- 【Android 应用开发】Google 官方 EasyPermissions 权限申请库 ( 权限申请原理对话框操作回调接口 | 永久拒绝权限后引导设用户置权限 )
文章目录 一.权限申请原理对话框操作回调接口 RationaleCallbacks 二.永久拒绝权限后引导设用户置权限 一.权限申请原理对话框操作回调接口 RationaleCallbacks 权限申 ...
- RDD 与 DataFrame原理-区别-操作详解
1. RDD原理及操作 RDD (resilientdistributed dataset),指的是一个只读的,可分区的分布式数据集,这个数据集的全部或部分可以缓存在内存中,在多次计算间重用.RDD内 ...
- Git理论、原理、操作
Git理论.原理.操作 Git简介: 一个开源的分布式版本控制系统.用于处理任何大大小小的项目,是一个开放源码的版本控制软件. Git与SVG的区别: 1.git是分布式的 2.git把内容按元数据方 ...
- Kong+Konga配置原理、操作 学习分享
Kong+Konga配置原理.操作 学习分享 一.什么是Kong,为什么使用Kong 1.首先知道为什么要使用网关: 2.什么是Kong? 3.Kong的安装: 4.什么是Konga? 6.怎么判断s ...
- 计算机组成原理寄存器的实验原理,计算机组成原理实验报告_寄存器的原理及操作课案.docx...
<计算机组成原理实验报告_寄存器的原理及操作课案.docx>由会员分享,提供在线免费全文阅读可下载,此文档格式为docx,更多相关<计算机组成原理实验报告_寄存器的原理及操作课案.d ...
- 计算机组成原理实验写入怎么,计算机组成原理实验报告_寄存器的原理及操作...
<计算机组成原理实验报告_寄存器的原理及操作>由会员分享,可在线阅读,更多相关<计算机组成原理实验报告_寄存器的原理及操作(10页珍藏版)>请在人人文库网上搜索. 1.成绩:实 ...
- 计算机组成原理r3寄存器,计算机组成原理实验报告-寄存器的原理及操作
<计算机组成原理实验报告-寄存器的原理及操作>由会员分享,可在线阅读,更多相关<计算机组成原理实验报告-寄存器的原理及操作(10页珍藏版)>请在装配图网上搜索. 1.成绩:实 ...
- 深度学习机器学习理论知识:范数、稀疏与过拟合合集(5)Dropout原理,操作实现,为什么可以缓解过拟合,使用中的技巧
范数.稀疏与过拟合合集(1)范数的定义与常用范数介绍 范数.稀疏与过拟合合集(2)有监督模型下的过拟合与正则化加入后缓解过拟合的原理 范数.稀疏与过拟合合集(3)范数与稀疏化的原理.L0L1L2范数的 ...
- 3730-0阀门定位器的工作原理与操作
3730-0阀门定位器的工作原理与操作 工作原理 电气阀门定位器装配到气动控制阀,接受控制系统或控制器输出的电动控制信号,按预先设置关系辅助气动执行机构调整阀位并实现准确定位.阀门定位器将输入控制信号 ...
最新文章
- 学点 C 语言(19): 数据类型 - 数组
- Spring的声明式事务管理
- 初识spring-boot
- 2018 蓝桥杯省赛 B 组模拟赛(五)题 G题
- jQuery回调、递延对象总结(中篇) —— 神奇的then方法
- php 循环获取分类,PHP 循环删除无限分类子节点
- docker 系列 - 基础镜像环境和Docker常用命令整理
- GIS地理空间数据免费获取
- 大数据学习——Hadoop本地模式搭建
- 深度学习入门 FashionMNIST数据集训练和测试(30层神经网路)
- 基于WIFI信号的呼吸和心率检测(论文总结)
- 各省金融机构存贷款余额、GDP、金融化程度、城镇化率、大专以上人口比重等(2012-2019年)
- 【机器学习】当贝叶斯、奥卡姆和香农一起来定义机器学习时
- 【随笔】7月休假:粤港澳大湾区旅程记录
- osgearth看不见靠近摄像机的物体怎么办
- 玩转NPM,搭建私有仓库-姜威-专题视频课程
- 一分钟搞懂中小型企业网络架构
- 如何利用市场情绪套利
- 【程序人生】程序员成长历程的四个阶段
- Linux 下文件的查询与搜索
热门文章
- 一、SSM整合按步骤详解(清晰的思路加代码)从零开始一步步整合【一】
- Southern Subregion Problem I. Plugs and Sockets
- 在华硕笔记本(X43B)上安装Debian6声卡驱动
- 当鼠标放在图片或文字上,如何让鼠标箭头变成小手
- 如何给惠普计算机主机解还原,惠普系统还原,详细教您惠普电脑系统如何还原...
- 利用爬虫将PDF的参考文献放在word中
- 浅谈消防应急疏散指示系统在综合管廊中的应用
- 汤力嘉:秒拍-10秒拍大片!
- 高级商务办公软件应用【2】
- 如何把电卖给电网?涂鸦智能户用光储方案助你实现用电自由