前言
Thrift是RPC通信的一种方式,可以通过跨语言进行通信,最近项目需要进行跨语言的通信,因此首先尝试搭建了一个简单的thrift框架,因为网上的实例大都参差不全,通过gpt查询得到的结果对我帮助更大一点,但是也不够仔细,因此做此总结,希望给需要的人帮助。
正文
1 创建一个gradle项目
首先我们需要创建一个gradle项目,如果你是在当前项目的基础上也可以不做创建哦。
2 添加依赖
找到根目录的bulid.gradle 文件添加依赖
ependencies {
implementation 'org.apache.thrift:libthrift:0.15.0'
}
之后idea会提示你导入依赖,或者收到更新一下依赖就可以生成thrift对应的依赖。
3创建一个简单的demo
-
创建 .thrift文件
创建一个文件夹比如命名为thrift,在文件下创建一个.thrift文件,用于生成对应语言的代码。
比如我创建了一个login.thrift 文件,添加两个方法,一个有返回值,一个没有返回值。
创建的文件↓:
文件内容↓: -
通过命令生成对应的java接口代码
这是thrift的一套机制,因为thrift是跨语言的,所以你要生成你的接口对应语言的service。
在你刚才创建的 .thrift文件所在的路径下执行命令。
找到你的 .thrift文件,右键,open in terminal,执行命令
thrift --gen java loginService.thrift
其中 xx.thrift 就是你刚才创建的文件
(▽) 如果你发现,这个命令没办法执行,那你需要先执行这个命令哦:(亲测有效)
sudo zypper install thrift
他就会自动生成文件夹和文件↓
-
写一个实现类,实现刚才生成的接口
针对你需要的功能,写一个实现类,比如我写一个loginServiceImpl,实现刚才生成的接口类。
到现在为止,我们已经完成了大部分,之后我们就开始写一个服务端和一个客户端去测试了。thrfit需要创建一个server端和一个client端,用于我们发送通信和接收通信。 -
写服务端
创建一个thriftServer,类你可以随意命名。举例↓
package com.gehc.surgery.thrift.Server;
import com.gehc.surgery.thrift.loginServiceImpl;
import com.gehc.surgery.thrift.loginService;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TSimpleServer;
import org.apache.thrift.transport.TServerSocket;
public class ThriftServer {
public static void main(String[] args){
try {
//刚才自己创建的实现类
loginServiceImpl login =new loginServiceImpl();
TServerSocket serverSocket =new TServerSocket(9090);
loginService.Processor<loginServiceImpl> processor =new loginService.Processor<>(login);
TServer.Args serverArg =new TServer.Args(serverSocket);
serverArg.processor(processor);
TSimpleServer server =new TSimpleServer(serverArg);
server.serve();
}catch (Exception e){
e.printStackTrace();
}
}
}
- 写一个客户端
创建一个thriftClient类,类名你可以自己命名,写法如下↓:
package com.gehc.surgery.thrift.Client;
import com.gehc.surgery.thrift.loginService;
import org.apache.thrift.TException;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
public class ThriftClient {
public static void main(String[] args) throws TException {
//自己定一下ip和端口 我随意定义的
TTransport transport= new TSocket("localhost",9090);
transport.open();
TBinaryProtocol protocol=new TBinaryProtocol(transport);
loginService.Client client=new loginService.Client(protocol);
//你的实现类的方法
client.login();
boolean result= client.login1();
System.out.println(result);
transport.close();
}
}
- 测试
先启动一下服务端,然后再启动一下客户端,我的login1()方法是有返回值的,当启动了客户端,就可以在服务端的执行日志那里看到我的相关返回值啦