当前位置:首页 > 短网址资讯

使用PHP和Node.js连接dubbo短网址服务

www.ft12.com9年前 (2017-05-03)短网址资讯1567
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,序列化使用github.com/node-modules 自带js-to-java功能,但是这里需要注意,拿到成功返回结果后,如果decode失败,一定要检查java服务方法返回的最好是List,Map,Array这种常规JAVA数据类型,否则可能反序列化失败解析不出js对象。

8,完成调用,缓存实例,对Monitor做通知,详细格式参见dubbo Monitor源码:github.com/alibaba/dubb

四,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的实现方式,语言虽然不一样,原理和调用方式都是相同,如果之后有时间,业务中经常使用这种场景,还是要自己亲自实现一个的好。

做前端真难。。所以我如果上面有说错的地方,大家指正,后续我再修改,希望帮助到想了解的朋友。


扫描二维码推送至手机访问。

版权声明:本文由短链接发布,如需转载请注明出处。

本文链接:https://www.ft12.com/article_29.html

分享给朋友:

相关文章

做微商一个月能赚多少钱?

做微商一个月能赚多少钱?

去年,我发现朋友圈里有人开始卖东西,看着一两百块钱一双的品牌运动鞋,我有些许动心,但也有点忐忑。点开那个没有聊天记录的对话框,我问朋友:“是不是真的啊。” 他信誓旦旦地保证道:“鞋子肯定是真的。”当时我没买,但今天和一个长时间在朋友圈卖鞋的…

论坛私信推广的准确操作姿态

论坛私信推广的准确操作姿态

本人操作过的项目许多,每一个简直都是从零起步,从没想过把一切资源整合到一同,错过了太多用户,错过了太多粉丝,我在短网址行业没有一个兄弟,多年来陪我的即是那几台电脑和日夜运行的软件。但是今天我不是来抱怨的,言归正传,分享给咱们一个亲自操作的案…

全球纯电动车制造商出货量排名:特斯拉仅第二

全球纯电动车制造商出货量排名:特斯拉仅第二

提到电动汽车,我们往往首先想到的是特斯拉,然而根据一份最新调查数据显示,特斯拉并非全球最大的电动汽车制造商。据JATO数据提供商最新公开的纯电动车制造商排名显示,目前雷诺-日产是全球最大的纯电动车制造商,特斯拉排在第二位,其它前十名厂商分别…

PHP编程需要掌握的20个要点,能极大提高效率

PHP编程需要掌握的20个要点,能极大提高效率

[摘要] 用单引号取代双引号来包括字符串,这样做会更快一些。由于PHP会在双引号包抄的字符串中征采变量,单引号则 不会,留意:只要echo能这么做,它是一种能够把多个字符串看成参数的“函数”用单引号取代双引号来包括字符串,这样做会更快一些。…

技术漫谈:为何KPI毁了索尼,而OKR却成就了谷歌?

技术漫谈:为何KPI毁了索尼,而OKR却成就了谷歌?

作者|李运华编辑|小智从技术 leader 的角度出发,看技术人绩效考核的痛。大多数公司里面总会因为 KPI 的考核方式而存在各种各样的问题,OKR 是一个在硅谷互联网公司比较流行的做法。怎样去理解 OKR 这个概念,并在技术团队中推行,从…

如何在一个月内,低成本获取前1000个高质量种子用户?

【来源丨人人都是产品经理】【编辑丨善小花】 要钱没钱,要资源没资源,想到起步获取种子用户就头大?辛辛苦苦熬夜写出的内容没人看,拉不来一个用户?拉来的用户只想褥羊毛不会反馈贡献,羊毛褥完就跑?眼看有上千号种子用户,但是却没有几个能够…

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。