thrift_入门指南

简介: 参考: http://www.ibm.com/developerworks/cn/java/j-lo-apachethrift/ http://blog.csdn.net/m13321169565/article/details/7836006<dependency> <groupId>org.apache.thrift</grou

参考:
http://www.ibm.com/developerworks/cn/java/j-lo-apachethrift/
http://blog.csdn.net/m13321169565/article/details/7836006

<dependency>
   <groupId>org.apache.thrift</groupId>
   <artifactId>libthrift</artifactId>
   <version>0.9.2</version>
</dependency>

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.6.1</version>
</dependency>

IDL文件
编写IDL文件 EchoService.thrift

namespace java service.demo
service EchoService {
    string echo(1:string para)   
}

编译

thrift -o <output directory> -gen java EchoService.thrift

实现接口

public class EchoServiceImpl implements EchoService.Iface {
    public String echo(String para) throws TException {
        return para;
    }
}

服务端

public class HelloServiceServer {
    public static void main(String arge[]) {
        try {
            // 设置服务端口为 7911
            TServerSocket serverTransport = new TServerSocket(7911);
            // 设置协议工厂为 TBinaryProtocol.Factory
            TBinaryProtocol.Factory proFactory = new TBinaryProtocol.Factory();
            // 关联处理器与 Hello 服务的实现
            TProcessor processor = new HelloService.Processor(new HelloServiceImpl());
            TServer server = new TThreadPoolServer(
                                new TThreadPoolServer.Args(serverTransport)
                                .protocolFactory(proFactory)
                                .processor(processor)
                             );
            System.out.println("Start server on port 7911...");
            server.serve();
        } catch (TTransportException e) {
            e.printStackTrace();
        }
    }
}

客户端

public class HelloServiceClient {
    public static void main(String args[]) {
        try {
            // 设置调用的服务地址为本地,端口为 7911
            TTransport transport = new TSocket("localhost", 7911);
            transport.open();
            // 设置传输协议为 TBinaryProtocol
            TProtocol protocol = new TBinaryProtocol(transport);
            HelloService.Client client = new HelloService.Client(protocol);
            // 调用服务的 helloVoid 方法
            System.out.print(client.echo("hello"));
            transport.close();
        } catch (TTransportException e) {
            e.printStackTrace();
        } catch (TException e) {
            e.printStackTrace();
        }
    }
}

异步IO

服务端


