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

2023-10-30

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

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

获取嘉宾演讲视频及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对多语言已经有了很好的支持,同时也兼容一些非常利于使用的运维体系。

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的引入让开发者能很方便的将自己的框架引入到平台上,而不使用我们提供的框架。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TARS-PHP:PHP构建高性能RPC框架 的相关文章

  • PHP 中的 NOW() 函数

    是否有 PHP 函数以与 MySQL 函数相同的格式返回日期和时间NOW 我知道如何使用date 但我想问是否有专门用于此的功能 例如 返回 2009 12 01 00 00 00 您可以使用date https www php net m
  • PHP - hash_pbkdf2 函数

    我正在尝试使用此 php 函数执行一个函数来哈希密码 http be php net manual en function hash pbkdf2 php http be php net manual en function hash pb
  • 如何用javascript正确读取php cookies

    考虑这个 php 和 javascript 代码 然后我在控制台中看到的是 utma 111872281 291759993 1444771465 1445374822 1445436904 4 utmz 111872281 1444771
  • 如何在 HTML / Javascript 页面中插入 PHP 下拉列表

    好吧 这是我的第二篇文章 请接受我是一个完全的新手 愿意学习 花了很多时间在各个网站上寻找答案 而且我几乎已经到达了我需要到达的地方 至少在这一点上 我有一个网页 其中有许多 javascript 函数 这些函数一起使用 google 地图
  • 将数组拆分为特定数量的块

    我知道array chunk 允许将数组拆分为多个块 但块的数量根据元素的数量而变化 我需要的是始终将数组拆分为特定数量的数组 例如 4 个数组 以下代码将数组分为 3 个块 两个块各有 2 个元素 1 个块有 1 个元素 我想要的是将数组
  • php 表单提交 - Q2

    我对这个虚拟问题感到抱歉 这是我的简单 PHP 表单 其中包含两个 SQL 表和 ADD 提交 按钮 我希望将人员从 Test1 转移到 Test2 很多事情都很好 只有提交按钮不起作用 因此 Test2 表没有反馈 Revised 现在提
  • Zend Framework Zend_Form 装饰器: 位于按钮元素内部?

    我有一个像这样创建的按钮元素 submit new Zend Form Element Button submit submit gt setLabel My Button submit gt setDecorators array Vie
  • 为什么 PHP 中不允许“传统”类型提示?

    刚刚发现类型提示 http php net manual en language oop5 typehinting phpPHP 中允许 但不适用于整数 字符串 布尔值或浮点数 为什么 PHP 不允许对整数 字符串等类型进行类型提示 从 P
  • 检查文件权限

    我怎样才能检查file permissions 无需通过运行操作系统特定命令passthru or exec Use 文件权限 http php net fileperms功能 clearstatcache echo substr spri
  • PHP 和 NLP:嵌套括号(解析器输出)到数组?

    想要将带有嵌套括号的文本转换为嵌套数组 以下是 NLP 解析器的输出示例 TOP S NP PRP I VP VBP love NP NP DT a JJ big NN bed PP IN of NP NNS roses 原文 我喜欢一大床
  • 包含包含文件的 php 文件

    这是目录结构 global php includes class bootstrap php includes init php plugins myplugin php 这是这些文件中的代码 start php require inclu
  • 如何将行变成列?

    我有一个数据库 其中存储分组到项目中的关键字以及与每个关键字相关的数据 然后我显示每个项目的数据网格 每个关键字一行和几列 全部从同一个表 数据 中检索 我有 4 个表 关键字 项目 group keywords 和数据 keywords
  • 创建 Facebook 测试用户时访问令牌出现问题

    我正在尝试为我的 Facebook 应用程序创建测试用户 他们在 11 月份的博客文章 http developers facebook com blog post 429 中宣布了此功能 并在此处记录了该功能 http developer
  • PHP使用auto_increment生成短唯一ID?

    我想生成一个简短的 唯一的 ID 而不必检查冲突 我目前正在做类似的事情 但是我当前生成的 ID 是随机的 并且在循环中检查冲突很烦人 并且如果记录数量显着增加 将会变得昂贵 通常担心冲突不是问题 但我想要生成的唯一 ID 是一个由 5 8
  • 具有更改用户代理上下文的 file_get_contents 不起作用

    我正在尝试获取页面的阅读数和点赞数 网址是 https mp weixin qq com s NPavBeHc8VdWXeSL6kfLRg https mp weixin qq com s NPavBeHc8VdWXeSL6kfLRg 您必
  • 如何在 Twitter Card 中传递动态图像路径?

    我在用
  • phpinfo 说 php.ini 路径是 C:\Windows 但那里没有 php.ini

    我们正在尝试从 PHP5 切换到 PHP7 现在我们已经安装了 Apache 并且 PHP 可以运行了 然而 我们在php ini文件没有任何作用 Via phpinfo 我们意识到原因是Configuration File php ini
  • 更改API数据输出的布局

    我是 API 集成和 PHP 的新手 我最近将 VIN 解码器集成到我的应用程序中 在输入框中输入车辆的 VIN 选择提交 然后就会显示 API 数据库中有关该车辆的所有信息 数据存储为关联数组 其中包含类别及其相应元素 例如 对于 VIN
  • 显式删除会话cookie会产生什么影响?

    我使用 php session 来维护用户的会话 Session 在登录后创建 在注销或超时后销毁 我需要管理面板中的一个选项来强制注销任何用户 如果他在网站上处于活动状态 我怎样才能做到这一点 我正在考虑删除临时会话文件 这应该有效地破坏
  • 谷歌日历手表过期时间超过1个月怎么办?

    我将我的 CRM 系统与 Google 日历同步 为此 我要求push notifications从我的用户 Google 日历到我的系统 我已经成功创建了手表 并将过期时间设置为2030年 但是当我收到手表事件的响应时 它显示手表的过期时

