RPC框架-thrift小试牛刀

1、RPC框架和thrift 简介

  • 什么是RPC框架:RPC简介
  • 什么是thrift: :官网地址

2、使用thrift 前的基本配置

这里以Windows为例

  • 步骤1:下载thrift 点这里下载
  • 步骤2:配置环境变量:
    1)首先在D盘中建立文件夹:thrift
    2)将下载的.exe文件重命名为thrift.exe
    3)将此路径添加在环境变量中
    RPC框架-thrift小试牛刀_第1张图片
    验证:打开cmd,输入 thrift --version 命令查看版本(看到版本信息即安装成功):
    在这里插入图片描述

3、基于java 的thrift 例子

在这里实现的是利用thrift 实现 Java的客户端和服务端通信。
需求:客户端新建一个User用户,将User用户信息传给服务端,服务端获取User用户信息,将User用户的姓名和年龄进行字符串拼接,将拼接之后的结果返回给客户端。

  • 步骤1 :新建一个Maven 工程
  • 步骤2:在pom文件中加入必要的thrift依赖包:
<!-- https://mvnrepository.com/artifact/org.apache.thrift/libthrift -->
        <dependency>
            <groupId>org.apache.thrift</groupId>
            <artifactId>libthrift</artifactId>
            <version>0.10.0</version>
        </dependency>
  • 步骤3:在maven工程中新建包,并且新建一个sayHello.thrift 文件,内容为:
namespace java cn.fudan.thrift

struct User{
    1: string username,
    2: i32 age,
}

service HelloWorldService{
    string sayHello(1:User user)
}
  • 步骤4:在Idea 中用命令行:thrift -r --gen java helloServer.thrift ,即可生成service和User代码。
    RPC框架-thrift小试牛刀_第2张图片

  • 步骤5:客户端代码
    HelloCLient.java

package thriftDemo;


import cn.fudan.thrift.HelloWorldService;
import cn.fudan.thrift.User;
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;

public class HelloClient {
    private static final String SERVER_IP = "localhost";
    private static final int SERVER_PORT = 8090;
    private static final int TIMEOUT = 30000;

    public void startClient(){
        TTransport transport = null;
        try{
            transport = new TSocket(SERVER_IP, SERVER_PORT, TIMEOUT);
            // 协议要和服务端一致
            TProtocol protocol = new TBinaryProtocol(transport);
            // 需要thrift 定义的协议
            HelloWorldService.Client client = new HelloWorldService.Client(protocol);
            transport.open();
            User user = new User();
            user.username = "harry";
            user.age = 25;
            String result = client.sayHello(user);
            System.out.println("Thrift client result = "+result);

        }catch (TException e){
            e.printStackTrace();
        }finally {
            if (null != transport){
                transport.close();
            }
        }
    }


    public static void main(String[] args){
        HelloClient client = new HelloClient();
        client.startClient();
    }
}

  • 步骤6:服务端代码
    1、实现类
package thriftDemo;

import cn.fudan.thrift.HelloWorldService;
import cn.fudan.thrift.User;
import org.apache.thrift.TException;

/**
 * 服务器端的实现代码
 * 实现thrift 中定义的接口
 */
public class HelloWorldServiceImpl implements HelloWorldService.Iface { //需要thrift定义的协议

    @Override
    public String sayHello(User user) throws TException {
        return "Hello, my name is "+user.username+"; my age is "+user.age;
    }
}

2、server类

package thriftDemo;

import cn.fudan.thrift.HelloWorldService;
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;

/**
 * 服务器端的代码
 */
public class HelloServer {

    private static final int SERVER_PORT = 8090;

    public void startServer() {
        try {
            System.out.println("HelloWorld TSimpleServer start ....");

            // 传入对应的服务器端的处理函数
            TProcessor tprocessor = new HelloWorldService.Processor<>(new HelloWorldServiceImpl());

            // 简单的单线程服务模型,一般用于测试
            TServerSocket serverTransport = new TServerSocket(SERVER_PORT);
            TServer.Args tArgs = new TServer.Args(serverTransport);
            tArgs.processor(tprocessor);
            tArgs.protocolFactory(new TBinaryProtocol.Factory());
            TServer server = new TSimpleServer(tArgs);
            server.serve();

        } catch (Exception e) {
            System.out.println("Server start error!!!");
            e.printStackTrace();
        }
    }


    /**
     * @param args
     */
    public static void main(String[] args) {
        HelloServer server = new HelloServer();
        server.startServer();
    }
}

  • 最终效果:
    当开启服务端之后,也就是运行HelloCServer(会一直处于监听状态):
    RPC框架-thrift小试牛刀_第3张图片
    然后调用客户端main函数:HelloClient,将会调用服务端的函数,然后返回对应的结果:
    RPC框架-thrift小试牛刀_第4张图片

4、总结

thrift作为一个良好的RPC的接口,在大型企业项目中发挥了较好的作用,学好thrift也是非常有必要的,继续加油!

你可能感兴趣的:(研究生日常技术,rpc,java,网络协议)