从原理到操作,让你在 Apache APISIX 中代理 Dubbo3 服务更便捷

本文为大家介绍了如何借助 Apache APISIX 实现 Dubbo Service 的代理,通过引入 dubbo-proxy 插件便可为 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 访问其中的 apisixDubbo 方法。具体接口实现如下:

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.yaml
plugins:- ... # plugin you need- dubbo-proxy

3. 创建指向 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"
}'

4. 为 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
}'

5. 使用 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 编码的预期效果一致。

6. 查看 Dubbo Provider 的日志。

Key = content-length, Value = 17
Key = host, Value = example.org
Key = content-type, Value = application/x-www-form-urlencoded
Key = body, Value = [B@70754265
Key = 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;
}@Component
public 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;}}

2. 通过如下命令请求来发起相关调用。

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 插件的介绍与使用可参考官方文档。

本文代码以 Dubbo Java SDK 为例实现,Go 语言版本集成示例请点击此处查看。

参考链接

Apache Dubbo

https://dubbo.apache.org/zh/

Apache APISIX

https://apisix.apache.org/

dubbo-samples

https://github.com/apache/dubbo-samples

官方文档

https://apisix.apache.org/zh/docs/apisix/plugins/dubbo-proxy/

原文链接

本文为阿里云原创内容,未经允许不得转载。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/510809.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云数据库走向“四化”:深度融合自研软硬件体系,AllinServerless

11月3日&#xff0c;在2022云栖大会上&#xff0c;阿里云宣布PolarDB、AnalyticDB(简称ADB)、RDS、Lindorm等核心数据库产品已与自研CPU、CIPU、飞天操作系统进行深度融合创新&#xff0c;并全面Serverless化&#xff0c;对外更好地提供一站式数据管理与服务。 阿里云智能数据库…

RocketMQ 5.0: 存储计算分离新思路

Apache RocketMQ 自 2012 年开源以来&#xff0c;因其架构简单&#xff0c;业务功能丰富&#xff0c;具备极强的可扩展性等特点被广泛采用。RocketMQ 在阿里巴巴集团内部有着数千台的集群规模&#xff0c;每天十万亿消息的规模。在阿里云上&#xff0c;RocketMQ 的商业化产品也…

谈谈技术能力

技术人成长的悖论 在程序员界有一个悖论持续在困惑着很多技术人&#xff1a;在写代码的人的困惑是一直写代码是不是会丧失竞争力&#xff0c;会不会被后面年轻的更能加班写代码的人汰换。典型代表就是工作 5 年左右的核心技术骨干&#xff0c;此时正处于编码正嗨但也开始着手规…

阿里云ODPS升级为一体化大数据平台 满足用户多元化数据计算需求

11月3日&#xff0c;2022云栖大会上&#xff0c;阿里巴巴集团副总裁、阿里云计算平台事业部负责人贾扬清表示&#xff0c;为满足用户多元化数据计算需求&#xff0c;阿里云ODPS升级为一体化大数据平台。 升级后的ODPS支持大规模批量计算、实时分析等服务&#xff0c;提供实时流…

上篇:技术架构的设计方法

上周我写的一篇文章《谈谈技术能力》引起了大家的关注&#xff0c;好多读者的评论“以写代想、以想促真、以讲验真”&#xff0c;大家的感受很深刻&#xff0c;基于上次的文章&#xff0c;这篇文章我其实更想跟大家聊聊一些常用的思考方法&#xff0c;思考问题的方式对了&#…

下篇:技术 Leader 的思考方式

技术 Leader 是一个对综合素质要求非常高的岗位&#xff0c;不仅要有解具体技术问题的架构能力&#xff0c;还要具备团队管理的能力&#xff0c;更需要引领方向带领团队/平台穿越迷茫进阶到下一个境界的能力。所以通常来说技术 Leader 的技能是虚实结合的居多&#xff0c;繁杂的…

阿里进入“全面云原生深度用云”阶段 PaaS支出占用云总成本43%

11月4日&#xff0c;2022杭州云栖大会《互联网产业与飞天技术创新》峰会上&#xff0c;阿里技术风险与效能负责人张瓅玶表示&#xff0c;经过持续多年上云用云&#xff0c;今年阿里巴巴集团在PaaS&#xff08;包括大数据、机器学习平台、数据库中间件等&#xff09;支持的业务形…

Apache ShenYu 网关正式支持 Dubbo3 服务代理

Apache Dubbo 在去年发布了下一代的云原生微服务版本 Dubbo3&#xff0c;目前最新版本 Dubbo3 已在阿里经济体完成对 HSF2 框架的全面替换与升级&#xff0c;Dubbo3 目前已成为社区企业实践推荐版本。Apache Shenyu 网关在这个背景下发布了对 Dubbo3 服务代理的支持。 本文介绍…

支持中英文自由说、访谈自动整理,新一代会议AI助理“听悟”升级发布

“你只需专注会议&#xff0c;其余一切交给听悟。”11月4日&#xff0c;2022杭州云栖大会&#xff0c;阿里巴巴达摩院研发的智能产品“听悟”进阶版亮相大会现场。仅需一台个人电脑&#xff0c;观众和媒体记者们即可体验全面集成达摩院语音语言智能的最新AI助理&#xff0c;感受…

