Thrift RPC使用入門

thrift使用入門

目前項目使用hessian來做爲服務之間RPC調用的底層框架,組內人員說能夠嘗試使用thrift替換他,thrift性能更出色,且使用更方便。因此找了一些資料,爲thrift作一個入門。html

服務描述

thrift的服務描述使用IDL(服務描述語言),而後提供一個代碼生成工具,將之轉化成不一樣語言的源代碼文件,服務端實現該接口,客戶端經過該接口進行服務調用。java

樣例

  1. 接口描述語言
    thrift本身定義了接口描述語言,以下,更多的參考 Thrift IDL,或者這篇文章apache

    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生成代理,來訪問遠程服務對象。ui

    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");
            }
        }
相關文章
相關標籤/搜索