Thrift服务搭建和调用

    xiaoxiao2021-04-14  33

    有住ERP与有住业务系统、成本预算系统对接,按客户要求使用Thrift协议接口服务,简单学习了一下,搭建Thrift服务只要步骤如下:

    一、准备必要的文件(jar包和生成Thrift java类的工具)

    thrift-0.9.3.exe、libthrift-0.9.1.jar、log4j.jar、slf4j-api-1.5.8.jar、slf4j-log4j12-1.5.8.jar

    (其中thrift-0.9.3.exe放到了d:\thrift目录下)

    二、编写接口对应的*.thrift文件(ThriftDemo.thrift),内容如下:

    namespace java thrift.study service HelloWorldService { string sayHello(1:string username) string getRandom() }

    thrift脚本文件中数据类型有:

    基本类型: bool:布尔值,true 或 false,对应 Java 的 boolean byte:8 位有符号整数,对应 Java 的 byte i16:16 位有符号整数,对应 Java 的 short i32:32 位有符号整数,对应 Java 的 int i64:64 位有符号整数,对应 Java 的 long double:64 位浮点数,对应 Java 的 double string:未知编码文本或二进制字符串,对应 Java 的 String 结构体类型: struct:定义公共的对象,类似于 C 语言中的结构体定义,在 Java 中是一个 JavaBean 容器类型: list:对应 Java 的 ArrayList set:对应 Java 的 HashSet map:对应 Java 的 HashMap 异常类型: exception:对应 Java 的 Exception 服务类型: service:对应服务的类

    使用thrift-0.9.3.exe生成java文件HelloWorldService.java,方法如下:

    命令行cmd → d: → cd thrift 定位到d:\thrift目录,执行命令thrift.exe -r -gen java ThriftDemo.thrift

    在d:\thrift\目录下会生成gen-java文件夹,内含生产的java文件HelloWorldService.java

    三、创建项目Thrift_Server和Thrift_Client分别作为服务端和客户端,如图:

    1、把生成的HelloWorldService.java分别复制到服务端和客户端项目的thrift包中,修改一下package包

    2、首先来写服务端

    创建HelloServiceImpl类实现Iface

    package service; import org.apache.thrift.TException; import thrift.HelloWorldService.Iface; public class HelloServiceImpl implements Iface { @Override public String sayHello(String username) throws TException { return "hello " + username; } @Override public String getRandom() throws TException { return "random"; } }创建启动服务类StartServer package service; import org.apache.thrift.protocol.TBinaryProtocol.Factory; import org.apache.thrift.server.TServer; import org.apache.thrift.server.TThreadPoolServer; import org.apache.thrift.server.TThreadPoolServer.Args; import org.apache.thrift.transport.TServerSocket; import org.apache.thrift.transport.TTransportException; import thrift.HelloWorldService; import thrift.HelloWorldService.Processor; /** * 启动服务 * @author dingxm * */ public class StartServer { public static void main(String[] args) { System.out.println("ServerStart!"); StartServer server = new StartServer(); server.startServer(); } /** * 启动Thrift服务器 */ private void startServer() { try { //定义传输的socket,设置服务端口为6789 TServerSocket serverTransport = new TServerSocket(6789); //设置协议工厂为TBinaryProtocol.Factory Factory proFactory = new Factory(true,true); //关联处理器与Hello服务的实现 HelloWorldService.Processor processor = new Processor(new HelloServiceImpl()); //定义服务端的参数值 Args args = new Args(serverTransport); args.processor(processor); args.protocolFactory(proFactory); TServer server = new TThreadPoolServer(args); //服务端开启服务 server.serve(); } catch (TTransportException e) { e.printStackTrace(); } } }

    测试类ClientTest package client; 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; import org.junit.Test; import thrift.HelloWorldService; /** * 客户端实现 * * @author dingxm * */ public class ClientTest { @Test public void startClient() { // 设置调用的服务地址为本地,端口为6789 try { TTransport transport = new TSocket("localhost", 6789); transport.open(); // 数据传输协议有:二进制协议、压缩协议、JSON格式协议 // 这里使用二进制协议 // 协议要和服务端一致 TProtocol protocol = new TBinaryProtocol(transport); HelloWorldService.Client client = new HelloWorldService.Client(protocol); // 调用服务器端的服务方法 System.out.println(client.sayHello("萝卜白菜,各有所爱!")); // 关闭 transport.close(); } catch (TTransportException e) { e.printStackTrace(); } catch (TException e) { e.printStackTrace(); } } }四、测试

    首先启动服务端,Run As Java Application,启动成功输出:ServerStart!

    然后JUnit测试客户端ClientTest类中startClient方法

    运行结果输出:hello 萝卜白菜,各有所爱!

    ---------------------------------------------------------------------------------------------------------------------------------------------------------------

    以上就是搭建Thrift服务端和客户端的入门过程,更深入的技巧需要仔细研究Thrift精妙之处,在项目中慢慢总结磨练。

    ----------------------------------------------------------------------------------------------------------------------------------------------------------------

    协议

    代码涉及传输协议,Thrift可以定义客户端与服务端质检传输通信协议的类别,总体划分为文本(text)和二进制(binary)传输协议,节约宽带提高传输效率,一般情况下使用二进制类型

    实际按照项目需求,常用的协议有以下几种:

    TBinaryProtocol——二进制编码格式进行数据传输

    TCompactProtocol——高效率、密集的二进制编码格式数据传输:

    构建HelloServiceServer.java

    TCompactProtocol.Factory proFactory = new TCompactProtocol.Factory(); HelloServiceClient.java TProtocol protocol = new TCompactProtocol(transport);

    TJSONProtocol——使用JSON的数据编码协议进行数据交换

    构建的HelloServiceServer.java

    TJSONProtocol.Factory proFactory = new TJSONProtocol.Factory();   HelloServiceServer.java

    TJSONProtocol protocol = new TJSONProtocol(transport);TSimpleJSONProtocol——只提供JSON只写的协议,适用于通过脚本语言解析

    传输层

    常见的传输层有: TSocket——使用阻塞式I/O进行传输,是最常见的模式 TFramedTransport——使用非阻塞式,按块的大小进行传输,类似于Java的NIO TNonblockingTransport——使用非阻塞方式,用于构建异步客户端

    参考文章:https://www.ibm.com/developerworks/cn/java/j-lo-apachethrift/

        https://yq.aliyun.com/articles/36749

    转载请注明原文地址: https://ju.6miu.com/read-669619.html

    最新回复(0)