2018年5月19日,在上海举行的第六届中国PHP开发者大会(PHPCon)上,腾讯开源项目TARS首次全面发布PHP版本,阅文集团高级开发工程师梁晨对PHP如何经过TARS构建高性能RPC框架作了经验分享。
php

分享内容:
TARS做为腾讯开源的RPC框架,在发布以后即受到开源领域的关注。它在微服务、协议、多语言和运营体系上的支持,都很是的完善。在微服务方面,实现了服务自动发现、智能调度、容灾容错、柔性熔断,以及路由与灰度的功能。与此同时,经过使用私有二进制协议,能够有效的下降服务之间调用的流量。而在语言支持的层面,TARS对C++、Java、Nodejs、PYTHON都提供了比较好的方案。考虑到PHP在WEB后台领域的使用很是的普遍,TARS-PHP的出现,势在必行。git
那么在设计TARS-PHP的时候,必须考虑到现有PHP的开发生态,至少要作到 功能完善、灵活、轻量和高效。在功能方面,TARS-PHP对标了现有的C++、JAVA、NodeJS的功能体系,作到了对CLIENT能力和SERVER能力的支持。而在灵活方面,PHP一直是出类拔萃的,做为泛型脚本语言,开发的过程,谁用谁知道。而在轻量设计方面,TARS-PHP遵循一个最简化、轻量级、可插拔的设计想法,让整个方案自成体系的同时,也能具有最大程度的可扩展性。最后,也是最重要的,高效。经过引入PHP业界优秀的SWOOLE框架,再结合SWOOLE2.0的协程能力,让TARS-PHP插上协程的翅膀。
TARS-PHP的解决方案,按照功能模块,会分红如下四个部分:github
l TARS-CLIENTdocker
l TARS-EXT扩展编程
l TARS-SERVER后端
l 开发效率模块缓存
TARS-CLIENT
对于熟悉TARS-PHP的同窗来讲,TARS-CLIENT的能力在半年前就已经开源,并提供使用了。本次TARS-PHP的从新设计,也对TARS-CLIENT现有的能力作了一个梳理。全新设计以后的TARS-CLIENT具有了配置统一化、一键调用、以及多种网络能力的特色。而在功能上,集成也更为丰富了,现有的TARS-CLIENT由以下的功能模块组成:
l 自动寻址:CLIENT再也无需关系服务地址服务器
l 主调上报:调用状况会默认进行主调上报,服务状况一览无遗网络
l 远程日志:日志能够写入远程服务,再落地,下降文件IO的损耗框架
l 网络能力:SOCKET、SWOOLE同步、SWOOLE协程
全新设计后的TARS-CLIENT,既能够知足后台系统的SOCKET请求需求,也可以知足在SWOOLE中进行同步和协程的两种调用需求,用户只须要灵活的按照配置各取所需。同时,全新集成的自动寻址、主调上报、远程日志功能,会让用户在使用的时候,更加的无感知,更加的顺畅。
下面便是现有TARS-CLIENT的使用demo:

能够清晰的看到,统一化的配置,层级更为清晰,并且调用者无需关心底层细节,寻址和主调上报已经悄然完成。
再从总体的角度来看一下TARS-CLIENT的方案:

从图中能够更为清晰的看到底层实现的细节。对于自动寻址而言,实现自动并不彻底解决问题。由于每次都去询问服务的地址,会给主控服务带来很大的压力。所以结合了PHP自己的能力以后,选用了SWOOLE TABLE和本地文件做为缓存的方式。缓存时间由服务启动时默认指定,那么在这个时间以内,便不会再次进行主控的请求。下降了主控压力的同时,也下降了本地获取服务地址的耗时。
而以下图所示:主调上报的策略中,也可以根据实际的网络收发状况,进行耗时、失败率、超时率、服务端异常的及时上报,方便业务尽快发现和定位问题。

TARS-EXT扩展
在TARS-CLIENT的底层,包含不少二进制协议的打包解包工做。而这些字符串的拼接和拷贝的操做偏偏是PHP的弱项,所以很是有必要将其抽象出来,做为独立的PHP扩展模块开发。
在现有扩展的体系中,主要包含了对高性能和稳定性两方面的考虑。高性能方面,字符串操做彻底经过纯C语言进行了实现。而同时经过合理设计接口,避免一次组包的屡次操做,从而进一步提升效率。
而在扩展的稳定性方面,经过引入phpt的扩展标准测试,以及Valgrind工具进行内存泄露测试。测试代码覆盖率达到了80%以上。同时每次进行内部版本代码提交的时候,会自动触发从PHP5.6~PHP7.2的主流版本自动构建测试,并在发生构建异常的时候,发送邮件。
下图中能够清晰的看到,相比于原有的使用纯PHP打包解包的方式,使用扩展的方式,在简单协议的状况下,打包效率提高了16倍,解包效率提高了14倍。而在复杂协议的状况下,一样效率的提高也达到了12和9倍之多。

TARS-SERVER
PHP做为SERVER走过了一段相对比较曲折的道路。最先时候,PHP是做为Apache的一个模块,来提供HTTP-SERVER的服务的。后来在Nginx愈来愈盛行的状况下,PHP_FPM应运而生。它比Apache的预先申请全部进程的方式稍好一些,可是仍然受制于进程资源和接受请求的能力,所以效率并非很高。在这种大背景之下,SWOOLE应运而生,它基于多进程的模型,常驻内存而且使用epoll的事件驱动模型来处理收到的请求。所以在IO能力上甩以前的解决方案好几条街。而在去年,SWOOLE2.0的出现,内置协程,同步编程的同时享受异步IO,更是如虎添翼。
基于此,TARS-SERVER的解决方案也会以SWOOLE做为底层的运行环境,开发出了TARS-HTTP-SERVER、TARS-TIMER-SERVER和TARS-TCP-SERVER,而且三个框架合一,只需简单配置,便可顺畅使用。

