Dubbo 跨语言调用神兽:dubbo-go-pixiu

简介: Pixiu 是基于 Dubbogo 的云原生、高性能、可扩展的微服务 API 网关。作为一款网关产品,Pixiu 帮助用户轻松创建、发布、维护、监控和保护任意规模的 API ,接受和处理成千上万个并发 API 调用,包括流量管理、 CORS 支持、授权和访问控制、限制、监控,以及 API 版本管理。

Pixiu 是什么

​在回答 Pixiu 是什么之前,我们简单解释一下 Dubbo 是什么。Dubbo 是一个开源的高性能 RPC 框架,有着丰富的服务治理能力以及优秀的扩展能力。Dubbo 更扩展出 Dubbo-go​,为用户提供了 Golang 的 Dubbo 解决方案,打通了两种语言之间的隔阂,使 Dubbo 更加贴近云原生。 


Dubbo-go 作为 Golang 服务,实现与 Dubbo 服务之间的相互调用。然而,在日常使用场景中,用户往往有把 Dubbo 服务以 RESTful 风格向外暴露的需求同时也要兼顾内部 Dubbo 调用。为了解决这种场景,作为 Dubbo API 网关的 Pixiu​ (中文: 貔貅, 曾用名 dubbo-go-proxy) 便应运而生。之所以采用 Pixiu 这个名称,是因为 Java 同类产品 Zuul 的意象是一个西方怪兽,Pixiu 作为一个国产产品,就用了我们中国的一个类似的神兽貔貅作为项目名称。也同时表达了 Dubbo 社区希望扩展出一整套云原生生态链的决心。
​

目前 Dubbo 多语言生态,发展最好的自然是 Java,其次是 Golang,其他语言都差强人意。dubbo-go-pixiu 项目是一个基于 dubbo-go 发展起来的项目,目前接口协议层支持的是七层的 HTTP 请求调用,计划在未来的 0.5 版本中支持 gRPC 请求调用,其另外一个使命是作为一种新的 dubbo 多语言解决方案。
​

为什么使用 Pixiu

​

Pixiu 是基于 Dubbogo 的云原生、高性能、可扩展的微服务 API 网关。作为一款网关产品,Pixiu 帮助用户轻松创建、发布、维护、监控和保护任意规模的 API ,接受和处理成千上万个并发 API 调用,包括流量管理、 CORS 支持、授权和访问控制、限制、监控,以及 API 版本管理。除此以外,作为 Dubbo 的衍生产品,Pixiu可以帮助 Dubbo 用户进行协议转换,实现跨系统、跨协议的服务能力互通。
​

Pixiu 的整体设计遵守以下原则:
​

  1. High performance: 高吞吐量以及毫秒级的延时。
  2. 可扩展: 通过 go-plugin,用户可以根据自己的需求延展 Pixiu 的功能。
  3. 简单可用: 用户通过少量配置,即可上线。

​

Pixiu 的特性及核心功能

​

  • 为 RESTful API 和 Dubbo API 提供支持

​

非 RESTful 风格的 API 和 Dubbo 协议的服务往往需要修改才可以以 RESTful API 风格对外开放。Pixiu 提供协议转换功能,通过 Pixiu,开发者可以将自己的 HTTP API 或 Dubbo API 通过配置,以 RESTful API 风格对外开放。v0.2.1 版本已支持基于泛化调用的 HTTP 至 Dubbo 的协议转换以及 HTTP 协议的转发。在后续的版本,社区将会增加对 gRPC 和 http2 协议的支持。
​

  • 面向用户的配置方式

​

一般的网关的配置往往繁琐且复杂。Pixiu,目标作为一款易用的网关产品,在设计上拥有三层配置层级,Gateway 层全局配置, API resource 层配置以及 HTTP verbs 方法层配置。通过三个不同层级的配置,既可以实现深度的定制,亦支持统一的默认配置;同时,支持本地的配置文件,亦可使用统一配置服务器。另外,还提供控制台模块,通过控制台模块,支持配置的热更新。Pixiu 配套配套的控制台界面也在同步开发中。
​

  • 通用功能的集成

