热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于apache:从原理到操作让你在-Apache-APISIX-中代理-Dubbo3-服务更便捷

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

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

本文为大家介绍了如何借助 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 pass to response http / Map apisixDubbo(Map httpRequestContext); }

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

接口信息配置好之后可通过 XML 配置形式公布 DemoService。

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

public class DemoServiceImpl implements DemoService { @Override public Map apisixDubbo(Map httpRequestContext) { for (Map.Entry entry : httpRequestContext.entrySet()) { System.out.println(“Key = ” + entry.getKey() + “, Value = ” + entry.getValue()); } Map ret = new HashMap(); ret.put(“body”, “dubbo success\n”); // http response body ret.put(“status”, “200”); // http response status ret.put(“test”, “123”); // http response header return ret; } }

上述代码中,DemoServiceImpl 会打印接管到的 httpRequestContext,并通过返回蕴含有指定 Key 的 Map 对象去形容该 Dubbo 申请的 HTTP 响应。

操作步骤

启动 dubbo-samples。
在 config.yaml 文件中进行 dubbo-proxy 插件启用。

Add this in config.yaml plugins: – … # plugin you need – dubbo-proxy

  1. 创立指向 Dubbo Provider 的 Upstream。

curl http://127.0.0.1:9180/apisix/… -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/… -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”}’

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

  1. 查看 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

那么,如果我的项目中呈现曾经定义好、但又不合乎上述限度的接口,该如何通过 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 invoke(Map context) throws Exception; } @Component public class HTTP2DubboServiceImpl implements HTTP2DubboService { @Autowired private ApplicationContext appContext; @Override public Map invoke(Map context) throws Exception { DubboInvocation invocation = JSONObject.parseObject((byte[]) context.get(&#8220;body&#8221;), DubboInvocation.class); Object[] args = new Object[invocation.getParameters().size()]; for (int i = 0; i httpRespOnse= new HashMap<>(); httpResponse.put(&#8220;status&#8221;, 200); httpResponse.put(&#8220;body&#8221;, JSONObject.toJSONString(result)); return httpResponse; } }

  1. 通过如下命令申请来发动相干调用。

curl http://127.0.0.1:9080/demo -H &#8220;Host: example.org&#8221; -X POST &#8211;data &#8216; { &#8220;service&#8221;: &#8220;org.apache.dubbo.samples.apisix.DemoService&#8221;, &#8220;method&#8221;: &#8220;createUser&#8221;, &#8220;parameters&#8221;: [ { &#8220;type&#8221;: &#8220;org.apache.dubbo.samples.apisix.User&#8221;, &#8220;value&#8221;: &#8220;{&#8216;name&#8217;: &#8216;hello&#8217;}&#8221; } ] }&#8217;

总结

本文为大家介绍了如何借助 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/dub&#8230;

官网文档
https://apisix.apache.org/zh/&#8230;

原文链接:http://click.aliyun.com/m/100&#8230;
本文为阿里云原创内容,未经容许不得转载。


推荐阅读
  • 开发心得:深入探讨Servlet、Dubbo与MyBatis中的责任链模式应用
    开发心得:深入探讨Servlet、Dubbo与MyBatis中的责任链模式应用 ... [详细]
  • 大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式
    大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式 ... [详细]
  • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
  • 本文详细介绍了在 CentOS 7 系统中配置 fstab 文件以实现开机自动挂载 NFS 共享目录的方法,并解决了常见的配置失败问题。 ... [详细]
  • 如何使用 `org.apache.tomcat.websocket.server.WsServerContainer.findMapping()` 方法及其代码示例解析 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 深入解析CAS机制:全面替代传统锁的底层原理与应用
    本文深入探讨了CAS(Compare-and-Swap)机制,分析了其作为传统锁的替代方案在并发控制中的优势与原理。CAS通过原子操作确保数据的一致性,避免了传统锁带来的性能瓶颈和死锁问题。文章详细解析了CAS的工作机制,并结合实际应用场景,展示了其在高并发环境下的高效性和可靠性。 ... [详细]
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
  • 深入探索HTTP协议的学习与实践
    在初次访问某个网站时,由于本地没有缓存,服务器会返回一个200状态码的响应,并在响应头中设置Etag和Last-Modified等缓存控制字段。这些字段用于后续请求时验证资源是否已更新,从而提高页面加载速度和减少带宽消耗。本文将深入探讨HTTP缓存机制及其在实际应用中的优化策略,帮助读者更好地理解和运用HTTP协议。 ... [详细]
  • 本指南介绍了 `requests` 库的基本使用方法,详细解释了其七个主要函数。其中,`requests.request()` 是构建请求的基础方法,支持其他高级功能的实现。此外,我们还重点介绍了如何使用 `requests.get()` 方法来获取 HTML 网页内容,这是进行网页数据抓取和解析的重要步骤。通过这些基础方法,读者可以轻松上手并掌握网页数据抓取的核心技巧。 ... [详细]
  • 在 Vue 应用开发中,页面状态管理和跨页面数据传递是常见需求。本文将详细介绍 Vue Router 提供的两种有效方式,帮助开发者高效地实现页面间的数据交互与状态同步,同时分享一些最佳实践和注意事项。 ... [详细]
  • 本文深入探讨了Ajax的工作机制及其在现代Web开发中的应用。Ajax作为一种异步通信技术,改变了传统的客户端与服务器直接交互的模式。通过引入Ajax,客户端与服务器之间的通信变得更加高效和灵活。文章详细分析了Ajax的核心原理,包括XMLHttpRequest对象的使用、数据传输格式(如JSON和XML)以及事件处理机制。此外,还介绍了Ajax在提升用户体验、实现动态页面更新等方面的具体应用,并讨论了其在当前Web开发中的重要性和未来发展趋势。 ... [详细]
  • REST与RPC:选择哪种API架构风格?
    在探讨REST与RPC这两种API架构风格的选择时,本文首先介绍了RPC(远程过程调用)的概念。RPC允许客户端通过网络调用远程服务器上的函数或方法,从而实现分布式系统的功能调用。相比之下,REST(Representational State Transfer)则基于资源的交互模型,通过HTTP协议进行数据传输和操作。本文将详细分析两种架构风格的特点、适用场景及其优缺点,帮助开发者根据具体需求做出合适的选择。 ... [详细]
author-avatar
爱你真好958_358
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有