• Thrift0.11.0基于Intellij IDEA的简单的例子


    前言

    目前流行的服务调用方式有很多种,例如基于 SOAP 消息格式的 Web Service,基于 JSON 消息格式的 RESTful 服务等。其中所用到的数据传输方式包括 XML,JSON 等,然而 XML 相对体积太大,传输效率低,JSON 体积较小,新颖,但还不够完善。本文将介绍由 Facebook 开发的远程服务调用框架 Apache Thrift,它采用接口描述语言定义并创建服务,支持可扩展的跨语言服务开发,所包含的代码生成引擎可以在多种语言中,如 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk 等创建高效的、无缝的服务,其传输数据采用二进制格式,相对 XML 和 JSON 体积更小,对于高并发、大数据量和多语言的环境更有优势。本文将详细介绍 Thrift 的使用,并且提供丰富的实例代码加以解释说明,帮助使用者快速构建服务。

    Thrift是一个跨语言的RPC框架,在公司工作的时候Thrift是相当重要的,这里实验了一个Thrift的小例子,以供学习和记录。

    安装Thrift0.11.0

    安装环境是MAC OS,version 10.13.4

    参考官网上的安装教程:http://thrift.apache.org/docs/install/os_x

    在安装thrift的过程中可能会报一些奇怪的错误,比如bison版本过低等问题,大家可以网上参考解决。

    一个简单的Thrift服务

    首先创建一个简单的服务Hello.thrift

    namespace java com.thrift.demo.service
    
    service Hello{
     string helloString(1:string para)
     i32 helloInt(1:i32 para)
     bool helloBoolean(1:bool para)
     void helloVoid()
     string helloNull()
    }

    编译为java类

    thrift -gen java Hello.thrift

    会生成Hello.java文件

    构建Maven项目thrifttest,编辑pom文件,添加所需的依赖如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>thrift-test</groupId>
        <artifactId>thrift-test</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <dependencies>
            <dependency>
                <groupId>org.apache.thrift</groupId>
                <artifactId>libthrift</artifactId>
                <version>0.11.0</version>
            </dependency>
        </dependencies>
    
    
    </project>

    把刚才生成的Hello class文件拷贝到Maven项目中:

    新建HelloServiceImpl类,实现Hello中Iface接口如下:

    package com.thrift.demo.service;
    
    import org.apache.thrift.TException;
    
    public class HelloServiceImpl implements Hello.Iface {
        @Override
        public boolean helloBoolean(boolean para) throws TException {
            return para;
        }
        @Override
        public int helloInt(int para) throws TException {
            try {
                Thread.sleep(20000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return para;
        }
        @Override
        public String helloNull() throws TException {
            return null;
        }
        @Override
        public String helloString(String para) throws TException {
            return para;
        }
        @Override
        public void helloVoid() throws TException {
            System.out.println("Hello World");
        }
    }

    新建HelloServiceServer类,代码如下:

    package com.thrift.demo.service;
    
    import org.apache.thrift.TProcessorFactory;
    import org.apache.thrift.protocol.TBinaryProtocol;
    import org.apache.thrift.server.TServer;
    import org.apache.thrift.server.TNonblockingServer;
    import org.apache.thrift.transport.TFramedTransport;
    import org.apache.thrift.transport.TNonblockingServerSocket;
    import org.apache.thrift.transport.TTransportException;
    
    public class HelloServiceServer {
        /**
         * 启动 Thrift 服务器
         * @param args
         */
        public static void main(String[] args) {
            try {
                TNonblockingServerSocket socket = new TNonblockingServerSocket(7911);
                Hello.Processor processor = new Hello.Processor(new HelloServiceImpl());
                TNonblockingServer.Args arg = new TNonblockingServer.Args(socket);
                arg.protocolFactory(new TBinaryProtocol.Factory());
                arg.transportFactory(new TFramedTransport.Factory());
                arg.processorFactory(new TProcessorFactory(processor));
                TServer server = new TNonblockingServer(arg);
                server.serve();
            } catch (TTransportException e) {
                e.printStackTrace();
            }
        }
    }

    新建HelloServiceClient类,代码如下:

    package com.thrift.demo.service;
    
    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;
    
    public class HelloServiceClient {
        public static void main(String[] args){
            try {
                TTransport tTransport = getTTransport();
                TProtocol protocol = new TBinaryProtocol(tTransport);
                Hello.Client client = new Hello.Client(protocol);
                String result = client.helloString("hello");
                System.out.println("The result is: " + result);
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        private static TTransport getTTransport() throws Exception{
            try{
                TTransport tTransport = getTTransport("127.0.0.1", 7911, 5000);
                if(!tTransport.isOpen()){
                    tTransport.open();
                }
                return tTransport;
            }catch(Exception e){
                e.printStackTrace();
            }
            return null;
        }
    
        private static TTransport getTTransport(String host, int port, int timeout) {
            final TSocket tSocket = new TSocket(host, port, timeout);
            final TTransport transport = new TFramedTransport(tSocket);
            return transport;
        }
    }

    测试

    启动HelloServiceServer,然后启动HelloServiceClient,会得到如下结果:

    可能遇到的问题:

    Intellij IDEA可能会对Hello文件中的@override报错:

    @Override is not allowed when implementing interface method

    解决方案如下:

    1. 保证编译thrift和Maven中添加的依赖版本相同;

    2. 参考下面的解决办法:https://blog.csdn.net/shenya2/article/details/50460447

    a、在project/module上,右键选择菜单“Open Module Settings” ;

    b、选择Modules,修改“Language Level” 为 “8-Lambdas,......”;

    c、选择Project, 修改“Project language level” 为 “SDK default”。

    d、保存,重启。

    谢谢大家~

  • 相关阅读:
    树上莫队学习笔记
    点分治学习笔记
    7.11总结
    线段树合并学习笔记
    7.10总结
    bzoj1201: [HNOI2005]数三角形----递推+bitset
    bitset(01串)优化
    Tarjan系列1
    bsgs(Baby Steps Giant Steps)算法
    [SD2015]序列统计——solution
  • 原文地址:https://www.cnblogs.com/liujinhong/p/8857015.html
Copyright © 2020-2023  润新知