基于 Triple 实现 Web 移动端后端全面打通

news2025/1/12 8:45:53

*作者:陈有为,陌陌研发工程师、Apache Dubbo PMC

RPC 协议开发微服务

图片

在我们正常开发微服务的时候,传统 RPC 服务可能在最底层。上层可能是浏览器、移动端、外界的服务器、自己的测试、curl 等等。我们可能会通过 Tomcat 这种外部服务器去组装我们的 RPC 层,也就是 BFF。或者我们没有 BFF,我们的 RPC 就是对外提供服务。但因为浏览器要访问,所以我们需要有一个网关,比如说 APISIX 或者 ShenYu 等 HTTP 网关。

图片

上图展示的是我们的流程,但是存在一些问题。

如果我们的服务是非常轻的,我们只需要一个转发层,无论是配网关还是起一个 webserver 去转发,怎么做都很麻烦。

此外,RPC 服务大部分都是基于二进制的,而二进制正常在本地是没法测试的。因此我们的公司内都可能就会开发一种后台或者中间的 Proxy 代理让我们去测试。但这个的前提是你至少得把它部署到测试环境,所以还是没法在本地测试。

总体来说,这两个问题会导致易用性比较低,且开发成本相对较高,因为要做一些与业务无关的重复劳动。

全新升级的 Triple 协议

图片

基于上边的两个问题,我们来介绍一下 Triple 协议。

先来说一下上一代协议,它产出的原因是什么。我们应该都知道 Dubbo 原来是 Dubbo 协议,它是基于 tcp 的,它只有一个包。因为它的包的设计,导致了网关无法做一些特殊规则判断、过滤等操作。但也不是绝对的,如果你愿意牺牲性能把包完全解出来,组装回去再透传还是可以做到的,但一般大家都不太能接受。

所以我们就在想能不能把原数据和真正的包分开。现在我们有现成的 HTTP,又有一个业界主流的 gRPC,所以我们的目标就是兼容 gRPC。因为 gRPC目前都是用 IDL,而 IDL 有一个问题,尤其在 Java 侧。因为大家都是写一些接口,定义一些包去实现,这样就会非常麻烦。Go 侧就还好,因为大家已经习惯了这种开发模式。

所以我们开发了 Triple 协议,首先它兼容了 gRPC, 所以我们能实现和 gRPC 的完全互通。其次,我们兼容了自己定义接口的方法。 虽然会损失一定的性能,但提升了一些易用性。而且 RPC 一般不是业务的瓶颈,大多数瓶颈还是在 DB。

但还有个问题,虽然我们兼容了 gRPC,但 gRPC 是基于 TPC 的,所以如果前端或者其他第三方系统只有 HTTP,它还是接受不了我们的系统。

图片

基于此,我们想推出一个全新的 Triple 协议。为了解决上述的所有问题,我们参考了gRPC、gRPC Web、通用 HTTP 等多种协议,做到浏览器访问,支持  Streaming,还支持同时运行在 HTTP/1、HTTP/2 协议上。因为目前 HTTP/3 还没有大规模推广,未来也会支持 HTTP/3。

最终的设计实现是完全基于 HTTP 的,且对人类、开发调试友好。 我们可以通过简单的浏览器访问或者 curl 访问,尤其是对 unary RPC。此外,我们和 gRPC 是完全互通的,用 HTTP 的业务不用担心兼容性的问题,也不用担心签协议的问题。为了稳定性,我们只会采用业界流行的网络库,比如 Java 的 native、Go 的基础的 net 包。

图片

虽然 Triple 协议和 gRPC 协议都基于 HTTP,但 gRPC 是基于 HTTP/2 的,而 Triple 是基于 HTTP/1 和 HTTP/2 的。

我们在兼容 gRPC 的同时,我们为了易用性也扩展了一些功能。比如请求里我们支持 Application/Json 的请求格式,支持使用 curl 访问;

