TARS-PHP:PHP构建高性能RPC框架

内容来源:2018 年 5 月 19 日,阅文集团高级开发工程师梁晨在“PHPCon China 2018 技术峰会”进行《TARS-PHP:PHP构建高性能RPC框架》演讲分享。IT 大咖说(微信id:itdakashuo)做为独家视频合做方,经主办方和讲者审阅受权发布。node

阅读字数:3570 | 9分钟阅读json

获取嘉宾演讲视频及PPT: http://suo.im/4CYv7H
后端

摘要

本次分享将介绍高性能RPC框架TARS的基本设计思想,以及在PHP语言和框架层面的TARS解决方案的设计与实现。以阅文集团的实践为例,介绍使用TARS-PHP进行服务治理以及SWOOLE2.0+PHP7+TARS架构所带来的开发、运维、性能的全面提高。数组

TARS


TARS是包含运营、平台、通讯框架、公共组件、统一协议的整套解决方案。上图是TARS的最新界面,分为服务管理和运维管理两部分,服务管理可以轻易的管理各类不一样的服务,运维管理能够进行部署服务、扩展以及新建模板管理。这些都是TARS的运营和平台的能力,除此以外它还内置了不少公共组件,以服务的方式提供,包含常见的配置中心、日志中心、通知中心、特性上报以及主控等等。缓存

TRAS 协议

TARS使用了一套二进制的协议,与语言无关有本身的独立语法。上面是协议的基本样式,其中自定了两个结构体LoginInfo和ProfileInfo,结构体内部能够随意的组合多个基础类型。下方的interface声明的是真正要调用的接口,它会用到上方定义的结构,参数列表中的out关键字标明了输出Info。这样咱们就有了一份约定的接口文件,以后能够经过工具将它转化为实际使用的代码,从而方便开发。服务器

除了二进制协议以外,咱们还设计了一套通讯的协议,包含协议版本、请求ID、服务器路由信息、接口信息、二进制数据包。微信

总的来讲TARS是一整套微服务解决方案。微服务方面包括服务自动发现、智能调度、容灾容错、柔性熔断、路由与灰度。协议上即支持私有二进制协议,也能够经过启动HTTP服务来支持json的协议。目前TARS对多语言已经有了很好的支持,同时也兼容一些很是利于使用的运维体系。swoole

TARS PHP

要设计一套TARS PHP方案首先要知足几点要求。第一必需要功能完善,可以对标现有C++、Java、NodeJS体系功能;第二要保持整个方案的灵活使用,让更多的人可以利用它;第三要是轻量级的设计,作到点到为止,即插即用;最后是能带来高效的性能。架构

上图为总体方案的构成,主要分为4块。第一块是TARS client,由于咱们最初的需求是用PHP接入到现有C++、Java的TARS服务。第二块是TARS Server,这里咱们但愿可以尽可能的知足你们的需求,让一些常见的Server可以三合一,同时保持灵活和轻量。第三块是为了可以提高性能作的TARS EXT扩展,主要负责底层二进制的解包打包工做。第四块是开发效率,TARS体系中基本上针对每种语言都会有相应的不论是客户端还服务端的自动生成工具。并发

TARS client

TARS client如今具有了以上的这些功能。自动寻址让你无需关系服务地址,只需知道服务的名字,咱们每一个服务都有App name和Server name以及主控,经过主控就可以知道服务的具体位置。主调上报是指全部的服务运行状况都由client上报,这样在Server界面中就能一览服务的全部状况。咱们也提供了远程日志的能力,并且是只发不收的形式。接着是3种不一样的发送服务的能力,分别是socket的接入方式,swoole同步,以及swoole协程 。

以上是TARS client的总体结构图。中间为client的Server,它依赖于PHP扩展,左边是三种访问方式,右边是各类服务。每次请求的时候会先调用一次主控服务将列表缓存起来,通常缓存在swoole table或本地文件中。服务启动的时候会有定时时间用来决定服务什么时候过时。获取到地址以后进行RPC请求,请求完成后作一次主调上报,上报范围包括耗时、失败率、超时率等,若是有须要的话也能够写些远程日志。

