thrift_入门指南

参考:
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);
时间: 2024-08-31 01:30:34

thrift_入门指南的相关文章

Firebug入门指南

据说,对于网页开发人员来说,Firebug是Firefox浏览器中最好的插件之一. 我最近就在学习怎么使用Firebug,网上找到一篇针对初学者的教程,感觉比较有用,就翻译了出来. ================= Firebug入门指南 作者:Estelle Weyl 原文网址:http://www.evotech.net/blog/2007/06/introduction-to-firebug/ 译者:阮一峰 本文是Firebug的一个概览,并不对它的所有特性进行详尽解释.不过,本文的内容

ajax入门指南(七)

ajax学习入门指南,对ajax初学者会有所帮助.    Prototype框架         页面插入         1.Insertion.Before类                 新建Insertion.Before类的实例,会将指定的HTML添加到指定元素之前,并且与之相邻                 示例:                 <div id="div1">original text</div>                

ajax入门指南(六)

ajax学习入门指南,相信对ajax初学者会有所帮助的.  Prototype框架     枚举对象(Enumerable对象)         1.Enumerable.each(iterator)         each方法的参数是一个JavaScript函数,它可以接受两个参数,它们分别是当前遍历的集合元素和当前遍历元素在集合中的序号         示例:         var arr = [1,2,3,4];         arr.each(            functio

ajax入门指南(五)

ajax学习入门指南,对ajax初学者应该有所帮助. Prototype基础类:        1. Class.create()             示例:                 var myClass = Class.create();       2.  Object.extend(destination,source)             示例:                 var myClass = Class.create();                

ajax入门指南(四)

ajax学习入门指南,对ajax初学者应该有所帮助. Prototype对Ajax的支持     Ajax.Request类     如下代码是一个示例:     <!--客户端:index.htm-->     <script language="javascript" type="text/javascript" src="prototype1.6.js"></script>     <script

ajax入门指南(三)

ajax入门指南,相信对ajax初学者会有所帮助. AJAX的主流框架:       浏览器端框架:       一.Prototype系列:         1.Prototype:http://prototype.conio.net,如果在Web应用中实现对Ajax的支持或者需要扩展一些基本的功能,Prototype是个很好的选择:         2.script.aculo.us:http://script.aculo.us,如果要在Web应用中实现更加在丰富的动态效果,提升用户体验,可

ajax入门指南(二)

ajax入门指南,相信对ajax初学者有所帮助. javascript面向对象编程实现:             1.类的声明:                 function test1(){                     this.p1 = "p1";                     this.p2 = "p2";                     this.f1 = function(){ alert("f1");

ajax入门指南(一)

ajax入门指南,对开始学习ajax的朋友应该有所帮助. 1.AJAX兼容IE和Firefox两大浏览器,出现了AJAX开发框架.      2.AJAX开发关键技术:XMLHttpRequest对象,JavaScript编程技术,DOM(文档对象模型),CSS(层叠样式表),和XSLT(可扩展样式表转换)            XMLHttpRequest对象是实现Ajax应用的核心:            JavaScript是Ajax应用在客户端使用的脚本语言:            通过

MySQL入门指南

mysql MySQL入门指南推荐:圆梦   发表日期:2000年10月10日   阅读次数:2039 Miles Tsai(net-bull@126.com)  songzy@mailcity.com 2000.2  一.SQL速成  结构查询语言(SQL)是用于查询关系数据库的标准语言,它包括若干关键字和一致的语法,便于数据库元件(如表.索引.字段等)的建立和操纵.  以下是一些重要的SQL快速参考,有关SQL的语法和在标准SQL上增加的特性,请查询MySQL手册.    1.创建表  表是