此外上一版的协议,为了支持传统定义接口的方式,我们有一个二次序列化的过程。我们想在这里通过一个特殊的 content type 来决定我们的 body 的结构,解决二次序列化的问题。同时这个东西是可以扩展的,理论上 HTTP 的所有功能我们在 Triple 协议上都可以实现,也可以拓展。

图片

用了 Triple 协议之后,我们的开发流程也发生了改变。如果你不需要进行组装,或者没有外层的代理,可能你的接入流程就是从外部的请求浏览器、对方的服务器、curl、自己测试等直接到了 server。

和其他的 gRPC 的通信也是没有问题的,流程就相当于少了一层。对于大多数用户,如果你不需要这个场景,其实是有很大的好处。

图片

Triple 协议因为最开始兼容 gRPC,那个时候只基于 HTTP/2,HTTP/2 有 Streaming 的能力,所以它天然支持 Streaming。但这里比较特殊的是,我们新版的协议在 HTTP/1 也支持了 Stream,但因为 HTTP/1 的限制只能支持到 Server Streaming。依赖 HTTP/1 的 Server Push 实现。

图片

Client Stream 和 Bi Stream 就没什么可说的了。但有一个特别的是,在 Java 侧没有 Bi Stream,从编码上就没有,但从实现上是有的。

Triple 协议开发微服务

图片

目前 Triple 协议比较灵活的支持两种定义方式,分别是 IDL 定义和直接定义。 直接定义支持同步、异步、手写。还有比较极端一点的,比如在自己定义接口的时候使用 IDL 生成 protobuf 的类,我们不定义它的 service,只用它的生成的 request 和  response 类也是没问题的,Triple 协议会自动识别接口使用 protobuf 还是不使用 protobuf 进行传输。

图片

Server 就是把它的务实现一下。上图是一个例子,我就直接拿了 API 的组装方式,真正的业务上可能是注解或者 XML 的方式。

图片

因为我们支持了 HTTP 这个标准的协议,理论上我们的测试就会变得很简单。

因为我们支持 gRPC,所以我们可以用 gRPC curl 去调用我们的服务。但前提是你得有反射服务,然后手动开启一下,它不是默认开启的。然后它就可以通过反射拿到接口的源数据,通过 Json 转成 protobuf 格式发过去。或者我们直接用 Application/Json 的方式直接调过去。这里有一点比较特别的是在 HTTP/1 下我们也可以用 Sreaming。

另外,因为我们支持 HTTP,理论上所有第三方的 HTTP 客户端都是可以调用的。然后使用 Dubbo 的 Admin 也可以进行测试,前提是你得把它注册上。

图片

调用端不管是 POJO 还是 IDL,它们都没有本质的区别。

图片

现在我们有了 Triple 协议,但如果这个协议没有承载方也是行不通的。因此我们还得有一个框架,有一些服务治理才是我们的微服务。 所以服务治理也是微服务中不可或缺的一部分。

Dubbo 为 Triple 协议带来治理能力

图片

Triple 的定位只是 Dubbo 里的其中一个协议,当然你也可以为了兼容性,用原来的 Dubbo 协议或者其他的协议。而且我们支持在同一个端口上开启多个协议,可以按需选择。

图片

同时 Dubbo 为 Triple 提供了多语言的实现。目前会在 Rust、Go、Java、JS、node、Python 这几部分实现官方的实现。这样用户就不用自己根据实验协议的 spec 去实现了。如果你有一些定制需求,比如内部的一些框架,你根据 spec 实现也是可以的。

图片

Dubbo 和服务框架集成的很好,理论上在开发流程中,尤其是在 Java 侧服务定义、服务治理、服务注册发现等都不用客户来操心,是开箱即用的。

图片

Dubbo 提供了丰富的生态,第三方的生态包括 Nacos、Zookeeper 等等,我们不用创新,直接引入相应的包即可。

图片

这是我们使用 Triple 协议服务注册的例子。上面你可以选 Nacos、Zookeeper、K8s,左边是一个 Client 和一个 Server,这么调用。

图片

我们在 admin 上看一下实现。这里提一句,我们的 admin 也在新版重构,是用 Go 实现的,大家可以期待一下。

图片

