首页 » PHP教程 » js挪用phprpc技巧_RPC 专栏从跨措辞调用到 dubbo2js

js挪用phprpc技巧_RPC 专栏从跨措辞调用到 dubbo2js

访客 2024-12-18 0

扫一扫用手机浏览

文章目录 [+]

跨措辞调用是一个很大的话题,也是一个很有寻衅的技能活,目前业界常常被提及的办理方案有如下几种,不妨拿出来旧调重弹一番:

spring cloud。
spring cloud 供应了一整套微做事开拓组件,它紧张面向 java 开拓,但由于其利用的协议是基于 restful 风格的 http 协议,这使得其天然具备跨措辞能力,异构措辞只须要供应 http 客户端,便可以实现跨措辞调用。
service mesh。
号称下一代微做事框架的 service mesh,其办理跨措辞问题的核心在于 SideCar ,SideCar 在 service mesh 的发展过程中观点不断的迁移,但实质都是完成了一件事:处理做事间通信,卖力实现要求的可靠通报。
motan。
motan 是新浪微博开源的一款跨措辞做事管理框架,在其早期版本中仅支持 motan-java,随着版本演进,在目前最新版本(1.1.0)中,供应了 motan-go,motan-php,motan-openresty 等跨措辞特性。
类似于 service mesh 中的 SideCar,motan 借助于 motan-go 作为 agent 完成协议的转发,并且依赖于定制协议:motan2,实现跨措辞调用。

当我们再聊跨措辞调用时我们在聊什么?纵不雅观上述几个较为通用,成熟的办理方案,可以得出结论:办理跨措辞调用的思路无非是两种:

js挪用phprpc技巧_RPC 专栏从跨措辞调用到 dubbo2js

探求一个通用的协议利用 agent 完成协议的适配

如果一个新型的团队面临技能选型,我认为上述的方案都可以纳入参考,可考虑到遗留系统的兼容性问题

js挪用phprpc技巧_RPC 专栏从跨措辞调用到 dubbo2js
(图片来自网络侵删)
旧系统的迁移本钱

这也关键的选型成分。
我们做出的第一个考试测验,便是在 RPC 协议高下功夫。

通用协议的跨措辞支持

springmvc的美好时期

springmvc

springmvc

在没有实现真正的跨措辞调用之前,想要实现“跨措辞”大多数方案是利用 http 协议做一层转换,最常见的手段莫过于借助 springmvc 供应的 controller/restController,间接调用 dubbo provider。
这种方案的上风和劣势显而易见

上风是大略,是最普通的办理方案。
劣势是使得调用链路变长,tcp 通信之上又多了一层 http 通信;开拓体验差,为了将 rpc 接口暴露出去,须要额外编写一份 controller 层的代码。

通用协议的支持

事实上,大多数做事管理框架都支持多种协议,dubbo 框架除默认的 dubbo 协议之外,还有当当网扩展的 rest协议和千米网扩展的 json-rpc 协议可供选择。
这两者都是通用的跨措辞协议。

rest 协议为知足 JAX-RS 2.0 标准规范,在开拓过程中引入了 @Path,@POST,@GET 等表明,习气于编写传统 rpc 接口的人可能不太习气 rest 风格的 rpc 接口。
一方面这样会影响开拓体验,另一方面,独树一帜的接口风格使得它与其他协议不太兼容,旧接口的共生和迁移都无法实现。
如果没有遗留系统,rest 协议无疑是跨措辞方案最大略单纯的实现,绝大多数措辞支持 rest 协议。

和 rest 协议类似,json-rpc 的实现也是文本序列化&http 协议。
dubbox 在 restful 接口上已经做出了考试测验,但是 rest 架构和 dubbo 原有的 rpc 架构是有差异的,rest 架构须要对资源(Resources)进行定义, 须要用到 http 协议的基本操作 GET、POST、PUT、DELETE。
在我们看来,restful 更得当互联网系统之间的调用,而 rpc 更适宜一个别系内的调用。
利用 json-rpc 协议使得旧接口得以兼顾,开拓习气仍旧保留,同时得到了跨措辞的能力。

千米网在早期实践中采取了 json-rpc 作为 dubbo 的跨措辞协议实现,并开源了基于 json-rpc 协议下的 python 客户端 dubbo-client-py 和 node 客户端 dubbo-node-client,利用 python 和 nodejs 的小伙伴可以借助于它们直接调用 dubbo-provider-java 供应的 rpc 做事。
系统中大多数 java 做事之间的相互调用还是以 dubbo 协议为主,考虑到新旧协议的适配,在不影响原有做事的根本上,我们配置了双协议。

<dubbo:protocol name=\"大众dubbo\"大众 port=\"大众20880\"大众 />

<dubbo:protocol name=\"大众jsonrpc\"大众 port=\"大众8080\"大众 />

dubbo 协议紧张支持 java 间的相互调用,适配老接口;json-rpc 协议紧张支持异构措辞的调用。

定制协议的跨措辞支持