重试、熔断、流量控制、访问控制等通用功能不再需要在每个后端服务上重复实现。使用 Pixiu,通过配置 filter ,开发者可以进行全局的控制,亦可以根据 API 配置各自的规则。因此开发者可以专注于业务逻辑和服务,而不是将时间用在维护基础设施上。
​

  • 可扩展

​

不同的使用场景有着各自独特的需求。为满足不同用户的定制化需求,Pixiu 使用了插件模式。开发者可以通过编写 go plugin,将自身特有的业务逻辑以 filter 形式内嵌至 Pixiu 网关中,实现诸如企业登录鉴权等功能。
截屏2021-07-15 下午6.23.32.png

图 1: Pixiu 核心功能列表

​

Pixiu 的架构设计


图 2: Pixiu 架构

貔貅: 即 dubbo-go-pixiu,由四个主要模块:Listener、Router、Filters 和 Clients 组成;


Dubbo Cluster: Dubbo 服务所在集群,包含一个或多个 Dubbo Services;


Other Cluster: Dubbo 以外的服务所在集群,现支持 HTTP 服务,未来将拓展支持 gRPC 等其他服务;
Registry Center: 注册中心,维护每个业务服务的调用地址信息;


Metadata Center: 元数据中心,维护每个业务服务的配置信息以及存储 Pixiu 本身的配置信息。

作为 Dubbo 所衍生的 API 网关,Pixiu 使用 Golang 搭建,主要因为: 1. Golang 的 G-M-P,net poller 等特性使 Golang 非常适合构建IO密集型应用;2. 使用 Golang 可以直接引入 Dubbo-go 中的一些组建,简化开发。
​

整个Pixiu大致可以拆分为四个主要模块:Listener、Router、Filters 和 Client。
​

1、Listener

​

在 Pixiu 中,Listener 代表外部可以访问Pixiu的方式。通过配置指定协议类型,地址,端口等属性,暴露 Gateway。现阶段暂支持 HTTP 协议,未来将会加入 gRPC。
​

listeners: - name: "net/http" address: socket_address: protocol_type: "HTTP" address: "0.0.0.0" port: 8888 config: idle_timeout: 5s read_timeout: 5s write_timeout: 5s

​

2、Router

​

Router 是 Pixiu 的路由组件。根据配置文件,Pixiu 将对外暴露的 URLs 以树的形势存储于内存中,当请求到了 router 组件时,即会根据 URL 及 HTTP 方法查找到对应的后端服务及其 API 配置,并将信息封装于请求中,为后续 filter,及 client 的调用提供足够的内容。
​

现阶段,Router 提供以下功能:

  • 支持请求一对一转发路由配置或 wildcard 路由配置。
  • 支持 HTTP 请求的转发到后端 HTTP 服务。
  • 支持 HTTP 请求转化为 dubbo 泛化调用请求。

3、Filters

​

Filter 是 Pixiu 实现额外功能及其扩展性的主要组件。其实现类似于 Dubbo-go 中的 filter,根据配置中 filter 的指定,生成调用链,从而在调用后端服务前,将各 filter 中的逻辑运行一遍,实现节流,日志等功能。
​

用户如果需要客制化的 filter,可通过编写 go-plugin 实现。在配置中,可通过类似如下配置,加载 .so文件,并在 API config 中指定使用的 plugin group,plugin name 实现。
​


pluginFilePath: "" 
pluginsGroup: - groupName: "group1" plugins: - name: "rate limit" version: "0.0.1" priority: 1000 externalLookupName: "ExternalPluginRateLimit" - name: "access" version: "0.0.1" priority: 1000 externalLookupName: "ExternalPluginAccess" - groupName: "group2" plugins: - name: "blacklist" version: "0.0.1" priority: 1000 externalLookupName: "ExternalPluginBlackList"

​

4、Client

Client 负责调用具体服务。现阶段,Pixiu 支持 HTTP 与 Dubbo 的后端服务。社区将逐渐增加 gRPC 等其他 Client 以满足不同的协议。
​

HTTP client 的实现相对简单,根据 Router 中获取的后端服务信息,通过 Golang 官方包 net/http 生成请求并调用。
​

Dubbo client 的实现对比 HTTP client 会稍微复杂,其基础为 Dubbo 服务的泛化调用。泛化调用技术是 Dubbo 提供的一个很基础的功能只需要知道调用的方法名、参数类型和返回值类型,即可发起服务调用。客户端对服务端的泛化调用既可以通过注册中心发现服务,也可以直连服务端,实现对服务的动态调用。