我们经常会遇到灰度发布或者流量染色的需求。我们可以从 admin 上发一个 tag 治理规则下去,然后把一些实例打上 tag,然后这个携带 tag 的流量就从入口就会挨个传递下去,从而实现全链路的流量染色。

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

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

相关文章

Win10 搭建FTP服务器

1. FTP 服务器用途 局域网中,资料共享,如果想实现外网访问可以设置路由端口映射(不建议外网一旦打开风险增大) 2. FTP服务器可以设置用户权限有什么? 用户只能读取 用户只能写入 用户读取写入 使用场景&#xff…

让GPT回复图片的咒语

咒语如下&#xff1a; 帮我画一张图关于XXXXX,用3/8Markdown 写&#xff0c;不要有反斜钱,不要用代码块。使用Unsplash APl(https://source.unsplash.com/1280x720/?<PUT YOUR QUERY HERE >) Over! ​​​​​​​

面向红队的自动化引擎工具

gogo 介绍 面向红队的、高度可控的可拓展的自动化引擎。特征如下&#xff1a; 自由的端口配置 支持主动/主动指纹识别 关键信息提取&#xff0c;如标题、证书以及自定义提取信息的正则 支持nuclei poc&#xff0c;poc目录&#xff1a;https://chainreactors.github.io/wiki/…

centos7安装erlang23.3.4.11及rabbitmq3.9.16版本

rpm包有系统版本要求&#xff0c;el是Red Hat Enterprise Linux(EL)的缩写。 EL7是Red Hat 7.x&#xff0c;Centos 7.x EL8是Red Hat 8.x, Centos 8.x 所以我们在安装erlang及rabbitmq时需要选择与自己的服务器相对应的rpm包 # rabbitmq的rpm安装包 https://github.com/rabbi…

小程序技术加速信创操作系统国产化替换

随着信息技术的不断发展&#xff0c;信息技术应用创新&#xff08;简称“信创”&#xff09;已经成为了当今企业数字化转型的重要趋势之一。信创是指在信息技术领域&#xff0c;以自主可控的国产软硬件产品和服务为核心&#xff0c;构建起一套完整的信息技术生态体系&#xff0…

【仪器仪表专题】案例:测试充电芯片保护时间测试10小时后电子负载自动下线是为什么?

测试充电芯片保护时间有两种办法,一种是使用真实的电池让充电芯片一直充电(可以通过降充电电流、修改时间参数或是并电池增加容量的方式)。另一种是使用电子负载的CV模式模拟电池(需要增加一个芯片NTC电阻来避免充电芯片发生NTC错误)。 为了最完整的还原这个过程,我采取…

子组件监听父组件消息,随之变化与不变化

父组件通过props传递给子组件消息&#xff0c;子组件有两种情况接收处理&#xff1a; 1、子组件监听父组件props的变化&#xff0c;同时随之变化【可以直接取props中的值展示&#xff0c;也可以监听值得变化处理】 2、子组件初始化时更新&#xff0c;随后不再随父组件变化 示…

JVM八股文

1.JVM的内存结构&#xff1f; 2.OOM是什么&#xff0c;怎么排查&#xff1f; 3.请解释四种引用是什么意思有什么区别&#xff1f; 4.GC的回收算法有哪些&#xff1f; 5.怎么判断对象是否存活&#xff1f; 1.什么是JVM内存结构 jvm将虚拟机分为5大区域&#xff0c;程序计数器、…

C语言 static extern 关键字详解

C语言 static 关键字详解 1 全局变量 2 static 修饰全局变量 3 static 修饰局部变量 4 static 修饰函数 5 extern 关键字 在C语言中主要是用来修饰变量和函数 1 全局变量 全局变量的作用域十分的广&#xff0c;只要在一个源文件中定义后&#xff0c;应用中所有的所有源…

发现国内优秀的团队协作软件,帮助提高工作效率

