一、前言
公司一直用thrift作为服务化端的编写,实现java与php的对接,一直以来都用觉得还是可以,这里分享给大家希望大家喜欢这个工具。
Thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 等等编程语言间无缝结合的、高效的服务。
二、Thrift基础
我们使用thrift需要的思路为如下图
我们建立thrift定义服务化接口,作为服务端与客户端都需要引入jar或者文件,通过thrift特点的服务与客户端即可以完成接口调用。
2.1 Thrift项目搭建
2.1.1 引入jar包
搭建项目第一步在pom文件,如果还没使用maven的同学估计可以挂了,现在基本已经没得用原生jar文件的了。
其中只有lib thrift的包为官方,下面的日志包为搭配。
<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 文件
整个项目文件:
1、defin目录:自己定义专门存放我们的thrift文件
2、src文件:专门存放java文件
3、php文件:专门存放php文件(未建立)
我们首先看看thrift文件:HelloWorldService.thrift
namespace * com.ycy.interfaces /** * 测试接口sayhello **/ service HelloWorldService { /** * sayhello * Parmas: * username:用户名 **/ string sayHello(1:string username), }注释:编写thrift文件之简单,我们可以看到。例子里面我写了一个借口为sayHello的接口。
为防止不会写thrift的小伙伴我把thrift的基本类型写一下:很少的哦,如果会使用其他编程语言一眼就该知道是什么意思
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文件。
首先我们需要下载好thrift文件的执行程序:
windows:下载exe
mac:brewhome里面下载thrift
linux:下载thrift(不懂得进入群咨询我,谢谢!)
window环境具体步骤
<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 生成项目
执行thrift命令之后,我们的项目如下。然后执行mvn clean install 将项目打包即可生成jar包,以供其他项目使用。
2.2 java端调用
java项目需要引入如上jar包,php项目需要引入上面生成文件。
项目整体
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(); } } }
2.2.3 测试结果
三、总结与序章
这一篇我们讲诉了使用thrift的基本用法,其实很简单,原理更简单。thrift就是使用thrift作为媒介,各个调用的接口都可以读取socket的数据,或者监控客户端以供数据。
但是很多人会发现,就这个客户端与服务端起鸡毛作用啊,根本就是socket的嘛。在项目实际运用中怎么玩耍呢,接下来我将会讲解怎么正在封装使用thrift,作为接口使用。一般互联网公司都这么玩耍。下一章节,讲诉。
两个项目的代码在git上面可以下载:: https://github.com/yangchangyong0