一、前言
公司一直用thrift作为服务化端的编写,实现java与php的对接,一直以来都用觉得还是可以,这里分享给大家希望大家喜欢这个工具。
Thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 等等编程语言间无缝结合的、高效的服务。
二、Thrift基础
2.1 Thrift项目搭建
2.1.1 引入jar包
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ycy</groupId>
<artifactId>thriftTest</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>thriftTest</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>org.apache.thrift</groupId>
<artifactId>libthrift</artifactId>
<version>0.9.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.12</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
</project>
2.1.2 写thrift 文件
namespace * com.ycy.interfaces
/**
* 测试接口sayhello
**/
service HelloWorldService {
/**
* sayhello
* Parmas:
* username:用户名
**/
string sayHello(1:string username),
}
注释:编写thrift文件之简单,我们可以看到。例子里面我写了一个借口为sayHello的接口。1.基本类型(括号内为对应的Java类型):
bool(boolean): 布尔类型(TRUE or FALSE)
byte(byte): 8位带符号整数
i16(short): 16位带符号整数
i32(int): 32位带符号整数
i64(long): 64位带符号整数
double(double): 64位浮点数
string(String): 采用UTF-8编码的字符串
2.特殊类型(括号内为对应的Java类型):
binary(ByteBuffer):未经过编码的字节流
3.Structs(结构):
struct定义了一个很普通的OOP对象,但是没有继承特性。
2.1.3 生成java文件
生成java文件与php文件都一眼,我们例子里面只展示使用java文件。<pre name="code" class="plain"> 1)安装thrift:到thrift官网下载exe文件,然后将文件重命名为thrift.exe,拷贝到c:\windows目录下(或者任何目录下),然后就可以在dos环境下使用了
c:\windows>thrift -gen java D:\mywork\javaProject\thriftTest\test.thrift ,输出的java文件默认输出到当前目录下c:\windows,也可以使用-o参数指定输出路径
1,首先得有一个thrift.exe (必须下载)
2,其次写一个协议文件:helloWorldService.thrift(上面已经编写)
3,将<span style="font-family: Arial, Helvetica, sans-serif;">helloWorldService.thrift</span>文件放到有thrift.exe的目录下
4,运行命令:thrift -r -gen java <span style="font-family: Arial, Helvetica, sans-serif;">helloWorldService.thrift</span>, 生成gen-java目录
5,将生成的java代码,拷贝到java项目中,注意:包名必须一致。
6,在java代码中,写一个类,继承生成的Thrift服务监听类。
7,向继承的监听类发送Thrift请求。
mac环境具体步骤
brew install thrift
然后进入我们项目定义define目录执行命令
1,运行命令:thrift -r -gen java helloWorldService.thrift, 生成gen-java目录
2,将生成的java代码,拷贝到java项目中,注意:包名必须一致。
3,在java代码中,写一个类,继承生成的Thrift服务监听类。
4,向继承的监听类发送Thrift请求。
2.1.4 生成项目
2.2 java端调用
2.2.1 实现接口
package com.ycy;
import com.ycy.interfaces.HelloWorldService;
/**
* Created by ycy on 16/3/3.
*/
public class HelloWorldServiceImpl implements HelloWorldService.Iface {
public String sayHello(String s) {
return "hello" + s;
}
}
2.2.1 服务端
package com.ycy.server;
import com.ycy.HelloWorldServiceImpl;
import com.ycy.interfaces.HelloWorldService;
import org.apache.thrift.TProcessor;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TSimpleServer;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.protocol.TBinaryProtocol.Factory;
import org.apache.thrift.protocol.TBinaryProtocol;
/**
* Created by ycy on 16/3/3.
*/
public class ServerMain {
public static void main(String[] args) {
try {
TProcessor processor = new HelloWorldService.Processor<HelloWorldService.Iface>(new HelloWorldServiceImpl());
//设置服务器端口为7911
TServerSocket serverTransport = new TServerSocket(7911);
//设置协议工厂为TBinaryProtocol.Factory
Factory proFactory = new TBinaryProtocol.Factory();
TServer.Args tArgs = new TServer.Args(serverTransport);
tArgs.processor(processor);
tArgs.protocolFactory(proFactory);
//使用TSimpleServer
TServer server = new TSimpleServer(tArgs);
System.out.println("Start server on port 7911....");
server.serve();
} catch (Exception x) {
x.printStackTrace();
}
System.out.println("done.");
}
}
2.2.2 客户端
package com.ycy.client;
/**
* Created by ycy on 16/3/3.
*/
import com.ycy.interfaces.HelloWorldService;
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;
public class ClientMain {
/**
* 调用Hello服务
* @param args
*/
public static void main(String[] args) {
try {
//设置调用的服务器为本地,端口为7911
TTransport transport = new TSocket("localhost", 7911);
transport.open();
//设置传输协议为TBinaryProtocol
TProtocol protocol = new TBinaryProtocol(transport);
HelloWorldService.Client client = new HelloWorldService.Client(protocol);
System.out.println(client.sayHello("mnin")); ;
transport.close();
} catch (TTransportException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}