微做事框架所谓的协议(protocol)可以大略理解为:报文格式和序列化方案。
做事管理框架一样平常都供应了浩瀚的协议配置项供给用者选择,撤除上述两种通用协议,还存在一些定制化的协议,如 dubbo 框架的默认协议:dubbo 协议以及 motan 框架供应的跨措辞协议:motan2。

motan2协议的跨措辞支持

motan2

motan2

motan2 协议被设计用来知足跨措辞的需求紧张表示在两个细节中—MetaData 和 motan-go。
在最初的 motan 协议中,协议报文仅由 Header+Body 组成,这样导致 path,param,group 等存储在 Body 中的数据须要反序列得到,这对异构措辞来说是很不友好的,以是在 motan2 中修正了协议的组成;weibo 开源了 motan-go ,motan-php ,motan-openresty ,并借助于 motan-go 充当了 agent 这一翻译官的角色,利用 simple 序列化方案来序列化协议报文的 Body 部分(simple 序列化是一种较弱的序列化方案)。

agent

agent

仔细揣摩下可以创造这么做和双协议的配置差异并不是大,只不过这里的 agent 是隐式存在的,与主理事共生。
明显的差异在于 agent 方案中异构措辞并不直接交互。

dubbo协议的跨措辞支持

dubbo 协议设计之初只考虑到了常规的 rpc 调用场景,它并不是为跨措辞而设计,但跨措辞支持从来不是只有支持、不支持两种选择,而是要按难易程度来划分。
是的,dubbo 协议的跨措辞调用可能并不好做,但并非无法实现。
千米网便实现了这一点,nodejs 构建的前端业务是异构措辞的主沙场,终极实现了 dubbo2.js,打通了 nodejs 和原生 dubbo 协议。
作为本文第二部分的核心内容,重点先容下我们利用 dubbo2.js 干了什么事。

Dubbo协议报文格式

dubbo协议

dubbo协议

dubbo协议报文头详解:

magic:类似java字节码文件里的魔数,用来判断是不是 dubbo 协议的数据包。
魔数是常量 0xdabbflag:标志位, 一共8个地址位。
低四位用来表示体数据用的序列化工具的类型(默认 hessian),高四位中,第一位为 1 表示是 request 要求,第二位为 1 表示双向传输(即有返回 response),第三位为 1 表示是心跳 ping 事宜。
status:状态位, 设置要求相应状态,dubbo 定义了一些相应的类型。
详细类型见com.alibaba.dubbo.remoting.exchange.Responseinvoke id: id, long 类型。
每一个要求的唯一识别 id(由于采取异步通讯的办法,用来把要求 request 和返回的 response 对应上)body length:体 body 长度, int 类型,即记录 Body Content 有多少个字节body content:要求参数,相应参数的抽象序列化之后存储于此。

协议报文终极都会变成字节,利用 tcp 传输,任何措辞只要支持网络模块,有类似 Socket 之类的封装,那么通信就不成问题。
那,跨措辞难在哪儿?以其他措辞调用 java 来说,紧张有两个难点:

异构措辞如何表示 java 中的数据类型,特殊是动态措辞,可能不存在严格的数据类型序列化方案如何做到跨措辞

dubbo2.js办理方案

上面我们剖析出了两个难点,dubbo2.js 办理这两个问题的关键依赖于两个类库:js-to-java ,hessian.js 。
js-to-java 使得 nodejs 具备 java 工具的表达能力,而 hessian.js 供应了序列化能力。
借助于 nodejs 的 socket ,妇科一套 dubbo 协议的报文格式,终极便实现了 nodejs 对 java-dubbo-provider 的调用。

dubbo2.js快速入门

为了让对 dubbo2.js 感兴趣的读者有一个直不雅观的体验,本节呈现一个快速入门示例,让你体会到利用 dubbo2.js 调用 dubbo 做事是一件多么轻松的事。

创建 dubbo-java-provider

后端 dubbo 做事利用 java 来供应,这做事大多数的业务场景。
首先定义做事接口:

public interface DemoProvider {

String sayHello(String name);

String echo() ;

void test();

UserResponse getUserInfo(UserRequest request);

}

其次,实现做事:

暴露做事:

实现 nodejs 的 dubbo 客户端

安装 dubbo2.js:

npm install dubbo2.js --save

配置 dubboConfig.ts:

利用 typescript 可以带来更好的开拓体验。

编写调用类 main.ts:

import {demoService} from './dubboConfig'

demoService.sayHello('kirito').then(({res,err})=>{

console.log(res)

});

实行调用

Debug 模式启动 nodejs 客户端:

DEBUG=dubbo ts-node main.ts

查看运行结果:

Hello kirito, response form provider: 172.19.6.151:20880

congratulation!

dubbo2.js特性支持 zookeeper 注册中央支持原生 dubbo 协议支持做事直连全链路跟踪dubbo 接口自动天生MORE DETAILS

本文中的示例代码,供应在此处,https://github.com/lexburner/Dubbojs-Learning 。
如果你对 dubbo 协议不慎理解,想要理解它的事情事理,项目中供应了一个子 moudle — java-socket-consumer,利用面向过程的思路实现了 java-socket-consumer,完成了原生 socket 发送 dubbo 协议报文,完成方法调用,并获取相应的全流程。

标签:

相关文章