TARS client 扩展

PHP扩展的主要是用来保证高性能和稳定。因为二进制协议的字符串操做涉及到不少的内存的拷贝和分配,因此咱们最初的方案是使用C实现,但后来发现了这种方案有些短板。最终为了性能的考虑引入了PHP扩展,同时将打包解包与编解码进行集成,下降PHP调用API的次数。稳定性方面是在每次提交代码的时候,作多版本构建测试,根据咱们线上使用的经验,还增长了Valgrind内存测试,目前的代码测试覆盖率基本上达到80%。

经过上图的数据对比,能够很清楚的看出PHP扩展带来的优点。

TARS Server

Apache加PHP多是你们较熟悉的传统PHP Server模式,后来随着Nginx的火热出现了Nginx配合PHP-FPM的形式。不过鉴于性能的优点咱们以后转向了swoole,随着swoole 2.0的推出又带来了协程的能力。

咱们的Server中包含TARS-HTTP-Server、TARS-TIMER-Server、TARS-TCP-Server。HTTP Server提供一些基础的功能,TIMER Server会作一些定时任务,TCP Server是为了提供一个高性能的RPC服务。

Server启动的时候会进行初始化,解析平台下发的配置以及注册服务,以后会每隔1分钟向主控进行一次上报告知存活,若是发现有问题主控会从新将服务拉起了。TARS也支持在平台中创建配置下发到各类服务中,服务会自动向TARS Config拉取配置。

TARS TCP Server能够用swoole 1.0和2.0中的任意版本,不过PHP版本必需要求是5.6以上。它在配置方面很是灵活,既能够将swoole的配置经过平台下发到服务上,也能够指定服务入口。核心实现是基于注解路由,TARS在收到请求的时候会接收到一个包,包中包含调用的服务和接口信息,Server在知道这些信息以后会将须要用到的参数经过预先生成的方式放在注解中,服务启动时会解析这些注解转换成PHP真正调用的数组方式。同时咱们还提供了一个管理端口,须要额外启动,用来接收平台的一些其余管理请求。

对于TARS HTTP Server咱们仅实现了个相对简单的版本,提供各类基础功能,包括GET/POST请求、Cookie/Status返回、基本路由、文件上传以及Service Detect。

上图是咱们经过压测得到一些数据。

开发效率

开发效率一直都是TARS须要关注的问题。从开发模式来看,首先Server会约定一个协议代表本次服务须要提供的接口并生成文件,即图中的TARS文件。而后TARS2PHP工具会根据该文件生成服务端接口代码和客户端调用代码,以后服务端会根据接口代码来实现实际业务逻辑,最后两边就能够联调了。整个过程都是解耦的而且不须要花费过多时间进行client调用。

TARS PHP 在阅文

这里主要介绍下TARS PHP在阅文的应用。首先是接入层,它使用的是Nginx配合斯巴达(TARS在咱们内部的系统),经过斯巴达系统可以很轻易的实现无缝扩容。为了实现先后端的解耦咱们还引入了TARS Node HTTP,将全部的模板渲染都沉淀都nodeJS层。Nginx的AJAX请求以后会到达TARS PHP HTTP,这一层的业务并发在实际场景中大概是2千左右。再往下是微服务层,咱们使用PHP、JAVA作了一些TARS的TCP微服务,它与HTTP的交互是基于TCP异步加协程的方案。

从实际数据来看,目前咱们模板拼接的Node HTTP服务大概有十多个,逻辑API层PHP服务与定时服务有40多个,后台TCP服务有100多个,每一个调用是亿级以上。

模块化设计

上图是目前TARS PHP支持的模块,这些模块均可以单独的使用。Tars server提供了最基本的HTTP、TCP等服务,tars client能够调用其余tars服务。tars monitor的监控上报包含主调上报和特性上报。Tars registry模块可让开发者经过主控通讯的方式对地址进行缓存。Tars report的引入让开发者能很方便的将本身的框架引入到平台上,而不使用咱们提供的框架。

相关文章
相关标签/搜索