成本节省 50%,9人团队使用函数计算开发 wolai 在线文档应用

我们的日常工作场景几乎离不开“云文档”。目前&#xff0c;人们对于文档的需求再不仅仅是简单的记录&#xff0c;而扩展到办公协同、信息组织、知识分享等。在国内众多在线文档中&#xff0c;wolai 因为功能新、迭代快、流畅的异地协同体验、高效的信息组织方式以及“信息块”…

阿里云“汽车云”亮相云栖大会,小鹏、一汽、长城、地平线等均已上云

11月3日&#xff0c;阿里云“汽车云”在2022云栖大会上正式亮相。基于云、钉钉、达摩院、瓴羊等核心技术能力&#xff0c;通过与客户、伙伴紧密共创&#xff0c;阿里云在研发、制造、流通三个业务场景形成了“自动驾驶云”“智造云”“营销云”解决方案&#xff0c;提供“产研供…

阿里云架构师梁旭:MES on 云盒,助力客户快速构建数字工厂

2022年5月18日&#xff0c;在“云上数字工厂与中小企业数字化转型创新论坛”暨“鼎捷MES & 阿里云云盒云上数字工厂解决方案发布会”上&#xff0c;阿里云智能弹性计算产品解决方案架构师梁旭为大家带来了《MES on 云盒&#xff0c;助力客户快速构建数字工厂》的主题分享&a…

如视技术副总裁杨永林:当传统产业遇到“数字空间”

图&#xff1a;2022阿里云视觉计算私享会现场 5月11日&#xff0c;在“2022阿里云视觉计算私享会”上&#xff0c;如视技术副总裁杨永林为大家带来了题为《当传统产业遇到“数字空间”》的主题分享。以下内容根据他的演讲整理而成。 随着互联网的发展&#xff0c;我们不断地将…

第二届上汽零束SOA平台开发者大会揭幕,智能汽车生态加速落地

重磅发布一览&#xff1a; 上汽、OPPO联合发布《生态域白皮书》&#xff0c;率先打通不同品牌硬件、操作系统和产品之间的交互壁垒&#xff0c;构建广泛兼容的生态域底层协议&#xff0c;并向全行业开放技术标准和开发资源。上汽、地平线联合发布基于征程5芯片的智驾解决方案。…

从 Redis7.0 发布看 Redis 的过去与未来

前言 经历接近一年的开发、三个候选版本&#xff0c;Redis 7.0终于正式发布&#xff0c;这是Redis历史上改变最多的一个大版本&#xff0c;它不仅包含了50多个新命令&#xff0c;还有大量核心新特性与改进&#xff0c;这些不仅能够解决用户使用中的诸多问题&#xff0c;还进一…

聊一聊并行文件系统的客户端优化之道

并行文件系统作为文件存储的一个高性能分支&#xff0c;自出现以来已经走过了二十个年头&#xff0c;一直被大规模应用于气象预测、石油勘探、高能物理、汽车制造、芯片制造、自动驾驶、影视渲染等高性能计算领域。在AI时代下&#xff0c;GPU并行计算如火如荼&#xff0c;阿里云…

马斯克“灭霸式”裁员,多个部门遭“团灭”!结果火速打脸,开始“跪求”被裁工程师复职?...

整理 | 郑丽媛出品 | 程序人生&#xff08;ID&#xff1a;coder_life&#xff09;“为了使 Twitter 走上健康的道路&#xff0c;我们将在周五经历裁减全球员工的艰难过程。我们清楚&#xff0c;这势必会影响到一些为 Twitter 做出宝贵贡献的人&#xff0c;但不幸的是&#xff0…

辛辛苦苦原创的网站,被抄袭了怎么办?

几个月前&#xff0c;某公司A针对网站被恶意抄袭发布了一则严正声明。A公司是一家网站设计公司&#xff0c;该公司网站精巧的设计、美观的排版&#xff0c;总会让人眼前一亮。可某天A公司却发现&#xff0c;另外一家B公司在没有任何授权的情况下&#xff0c;其网站照搬了A公司网…

IT人才能嗑到的这对CP,甜!

提到文件存储&#xff0c;相信大家都不陌生&#xff0c;在浩瀚的存储发展史中&#xff0c;文件存储无疑是璀璨的&#xff0c;耀眼的。那么&#xff0c;在性能已经成为刚需&#xff0c;自动驾驶行业风起云涌的当下&#xff0c;文件存储与GPU这对CP又有怎样的含糖量呢&#xff1f…

走进施耐德电气中国软件研发中心,读懂软件创新推动“双转型”

低碳发展和数字化的“双转型”挑战下&#xff0c;施耐德电气认为&#xff0c;软件将成为企业增长的强力引擎——软件能够打通产品、生产、运营和资产的各个环节&#xff0c;实现全生命周期管理&#xff0c;让数据“可视、可管、可控、可用”&#xff0c;促进整个产业链实现从设…