• 使用Mac编写Thirft的HelloWorld项目


    前言

    最近在hive新增Thirft接口,于是学习了一下Thirft的使用

    步骤

    准备工作

    1. brew install thrift安装thrift
    2. 创建maven项目并引入依赖
        <dependency>
          <groupId>org.apache.thriftgroupId>
          <artifactId>libthriftartifactId>
          <version>0.12.0version>
        dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 根据thrift文件生成java基类

    在resource下创建一个hello.thrift文件

    namespace java service.demo
    service service.demo.HelloWorld{
        string sayHello(1: string param)
    }
    
    • 1
    • 2
    • 3
    • 4

    进入resource,thrift -r -gen java hello.thrift会在当前路径创建出一个gen-java.service.demo的文件夹。文件夹下面有Hello.java文件,将其移动到main目录的service.demo包中
    在这里插入图片描述

    编写Java实现

    1. 实现IFace接口
    package service.demo;
    
    import org.apache.thrift.TException;
    public class HelloWorldIfaceImpl implements HelloWorld.Iface {
        public String sayHello(String param) throws TException {
            return "hello! "+ param;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    1. 构建服务端并启动
    package service.demo;
    
    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;
    import org.apache.thrift.transport.TTransportException;
    
    
    public class HelloWorldServer {
        public static void main(String[] args) {
            try {
                System.out.println("Server Starting....");
                // TServer的参数,并添加需要的处理过程和协议
                TServer.Args tArgs = new TServer.Args(new TServerSocket(666));
                // 1.过程
                TProcessor tprocessor = new HelloWorld.Processor<HelloWorld.Iface>(new HelloWorldIfaceImpl()); // 构造server的处理过程
                tArgs.processor(tprocessor);
                // 2.协议
                tArgs.protocolFactory(new TBinaryProtocol.Factory()); // 选用Protocol协议
                // 构建server并启动
                TServer server = new TSimpleServer(tArgs);
                server.serve();
            }catch (TTransportException e) {
                e.printStackTrace();
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    启动后,开源看到日志输出
    在这里插入图片描述
    3. 创建客户端并访问服务端

    package service.demo;
    
    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;
    import org.apache.thrift.transport.TTransportException;
    
    public class HelloWorldClient {
        public static void main(String[] args) {
            System.out.println("Client starting....");
            TTransport transport = null;
            try {
                // 绑定通信端口
                transport = new TSocket("localhost", 666, 30000);
                transport.open();
                // 构建协议,注意和服务端一致
                TProtocol protocol = new TBinaryProtocol(transport);
                // 创建客户端
                HelloWorld.Client client = new HelloWorld.Client(protocol);
              	// 客户端请求服务端,获得结果并输出
                String result = client.sayHello("Spider-Man");
                System.out.println(result);
            } catch (TTransportException e) {
                e.printStackTrace();
            } catch (TException e) {
                e.printStackTrace();
            } finally {
                if (null != transport) {
                    transport.close();
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    运行后成功拿到结果
    在这里插入图片描述

    总结

    Server

    负责连接调度、服务的生命周期,定义接口是TServer

    • TSimpleServer:简单的阻塞服务端
    • TThreadPoolServer:使用线程池的处理请求的阻塞服务端
    • THsHaServer:使用线程池处理请求的基于 NIO 的非阻塞服务端
    • TThreadedSelectorServer:使用多种线程池的基于 NIO 的非阻塞服务端

    Processor

    处理请求,具体的实现由生成的代码处理,定义接口是 TProcessor

    • TBaseProcessor:同步处理的 Processor
    • TBaseAsyncProcessor:异步处理的 Processor
    • TMultiplexedProcessor:支持多个服务的同步 Processor

    Protocol

    请求协议,数据的编解码实现,定义接口是 TProtocol

    • TBinaryProtocol:二进制协议
    • TCompactProtocol:压缩协议
    • TJSONProtocol:JSON 格式协议
    • TMultiplexedProtocol:支持多个 Processor 的封装协议,依赖于其他协议

    Transport

    底层的连接,提供了读写的抽象实现;服务端定义是 TServerTransport

    • TServerSocket: 基于 ServerSocket 的服务端 Transport
    • TNonblockingServerSocket:基于 ServerSocketChannel 的服务端 Transport
    • TSaslTransport:支持 SSL 加密的 Transport
  • 相关阅读:
    微信小程序-最近动态滚动实现
    位运算 离散化 区间和算法
    python之爬虫基础(1)
    (一)Gluster 介绍及简单部署
    实现简单BS架构案例
    数据结构之顺序查找
    day007
    Linux系统中驱动之设备树的platform驱动实现
    LeetCode刷题笔记【35】:动态规划专题-7(爬楼梯、零钱兑换、完全平方数)
    除静电离子风棒的工作原理及应用
  • 原文地址:https://blog.csdn.net/weixin_44112790/article/details/127772724