基于thrift的简单Java RPC框架

背景:RPC是一种常用的技术,比如游戏服务器,算法服务等都会用到。有时我们想使用一个简单的RPC框架;或者客户端服务端程序是由不用语言编写,但是要使用RPC技术,这时thrift是一种很好的选择。thrift是一种跨语言的RCP框架(不跨语言也可以),下面讲解如何用thrift编写一个简单的客户端服务端均为Java语言的RPC框架。


定义接口,生成代码

创建一个helloworld.thrift文件,内容如下
service Hello {
string helloString(1:string word)
}
用命令:thrift --gen java helloworld.thrift 生成一个名为Hello的Java文件,把此文件放入客户端和服务端项目的thrift包里
代码结构如下图所示,两个module里的Hello.java是使用thrift自动生成的,SimilarityThriftClient 、ThirftServer、HelloServiceImpl 是我们自己编写的。
在这里插入图片描述
依赖如下:

    <dependencies>
        <dependency>
            <groupId>org.apache.thrift</groupId>
            <artifactId>libthrift</artifactId>
            <version>0.13.0</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.5.8</version>

        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
        </dependency>
    </dependencies>

客户端代码

package client;

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 thrift.Hello;
import java.io.IOException;

public class SimilarityThriftClient {

    public static void main(String[] args) {
        try {
            TTransport transport;
            transport = new TSocket("localhost", 9000);
            transport.open();
            TProtocol protocol = new TBinaryProtocol(transport);
            Hello.Client client = new Hello.Client(protocol);
            perform(client);
            transport.close();
        } catch (TException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    private static void perform(Hello.Client client) throws TException, IOException {
        String str = "001.jpg,002.jpg,003.jpg,004.jpg,005.jpg,demo.jpg";
        String[] paths = str.split(",");
        for(String path:paths){
            //ratio是客户端吧path传过去后服务端的返回信息,即服务端代码里的1
            String ratio = client.helloString(path);
            System.out.println(ratio);
        }
    }
}

服务端代码

package server;

import org.apache.thrift.protocol.TBinaryProtocol.Factory;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TThreadPoolServer;
import org.apache.thrift.server.TThreadPoolServer.Args;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TTransportException;
import thrift.Hello;
import thrift.Hello.Processor;

/**
 * 启动服务
 *
 */
public class ThriftServer {
/**
 * 启动Thrift服务器
 */
public void startServer() {
        try {
        // 定义传输的socket,设置服务端口为6789
        TServerSocket serverTransport = new TServerSocket(9000);

        // 设置协议工厂为 TBinaryProtocol.Factory
        Factory proFactory = new Factory(true, true);

        // 关联处理器与 Hello服务的实现
        Hello.Processor processor = new Processor(new HelloServiceImpl());

        // 定义服务端的参数值
        Args args = new Args(serverTransport);
        args.processor(processor);
        args.protocolFactory(proFactory);
        TServer server = new TThreadPoolServer(args);

        // 服务端开启服务s
        server.serve();
        } catch (TTransportException e) {
        e.printStackTrace();
        }
        }

    public static void main(String[] args) {
        System.out.println("ServerStart!");
        ThriftServer server = new ThriftServer();
        server.startServer();
    }

}
package server;

import org.apache.thrift.TException;
import thrift.Hello.Iface;

/**
 * 服务端实现类
 *
 * @author pallas_cat
 */
public class HelloServiceImpl implements Iface {

    public String helloString(String word) throws TException {
        //输出word是在服务端输出
        System.out.println(word);
        //return是给客户端返回信息
        return "1";
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值