上图中,能够很清晰的看到强大的TARS-SERVER能力。除了提供最底层的三种基本SERVER类型以外。咱们还提供了TARS-UTILS用来处理配置文件解析,TARS-Report用来进行服务保活的定时上报,TARS-Config用来拉取平台下发的配置,TARS-Property用来进行特性上报,以及TARS-Deploy模块进行业务代码的打包。这一整套的体系,使得TARS-SERVER的使用者既可以实现本身的业务逻辑,也可以针对性的进行拓展。可谓一箭双雕。
总的来看,咱们的TARS-SERVER,基于SWOOLE 1.x和2.x,同时可以很顺畅的支持灵活的配置,如SWOOLE的配置和用户本身的配置。除此以外,TARS-SERVER经过自动生成的注解进行请求的路由,开发者彻底不须要关心,只须要关注于实现本身的业务逻辑便可。而另外一方面,TARS-SERVER还额外提供了一个管理端口,用来接收平台下发的指令,如SHUTDOWN、配置下发等等。
TARS-HTTP-SERVER为了知足逻辑层服务的需求,进行了专门设计。一期中包括了GET/POST基本支持、Cookie/Status标准支持、极简的路由组件实现、FILE上传功能模块以及服务可用探测接口模块。
而TARS-TIMER-SERVER的使用也很是方便,只需以下代码:

时间能够灵活控制,同时全部定时服务放在一块儿也很是的方便管理。TIMER在服务启动的时候,也会自动启动,无需再次触发。TIMER的数量,只受制于SWOOLE启动时候的进程数量,开发者能够灵活的调配。
对于开发者很是关心的服务性能,咱们也针对不一样的接口、版本、CLIENT进行了压测,结果以下:

从数据来看,仍是很是的使人满意。空跑的HTTP SERVER QPS最高达到了23万。而使用了协程CLIENT以后,在混合RPC调用的状况下,仍有2万1的QPS,相比于同步CLIENT,提高了50%左右。充分说明了协程CLIENT对于性能的提高做用明显。
开发效率
在进行TARS-PHP设计的时候,一个必需要考虑的问题,就是开发效率。为了遵循TARS自己的设计理念,TARS2PHP工具也进行了全新的升级,经过配置文件的方式,同时兼容了客户端代码和服务端代码的生成,配置文件中会包含服务信息、TARS文件信息、命名空间信息等等:

从下图中,可以更加明显的看到整个开发的路径:

由此,经过TARS文件、TARS2PHP工具,就可以彻底实现客户端和服务端的代码生成,而且两端经过协议彻底解耦,大大提升了开发效率。

TARS-PHP在阅文
TARS-PHP在阅文通过了一年多的验证和使用,也逐步趋向成熟,愈来愈多的业务开始了解和使用TARS-PHP这套方案,并为他们在实际的开发和运维中带来了收益。
从下图中能够很是明显的看到TARS与TARS-PHP在运维的使用状况:

模板拼接的Node HTTP服务有10+,逻辑API层PHP服务与定时服务 40+,后台TCP服务100+,每日之间亿级调用。
后续规划
随着TARS-PHP整套方案愈来愈成熟,但愿更多的公司和开发者可以加入进来,共同建设。考虑到不一样公司使用的框架并不相同,所以咱们的模块化设计作得很是完全,在对SWOFT框架进行接入的过程当中,模块化的方式体现了很是大的成效,只须要半天到一天的时间便可完成。后续TARS-PHP也会进一步丰富CLIENT能力,同时支持更多的现有框架,在提升稳定性的同时,对SERVER自己的功能丰富性,再作提高。TARS-PHP,等你来!
现场问答摘录:

问:一个中小型的公司如何使用TARS
答:其实tars自己并非很是的重量级,它主要是包含了一个一体化的运维系统,以及专一于业务开发的一个rpc体系。阅文集团自己也有一块新的业务在使用TARS。项目的机器规模也只是在几十台机左右,因此对于中小企业的公司来讲,TARS也是一个可行的方案。
问:搭建一个TARS平台成本比较高 如何解决这个问题
答:咱们看到dockerhub 上面已经有了开发者 热情的开发者,作出了一套包含环境的Docker容器,咱们会考虑功能是否完善,把它合进来或者是制做官方的镜像,这样用户在运行的时候就会很是方便了。
问:TARS-PHP对于不一样通讯和二进制协议自己的支持怎么样
答:如今TARS-PHP TCP服务支持的协议,仅限于TARS二进制协议自己 但同时咱们也提供了一些配置方式和接口,供你们实现本身的协议。而使用HTTP SERVER的话,协议都是能够本身选择的,好比JSON等等。
问:对于将已有
PHP+Swoole1.x的项目迁移至TARS上,须要注意什么问题以及有没有比较合适的解决方案
答:阅文集团以前也是各个PHP项目分别独立部署在服务器上,没有接入TARS平台,但在去年通过1个月左右的改造已经所有迁移至TARS平台,将已有项目迁移至TARS平台除了须要对项目作一些必要的改造以外还须要保证后端TCP服务也已经接入TARS,迁移可能会有一些成本,可是以后便能享受到TARS平台带来的一系列的红利。
PPT下载:
https://github.com/Tencent/Tars/tree/phptars php目录内下载

对TARS使用还有任何问题,欢迎加入QQ交流群:
TARS交流群: 群号669339903 TARS-PHP交流群:群号:769531734