干货 | 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/Tars/tree/phptars php目录内下载

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

原文发布于微信公众号 - DevOps时代(DevOpsTimes)

原文发表时间:2018-05-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏FreeBuf

借你一双慧眼,鸟瞰二进制世界的秘密

由于Java世界的特性所致,安卓应用在代码自身保护方面一直乏善可陈。所谓的Java混淆等技术,也不过是一层簿簿的面纱,极易被撕开,毫无秘密可言。所以,当前也没有...

920
来自专栏测试开发架构之路

Android软件测试Monkey测试工具

前言: 最近开始研究Android自动化测试方法,对其中的一些工具、方法和框架做了一些简单的整理,其中包括android测试框架、CTS、Monkey、Monk...

48111
来自专栏SAP最佳业务实践

SAP最佳业务实践:SD–外贸出口处理(118)-2付款保证

一、VX11N付款保证 在此活动中,你创建一份从客户开户行获得的信用证。 后勤 ®销售和分销 ®外贸/关税®付款保证 ®凭证的付款®财务凭证 ®创建 1. 在...

34911
来自专栏北京马哥教育

程序员技术练级攻略

月光博客6月12日发表了《写给新手程序员的一封信》,翻译自《An open letter to those who want to start programm...

25910
来自专栏Java编程技术

UML建模(活动图)

活动图是UML中一种行为图,它展示了控制流和对象流,并且强调它们的顺序和条件控制流。 下面换种方法,通过引入uml官方例子同时介绍活动图里面元素。

772
来自专栏数据的力量

那些反人类的2B设计,忍受你们好多年了!

3、几乎所有马桶都是反JJ!大便时,如果要尿尿,要用手把jj按下去,否则会尿到外面!马桶的大小大家是知道的,屁股已经占了大半,jj一低头,基本就贴到马桶边上,(...

531
来自专栏CSDN技术头条

从架构角度来看 Java 分布式日志如何收集

本文来自作者 张振华 在 GitChat 上分享 「从架构角度来看 Java 分布式日志如何收集」

1305
来自专栏腾讯Bugly的专栏

iOS App 启动性能优化

导语 本文介绍了如何优化 iOS App 的启动性能,分为四个部分: 第一部分科普了一些和App启动性能相关的前置知识 第二部分主要讲如何定制启动性能的优化目标...

3836
来自专栏北京马哥教育

小技巧:显示数据库查询耗时,改善开发者习惯

我会分享一系列在我开发生涯中积累的有用且容易实现的小技巧,本文是此系列的第一篇。 ---- 很多原因都可能导致网站运行缓慢,但这其中最常见的就是在数据库查询耗时...

2656
来自专栏QQ音乐技术团队的专栏

QQ音乐MV播放杂音问题解析

1181

扫码关注云+社区