如下面代码所示,Pixiu 通过动态配置 referenceConfig,然后通过 GetRPCService 生成 Dubbo 的 Generic Client(泛化调用客户端)进行下一步的调用。
​

 referenceConfig := dg.NewReferenceConfig(irequest.Interface, context.TODO())referenceConfig.InterfaceName = irequest.InterfacereferenceConfig.Cluster = constant.DEFAULT_CLUSTERvar registers []stringfor k := range dgCfg.Registries {registers = append(registers, k)}referenceConfig.Registry = strings.Join(registers, ",")if len(irequest.DubboBackendConfig.Protocol) == 0 {referenceConfig.Protocol = dubbo.DUBBO} else {referenceConfig.Protocol = irequest.DubboBackendConfig.Protocol}referenceConfig.Version = irequest.DubboBackendConfig.VersionreferenceConfig.Group = irequest.GroupreferenceConfig.Generic = trueif len(irequest.DubboBackendConfig.Retries) == 0 {referenceConfig.Retries = "3"} else {referenceConfig.Retries = irequest.DubboBackendConfig.Retries}dc.lock.Lock()defer dc.lock.Unlock()referenceConfig.GenericLoad(key)clientService := referenceConfig.GetRPCService().(*dg.GenericService)

​

实际上,在泛化调用的客户端中,实际执行泛化调用的关键步骤是 Dubbo-go 中的 generic_filter (如下代码片段)。在调用 generic_filter 的 Invoke 时,约定 invocation 参数列表第一个为方法名,第二个为参数类型列表,第三个为参数值列表。generic_filter 将用户请求的参数值列表转化为统一格式的 map(代码中的 struct2MapAll ),将类( golang 中为 struct )的正反序列化操作变成 map 的正反序列化操作。这使得无需 POJO 描述通过硬编码注入 hessain 库,从而完成 Dubbo 服务的泛化调用。
​

