Himalayas

博客园 首页 联系 订阅 管理

一:thrift 框架引入

上一篇文章我们了解了基于java的rpc实现方式。非常的核心,但是也非常的简单。代码不够通用,不支持异步等详细的功能。如果需要的话,我们得手动写代码去做封装和功能的完善。我们常说不要重复造轮子,有没有现成的rpc框架能让我直接用呢?肯定有,而且不止一种。比如 Dubbo,gRPC,Thrift等。

二:thrift的使用

(1)下载 thrift

去官网(http://thrift.apache.org/download)下载 thrift-x.x.x.exe 文件

(2)配置环境变量(为了在任意路径都能使用thrift命令)

在path中加一下thrift-x.x.x.exe文件的路径。比如我把这个文件放到了 C:\soft\developSoft\thrift-0.12.0 目录下

(3)编写Hello.thrift文件,声明rpc方法和类名等信息

namespace java com.cs.thrift

service Hello{

	string helloString(1:string para)
	i32 helloInt(1:string para)
	bool helloBoolean(1:bool para)
	void helloVoid()
	string helloNull()

}

(4)通过thrift生成对应的java类文件

 

(5)新建一个maven项目,把生成的类copy到myeclipse中(拷贝gen-java目录下的所有文件即可)

(6)编写服务的实现类

新建 HelloServiceImpl,实现 Hello.Iface。并实现里面的方法。

public class HelloServiceImpl implements Hello.Iface{

    @Override
    public String helloString(String para) throws TException {
        // TODO Auto-generated method stub
        return "这是我的一个thrift hello java——————" + para;
    }

    @Override
    public int helloInt(String para) throws TException {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public boolean helloBoolean(boolean para) throws TException {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public void helloVoid() throws TException {
        // TODO Auto-generated method stub
        
    }

    @Override
    public String helloNull() throws TException {
        // TODO Auto-generated method stub
        return null;
    }

}

 

(7)编写server

import org.apache.thrift.TProcessor;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TSimpleServer;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TTransportException;

/**
 * 编写 Thrift服务端,并启动
 * @author cuishuai01
 */
public class HelloServiceServer {

    public static void main(String[] args) throws TTransportException {
        
        //设置服务监听端口为 8888
        TServerSocket tServerSocket = new TServerSocket(8888);
        //创建自己具体的processor 并 关联Hello服务的实现
        TProcessor tProcessor = new Hello.Processor<Hello.Iface>(new HelloServiceImpl());
        //关联processor
        TServer.Args tArgs = new TServer.Args(tServerSocket);
        tArgs.processor(tProcessor);
        
        //设置协议工厂为 TBinaryProtocol.Factory
        tArgs.protocolFactory(new TBinaryProtocol.Factory());
        
        TServer tServer = new TSimpleServer(tArgs);
        
     System.out.println("下面开始监听客户端发来的服务请求!"); tServer.serve(); } }

(8)编写client

/**
 * 编写客户端,并启动
 * @author cuishuai01
 */
public class HelloClient {

    public static void main(String[] args) throws Exception {
        //设置服务端的信息
        TTransport tTransport = new TSocket("127.0.0.1", 8888, 3000);
        
        //协议要和服务端一致
        TProtocol tProtocol = new TBinaryProtocol(tTransport);
//        TProtocol tProtocol = new TCompactProtocol(tTransport);
//        TProtocol tProtocol = new TJSONProtocol(tTransport);
        Hello.Client client = new Hello.Client(tProtocol);
        
        tTransport.open();//开启socket
        
        String result = client.helloString("thrift java client");//客户端调用服务端方法
        System.out.println(result);//打印服务端方法的返回结果
        
    }
    
}

(9)测试

启动 HelloServiceServer, 再执行 HelloClient 来调用服务端的方法,效果如下。

posted on 2019-10-05 21:57  Himalayas  阅读(233)  评论(0编辑  收藏  举报