使用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(); } }