一 基本概述与入门
1.1 官网知识
- Thrift是一个轻量级、跨语言的远程服务调用框架,最初由Facebook开发,后面进入Apache开源项目。它通过自身的IDL中间语言, 并借助代码生成引擎生成各种主流语言的RPC服务端/客户端模板代码。
- Thrift支持多种不同的编程语言,包括C++、Java、Python、PHP、Ruby等,本系列主要讲述基于Java语言的Thrift的配置方式和具体使用。
- 官网:https://thrift.apache.org/
1.2 下载安装
- 下载地址:http://www.apache.org/dyn/closer.cgi?path=/thrift/0.15.0/thrift-0.15.0.exe
- 配置环境变量到path路径中
- idea中安装
thrift 插件,可以实现thrift 语法自动提示
- 由官网可知这是一门新的语言,当然有他的基本语法,下面我们来认识下
1.3 基本数据结构
- 基本类型:
bool : 布尔值;byte : 8位有符号整数; i16 : 16位有符号整数 i32 : 32位有符号整数;i64 : 64位有符号整数;double : 64位浮点数 string : UTF-8编码的字符串;binary : 二进制串 - 结构体类型:
struct : 定义的结构体对象 - 容器类型:
list : 有序元素列表;set : 无序无重复元素集合;map : 有序的key/value集合 - 异常类型:
exception : 异常类型 - 服务类型:
service : 具体对应服务的类
1.4 基本案例入门
1.4.1 编写thrift文件
idea中编写一个Person.thrift文件
namespace java com.shu.demo.thrift
typedef i16 short
typedef i32 int
typedef i64 long
typedef string String
typedef bool Boolean
typedef double Double
struct person{
1:optional String id;
2:optional String userName;
3:optional String passWord;
4:optional Boolean isCheck;
}
exception personexception{
1:optional int code;
2:optional String message;
}
service personservice{
person getPersonInfoByUserNmae(1:required String username) throws (1: personexception exce )
Boolean IsCheck(1:required String username)
}
1.4.2 新建springBoot项目
<dependency>
<groupId>org.apache.thrift</groupId>
<artifactId>libthrift</artifactId>
<version>0.15.0</version>
</dependency>
1.4.3 生成文件
thrift -gen <language> <Thrift filename>
thrift -gen java Person.thrift
1.4.4 文件解析
Iface :服务端通过实现HelloWorldService.Iface接口,向客户端的提供具体的同步业务逻辑。AsyncIface :服务端通过实现HelloWorldService.Iface接口,向客户端的提供具体的异步业务逻辑。Client :客户端通过HelloWorldService.Client的实例对象,以同步的方式访问服务端提供的服务方法。AsyncClient :客户端通过HelloWorldService.AsyncClient的实例对象,以异步的方式访问服务端提供的服务方法。
1.4.5 定义实现类
package com.example.thrift;
import com.example.thrift.thrift.person;
import com.example.thrift.thrift.personexception;
import com.example.thrift.thrift.personservice;
import org.apache.thrift.TException;
public class PersonServiceImpl implements personservice.Iface{
@Override
public person getPersonInfoByUserNmae(String username) throws personexception, TException {
System.out.println("客服端数据:"+username);
person person=new person();
person.setId("1");
person.setUserName("admin");
person.setPassWord("123456");
person.setIsCheck(false);
return person;
}
@Override
public boolean IsCheck(String username) throws TException {
System.out.println("客服端数据:"+username);
return false;
}
}
1.4.6 服务端
package com.example.thrift.server;
import com.example.thrift.PersonServiceImpl;
import com.example.thrift.thrift.personservice;
import org.apache.thrift.TProcessorFactory;
import org.apache.thrift.protocol.TCompactProtocol;
import org.apache.thrift.server.THsHaServer;
import org.apache.thrift.server.TServer;
import org.apache.thrift.transport.TNonblockingServerSocket;
import org.apache.thrift.transport.TTransportException;
import org.apache.thrift.transport.layered.TFastFramedTransport;
public class ThriftServer {
public static void main(String[] args) throws TTransportException {
TNonblockingServerSocket serverSocket =new TNonblockingServerSocket(8803);
THsHaServer.Args arg=new THsHaServer.Args(serverSocket).maxWorkerThreads(4).minWorkerThreads(2);
personservice.Processor<PersonServiceImpl> processor =new personservice.Processor<>(new PersonServiceImpl());
arg.protocolFactory(new TCompactProtocol.Factory());
arg.transportFactory(new TFastFramedTransport.Factory());
arg.processorFactory(new TProcessorFactory(processor));
TServer tServer = new THsHaServer(arg);
System.out.println("Running Simple Server");
tServer.serve();
}
}
1.4.7 客服端
package com.example.thrift.client;
import com.example.thrift.thrift.person;
import com.example.thrift.thrift.personservice;
import org.apache.thrift.TException;
import org.apache.thrift.protocol.TCompactProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
import org.apache.thrift.transport.layered.TFramedTransport;
public class ThriftClient {
public static void main(String[] args) {
TTransport transport =null;
try {
transport = new TFramedTransport(new TSocket("127.0.0.1",8803),600);
TProtocol protocol = new TCompactProtocol(transport);
personservice.Client client = new personservice.Client(protocol);
transport.open();
person result = client.getPersonInfoByUserNmae("Leo");
System.out.println("Result =: " + result);
} catch (TException e) {
e.printStackTrace();
} finally {
if (null != transport) {
transport.close();
}
}
}
}
1.4.8 测试
到此一个简单的入门就完成了
|