thrift服务端的c++语言实现
1.thrift 概念1
thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 这些编程语言间无缝结合的、高效的服务。
thrift最初由facebook开发,07年四月开放源码,08年5月进入apache孵化器。
thrift允许你定义一个简单的定义文件中的数据类型和服务接口。以作为输入文件,编译器生成代码用来方便地生成RPC客户端和服务器通信的无缝跨编程语言。
2.生成c++语言的thrift服务端
利用thrift软件框架进行开发要首先进行环境的搭建,安装thrift运行库。
基本流程如下:
1)定义数据类型和服务接口文件:test.thrift;
2)利用代码生成引擎生成服务端框架,thrift --gen cpp test.thrift;
3)在./gen-cpp/test_server.skeleton.cpp文件中添加定制的服务;
4)编写客户端程序向服务端请求服务。
详细过程可以参加注释2给出的链接地址。
thrift定义了自己的数据类型,从而实现了跨语言平台之间的数据交换,关于thrift数据类型的详细说明可以参加注释3给出的链接地址。
3.php客户端
基于c++语言实现的thrift服务端程序经常被用在网站的后台提供实时且高效的服务,通常客户端程序是php语言的实现版本。只要根据数据类型和服务接口文件test.thrift生成php语言的接口文件即可用来调用。方法是thrift --gen php test.thrift,调用该命令后会在工作目录下生成./gen-php目录,里面有php语言的接口文件。
注释:
Thrift的C++版本,在win下编译很麻烦。过程:1.svn下载thrift。你首先要学习,什么是svn(svn类似ftp)。接着,要去找svn客户端(类似FlashFXP
)。
2.下载完成后,在目录里找到 thrift\lib\cpp,里面有两个VS工程,一个是libthrift,提供基本服务端功能,另一个是libthriftnb。提供高级服务端功能,比如异步支持。
3.当前版本0.9.0,但任然需要修改thrift里的部分代码,才能让它在win里运行。具体代码包请加群193713524,里面有几个大牛有已经改好的,工作日在群里多找几个时间问一下。当然,自己改也行,但需要找很多个帖子,不断尝试才行,因为有些帖子给出的修改方案并不可取。
4.接下来,需要使用thrift的依赖库。有两个,boost和libevent。这两个依赖库有很多版本,具体需要哪个版本,在thrift和thriftnb工程->属性->VC++目录->包含目录 里可以看到。由于boost库编译后的lib,我死活用不了,而且libevent不需要编译,只需要进行include就行。因此,我的建议是,只下载 boost和libevent,在编译时,会提示缺少 boost的lib,然后直接在网上下载编译好的 boost lib,有好几个。
Thrift提供了多种服务器实现。TSimplerServer在while循环中每次接受一个连接,处理连接请求,直到客户端关闭了连接,它才会去接受一个新的连接。由于它只在一个单独的线程中以阻塞I/O的方式完成这些工作,所以它只能服务一个客户端连接,其他所有客户端在被服务器端接受之前都只能等待。其使用方法如下:
TNonblockingServer 使用非阻塞的 I/O 解决了TSimpleServer一个客户端阻塞其他所有客户端的问题。它使用了java.nio.channels.Selector,通过调用select(),它使得你阻塞在多个连接上,而不是阻塞在单一的连接上。当一或多个连接准备好被接受/读/写时,select()调用便会返回。TNonblockingServer处理这些连接的时候,要么接受它,要么从它那读数据,要么把数据写到它那里,然后再次调用select()来等待下一个可用的连接。通用这种方式,server可同时服务多个客户端,而不会出现一个客户端把其他客户端全部“饿死”的情况。
使用方法:
ThreadedSelectorServer允许你用多个线程来处理网络 I/O。它维护了两个线程池,一个用来处理网络 I/O,另一个用来进行请求的处理。使用方法:
TThreadPoolServer有一个专用的线程用来接受连接旦接受了一个连接,它就会被放入ThreadPoolExecutor中的一个 worker 线程里处理。worker 线程被绑定到特定的客户端连接上,直到它关闭。一旦连接关闭,该worker线程就又回到了线程池中。你可以配置线程池的最小、最大线程数,默认值分别是5(最小)和Integer.MAX_VALUE(最大)。使用方法:
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)