func (ef *GenericFilter) Invoke(ctx context.Context, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result {if invocation.MethodName() == constant.GENERIC && len(invocation.Arguments()) == 3 {oldArguments := invocation.Arguments()if oldParams, ok := oldArguments[2].([]interface{}); ok {newParams := make([]hessian.Object, 0, len(oldParams))for i := range oldParams {newParams = append(newParams, hessian.Object(struct2MapAll(oldParams[i])))}newArguments := []interface{}{oldArguments[0],oldArguments[1],newParams,}newInvocation := invocation2.NewRPCInvocation(invocation.MethodName(), newArguments, invocation.Attachments())newInvocation.SetReply(invocation.Reply())return invoker.Invoke(ctx, newInvocation)}}return invoker.Invoke(ctx, invocation)
}

​

总结

​

通过上面的四个模块以及注册中心的简单介绍不难发现,当请求通过 listener 被 Pixiu 接收后,请求被传入 router 中。router 根据接口的配置,从原请求中找到目标后端服务连同相关API配置下发到 filter 组件。filter 组件根据原请求、 API 配置等信息顺序执行,最终请求到达 client, 通过 client 调用后端服务。
​

Pixiu的未来

 图 3: Pixiu 迭代里程碑

​

Pixiu 作为网关产品外,其衍生项目也会在我们的未来计划中,主要目的是提供更好的可用性。例如,由于 Golang 语言缺乏原生的注解, 因此 Dubbo-go 需要通过配置文件方式生成服务的元数据写入注册中心。开课啦教育公司相关同学写了一个扫描代码的工具 _https://github.com/jack15083/dubbo-go-proxy-tool_,在每个 RPC 服务方法前加上对应的注释,从而在服务启动前通过扫描注释生成元数据。Pixiu 也计划在未来的版本上通过提供 package,允许服务通过注释借助 _https://github.com/MarcGrol/golangAnnotations _生成 API 配置并注册到 Pixiu 上。

Pixiu 目前的定位是一个七层协议网关,其最初版本是被定义成一个 Dubbo 的服务网关。作为云时代的产品,Pixiu 的发展方向必然是面向云原生的。现在的版本为0.2.1, 已经实现基本的 Dubbo/Http 服务代理和部分的网关通用功能。目前正在开发中的 0.4 及其后续版本支持 gRPC 和 Spring Cloud 服务调用, 后续还将提供 MQ 服务支持。另外,社区将继续优化配置方式,降低用户的使用难度,继续优化官方的 filter,使 Pixiu 可以在官方层面实现更多的网关通用功能。

 在未来的一年内,社区计划支持 xDS API,将 Pixiu 演化为 Dubbo mesh 的 sidecar。其最终目的就是:在现有的 dubbo mesh 形态中演化出 Proxy Service Mesh 形态。基于这个形态,Js、Python、PHP、Ruby 和 Perl 等脚本语言程序除了收获 dubbo mesh 原有的技术红利之外,大概率还能收获性能上的提升。
​

Pixiu 在 Dubbo Mesh 中的终极目的是:把东西向和南北向数据面流量逐步统一 Pixiu 中的同时,让它逐步具备 Application Runtime 的能力,作为 Dubbo 多语言生态的关键解决方案。
​

冯振宇,Apache Dubbo Committer,目前负责管理香港一家消费品公司的IT部门整个团队。2020 年夏天 偶然看到了介绍 dubbogo 的文章后加入了 dubbogo 社区,目前在主导 Pixiu 0.4.0 版本的开发。

原文链接

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

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

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

相关文章

微软亚洲研究院成立理论中心,以理论研究打破AI发展瓶颈

微软亚洲研究院成立理论中心,以理论研究打破AI发展瓶颈微软亚洲研究院成立理论中心,以理论研究打破AI发展瓶颈12月11日,微软亚洲研究院举办了2021理论学术研讨会,来自学术界和产业界的理论研究专家齐聚一堂,分享了最新…

Serverless 时代下大规模微服务应用运维的最佳实践

简介: 原来的微服务用户需要自建非常多的组件,包括 PaaS 微服务一些技术框架,运维 IaaS、K8s,还包括可观测组件等。SAE 针对这些方面都做了整体的解决方案,使用户只需要关注自己的业务系统,这极大地降低了用…

极光推送 请检查参数合法性_极光小课堂 | 极光推送在人脸识别终端管理系统中的应用...

项目背景最近开发的一款人脸识别终端管理系统,主要包括运营平台、企业后台管理系统、APP 端、智能人脸识别终端模块。下图是系统的架构图:其中各个模块之间都需要即时通讯,比如:APP 端用户注册完成之后,企业管理员在后…

实时数仓入门训练营:Hologres性能调优实践

简介: 《实时数仓入门训练营》由阿里云研究员王峰、阿里云资深技术专家金晓军、阿里云高级产品专家刘一鸣等实时计算 Flink 版和 Hologres 的多名技术/产品一线专家齐上阵,合力搭建此次训练营的课程体系,精心打磨课程内容,直击当下…

re:Invent大会第十年,亚马逊云科技推出了哪些底层自研技术

编辑 | 宋慧 出品 | CSDN云计算 头图 | 付费下载于视觉中国 一转眼, 亚马逊云科技的云计算已经推出了十五年,亚马逊云科技的年度大会 re:Invent 也举办到了第十年。 今年 re:Invent全球 大会上,亚马逊云科技继续向前,发布系列重…

微信小程序(uniapp)api讲解

Uniapp是一个基于Vue.js的跨平台开发框架,可以同时开发微信小程序、H5、App等多个平台的应用。下面是Uniapp常用的API讲解: Vue.js的API Uniapp采用了Vue.js框架,因此可以直接使用Vue.js的API。例如:v-show、v-if、v-for、comput…

mysql 5.7 binlog 压缩_mysql binlog压缩处理

前一段时间系统mysql压力较大,产生大量binlog,大量的binlog删除后又担心后期出现问题难以调查,保存后又占用本身的空间存储。每天产生的binlog可以多达5-6G。因此考虑是否扩容机器达到目的?经过运维同学 建议,可以压缩…

高度为5的3阶b树含有的关键字个数_第15期:索引设计(索引组织方式 B+ 树)

谈到索引,大家并不陌生。索引本身是一种数据结构,存在的目的主要是为了缩短数据检索的时间,最大程度减少磁盘 IO。任何有数据的场景几乎都有索引,比如手机通讯录、文件系统(ext4xfsntfs)、数据库系统(MySQL…

ARMS企业级场景被集成场景介绍

简介: ARMS企业级场景被集成场景介绍 通过本次最佳实践内容,您可以看到ARMS OpenAPI可以灵活的被集成到客户链路监控场景,并对其进行可视化图形展示监控信息。 1. 背景信息 应用实时监控服务ARMS(Application Real-Time Monitor…

千万并发连接下,如何保障网络性能

过去几十年互联网呈爆发式的增长,内容的丰富以及层出不穷的DDoS攻击等,对网络性能提出了极大的挑战,也同样促进了网络基础设施的快速发展。运营商的带宽越来越大,CPU/网卡等硬件的性能也会越来越强。但在很长时间内,软…

kafka window 启动_Apache Flink结合Kafka构建端到端的Exactly-Once处理

Apache Flink自2017年12月发布的1.4.0版本开始,为流计算引入了一个重要的里程碑特性:TwoPhaseCommitSinkFunction(相关的Jira)。它提取了两阶段提交协议的通用逻辑,使得通过Flink来构建端到端的Exactly-Once程序成为可…

浅谈云原生架构的 7 个原则

简介: 作为一种架构模式,云原生架构通过若干原则来对应用架构进行核心控制。这些原则可以帮助技术主管和架构师在进行技术选型时更加高效、准确,下面将展开具体介绍。 服务化原则 在软件开发过程中,当代码数量与开发团队规模都扩…

深入浅出FlatBuffers原理

简介: FlatBuffers 是一个开源的、跨平台的、高效的、提供了多种语言接口的序列化工具库。实现了与 Protocal Buffers 类似的序列化格式。主要由 Wouter van Oortmerssen 编写,并由 Google 开源。本文将基于高德地图数据编译增量发布使用了FlatBuffers序…

java 反编译class文件_用Java实现JVM第三章《解析class文件》

解析class文件案例介绍本案例主要介绍通过java代码从class文件中解析;class文件、常量池、属性表;作为类(或者接口)信息的载体,每个class文件都完整地定义了一个类。为了使java程序可以“编写一次,处处运行”,Java虚拟…

解放人与设备距离,5G时代的远程操控该如何完成

物联网这个概念早在十多年前便已提出,其主要依托于移动通讯网络来实现其功能的传输。在过去物联网领域的一些设备控制场景中,我们或多或少都见到过远程控制技术的身影,但受限于当时的网络条件和技术场景,大部分应用都属于对设备的…

html点击按钮不响应_html 脚本标签

HTML 脚本小编:阳光就好JavaScript 使 HTML 页面具有更强的动态和交互性。实例插入一段脚本document.write("Hello World!")运行结果:Hello World!(如何将脚本插入到HTML文档中)使用标签document.write("Hello World!")抱歉&#xf…

Spark 大数据处理最佳实践

开源大数据社区 & 阿里云 EMR 系列直播 第十一期 主题:Spark 大数据处理最佳实践 讲师:简锋,阿里云 EMR 数据开发平台 负责人 内容框架: 大数据概览如何摆脱技术小白Spark SQL 学习框架EMR Studio 上的大数据最佳实践 直播…

CNCF TOC 委员张磊:不断演进的云原生给我们带来了什么?

简介: 任何一种云原生技术,它不再是某种能力的弥补,而是更多地将云的能力以某种方式更简单、更高效地透出给我的应用去使用。无论是容器、K8s 还是 Service Mesh,他们都是在不同的环节帮助应用本身能够更好地去使用云服务。 作者…

php url传递参数_互联网系统(APP、网站等)通信基石——会话(PHP版)

一、会话概述1.1、技术背景互联网通信中采用的Http协议(建立TCP连接->Http请求->Http应答->断开TCP连接)本身是无状态的,即Http各请求之间是相互独立、互不相关的,而大量应用需要将各请求关联起来(如:用户登录系统购物、多次购买行为…

pyboard micropython_pyboard:tutorial:repl

进入一个MicroPython REPL命令行REPL意为读取-求值-打印-循环(Read Evaluate Print Loop),是交互式提示的名称,您可在pyboard上访问此交互式终端。 目前测试代码和运行指令的最简便方法即使用REPL。目前,使用REPL是检验代码和运行指令的最简单…