1.前言
使用thrift心得:
(1)thrift是一个RPC的框架 ,RPC是远程过程调用协议;用于进行可扩展且跨语言的服务的开发,以构建在C++、Java、Python、PHP、Ruby、Erlang、
Perl、Haskell、C#、Cocoa、JavaScript、Node.js、Smalltalk、and OCaml这些编程语言的服务,thrift实际上是实现了C/S模式,通过代码生成工具将接口定
义文件生成服务器端和客户端代码(可以为不同语言),从而实现服务端和客户端跨语言的支持。用户在thrift描述文件中声明自己的服务,这些服务经过编译后会
生成相应语言的代码文件,然后用户实现服务(客户端调用服务,服务器端提供服务)便可以了。其中protocol(协议层,定义数据传输格式,可以为二进制或者XML等)
和transport(传输层,定义数据传输方式,可以为TCP/IP传输,内存共享或者文件共享等)被用作运行时库
(2)thrift类似于一个脚本编译软件用来编译thrift脚本转成相应的Java文件,用于共同约束客户端和服务端关于 参数、接口、异常等数据的使用,像一个中间件一样;
(3)服务端需要设置端口号,需要实例脚本的service 【类似于接口】后映射相对应的具体实现类,具体实现类需要继承写该service并重写该service接口的方法;
(4)客户端需要输入服务端IP地址和端口号连接,连接成功后需要实例service,并设置参数,这些都需要thrift脚本转成相应的Java文件的约束,具体使用则直接调用即可,
语法的使用需要配合thrift依赖的方法使用;
(5)客户端使用结束后,记得关闭连接。
2.
需要提前编译thrift脚本,window系统可在文件夹新建一个后缀是 .thrift 的文件 ,我这里命名为 login.thrift
内容:
namespace java cn.cen.thrift struct MyRequest{ 1: string username; 2: string psw; } exception MyRequestException{ 1: required i32 code; 2: optional string reason; } //服务名 service MyLoginService{ string doLogin(1: MyRequest myRequest) throws (1:MyRequestException mrqe);//可能抛出异常 }
解释:
(1)namespace java cn.cen.thrift 的意思是说 【命名空间】【编译语言】【文件夹路径】
(2)struct 是块的意思 ,相当于poji类的使用
(3)exception 是异常类型 , required 是指必须有的参数 ,optional 是可选参数,可有可无
(4)service 是服务类型 ,类似于接口 的使用 ,里面是方法 ,string doLogin 意思是方法doLogin 返回string 类型数据 ,括号的是参数
(5)所有的参数 都需要写序号
3.
cmd打开指令框,进入有login.thrift这个文件的文件夹,后执行thrift编译指令
注意,thrift-0.9.3 是exe文件的名字,是可变的,很具实际输入 -gen java 意思是编译成java语言 ,后面的是文件名
编译后会在同文件夹生成一个gen-java文件夹 ,根据命名空间的参数一层层建立文件夹,里面会生成多个java文件
4.
新建一个maven项目,
pom.xml引入依赖包
<!-- thrift依赖包 ,这个不可缺-->
<dependency>
<groupId>org.apache.thrift</groupId>
<artifactId>libthrift</artifactId>
<version>0.9.3</version>
</dependency>
<!-- 下面两个日志依赖包,可有可无,虽然不影响thrift,
但是最好有,不然会有警告提示-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.21</version>
</dependency>
5.
项目结构
6.
建立 具体实现类
package doThrift; import org.apache.thrift.TException; import thrift.MyLoginService; import thrift.MyRequest; import thrift.MyRequestException; import java.util.ArrayList; /** * 具体实现类 */ public class LoginServiceImpl implements MyLoginService.Iface { @Override public String doLogin(MyRequest myRequest) throws MyRequestException, TException { System.out.println("设施具体方法位置"); System.out.println(myRequest.getUsername()); System.out.println(myRequest.getPsw()); return myRequest.getUsername() + myRequest.getPsw(); } }
7.
建立 服务端
package server; import doThrift.LoginServiceImpl; import org.apache.thrift.server.TServer; import org.apache.thrift.server.TSimpleServer; import org.apache.thrift.transport.TServerSocket; import org.apache.thrift.transport.TTransportException; import thrift.MyLoginService; import java.io.IOException; import java.net.ServerSocket; public class MyServer { public static void main(String[] args) throws IOException, TTransportException { //transport ,建立服务端socket的接收,设置端口号 ServerSocket serverSocket = new ServerSocket(8888); TServerSocket tServerSocket = new TServerSocket(serverSocket); //processor处理器 , 实例thrift脚本的service类型数据,生成处理器,映射相应的具体实现类【即具体业务】 MyLoginService.Processor processor = new MyLoginService.Processor(new LoginServiceImpl()); TServer.Args tServerArgs = new TServer.Args(tServerSocket); //在总线添加子处理器 tServerArgs.processor(processor); //server TServer server = new TSimpleServer(tServerArgs); System.out.println("服务端启动"); //启动服务 server.serve(); } }
可以直接运行,效果类似于tomcat的启动
8.
建立 客户端,并调用服务端 MyLoginService 接口 ,的 doLogin()方法
package client; 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 thrift.MyLoginService; import thrift.MyRequest; public class MyClient { public static void main(String[] args){ TTransport tTransport = null; try { //创建transport,,其实就是设置IP地址和端口号 tTransport = new TSocket("localhost",8888); // 创建TProtocol 协议要与服务端一致 TProtocol tProtocol = new TBinaryProtocol(tTransport); //创建client,,其实就是将thrift脚本的service类型数据实例化,相当于new一个对象 MyLoginService.Client client = new MyLoginService.Client(tProtocol); //建立连接 tTransport.open(); //设置传入参数,相当于设置pojo类 MyRequest myRequest = new MyRequest().setUsername("爱你哟").setPsw("123456"); //client 调用 server端的方法 ,其实就是调用thrift脚本的service类型里的方法 String res = client.doLogin(myRequest); System.out.println("客户端返回结果是:"+res); }catch (Exception e){ e.printStackTrace(); }finally { //关闭连接 tTransport.close(); } } }
9.
运行客户端 ,控制台打印信息
服务端打印的信息:
--------------------
参考博客原址: https://www.jianshu.com/p/166efddfcb20