

使用PHP和Node.js连接dubbo服务
source link: https://zhuanlan.zhihu.com/p/26581501
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

使用PHP和Node.js连接dubbo服务
DUBBO是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000,000+次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。
不巧的是我司也在用,之前的解决方案是JAVA包装成HTTP的restful API给中间层Node.js或者PHP调用,但是其实有时候需求比较紧急的情况下,直接RPC远程调用可能能解决一些燃眉之急。
由于技术栈是PHP和Node.js,前一阵子研究了一下,总结一下,希望能帮助到有类似场景的同学,也分享一下遇到这种根本不了解的问题是如何去解决的过程,PS,我之前没有JAVA开发背景和PHP开发背景。
一,了解dubbo和他的RPC远程调用原理。
首先是这张图分了几个角色,是从官网拿来的:
Provider: 暴露服务的服务提供方。
Consumer: 调用远程服务的服务消费方。
Registry: 服务注册与发现的注册中心。
Monitor: 统计服务的调用次调和调用时间的监控中心。
Container: 服务运行容器。
说的通俗一点,我们要拿PHP或者NodeJs实现一个Consumer,而Consumer与Monitor和Registry是有关联的,与Provider是有调用关系的。
这个图和上面这段话理解后,简单分析下,dubbo服务的Registry一般使用的都是zookeeper作为注册中心,Monitor需要在消费方和服务提供方进行监控统计,这里只需要实现Monitor消费方的通知即可。
二,实现方案。
上面只是简单的分析出来需求,那么如何实现这个Consumer呢,通过查看几个已经存在的开源项目,比如node.js比较有名的,很多人都在用的,支持hessian协议的 p412726700/node-zookeeper-dubbo,还有支持jsonrpc调用的hufeng/node-jsonrpc-dubbo,他们的实现基本上思路是一样的,包括几个PHP的项目:quickj/dubbo-php-client
既然大家都已经实现了,我讲讲我看到的源码和一些关键代码吧。
三,Node.js连接原理
1,基本所有的库都是使用alexguan/node-zookeeper-client来连接的Registry,使用zookeeper.createClient方法来创建zookeeper实例。
2,从zookeeper连接后的实例中拿到对应服务提供者提供的的dubbo协议集合,使用getChildren方法。
3,对拿到的集合遍历,记得要decodeURIComponent,然后对URL做解析,比如是http开头的dubbo协议,还是dubbo开头的协议,需要分别保存。
4,协议中是包含了RPC调用的所有dubbo方法的,此时需要把对应的方法进行保存,有的框架对方法做了属性拷贝,属性对应的方法内容就是一个invoke调用,有的则是对invoke做了API,你自己去传入RPC调用的方法名。
5,对不同协议编写不同的调用实现方法,如HTTP的调用使用node-json-rpc,而dubbo协议则使用hessian的库。
6,分析dubbo协议原理,简单概括就是基于hessian协议,传输前需要序列化,传输成功后使用hessian的反序列化方法拿到结果,传输使用socket方法连接。
7,序列化使用https://github.com/node-modules/hessian.js 自带js-to-java功能,但是这里需要注意,拿到成功返回结果后,如果decode失败,一定要检查java服务方法返回的最好是List,Map,Array这种常规JAVA数据类型,否则可能反序列化失败解析不出js对象。
8,完成调用,缓存实例,对Monitor做通知,详细格式参见dubbo Monitor源码:https://github.com/alibaba/dubbo/blob/master/dubbo-monitor/dubbo-monitor-api/src/main/java/com/alibaba/dubbo/monitor/MonitorService.java#L68
四,PHP连接原理
因为我是先了解了NodeJs的大概一个调用和实现过程的,那么再看PHP的,其实就不难了。我这里做一个最小化的解释,我PHP并不太好……属于现学现卖。
1,先找能连zookeeper的类,ZooKeeper - Manual
2,同样使用getChild方法解析出dubbo的协议集合,并且urldecode,再分析保存住对应可以invoke的方法名,协议调用地址。
3,php中的invoke方法实现为先socket_create方法创建一个连接,connect之后socket_write发送请求,然后读回结果,再json_decode(包含中文结果记得转编码)。
4,write参数格式为:invoke com.xx.xx.interfaces.service.method("args")
5,发送Monitor通知。
其实总结一下,理论上Node.js也是可以转写成PHP的实现方式,PHP也可以转写成Node.js的实现方式,语言虽然不一样,原理和调用方式都是相同,如果之后有时间,业务中经常使用这种场景,还是要自己亲自实现一个的好。
做前端真难。。所以我如果上面有说错的地方,大家指正,后续我再修改,希望帮助到想了解的朋友。
Recommend
-
64
README.md dubbo-php-framework dubbo-php-framework是一个用于php语言的RPC通讯框架,与dubbo在协议上完全兼容,可同时作为provider端和consumer端,使用zookeeper用于服务注册发现,序列化使用fastjson....
-
34
-
18
前言 本文 Dubbo 使用版本 2.7.5 Dubbo 通过使...
-
23
前言 上篇文章《Dubbo之服务暴露》分析 Dubbo 服务是如何暴露的,本文接着分析 Dubbo 服务的消费流程。主要从以下几个方面进行分析...
-
25
上一篇中,我们介绍了dubbo的负载均衡实现,见识了几种常用的负载均衡算法。就单个功能而言,似乎dubbo并没有太多的突出之处。事实上,一个成功的产品不必每个地方都要打破常规。更重要的是其全局优化的架构设计,以及如何使用现有的优秀解...
-
25
看完今天的服务调用流程,基本上Dubbo的核心过程就完整的串联起来了,在脑海中应该就有 Dubbo 整体运行的概念,这体系就建立起来了,对 RPC 也会有进一步的认识。 简单的想想大致流程 在分析Dubbo 的服...
-
15
远程调用的过程: 首先服务消费者通过代理对象 Proxy 发起远程调用,接着通过网络客户端 Client 将编码后的请求发送给服务提供方的网络层上,也就是 Server。Server 在收到请求后,首先要做的事情是对数据包进行解码。然后将解码后的请求发送至分发器 Di...
-
3
曾凡维 杭州开课啦教育科技有限公司高级开发工程师 来源 | 阿里巴巴云原生公众号杭州开课啦教育科技有限公司是一家致力于为中小学生提供学习辅导的在线教育公司,目前...
-
9
Dubbo服务启动依赖检查 作者: wencst 分类: JAVA,Uncategorized,
-
4
Dubbo服务间的连接是怎么控制处理的? 最近被问到一个问题: 有依赖关系的两个dubbo服务。通过TCP进行连接时候,他们之间的连接是怎么控制的?怎么达到一个合理的数量? 我们从一个例子开始吧:一个订单服务 OrderServ...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK