Thrift java应用实例讲解
2017-09-21 14:54
381 查看
1、前言
Apache Thrift是个远程服务调用框架,目前应用较广,它有如下优点:1. IDL接口描述
2. 跨语言支持,如定义好接口后,可以支持多种语言的开发,如C++、Java、Python、PHP、Ruby、Perl等等,在多语言的环境下,有较大优势。
以下从应用角度,介绍个完整的demo,来实现client和server间的通信交互。
2、准备工作
1. 下载安装thrift:
以mac下的终端为例:( - linux下的安装类似,可以用yum、apt-get等,还可从源码编译安装(不建议该方式),请自行google、不再赘述)thrift安装:brew install thrift
2. Java相关环境准备:
1. 下载jdk,并配置环境变量2. 下载java IDE(集成开发环境)eclipse
以上安装网上资料很多,此处不详介绍。
3. 配置maven环境
为方便依赖包下载,可考虑用maven来管理依赖包 -- 手动安装依赖包的,可考虑跳过这一小节。1)maven下载:步骤参考该贴的讲解:http://blog.csdn.net/jiuqiyuliang/article/details/45390313
2)eclipse中集成maven
~/.bash_profile中添加MAVEN_HOME,然后export到PATH中,在source ~/.bash_profile文件使其生效
查看是否加载成功:mvn -version
在eclipse中安装maven插件:Help --> Install New Software,然后输入 HTTP地址http://m2eclipse.sonatype.org/sites/m2e
下载jar包操作:在pom.xml中添加依赖包后,选中pom.xml,右键选择“Maven install”,之后到.m2文件夹下查看安装好的jar包
3、Thrift实例讲解 - JAVA
在Eclipse中添加一个maven项目(依赖包不需要maven来下载的,直接添加普通package即可)1. 定义服务接口
thrift采用IDL服务接口方式:step1:编写thrift接口文件
demo.thrift:
namespace java com.test.thriftTry service demo{ void sayHello(1:i64 id,2:string name,3:i32 age); }其中com.test.thriftTry是eclipse中建立的package,截图如下:
step2:使用thrift工具编译,自动生成接口声明代码文件。
该文件包含:
1)thrift文件中描述的服务接口定义,即xxx.Iface接口;
2)封装服务调用的底层通信细节,包括客户端的调用逻辑、以及服务端的处理逻辑。
编译命令:
thrift --gen java demo.thrift
将生成的gen-java下的demo.java move到eclipse的package下(参考上截图)
2. 实现服务处理接口impl
demo.java可理解成接口声明文件,在impl文件里实现接口细节。
demoimpl.java:package com.test.thriftTry; import java.util.Date; import org.apache.thrift.TException; public class demoImpl implements demo.Iface{ @Override public void sayHello(long id,String name, int age) { if (id == 1){ System.out.println("first id ACCESS --- " + new Date()); System.out.println("id: "+id+" name: "+name+" age: "+age+"\n"); }else if(name.length() < 3){ System.out.println("second id ACCESS -- " + new Date()); System.out.println("id: "+id+" name: "+name+" age: "+age+"\n"); }else{ System.out.println("third id ACCESS -- " + new Date()); System.out.println("id: "+id+" name: "+name+" age: "+age+"\n"); } } }其中thrift文件中定义的sayHello API接口在这里实现。
3. 服务端代码实现
服务端代码基本步骤:1)创建定义ServerSocket端口
2)创建Processor
3)创建TProtocol
4)创建server
5)启动server
代码细节参考如下
tServer.java
package com.test.thriftTry; import org.apache.thrift.protocol.TBinaryProtocol; import org.apache.thrift.protocol.TBinaryProtocol.Factory; import org.apache.thrift.server.TServer; import org.apache.thrift.server.TThreadPoolServer; import org.apache.thrift.server.TThreadPoolServer.Args; import org.apache.thrift.transport.TServerSocket; import org.apache.thrift.transport.TTransportException; import com.test.thriftTry.demo.Processor; public class tServer { public void startServer(){ try { TServerSocket sts = new TServerSocket(8111); demo.Processor pros = new Processor(new demoImpl()); Factory pf = new TBinaryProtocol.Factory(true, true); Args args = new Args(sts); args.processor(pros); args.protocolFactory(pf); TServer server = new TThreadPoolServer(args); server.serve(); } catch (TTransportException e) { e.printStackTrace(); } } public static void main(String [] args){ tServer ts = new tServer(); ts.startServer(); } }
4. 客户端代码实现
客户端代码基本步骤:1. 创建Transport
2. 创建TProtocol
3. 创建Client
4. 调用Client
代码细节参考如下
tClient.java
package com.test.thriftTry; import org.apache.thrift.TException; import org.apache.thrift.protocol.TBinaryProtocol; import org.apache.thrift.protocol.TProtocol; import org.apache.thrift.transport.TSocket; import org.apache.thrift.transport.TTransport; import org.apache.thrift.transport.TTransportException; import com.test.thriftTry.demo.sayHello_args; public class tClient { public void startClient() throws InterruptedException{ TTransport ts = new TSocket("localhost",8111); TProtocol pto = new TBinaryProtocol(ts); demo.Client client = new demo.Client(pto); try { ts.open(); client.sayHello(1,"jack", 30); Thread.sleep(3000); client.sayHello(2,"lucy", 5); Thread.sleep(3000); client.sayHello(3,"jetty", 29); } catch (TTransportException e) { e.printStackTrace(); } catch (TException e) { e.printStackTrace(); } } public static void main(String[] args) throws InterruptedException{ tClient tc = new tClient(); tc.startClient(); } }
5. 代码执行
1. 启动server:eclipse中选中"tServer.java",右键选择“Run as” -> "Java Application"注意重启的话,需杀掉之前的进程,否则会报端口占用的错误。
2. 启动client:eclipse中选中"tClient.java",右键选择“Run as” -> "Java Application"
项目结构图、执行结果截图如下,
6. 其它 - pom.xml配置
用maven下载依赖包时,pom.xml配置如下:主要是thrift和slf4j的jar包下载地址
<dependency> <groupId>org.apache.thrift</groupId> <artifactId>libthrift</artifactId> <version>0.9.3</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.25</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-nop</artifactId> <version>1.7.25</version> <scope>test</scope> </dependency>
依赖包的地址配置和版本可到mvn官网查找:http://mvnrepository.com/
其中slf4j-nop是为了解决执行时的报错:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
4、写在最后
本文给了个thrift tcp请求的基本构建实例。在该实例基础上还可以做扩展,如thrift文件添加自定义struct结构类型、server端增加DB访问的支持、多线程的支持等等。
end
相关文章推荐
- Java实现Web应用中的定时任务(实例讲解)
- [零基础学JAVA]Java SE应用部分-31.Java IO操作(05)IO操作实例讲解之实现简单MIS 推荐
- 通过实例讲解Java_ Filter我们常见的应用方法
- JAVA使用 MOCK 对象进行单元测试的实例讲解
- Thrift入门初探--thrift安装及java入门实例
- java中多线程应用实例
- Java反射讲解-实例(2)
- 多语言协作工具thrift实例讲解
- Java自动化测试中多数据源的切换(实例讲解)
- java 动态生成SQL的实例讲解
- java的反射机制(实例讲解)
- Thrift入门及Java实例
- Java反射入门和应用实例
- Thrift入门初探--thrift安装及java入门实例
- Java的Hibernate框架中Criteria查询使用的实例讲解
- java 自定义注解应用实例
- Rx_java(1) 观察者模式实例讲解
- 实例讲解:Java中的SOAP技术
- java注解应用实例 - Annotation, 自定义注解, 注解类规则
- SOAP在java中的应用实例