前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >TarsPHP 新版本发布,支持 Protobuf 协议

TarsPHP 新版本发布,支持 Protobuf 协议

作者头像
TARS基金会
发布2020-07-15 15:28:25
9730
发布2020-07-15 15:28:25
举报
文章被收录于专栏:TARS基金会TARS基金会

作者丨张勇

编辑丨TARS小助手

TARS是腾讯从2008年到今天一直在使用的微服务开发框架,2018年成为Linux基金会开源项目目前支持PHP、C++、Java、Nodejs与Go语言。该框架为用户提供了涉及到开发、运维,以及测试的一整套解决方案,帮助一个产品或者服务快速开发、部署、测试、上线。它集可扩展协议编解码、高性能RPC通信框架、名字路由与发现、发布监控、日志统计、配置管理等于一体,通过它可以快速用微服务的方式构建自己的稳定可靠的分布式应用,并实现完整有效的服务治理。

TarsPHP作为Tars在PHP语言的解决方案,设计的时候主要考虑如下四个方面:

  • 功能完善:对标现有C++、Java与NodeJS体系功能
  • 灵活:论灵活,谁与PHP争锋
  • 轻量:用最轻量的设计,点到即止,即插即用
  • 高效:插上Swoole协程的翅膀,不得不飞

Protobuf简介

Protocol buffers (简称PB)是Google开源的语言中立,平台无关,可扩展的序列化数据的格式,可用于通信协议,数据存储等。

Protocol buffers (简称PB)是Google开源的语言中立,平台无关,可扩展的序列化数据的格式,可用于通信协议,数据存储等。它和XML类似,但比XML更小,更快,更简单。

PB是编码协议,如果涉及到网络传输和RPC调用,就需要引入通讯协议。Google开源的RPC框架gRPC就使用Http2作为通讯协议,PB作为编码协议。

使用TarsPHP 构建 PB Server

初始化环境

  • Protoc 安装

首先需要安装protoc库,这个库的主要作用是打包解包protobuf协议数据。可以参考:https://github.com/protocolbuffers/protobuf/tree/master/src 直接安装。

如果 protoc –version 可以正常输出,说明安装完成。

  • php protobuf安装

之后需要安装 php protobuf扩展,这个扩展主要用作php和protoc库中间的一个桥梁。

如果 php –ri protobuf 有输出,说明安装正常。

  • Swoole 安装

建议使用4.4.0或以上版本,需要开启http2 和 openssl支持。

编写一个proto文件

参考TarsPHP中ActDemo中评论服务的tars文件,我们写了一个actComment.proto的协议文件。

和tars协议文件不同,proto协议中规定输入输出参数必须也只能是一个message结构体,因此需要对输入输出参数单独在封装一个message。

生成server端代码

protoc可以根据proto文件生成对应的php类代码,但是官方并不支持proto文件生成server端代码,可以使用gRPC插件生成client代码。如果需要使用生成的client代码我们还需要安装grpc库和grpc php扩展。

因此我们的思路是,先使用protoc生成php需要的类,然后自己解析proto文件生成server 端interface,这个过程非常像现有的tars2php的过程,因此我们叫它proto2php。

由于使用两个工具生成还比较麻烦,我们把调用proto的过程集成到proto2php中方便大家使用。

我们先构建一个tars.proto.php设置一些基本信息。

然后执行:

之后会生成GPBMetadata目录和protocol目录。其中protocol中就是proto文件生成的php类,另外CommentObjServant.php就是proto2php文件生成的server端interface类。构建TarsPHP pb server需要实现这个类。

部署TarsPHP PB server

按照Demo中 Readme部署tarsphp pb server即可。

几点注意:

  1. 需要在impl目录中实现interface逻辑
  2. 在src下的services.php中指定home-api,home-class位置,protocolName是pb,serverType是grpc
  3. tars平台上协议类型是 tcp,非tars协议
  4. 需要在composer.json中添加require “google/protobuf”,autoload中需要配置 Protocol 和 GPBMetadata,范例如下:

最后执行 composer run-script deploy,生成代码包,上传到Tars平台上发布。

使用client访问

可以使用gRPC生成的php客户端访问测试,也可以直接使用swoole 的http2客户端构建一个grpc客户端。

执行php client.php观察返回。

生成client端代码

前面提到的client,只是我们访问PB server 的简单demo,可以帮助我们测试PB server的状态。如果需要在其他Tars服务中调用PB server应该如何使用呢?和Tars类似我们也提供了生成PB client端代码的方式。

这里使用TarsActDemo下的QD.ActHttpServer为范例演示如何生成Tars PB client代码并调用PB服务。

  1. 拷贝actComment.proto文件到tars目录
  2. 构建actCommentPb.proto.php 文件,内容和生成server代码用的tars.proto.php内容一致,修改 withServant = false
  3. 执行:
  1. 之后在protocol/QD/ActCommentPbServer 中可以看到相关生成代码。(和Server 端代码类似,CommentObjServant.php是 proto2php生成的,其他文件是proto2php 调用 protoc 插件生成的)
  2. 和Server端类似需要添加 GPBMetadata 和 Protocol 到composer.json 的psr-4中
  3. 和Tars 调用类似,可以直接调用CommentObjServant类的相关方法和PB 服务通讯。需要注意的是 传入的 CommunicatorConfig 中的socketModel 需要设置为 4 grpc 模式

范例如下:

和TarsGo中关于PB支持的不同

TarsGo中关于PB的支持,本质是对proto协议文件的支持,提供将proto协议文件转换为tars协议的能力,在相互调用中实际使用的是tars协议。这个服务可以和其他Tars服务相互工作。

TarsPHP中关于PB的支持,是构建了一个gRPC服务,这个服务部署在Tars平台上,参与Tars平台寻址,受Tars平台管理。这个服务使用gRPC on Http2作为网络通讯协议,使用Protobuf作为编码协议,可以和其他PB client 相互工作。

两者方向不同,不能混合使用,希望大家区分。

相关数据

我们使用相同Http服务,分别使用Tars和Pb协议和后端服务通讯并进行压测。

  • 服务器环境:2核 4G,php 7.2.16,swoole 4.4.0
  • 服务空跑指的是简单的ping到后端服务,不进行任何业务处理直接返回
  • 单次简单RPC指的是向后端服务获取弹幕数量返回一个int,数量值rand生成,并没有使用mysql count
  • 单次复杂PRC会实际向后端获取弹幕列表结构体,包含多条弹幕对象完整结构

QDPS

PB

TARS

服务空跑

3800

6200

单词简单RPC

3600

6150

单词复杂RPC

1050

1150

从压测数据来看,Tars性能比PB高出一截,但对比两者打包解包性能发现PB打包解包性能略优于Tars,导致这样结果的主要原因我认为是gRPC使用Http2作为通讯协议相比Tars的自定义通讯协议需要很多开销。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 TARS星球 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据保险箱
数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档