范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

性能工具之Jmeter压测ThriftRPC服务

  概述
  Thrift是一个可互操作和可伸缩服务的框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 等等编程语言间无缝结合的、高效的服务。
  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还包括一个服务器基础结构,用于将协议和传输绑定在一起。有可用的阻塞,非阻塞,单线程和多线程服务器。 堆栈的"底层I / O"部分根据所开发语言而有所不同。对于Java和Python网络I / O,Thrift库利用内置库,而C ++实现使用自己的自定义实现。  数据类型:基本类型:bool:布尔值,true 或 false,对应 Java 的 boolean  byte:8 位有符号整数,对应 Java 的 byte  i16:16 位有符号整数,对应 Java 的 short  i32:32 位有符号整数,对应 Java 的 int  i64:64 位有符号整数,对应 Java 的 long  double:64 位浮点数,对应 Java 的 double  string:未知编码文本或二进制字符串,对应 Java 的 String  结构体类型:struct:定义公共的对象,类似于 C 语言中的结构体定义,在 Java 中是一个 JavaBean  集合类型:list:对应 Java 的 ArrayList  set:对应 Java 的 HashSet  map:对应 Java 的 HashMap  异常类型:exception:对应 Java 的 Exception  服务类型:service:对应服务的类  数据传输层TransportTSocket —— 使用阻塞式 I/O 进行传输,是最常见的模式  TFramedTransport —— 使用非阻塞方式,按块的大小进行传输,类似于 Java 中的 NIO,若使用 TFramedTransport 传输层,其服务器必须修改为非阻塞的服务类型  TNonblockingTransport —— 使用非阻塞方式,用于构建异步客户端  数据传输协议Protocol
  Thrift 可以让用户选择客户端与服务端之间传输通信协议的类别,在传输协议上总体划分为文本 (text) 和二进制 (binary) 传输协议,为节约带宽,提高传输效率,一般情况下使用二进制类型的传输协议为多数,有时还会使用基于文本类型的协议,这需要根据项目 / 产品中的实际需求。  常用协议有以下几种:TBinaryProtocol : 二进制格式.  TCompactProtocol : 高效率的、密集的二进制压缩格式  TJSONProtocol : JSON格式  TSimpleJSONProtocol : 提供JSON只写协议, 生成的文件很容易通过脚本语言解析
  注意:客户端和服务端的协议要一致。  服务器类型ServerTSimpleServer ——单线程服务器端使用标准的阻塞式 I/O,一般用于测试。  TThreadPoolServer —— 多线程服务器端使用标准的阻塞式 I/O,预先创建一组线程处理请求。  TNonblockingServer —— 多线程服务器端使用非阻塞式 I/O,服务端和客户端需要指定 TFramedTransport 数据传输的方式。  THsHaServer —— 半同步半异步的服务端模型,需要指定为: TFramedTransport 数据传输的方式。它使用一个单独的线程来处理网络I/O,一个独立的worker线程池来处理消息。这样,只要有空闲的worker线程,消息就会被立即处理,因此多条消息能被并行处理。  TThreadedSelectorServer —— TThreadedSelectorServer允许你用多个线程来处理网络I/O。它维护了两个线程池,一个用来处理网络I/O,另一个用来进行请求的处理。当网络I/O是瓶颈的时候,TThreadedSelectorServer比THsHaServer的表现要好。  实现逻辑服务端
  实现服务处理接口   impl
  创建TProcessor 创建TServerTransport 创建TProtocol 创建TServer 启动Server  客户端
  创建Transport 创建TProtocol 基于TTransport和TProtocol创建 Client 调用Client的相应方法  ThriftServerDemo实例
  新建   Maven   项目,并且添加  thrift   依赖包                      org.apache.thrift            libthrift            0.9.3                            org.slf4j            slf4j-log4j12            1.7.12                            org.apache.logging.log4j            log4j-api            2.7                            org.apache.logging.log4j            log4j-core            2.7                                                    org.apache.maven.plugins                maven-compiler-plugin                3.3                                    1.8                    1.8                    utf-8                                        
  编写   IDL   接口并生成接口文件 namespace java thrift.service
  // 计算类型 - 仅限整数四则运算  enum ComputeType {  ADD = 0;  SUB = 1;  MUL = 2;  DIV = 3;  }
  // 服务请求  struct ComputeRequest {  1:required i64 x;  2:required i64 y;  3:required ComputeType computeType;  }
  // 服务响应  struct ComputeResponse {  1:required i32 errorNo;  2:optional string errorMsg;  3:required i64 computeRet;  }
  service ComputeServer {  ComputeResponse getComputeResult(1:ComputeRequest request);  }
  执行编译命令:  thrift-0.11.0.exe -r -gen java computeServer.thrift
  拷贝生成的   Service   类文件到  IDEA
  服务端接口实现  public class ThriftTestImpl implements ComputeServer.Iface {    private static final Logger logger = LogManager.getLogger(ThriftTestImpl.class);    public ComputeResponse getComputeResult(ComputeRequest request) {        ComputeType computeType = request.getComputeType();        long x = request.getX();        long y = request.getY();        logger.info("get compute result begin. [x:{}] [y:{}] [type:{}]", x, y, computeType.toString());        long begin = System.currentTimeMillis();        ComputeResponse response = new ComputeResponse();        response.setErrorNo(0);        try {            long ret;            if (computeType == ComputeType.ADD) {                ret = add(x, y);                response.setComputeRet(ret);            } else if (computeType == ComputeType.SUB) {                ret = sub(x, y);                response.setComputeRet(ret);            } else if (computeType == ComputeType.MUL) {                ret = mul(x, y);                response.setComputeRet(ret);            } else {                ret = p(x, y);                response.setComputeRet(ret);            }        } catch (Exception e) {            response.setErrorNo(1001);            response.setErrorMsg(e.getMessage());            logger.error("exception:", e);        }        long end = System.currentTimeMillis();        logger.info("get compute result end. [errno:{}] cost:[{}ms]", response.getErrorNo(), (end - begin));        return response;    }    private long add(long x, long y) {        return x + y;    }    private long sub(long x, long y) {        return x - y;    }    private long mul(long x, long y) {        return x * y;    }    private long p(long x, long y) {        return x / y;    } }
  服务端实现  public class ServerMain {  private static final Logger logger = LogManager.getLogger(ServerMain.class);
  public static void main(String[] args) {  try {  //实现服务处理接口impl  ThriftTestImpl workImpl = new ThriftTestImpl();  //创建TProcessor  TProcessor tProcessor = new ComputeServer.Processor(workImpl);  //创建TServerTransport,非阻塞式 I/O,服务端和客户端需要指定 TFramedTransport 数据传输的方式  final TNonblockingServerTransport transport = new TNonblockingServerSocket(9999);  //创建TProtocol  TThreadedSelectorServer.Args ttpsArgs = new TThreadedSelectorServer.Args(transport);  ttpsArgs.transportFactory(new TFramedTransport.Factory());  //二进制格式反序列化  ttpsArgs.protocolFactory(new TBinaryProtocol.Factory());  ttpsArgs.processor(tProcessor);  ttpsArgs.selectorThreads(16);  ttpsArgs.workerThreads(32);  logger.info("compute service server on port :" + 9999);  //创建TServer  TServer server = new TThreadedSelectorServer(ttpsArgs);  //启动Server  server.serve();  } catch (Exception e) {  logger.error(e);  }  }  }
  服务端整体代码结构
  log4j2.xml配置文件  <?xml version="1.0" encoding="UTF-8"?>                      
    
              
  

经常吃蚝油对身体有啥好处?医生建议这3种调味品,尽量少吃导语提起癌症的问题,许多人都会谈之色变,特别是近几年来患有癌症的人群越来越多,也让许多人感觉到恐惧。因为癌症一旦出现,将会导致患者身体受到严重的伤害,也给患者的家庭造成沉重的负担和几十块巨大一桶的身体乳,好好用MSMK巨大巨好用!Heygirls我是今日的代班编辑dada。一进入冬天除了和寒冷对抗,就是和干燥斗智斗勇了!身体乳肯定少不了吧!但身体乳是大用量的东西,肯定越大碗,用起来才不会宝妈生一胎和生二胎身体会有哪些变化?妈妈们生一胎和二胎时到底会有何不同?本期我们收到一些来自二胎宝妈的留言,一起探讨一下生一胎和二胎的不同吧!米米一胎照书养,二胎真的照猪养,一胎啥都不敢吃,二胎没啥不吃的大阔耐生一胎三处因气压带风带季节移动,导致信风跨过赤道而偏转的季风现象由于地球是一个球体,可以近似看成平行光的太阳辐射照射在地球表面,太阳光线与地表的夹角,也就是太阳高度各不相同,因而使得各纬度获得的热量也差异巨大。总体而言,太阳辐射由低纬向高纬递减当咖啡逐渐奶茶化,身体会发生什么变化?实测16款,看完真得注意每次评测奶茶科普咖啡聊减肥失眠,都会有粉丝朋友催我们赶紧把咖啡评测提上日程。这次它终于来了,我们购买了9家连锁咖啡店奶茶店,16款热销咖啡,用实测结果回答哪些逐渐奶茶化,就是糖水?医生身体出现这些症状时,或是肺部出现问题的表现,需警惕肺作为我们人体呼吸系统中最为重要的一个器官,对人体有着重要的作用。可是近些年来,据调查研究发现,人们肺部患上疾病的风险越来越高,而且生活中肺部患有疾病的人也越来越多。究其原因,我们中老年人要懂得忌嘴,少吃白菜和萝卜,多吃3样菜,身体壮显年轻中老年人要懂得忌嘴,少吃白菜和萝卜,多吃3样菜,身体壮显年轻。哈喽,大家好。我是大厨江一舟,今天又到了和大家分享美食的课了,你准备好了吗?随着年龄的不断增长,这对于过了50岁的中老64岁的朱玲玲皮肤紧致,整个人也丰腴不少,她真的是嫁给了爱情64岁的前港姐冠军朱玲玲带着自己的丈夫罗康瑞参加了TVB55周年的庆典,引起了很多关注。如今TVB那些年轻的女艺人甚至都没有朱玲玲的关注度这么高。朱玲玲的丈夫罗康瑞是香港的百亿富豪两性交往,暧昧关系发生之后,这些现象非常明显前言在两性交往的过程,有些事情是非常明显的,我们需要知道该如何去处理,如果不能够掌握正确的方法,没有认真地去面对的话,就会导致各种问题的发生,甚至没办法挽回。两性交往,暧昧关系发生牛肉壮身体?提醒人到中年,别舍不得吃!4种食物易消化有营养人一旦上了年纪,身体的各项机能都大不如从前,如果平时再不注意保养,大毛病小毛病都会逐渐找上门来,身心都跟着遭罪,这也是很多中老年人越来越注意加强营养增强体质的重要原因。不过,别一提正能量激励早安心语图片只要坚定向前,一切皆有可能去追求展现自我,用努力创造业绩!早安,梦想!别敷衍,每一天都是塑造自己的过程。你也一样,别怕为时已晚,别怕人生苦短,过一天就得有一天的乐趣,别把没钱,当作敷衍生活的挡箭牌。现在,就
2022年上半年卖地收入降三成土地财政模式将迎来怎样的未来?这是熊猫贝贝的第1206篇原创文章道理没人听,现实教做人。中国的房地产经济和地方政府的土地财政玩法,从未如此明确而又清晰,站在了一个时代的分水岭之上进入2022年下半年首月,上半年有种毁容叫女明星卸妆,素颜照有几个敢说天生丽质?别看女明星在聚光灯下光鲜亮丽,其实卸完妆后和普通人无异,浅盘一下那些素颜状态的女明星吧。关晓彤真的无人不知了吧,国民闺女,鹿晗女友,长腿女神,但是离开滤镜和修图,素颜状态下的样子真南特主帅期待遇到状态正佳的巴黎,他们早已习惯被视作取胜热门直播吧7月27日讯南特即将在法国超级杯中对阵巴黎圣日耳曼。赛前南特主帅安托万孔鲍尔在接受俱乐部官网采访时表示,自己很期待能够与状态最佳的巴黎交手,直言巴黎早已习惯被外界视作为赢球热中餐厅6定档海报出炉,陈立农章若楠两边靠,C位姐姐吸人眼球综艺节目一年一季已经是一种非常普遍的现象了,像综艺界的常青树奔跑吧,算上之前的奔跑吧兄弟和奔跑吧黄河篇系列。从2014年开始,至今已经陆陆续续地拍摄了12季,陪伴了一大批人从幼儿园郭晶晶夫妇参加盛大晚会!百人大合照站C位,郭晶晶穿凉鞋接地气近段时间,香港地区举办了一场中华传统音乐盛大晚会,邀请了众多文体界人士参加。其中,郭晶晶和霍启刚夫妇也受邀出席,两人在活动结束后的百人大合照环节更是稳居C位,足见主办方对他们的重视老婆十月怀胎,他们却在外沾花惹草,这些男明星,真不该被原谅热播剧少年派2中,闫妮扮演的王胜男,一段话戳中了众多母亲的心事业搁置身体不适还有孕吐妊娠纹变丑变胖,晚上睡不着觉,尿频,孕后期,部分生活不能自理,生产十级阵痛她眼含泪光,而此时身旁黄嘉千夏克立离婚官司9月开庭,女方将争夺登记于男方名下的房产据台媒7月27日报道,黄嘉千夏克立离婚官司将在9月12日开庭,届时夏克立必须回到中国台湾省出庭,必然也会遭到狗子队的围堵。法院人士透露,两人婚变消息曝光后,双方友人不断透过媒体声援向佐出轨添新瓜?女方曝光聊天记录,和向佐视频穿衣裸露很妖娆7月26日,有网友在网上曝光了一段聊天记录,以及向佐和她开视频的截图,内容曝光后,由于里面信息丰富,视频截图露骨,很快就引起了网友们的广泛关注和评论。曝光者表示聊天记录的内容发生在跟警察合影怎样才不像犯人?连马云都错了,成龙的方式最标准在我们的日常生活中,明星群体几乎与我们隔绝。毕竟,它们并非偶然出现在公众面前。因此,普通人很少见到他们。在会议上,不可避免地要求签名和合影,包括警察。但更有趣的是,普通人和明星合影陈妙英笑起来满脸的故事!49岁了还想复出,不过老牌明星确实耐看曾经在TVB五大花旦之一陈妙瑛,现在也都49岁了!作为一代知名的港星,陈妙瑛确实是一个时代的标志,曾经出演的无头东宫是不少人心里的记忆吧!电视剧中的她,虽然长相不是最美的,但是看起贾乃亮发声道歉!网友不买账扒出更多新料,涉及黄晓明郑恺等明星7月26日当天贾乃亮终于针对与校园贷创始人合作直播等争议道歉了。能看到的是贾乃亮表示关于该品牌的合作,没有背景调查,是自己的大意,然而当这份道歉曝光的时候,就有网友表示另外一位的文