打卡日期(2019-07-12)
学习要点
简单实现thrift客户端与服务器端通信
- 1.编写thrift文件
- 2.利用thrift自动生成代码工具,将.thrift文件转换成需要的开发语言文件
- 3.编写服务端代码
- 4.编写客户端代码
1.编写thrift文件
#包名
namespace java com.dragon.thrift
#定义数据类型
typedef i16 short
typedef i32 int
typedef string String
typedef bool boolean
typedef double Double
#定义结构体
struct Person{
1: optional String name
2: optional String address
3: optional int age
4: optional boolean married
5: optional Double weight
}
exception DataException{
1: optional String message
2: optional int code
}
service PersonService{
Person getPersonByUserName(1: required String name) throws (1: DataException dataEx)
void savePerson(1: required Person person) throws(1:DataException dataEx)
}
2.生成对应开发语言文件
运行命令:将.thrift文件转成java文件
thrift --gen java src/main/thrift/Person.thrift
3.编写客户端代码
package com.dragon.thrift.server;
import com.dragon.thrift.DataException;
import com.dragon.thrift.Person;
import com.dragon.thrift.PersonService;
import org.apache.thrift.TException;
public class PersonServiceImpl implements PersonService.Iface {
@Override
public Person getPersonByUserName(String name) throws DataException, TException {
System.out.println("通过用户名称获取用户信息:"+ name);
Person person = null;
if (name.equals("张三")) {
person = new Person();
person.setName("张三");
person.setAddress("北京市朝阳区");
person.setMarried(false);
person.setWeight(100.01);
person.setAge(30);
} else {
DataException dataException = new DataException();
dataException.setCode(101);
dataException.setMessage("用户不存在");
throw dataException;
}
return person;
}
@Override
public void savePerson(Person person) throws DataException, TException {
System.out.println("保存用户信息 savePerson");
System.out.println(person.getName());
System.out.println(person.getAddress());
System.out.println(person.getWeight());
}
}
package com.dragon.thrift.server;
import com.dragon.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.TFramedTransport;
import org.apache.thrift.transport.TNonblockingServerSocket;
import org.apache.thrift.transport.TTransportException;
public class MyThriftServer {
public static void main(String[] params) throws TTransportException {
// 非阻塞服务socket,绑定端口8080
TNonblockingServerSocket socket = new TNonblockingServerSocket(8080);
// THsHaServer 其模型任务是读写任务放到线程池里面去处理,半同步半异步服务模型
// Half-sync,用于handler对RPC同步处理
// Half-async,处理IO事件
/***
* @Param minWorkerThreads 最少工作线程数,默认5
* @Param maxWorkerThreads 最大工作线程数,默认Integer的最大值 2147483647
*/
THsHaServer.Args args = new THsHaServer.Args(socket).minWorkerThreads(2).maxWorkerThreads(4);
// processor 服务器端辅助对象sklenton,负责调用服务器端的本地代码
PersonService.Processor<PersonServiceImpl> processor = new PersonService.Processor<>(new PersonServiceImpl());
// Protocol 设置协议层,将数据转换成不同的格式
args.protocolFactory(new TCompactProtocol.Factory());
// transport 设置传输层
args.transportFactory(new TFramedTransport.Factory());
// sklenton 服务端辅助对象,调用服务端的本地方法
args.processorFactory(new TProcessorFactory(processor));
TServer server = new THsHaServer(args);
// 启动service
server.serve();
}
}
4.编写客户端代码
package com.dragon.thrift.server;
import com.dragon.thrift.Person;
import com.dragon.thrift.PersonService;
import org.apache.thrift.protocol.TCompactProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TFramedTransport;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
import org.apache.thrift.transport.TTransportException;
public class MyThriftClient {
public static void main(String[] args) throws TTransportException {
// 设置传输层
TTransport tTransport = new TFramedTransport(new TSocket("localhost",8080),600);
// 设置传输层协议
TProtocol protocol = new TCompactProtocol(tTransport);
// 客户端服务对象,stub
PersonService.Client client = new PersonService.Client(protocol);
try {
// 开启传输
tTransport.open();
Person person = client.getPersonByUserName("张三");
System.out.println(person.getName());
System.out.println(person.getWeight());
System.out.println(person.getAddress());
System.out.println(person.getAge());
System.out.println("=========================");
person.setName("李四");
client.savePerson(person);
}catch (Exception e){
}finally {
// 关闭传输
tTransport.close();
}
}
}
运行客户端和服务端代码,运行结果如下:
Server
通过用户名称获取用户信息:张三
保存用户信息 savePerson
李四
北京市朝阳区
100.01
Client
张三
100.01
北京市朝阳区
30
=========================
至此一个完整利用java 基于thrift的RPC通讯案例完成