随机推荐

  • php参考文献外文文献,web of science怎么导出参考文献

    web of science导出参考文献的方法 首先登录web of Science网站 选择文献 然后选中所需要的文献 点击页面上方中间 保存至Endnote online 旁边的下拉箭头 选择保存位置即可 本文操作环境 Windows7
  • 通过apply进行数据预处理

    数据准备 这里我事先下载了一个csv文件 其中包含两列 时间戳和字符串 大小为近8000行 使用apply进行预处理 apply可以批量的改变dataframe中的数据 经过上边的处理 在df中添加了一列 全部都是a 将A列改的值为大写 a
  • 写给Android开发者的性能优化指南(Android 性能优化的方面方面都在这儿)

    众所周知 一个好的产品 除了功能强大 好的性能也必不可少 有调查显示 近90 的受访者会因为APP性能差而卸载 性能也是造成APP用户沮丧的头号原因 而且随着产品的更新迭代 功能的越发复杂 UI页面的越发丰富 性能问题变得更加严重 说实话要
  • 推荐系统-基于物品的协同过滤(Item-based CF)

    今天我们来聊一聊基于物品的协同过滤即Item based CF方法 有了上一篇的经验 你可能很容易就想到Item based CF就是通过计算物品之间的相似度 然后用户曾与那些商品发生过交互 给他推荐与这些商品最接近的东西给他 这样做有什么
  • 毕业设计-基于机器学习的软件漏洞挖掘方法

    目录 前言 课题背景和意义 实现技术思路 一 基于机器学习的软件漏洞挖掘流程 二 代码的表征形式 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近
  • getopts 可选参数_linux shell命令行选项与参数用法详解--getopt

    本文介绍了linux shell中使用命令行选项与命令行参数的方法 在bash中 可以用以下三种方式来处理命令 行参数 每种方式都有自己的应用场景 问题描述 在linux shell中如何处理tail n 10 access log这样的命
  • gsoap学习笔记一

    本文章是对gsoap中生成的cpp类型的代码框架的应用 因为要实现一些ONVIF规范中的一些功能 所以选择了gsoap生成代码框架 但是发现好多博客上都是生成的C的代码框架 使用起来很麻烦 而且引用插件功能的时候 什么时候需要修改文件内容
  • Vue各种标签的使用方法

    1 内容绑定 事件绑定 v text v html v on 1 v text 绑定内容 作用 设置标签的内容 无论内容是什么 它只会解析文本 div style color red h2 h2 h1 h1 div
  • RuoYi框架微服务版本(windows环境)二次开发环境搭建详解【小白版】

    1 需要准备的依赖环境服务 JDK gt 1 8 推荐1 8版本 Mysql gt 5 7 0 推荐5 7版本 Redis gt 3 0 Maven gt 3 0 NodeJS gt 10 以上安装配置不赘述 nacos gt 1 1 0
  • 基于Smack3.0.4+ Openfire3.10.2开发之Android 客户端之二

    我们在之前依次介绍openfire部署以及smack常用API的使用 这一节中我们着力介绍如何基于asmack开发一个Android的客户端 本篇的重点在实践 讲解和原理环节 大家可以参考前面我所发布的OpenFire和Smack的相关文章
  • FLOPS的计算

    参考 https blog csdn net qq 42309265 article details 123098538 概念 FLOPS 浮点运算数 是floating point operations per second的缩写 意指每
  • C51子函数

    子函数 将完成某一种功能的程序代码单独抽取出来形成一个模块 在其它函数中可以随时调用此模块 以达到代码的复用和优化程序结构的目的 void Function unsigned char x 返回值 函数名 形参 函数体
  • 爬虫的异常处理办法

    爬虫是一种自动化程序 用于从互联网上收集数据 然而 由于互联网的不确定性和复杂性 爬虫程序可能会遇到各种异常情况 这些异常情况可能会导致爬虫程序停止工作或者收集到错误的数据 因此 异常处理是爬虫程序开发中非常重要的一部分 本文将介绍爬虫程序
  • mysql视图总结

    1 概述 视图是指计算机数据库中的视图 是一个虚拟表 其内容由查询定义 同真实的表一样 视图包含一系列带有名称的列和行数据 但是 视图并不在数据库中以存储的数据值集形式存在 行和列数据来自由定义视图的查询所引用的表 并且在引用视图时动态生成
  • au人声处理_如何消去人声保留伴奏?

    因为有做混剪视频 经常需要把声音和背景音乐分离 所以我尝试过很多的办法 下面分享2种我觉得分离效果还行的方法 PS 先声明 目前技术只能优化声音 音乐分离 还不能完成剥离 所以人声和音乐分离后 音质肯定会有些许的损失 01 Au中置声道提取
  • 一个小时内学习SQLite数据库

    1 介绍 SQLite 是一个开源的嵌入式关系数据库 实现自包容 零配置 支持事务的SQL数据库引擎 其特点是高度便携 使用方便 结构紧凑 高效 可靠 与其他数据库管理系统不同 SQLite 的安装和运行非常简单 在大多数情况下 只要确保S
  • 使用Typora编辑markdown上传CSDN时图片大小调整麻烦问题

    文章目录 一 问题来源 二 解决方案 一 创建工程项目 二 代码 一 问题来源 我日常写博客时 首先使用 typora 编辑 markdown 文件 然后在 CSDN 的 markdown 编辑器中导入 md 文件 但是使用 typora
  • 攻防世界web题总结A

    题1 思路 题目说右键用不了 因为打开右键可以查看网页的代码 所以我们要想办法打开网页大源代码 复制链接在浏览器上打开 因为右键用不了 我们可以按一下快捷键 1 可以直接按 F12 不过有些电脑不可以 需要按 Fn F12 2 直接按 Ct
  • 初识java——熟悉java代码格式

    CD145 整数的二进制数表达中有多少个1 求一个整数 在内存当中存储时 二进制1的个数 方法一 一个整型的数字共32个比特位 每个比特位如何判断是否为1 只需让这一位和1进行按位与即可 import java util Scanner p
  • TARS-PHP:PHP构建高性能RPC框架

    内容来源 2018 年 5 月 19 日 阅文集团高级开发工程师梁晨在 PHPCon China 2018 技术峰会 进行 TARS PHP PHP构建高性能RPC框架 演讲分享 IT 大咖说 微信id itdakashuo 作为独家视频合