背景:团队中所有的项目都是php开发的,且都是用的php-fpm。总共目前有6项目,这几个项目的核心数据都是在一个数据库中,现在如果改动一个小功能,可能这几个项目都会去改动,效率低下。所以考虑将一些公共的服务和数据独立拆分出来,有统一的读和写入口。
问题:那这个6个项目是怎么相互调用的呢?新项目又怎么调用呢?
创建一个和这6个项目目录平级的新的项目(codebase),这个项目是一个公共的调用项目。其他所有项目index.php都include codebase中的autoload.php文件。为什么没有选择用composer的方式将新的codebase加入到项目中。因为上线太麻烦了,在codebase中修改一个功能,需要协调6个项目组中的人去composer update ,同时去上线、测试。这个流程就太漫长了,也不满足我们设计这套方案的初衷。目前只要是新功能都会产生一个独立的项目,如果这几个端口和新功能有关系,那么都是通过rpc的方式来调用。
协议选择:protobuffer、thrift、json-rpc、yar。对于Pb和thrift我感觉还是重了一点,团队中至少目前跨语言还没有出现。json-rpc没有找到运用得比较广泛的应用、且关注的人比较少。所以最后选择鸟哥的yar。
yar是一个php的扩展,需要安装,安装方法参考最后链接说明。
rpc的优势是可以调用本地方法一样调用远程的方法,且可以捕获异常,非常方面。
客户端:需要注意的是client设置超时时间YAR_OPT_TIMEOUT,单位为秒。
以下是copy鸟哥的说明:
<?php
$client = new Yar_Client("http://host/api/");
$client->SetOpt(YAR_OPT_CONNECT_TIMEOUT, 1000);
$client->SetOpt(YAR_OPT_HEADER, array("hd1: val", "hd2: val"));
//调用远端服务
$result = $client->some_method("parameter");
服务端:一个普通的php-fpm,不是像swoole这种常驻进程。
<?php
class API {
public function some_method($parameter, $option = "foo") {
}
protected function client_can_not_see() {
}
}
$service = new Yar_Server(new API());
$service->handle();
网友评论