性能工具之Jmeter压测ThriftRPC服务
概述
Thrift是一个可互操作和可伸缩服务的框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在C,Java,Python,PHP,Ruby,Erlang,Perl,Haskell,C,Cocoa,JavaScript,Node。js,Smalltalk,andOCaml等等编程语言间无缝结合的、高效的服务。
Thrift最初由facebook开发,07年四月开放源码,08年5月进入apache孵化器。thrift允许你定义一个简单的定义文件中的数据类型和服务接口(IDL)。以作为输入文件,编译器生成代码用来方便地生成RPC客户端和服务器通信的无缝跨编程语言。
其传输数据采用二进制格式,相对于XML和JSON等序列化方式体积更小,对于高并发、大数据量和多语言的环境更有优势。Thrift它含有三个主要的组件:protocol,transport和server,其中,protocol定义了消息是怎样序列化的,transport定义了消息是怎样在客户端和服务器端之间通信的,server用于从transport接收序列化的消息,根据protocol反序列化之,调用用户定义的消息处理器,并序列化消息处理器的响应,然后再将它们写回transport。
官网地址:thrift。apache。org基本概念架构图
堆栈的顶部是从Thrift定义文件生成的代码。Thrift服务生成的客户端和处理器代码。这些由图中的棕色框表示。红色框为发送的数据结构(内置类型除外)也会生成代码。协议和传输是Thrift运行时库的一部分。因此使用Thrift可以定义服务,并且可以自由更改协议和传输,而无需重新生成代码。Thrift还包括一个服务器基础结构,用于将协议和传输绑定在一起。有可用的阻塞,非阻塞,单线程和多线程服务器。堆栈的底层IO部分根据所开发语言而有所不同。对于Java和Python网络IO,Thrift库利用内置库,而C实现使用自己的自定义实现。数据类型:基本类型:bool:布尔值,true或false,对应Java的booleanbyte:8位有符号整数,对应Java的bytei16:16位有符号整数,对应Java的shorti32:32位有符号整数,对应Java的inti64:64位有符号整数,对应Java的longdouble:64位浮点数,对应Java的doublestring:未知编码文本或二进制字符串,对应Java的String结构体类型:struct:定义公共的对象,类似于C语言中的结构体定义,在Java中是一个JavaBean集合类型:list:对应Java的ArrayListset:对应Java的HashSetmap:对应Java的HashMap异常类型:exception:对应Java的Exception服务类型:service:对应服务的类数据传输层TransportTSocket使用阻塞式IO进行传输,是最常见的模式TFramedTransport使用非阻塞方式,按块的大小进行传输,类似于Java中的NIO,若使用TFramedTransport传输层,其服务器必须修改为非阻塞的服务类型TNonblockingTransport使用非阻塞方式,用于构建异步客户端数据传输协议Protocol
Thrift可以让用户选择客户端与服务端之间传输通信协议的类别,在传输协议上总体划分为文本(text)和二进制(binary)传输协议,为节约带宽,提高传输效率,一般情况下使用二进制类型的传输协议为多数,有时还会使用基于文本类型的协议,这需要根据项目产品中的实际需求。常用协议有以下几种:TBinaryProtocol:二进制格式。TCompactProtocol:高效率的、密集的二进制压缩格式TJSONProtocol:JSON格式TSimpleJSONProtocol:提供JSON只写协议,生成的文件很容易通过脚本语言解析
注意:客户端和服务端的协议要一致。服务器类型ServerTSimpleServer单线程服务器端使用标准的阻塞式IO,一般用于测试。TThreadPoolServer多线程服务器端使用标准的阻塞式IO,预先创建一组线程处理请求。TNonblockingServer多线程服务器端使用非阻塞式IO,服务端和客户端需要指定TFramedTransport数据传输的方式。THsHaServer半同步半异步的服务端模型,需要指定为:TFramedTransport数据传输的方式。它使用一个单独的线程来处理网络IO,一个独立的worker线程池来处理消息。这样,只要有空闲的worker线程,消息就会被立即处理,因此多条消息能被并行处理。TThreadedSelectorServerTThreadedSelectorServer允许你用多个线程来处理网络IO。它维护了两个线程池,一个用来处理网络IO,另一个用来进行请求的处理。当网络IO是瓶颈的时候,TThreadedSelectorServer比THsHaServer的表现要好。实现逻辑服务端
实现服务处理接口impl
创建TProcessor创建TServerTransport创建TProtocol创建TServer启动Server客户端
创建Transport创建TProtocol基于TTransport和TProtocol创建Client调用Client的相应方法ThriftServerDemo实例
新建Maven项目,并且添加thrift依赖包dependenciesdependencygroupIdorg。apache。thriftgroupIdlibthriftartifactIdversion0。9。3versiondependencydependencygroupIdorg。slf4jgroupIdslf4jlog4j12artifactIdversion1。7。12versiondependencydependencygroupIdorg。apache。logging。log4jgroupIdlog4japiartifactIdversion2。7versiondependencydependencygroupIdorg。apache。logging。log4jgroupIdlog4jcoreartifactIdversion2。7versiondependencydependenciesbuildpluginsplugingroupIdorg。apache。maven。pluginsgroupIdmavencompilerpluginartifactIdversion3。3versionconfigurationsource1。8sourcetarget1。8targetencodingutf8encodingconfigurationpluginpluginsbuild
编写IDL接口并生成接口文件namespacejavathrift。service
计算类型仅限整数四则运算enumComputeType{ADD0;SUB1;MUL2;DIV3;}
服务请求structComputeRequest{1:requiredi64x;2:requiredi64y;3:requiredComputeTypecomputeType;}
服务响应structComputeResponse{1:requiredi32errorNo;2:optionalstringerrorMsg;3:requiredi64computeRet;}
serviceComputeServer{ComputeResponsegetComputeResult(1:ComputeRequestrequest);}
执行编译命令:thrift0。11。0。exergenjavacomputeServer。thrift
拷贝生成的Service类文件到IDEA
服务端接口实现publicclassThriftTestImplimplementsComputeServer。Iface{privatestaticfinalLoggerloggerLogManager。getLogger(ThriftTestImpl。class);publicComputeResponsegetComputeResult(ComputeRequestrequest){ComputeTypecomputeTyperequest。getComputeType();longxrequest。getX();longyrequest。getY();logger。info(getcomputeresultbegin。〔x:{}〕〔y:{}〕〔type:{}〕,x,y,computeType。toString());longbeginSystem。currentTimeMillis();ComputeResponseresponsenewComputeResponse();response。setErrorNo(0);try{longret;if(computeTypeComputeType。ADD){retadd(x,y);response。setComputeRet(ret);}elseif(computeTypeComputeType。SUB){retsub(x,y);response。setComputeRet(ret);}elseif(computeTypeComputeType。MUL){retmul(x,y);response。setComputeRet(ret);}else{retp(x,y);response。setComputeRet(ret);}}catch(Exceptione){response。setErrorNo(1001);response。setErrorMsg(e。getMessage());logger。error(exception:,e);}longendSystem。currentTimeMillis();logger。info(getcomputeresultend。〔errno:{}〕cost:〔{}ms〕,response。getErrorNo(),(endbegin));returnresponse;}privatelongadd(longx,longy){returnxy;}privatelongsub(longx,longy){returnxy;}privatelongmul(longx,longy){returnxy;}privatelongp(longx,longy){returnxy;}}
服务端实现publicclassServerMain{privatestaticfinalLoggerloggerLogManager。getLogger(ServerMain。class);
publicstaticvoidmain(String〔〕args){try{实现服务处理接口implThriftTestImplworkImplnewThriftTestImpl();创建TProcessorTProcessortProcessornewComputeServer。ProcessorComputeServer。Iface(workImpl);创建TServerTransport,非阻塞式IO,服务端和客户端需要指定TFramedTransport数据传输的方式finalTNonblockingServerTransporttransportnewTNonblockingServerSocket(9999);创建TProtocolTThreadedSelectorServer。ArgsttpsArgsnewTThreadedSelectorServer。Args(transport);ttpsArgs。transportFactory(newTFramedTransport。Factory());二进制格式反序列化ttpsArgs。protocolFactory(newTBinaryProtocol。Factory());ttpsArgs。processor(tProcessor);ttpsArgs。selectorThreads(16);ttpsArgs。workerThreads(32);logger。info(computeserviceserveronport:9999);创建TServerTServerservernewTThreadedSelectorServer(ttpsArgs);启动Serverserver。serve();}catch(Exceptione){logger。error(e);}}}
服务端整体代码结构
log4j2。xml配置文件lt;?xmlversion1。0encodingUTF8?console
PoliciesRollingFile
FiltersPoliciesRollingFile
appenders
深圳野生动物园天鹅冬日暖阳秀舞姿来源:【读特】连日来,深圳市天气晴好,阳光明媚。12月26日,在深圳野生动物园天鹅湖,成群结队的黑天鹅在水面快速扇动翅膀,双脚不断划水,水花四溅,随着逐渐加速,其身体瞬间……
沉默,是一个人最深的境界!俗话说得好:水深无声,人稳。静水流深,越是胸中有沟壑的人,越是低调不张扬。沉默是一个人最深层的状态,是他智慧的体现。沉默是看透后的沉默,是悲观后的争执,是做人……
转会期倒计时2天!究竟谁是本次冬转的憋气冠军S12落幕至今为止也有一段时间了,相信LPL的粉丝除了目睹飞行员Deft十年一舞终夺冠留下的感概,剩下的目光全投放在了各支队伍转会期的动态上,到底谁才是本次转会期的憋气冠军,让……
苹果要用中国芯片?美国反华议员果然气炸来源:环球时报环球网【环球时报环球网报道】美国共和党议员近日警告苹果,如果该公司从一家中国半导体制造商那里为新款iPhone14采购存储芯片,它将面临国会的严格审查。……
CBA三消息辽宁外援踏上归途,丁彦雨航仅砍3分,付豪缺席热身爱国篮,爱CBA,我是洛姐,小伙伴们看完记得点赞!辽宁队下个赛季还是以CBA联赛的总冠军作为球队的最高目标,说实话现在辽宁队的整体球员阵容确实是非常强的,球迷们应该都很清……
突发!美登月火箭发射台遭雷击美国新一代登月火箭太空发射系统拟于29日首次发射升空,却在发射前48小时倒计时开始后遭遇雷雨天气,发射台3次遭雷击。环球网制作:环视频何卓谦威力不大美国……
高血压高血脂糖尿病的9大谣言,不靠谱在哪?高血压、高血脂、糖尿病是不能再常见的慢性病了,但依旧存在不少谣言和误区,很多人还在信!这些谣言和误区不靠谱的地方在哪?一起来看看!关于高血压的谣言平时没有不舒服不需……
近50投资者更偏好养老储蓄,利率会是多少?投教12121世纪经济报道记者李愿综合报道投资走正道,安全有保障,欢迎来到《投教121》。我是养老愿,让大家养老生活更安心。上一期讲到养老理财,不少读者表示看完养老愿的介绍后……
你好,李少莉实话说,自媒体时代,对于李少莉来说,出现这种口诛笔伐的现象,一点也不奇怪,因为人们已经习惯了在网络中表达自己的情感。都有表达自己情感的意愿。只不过李同志只是做了一个焦点而已。少……
这4个时刻,千万不能多喝水平时,我们总是强调多喝水的好处,但事实上,有些时刻,我们千万不能多喝!4种情况先放下水杯01感冒时感冒了,大多数人都认为要多喝水才能好得快。但这不意味着……
世界杯巡礼之凯恩大英队长争生涯首冠,历史地位迎来质的飞跃?大英队长哈里凯恩绝对算是当今足坛经历最为悲壮的球星之一,作为足坛顶级前锋的凯恩,在众星云集的英格兰国家队担任领袖,然而迄今为止凯恩在俱乐部和国家队都仍未收获任何一个冠军。对于已……
珲春丝绸之路渤海古镇开建打造旅游夜经济新亮点近日,在位于珲春市站前街北侧的珲春丝绸之路渤海古镇旅游基础设施建设项目(一期)施工现场,工人们正在不停地忙碌着,呈现出一派热火朝天的施工景象。记者从该项目承办单位珲春防川……