中国有许多优秀的团队协作软件&#xff0c;它们在企业和组织中发挥着重要作用。 以下是一些最受欢迎的团队协作软件&#xff1a; 1、钉钉&#xff08;DingTalk&#xff09;: 这是一款由阿里巴巴推出的企业级协作工具&#xff0c;旨在帮助企业和组织实现高效沟通和协作。钉钉提…

【VR】【Unity】如何调整Quest2的隐藏系统时间日期

【背景】 网络虽然OK&#xff0c;但是Oculus Quest要连上商店还必须调整好系统时间&#xff0c;不过在Quest系统中&#xff0c;时间对用户是不可见的&#xff0c;本篇介绍调整的方法。 【方法】 打开SideQuest&#xff0c;没有的话先去下载一个。打开后先登录&#xff0c;如…

Unity-3D模型展示

将3D模型放置到某个位置&#xff0c;然后通过鼠标左键进行旋转的操作 一种方法是添加另外的相机&#xff0c;采用RenderTexture来渲染该相机的内容 那么RenderTexture是做什么的呢&#xff1f; RenderTexture可以捕获从摄像机、光源和其他对象渲染的图像&#xff0c;并将结果…

基础课2——自然语言处理

1.概念 自然语言处理&#xff08;Natural Language Processing, NLP&#xff09;是计算机科学领域与人工智能领域中的一个重要方向&#xff0c;它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。 自然语言处理的主要研究方向包括&#xff1a; 语言学研究&…

软考高项第四版教材整合管理(第8章)重点内容

序&#xff1a;距离2023下半年软考还有18天&#xff0c;来不及看书的小伙伴看过来啦&#xff0c;一起过一下重点&#xff0c;开始之前&#xff0c;建议大家将下面的过程组矩阵图熟记&#xff01;&#xff01;&#xff01; 第8章 项目整合管理 项目整合管理包括识别、定义、组…

水滴怕片效果实现

效果展示 CSS 知识点 border-radius 属性运用 FANCY-BORDER-RADIUS 工具 此工具主要是实现不规则的图形。 FANCY-BORDER-RADIUS 工具地址 页面整体布局实现 <div class"container"><div class"drop" style"--clr: #ff0f5b">&l…

手机有什么爬虫App工具?

随着智能手机的普及和应用的繁盛&#xff0c;越来越多的人开始对手机App进行数据爬取和分析。那么&#xff0c;在进行手机App爬虫的过程中&#xff0c;我们可以借助哪些工具呢&#xff1f;让我们一起来了解一下吧&#xff01; 1、Fiddler Fiddler是一款功能强大的网络调试工具…

Angular安全专辑之五 —— 防止URL中敏感信息泄露

URL 中的敏感数据是指在网址上的机密或者个人信息&#xff0c;包括 UserId, usernames, passwords, session, token 等其他认证信息。 由于URL 可能会被第三方拦截和查看&#xff08;比如互联网服务商、代理或者其他监视网络流量的攻击者&#xff09;&#xff0c;所以URL中的敏…

Qt (QFileDialogQColorDialogQFontDialog) 对话框实战

目录 一、QFileDialog 类 (文件对话框) 二、QColorDialog 类(颜色对话框) 三、QFontDialog 类(字体对话框类) 一、QFileDialog 类 (文件对话框) QFileDialog 是 Qt 框架中的一个类&#xff0c;用于在应用程序中提供文件对话框。它允许用户选择文件或目录&#xff0c;并且可…

ssh 连接:Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

报错原因&#xff1a; ssh配置文件中有些配置文件没有开启 问题解决&#xff1a; PasswordAuthentication yes // 开启密码登录 PermitRootLogin yes // 开启root登录 PubkeyAuthenticaion yes // 开启公钥登录 配置项解释&#xff1a; 1.PasswordAuthenticati…

AI算法检测对无人军用车辆的MitM攻击

南澳大利亚大学和查尔斯特大学的教授开发了一种算法来检测和拦截对无人军事机器人的中间人&#xff08;MitM&#xff09;攻击。 MitM 攻击是一种网络攻击&#xff0c;其中两方&#xff08;在本例中为机器人及其合法控制器&#xff09;之间的数据流量被拦截&#xff0c;以窃听或…