zoukankan      html  css  js  c++  java
  • go thrift 开发

    thrift 从 0.9.1版本开始,可以完美支持 go 语言,可以完美的实现跨语言的 rpc 调用了。下面以 go 和 java 语言相互调用为例。

    • 编辑协议文件,go 语言示例
    /** example.thrift */
    namespace go example
    
    service transdata {
        bool sendMsg(1: string msgJson),
    }
    •  下载thrift,用于生成协议库文件

    下载地址 http://www.apache.org/dyn/closer.cgi?path=/thrift/0.11.0/thrift-0.11.0.exe

    生成库文件 thrift.0.11.0.exe -r --gen go example.thrift

    • go 语言客户端和服务端示例代码
    /** thrift_example.go */
    package thrift import (
    "fmt" "git.apache.org/thrift.git/lib/go/thrift" "os" "context" "log" "net" "awesome-go/src/service/thrift/gen-go/example" ) const ( HOST = "localhost" PORT = "19090" ) type TransdataImpl struct { } func (trandata *TransdataImpl) SendMsg(ctx context.Context, msgJson string) (r bool, err error){ fmt.Println("-->SendMsg Call:", msgJson) return true, nil } func Server() { transportFactory := thrift.NewTFramedTransportFactory(thrift.NewTTransportFactory()) protocolFactory := thrift.NewTBinaryProtocolFactoryDefault() //protocolFactory := thrift.NewTCompactProtocolFactory() serverTransport, err := thrift.NewTServerSocket(net.JoinHostPort(HOST, PORT)) if err != nil { fmt.Println("Error!", err) os.Exit(1) } handler := &TransdataImpl{} processor := example.NewTransdataProcessor(handler) server := thrift.NewTSimpleServer4(processor, serverTransport, transportFactory, protocolFactory) fmt.Println("thrift server in", net.JoinHostPort(HOST, PORT)) server.Serve() } func Client() { tSocket, err := thrift.NewTSocket(net.JoinHostPort(HOST, PORT)) if err != nil { log.Fatalln("tSocket error:", err) } transportFactory := thrift.NewTFramedTransportFactory(thrift.NewTTransportFactory()) transport, _ := transportFactory.GetTransport(tSocket) protocolFactory := thrift.NewTBinaryProtocolFactoryDefault() client := example.NewTransdataClientFactory(transport, protocolFactory) if err := transport.Open(); err != nil { log.Fatalln("Error opening:", HOST + ":" + PORT) } defer transport.Close() d, err := client.SendMsg(nil,"test string") fmt.Println(d) }
    • go 语言测试代码
    /** thrift_example_test.go */
    package thrift import
    "testing" func ClientTest(t *testing.T) { Client() } func ServerTest(t testing.T) { Server() }
    • java 协议文件示例
    namespace go service.thrift
    
    service Transdata {
        bool sendMsg(1: string msgJson),
    }
    • 生成java 协议库文件

    生成库文件 thrift.0.11.0.exe -r --gen java example.thrift

    • java 服务端示例
    package service.thrift;
    
    import org.apache.thrift.protocol.TBinaryProtocol;
    import org.apache.thrift.protocol.TBinaryProtocol.Factory;
    import org.apache.thrift.server.TNonblockingServer;
    import org.apache.thrift.server.TServer;
    import org.apache.thrift.transport.TNonblockingServerSocket;
    import org.apache.thrift.transport.TNonblockingServerTransport;
    import org.apache.thrift.transport.TTransportException;
    
    /**
     * @author zhengqian
     */
    public class Server {
    
        public static void StartSimpleServer(Transdata.Processor<ExampleHandler> processor) {
            TNonblockingServerTransport serverTransport = null;
            try {
                serverTransport = new TNonblockingServerSocket(19090);
            } catch (TTransportException e) {
                e.printStackTrace();
            }
    
            Factory protFactory = new TBinaryProtocol.Factory(true, true);
            //TCompactProtocol.Factory protFactory = new TCompactProtocol.Factory();
    
            TNonblockingServer.Args args = new TNonblockingServer.Args(
                    serverTransport);
            args.processor(processor);
            args.protocolFactory(protFactory);
            TServer server = new TNonblockingServer(args);
            System.out.println("Start server on port 19090 ...");
            server.serve();
        }
    
        public static void main(String[] args) {
            StartSimpleServer(new Transdata.Processor<ExampleHandler>(new ExampleHandler()));
        }
    }
    • java 客户端代码示例
    package service.thrift;
    
    import org.apache.thrift.TException;
    import org.apache.thrift.protocol.TBinaryProtocol;
    import org.apache.thrift.protocol.TProtocol;
    import org.apache.thrift.transport.TFramedTransport;
    import org.apache.thrift.transport.TSocket;
    import org.apache.thrift.transport.TTransport;
    import org.apache.thrift.transport.TTransportException;
    
    /**
     * @author zhengqian
     */
    public class Client {
        public static void main(String[] args) {
    
            try {
                TTransport transport = new TFramedTransport(new TSocket("localhost", 19090));
                TProtocol protocol = new TBinaryProtocol(transport);
                Transdata.Client client = new Transdata.Client(protocol);
    
                transport.open();
                System.out.println(client.sendMsg("test string"));
                transport.close();
            } catch (TTransportException e) {
                e.printStackTrace();
            } catch (TException x) {
                x.printStackTrace();
            }
        }
    }
    • 两个语言版本的 server / client 随意组合,都可以相互调用。
    • 补充,如果两端使用的 thrift 版本不一致,也可以调用,测试一端使用 0.9.3 版本,一端使用 0.11.0 版本,可正常相互调用。不用担心旧服务不兼容的问题。
  • 相关阅读:
    jquery动态生成html代码绑定事件
    jQuery中如何给动态添加的元素绑定事件
    JAVA基础面试(一)
    JAVA基础面试(二)
    JAVA面试之集合框架(三)
    JAVA基础面试(四4)
    JAVA基础面试(五5)
    JAVA基础面试(五)
    JavaWeb面试(六)
    JavaWeb面试(七)
  • 原文地址:https://www.cnblogs.com/ylty/p/9986179.html
Copyright © 2011-2022 走看看