1

thrift使用入门

目前项目使用hessian来作为服务之间RPC调用的底层框架,组内人员说可以尝试使用thrift替换他,thrift性能更出色,且使用更方便。所以找了一些资料,为thrift做一个入门。

服务描述

thrift的服务描述使用IDL(服务描述语言),然后提供一个代码生成工具,将之转化成不同语言的源代码文件,服务端实现该接口,客户端通过该接口进行服务调用。

样例

  1. 接口描述语言
    thrift自己定义了接口描述语言,如下,更多的参考 Thrift IDL,或者这篇文章

    namespace java com.tongyin.thrift.demo
    service HelloWorldServcie{
        string sayHello(1:string username)
    }
  2. 使用官方提供的代码生成工具
    首先官方去下载代码生成工具(提供了多个语言的版本),然后运行

    thrift -r --gen java demo.thrift

    下面是生成的java版本的java接口文件,没有贴完,给了个大概

    package com.szp.mvp.thrift.demo1;
    
    @SuppressWarnings({"cast", "rawtypes", "serial", "unchecked", "unused"})
    @javax.annotation.Generated(value = "Autogenerated by Thrift Compiler (0.10.0)", date = "2017-09-26")
    public class HelloWorldServcie {
      public interface Iface {
        public String sayHello(String username) throws org.apache.thrift.TException;
      }
  3. 服务端
    服务器端要实现接口对应的方法

    //HelloWorldImpl.java
    public class HelloWorldImpl implements HelloWorldServcie.Iface {
        public String sayHello(String username)throws TException{
            System.out.println("server:" + username);
            return "Hi, "+ username;
        }
    }

    接口实现了,需要将该实现暴露出去,这里又涉及了很多Thrift的类,监听端口.这里需要研究下如何通过一个端口暴率多个服务类,不然对端口资源太浪费

        public class HelloServerDemo {
            public static final int SERVER_PORT=7911;
            public void startServer(){
                try{
                    System.out.println("Thrift TThreadPoolServer start...");
                    TProcessor tprocessor = new HelloWorldServcie.Processor<HelloWorldServcie.Iface>(new HelloWorldImpl());
                    TServerSocket serverTransport = new TServerSocket(SERVER_PORT);
                    TThreadPoolServer.Args ttpsArgs = new TThreadPoolServer.Args(serverTransport);
                    ttpsArgs.processor(tprocessor);
                    ttpsArgs.protocolFactory(new TBinaryProtocol.Factory());
                    TServer server = new TThreadPoolServer(ttpsArgs);
                    server.serve();
                }catch (Exception e){
                    System.out.println("Server start error!!!");
                    e.printStackTrace();
                }
        
            }
            public static void main(String[] args){
                HelloServerDemo server = new HelloServerDemo();
                server.startServer();
            }
        }
  4. 客户端
    客户端引入接口,使用thrift生成代理,来访问远程服务对象。

        public class HelloClientDemo {
            public static final String SERVER_IP="127.0.0.1";
            public static final int SERVER_PORT=7911;
            public static final int TIMEOUT=30000;
        
            public  void startClient(String userName){
                TTransport transport = null;
                try{
                    transport = new TSocket(SERVER_IP,SERVER_PORT,TIMEOUT);
                    TProtocol protocol = new TBinaryProtocol(transport);
                    HelloWorldServcie.Client client = new HelloWorldServcie.Client(protocol);
                    transport.open();;
                    String result = client.sayHello(userName);
                    System.out.println("Thrify client result = " + result);
                }catch(TTransportException e){
                    e.printStackTrace();
                }catch(TException e1){
                    e1.printStackTrace();
                }finally{
                    if(null !=transport){
                        transport.close();
                    }
                }
        
        
            }
            public static void main(String[] args){
                HelloClientDemo client = new HelloClientDemo();
                client.startClient("Linda");
            }
        }

沈子平
183 声望17 粉丝

慢慢积累,一切都不会太晚.