干货| PHPCon上TARS-PHP全面解读及PPT下载
2018年5月19日,在上海举行的第六届中国PHP开发者大会(PHPCon)上,腾讯开源项目TARS首次全面发布PHP版本,阅文集团高级开发工程师梁晨对PHP如何通过TARS构建高性能RPC框架做了经验分享。
分享内容:
TARS作为腾讯开源的RPC框架,在发布之后即受到开源领域的关注。它在微服务、协议、多语言和运营体系上的支持,都非常的完善。在微服务方面,实现了服务自动发现、智能调度、容灾容错、柔性熔断,以及路由与灰度的功能。与此同时,通过使用私有二进制协议,可以有效的降低服务之间调用的流量。而在语言支持的层面,TARS对C++、Java、Nodejs、PYTHON都提供了比较好的方案。考虑到PHP在WEB后台领域的使用非常的广泛,TARS-PHP的出现,势在必行。
那么在设计TARS-PHP的时候,必须考虑到现有PHP的开发生态,至少要做到 功能完善、灵活、轻量和高效。在功能方面,TARS-PHP对标了现有的C++、JAVA、NodeJS的功能体系,做到了对CLIENT能力和SERVER能力的支持。而在灵活方面,PHP一直是出类拔萃的,作为泛型脚本语言,开发的过程,谁用谁知道。而在轻量设计方面,TARS-PHP遵循一个最简化、轻量级、可插拔的设计想法,让整个方案自成体系的同时,也能具备最大程度的可扩展性。最后,也是最重要的,高效。通过引入PHP业界优秀的SWOOLE框架,再结合SWOOLE2.0的协程能力,让TARS-PHP插上协程的翅膀。
TARS-PHP的解决方案,按照功能模块,会分成以下四个部分:
- TARS-CLIENT
- TARS-EXT扩展
- TARS-SERVER
- 开发效率模块
TARS-CLIENT
对于熟悉TARS-PHP的同学来说,TARS-CLIENT的能力在半年前就已经开源,并提供使用了。本次TARS-PHP的重新设计,也对TARS-CLIENT现有的能力做了一个梳理。全新设计之后的TARS-CLIENT具备了配置统一化、一键调用、以及多种网络能力的特点。而在功能上,集成也更为丰富了,现有的TARS-CLIENT由如下的功能模块组成:
- 自动寻址:CLIENT再也无需关系服务地址
- 主调上报:调用情况会默认进行主调上报,服务情况一览无遗
- 远程日志:日志可以写入远程服务,再落地,降低文件IO的损耗
- 网络能力: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/Ta... php目录内下载
对TARS使用还有任何问题,欢迎加入QQ交流群:
TARS交流群: 群号669339903 TARS-PHP交流群:群号:769531734