public static void main(String[] args) {
        try {
            //传输通道 - 非阻塞方式
            TNonblockingServerSocket serverTransport = new TNonblockingServerSocket(7911);

            //异步IO,需要使用TFramedTransport,它将分块缓存读取。
            TTransportFactory transportFactory = new TFramedTransport.Factory();

            //使用高密度二进制协议
            TProtocolFactory proFactory = new TCompactProtocol.Factory();

            //设置处理器 HelloImpl
            TProcessor processor = new Hello.Processor(new HelloImpl());

            //创建服务器
            TServer server = new TThreadedSelectorServer(
                    new Args(serverTransport)
                    .protocolFactory(proFactory)
                    .transportFactory(transportFactory)
                    .processor(processor)
                );

            System.out.println("Start server on port 7911...");
            server.serve();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

客户端

/** 调用[非阻塞IO]服务,异步 */
    public static void main(String[] args) {
        try {
            //异步调用管理器
            TAsyncClientManager clientManager = new TAsyncClientManager();
            //设置传输通道,调用非阻塞IO。
            final TNonblockingTransport transport = new TNonblockingSocket("localhost", 7911);  
            //设置协议
            TProtocolFactory protocol = new TCompactProtocol.Factory();  
            //创建Client
            final Hello.AsyncClient client = new Hello.AsyncClient(protocol, clientManager, transport);
            // 调用服务 
            System.out.println("开始:" + System.currentTimeMillis());
            client.helloBoolean(false, new AsyncMethodCallback<Hello.AsyncClient.helloBoolean_call>() {
                public void onError(Exception exception) {
                    System.out.println("错误1: " + System.currentTimeMillis());
                }
                public void onComplete(helloBoolean_call response) {
                    System.out.println("完成1: " + System.currentTimeMillis());
                    try {
                        client.helloBoolean(false, new AsyncMethodCallback<Hello.AsyncClient.helloBoolean_call>() {
                            public void onError(Exception exception) {
                                System.out.println("错误2: " + System.currentTimeMillis());
                            }

                            public void onComplete(helloBoolean_call response) {
                                System.out.println("完成2: " + System.currentTimeMillis());
                                transport.close();
                            }
                        });
                    } catch (TException e) {
                        e.printStackTrace();
                    }
                }
            });
            System.out.println("结束:" + System.currentTimeMillis());
            Thread.sleep(5000);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

跨语言调用

reference:
http://itindex.net/detail/52661-thrift-%E8%AF%AD%E8%A8%80-%E5%BC%80%E5%8F%91

例如本文中使用c++调用对应的java服务。服务端和客户端的请求调用是通过网络完成的,因此需要保证,请求协议、编码格式以及服务调用的格式都保持一致。
因此针对跨语言的调用,只要生成对应的服务接口,按照不同语言提供的客户端服务接口编写对应的代码。保持协议和编码合适一致即可。

安全协议

使用SSL安全传输协议

服务端

TSSLTransportParameters parameters = new TSSLTransportParameters();
params.setKeyStore("../.keystore", "thrift" , null, null);
TServerTransport serverTransport = TSSLTransportFactory.getServerSocket(9091, 0, null, param);

客户端

TSSLTransportParameters parameters = new TSSLTransportParameters();
params.setKeyStore("../.keystore", "thrift" , "SunX509", "JKS");
TServerTransport serverTransport = TSSLTransportFactory.getServerSocket("localhost", 9091, 0, param);
目录
相关文章
|
算法 Java 数据安全/隐私保护
Java:Hutool工具箱之Hutool-crypto加密解密
Java:Hutool工具箱之Hutool-crypto加密解密
3675 0
Java:Hutool工具箱之Hutool-crypto加密解密
|
4月前
|
SQL 缓存 监控
SQL 质量革命:利用 DAS 智能索引推荐修复慢查询全流程
在数据驱动时代,数据库性能直接影响系统稳定与响应速度。慢查询常因索引缺失、复杂逻辑或数据量过大引发,导致延迟、用户体验下降甚至业务受损。DAS(数据库管理服务)提供智能索引推荐功能,通过分析SQL语句与数据分布,自动生成高效索引方案,显著提升查询性能。本文结合实战案例,详解DAS智能索引推荐原理与使用流程,帮助用户快速定位问题并优化数据库表现,实现系统高效运行。
241 61
|
4月前
|
SQL 关系型数据库 MySQL
Go语言数据库编程:使用 `database/sql` 与 MySQL/PostgreSQL
Go语言通过`database/sql`标准库提供统一数据库操作接口,支持MySQL、PostgreSQL等多种数据库。本文介绍了驱动安装、连接数据库、基本增删改查操作、预处理语句、事务处理及错误管理等内容,涵盖实际开发中常用的技巧与注意事项,适合快速掌握Go语言数据库编程基础。
296 62
|
4月前
|
SQL 数据库连接 Go
Go语言数据库编程:GORM 的基本使用
GORM 是 Go 语言最流行的 ORM 框架,封装了 database/sql,支持自动迁移、关联关系、事务等功能,开发体验接近高层语言的 ORM。本文介绍了 GORM 的安装与初始化、模型定义、自动迁移、基本 CRUD 操作、条件构造器、钩子函数、事务处理、日志调试等内容,帮助开发者快速掌握其使用方法。
|
小程序 算法 Java
【技巧】Git提交描述骂了领导,不会删除提交记录咋办!
本文以一次git提交失误的故事为背景,详细介绍了如何使用`git revert`和`git reset`两个命令来撤销错误提交。`git revert`用于撤销提交并创建新提交以保留历史记录,而`git reset`则通过移动HEAD指针来修改提交历史,不创建新提交。文章通过实例演示了具体操作步骤,帮助读者在遇到类似问题时能够从容应对。
201 1
【技巧】Git提交描述骂了领导,不会删除提交记录咋办!
|
安全 关系型数据库 Go
远程连接PostgreSQL:配置指南与安全建议
远程连接PostgreSQL:配置指南与安全建议
1083 0
|
JSON JavaScript Java
性能工具之Jmeter压测Thrift RPC服务
【5月更文挑战第21天】性能工具之Jmeter压测Thrift RPC服务
293 1
|
Java
SpringBoot整合sharding-jdbc实现分库分表
SpringBoot整合sharding-jdbc实现分库分表
552 1
|
安全 Linux Android开发
Android与iOS的比较:哪个更适合你?
【5月更文挑战第31天】本文将深入探讨Android和iOS两大移动操作系统的特点、优缺点以及适用场景。通过对比分析,帮助读者更好地理解这两个系统的差异,从而做出更明智的选择。