thrift_入门指南
来源:互联网 发布:淘宝网女士纱巾 编辑:程序博客网 时间:2024/04/29 02:46
参考:
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.demoservice 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);
0 0
- thrift_入门指南
- 入门指南
- 入门指南
- 入门指南
- 入门指南
- 编程“初学者”入门指南
- Emacs入门指南(1)
- Emacs入门指南(2)
- Emacs入门指南(3)
- XML DOM 入门指南
- XML DOM 入门指南
- Emacs入门指南(1)
- Emacs入门指南(2)
- Emacs入门指南(3)
- 共享软件入门指南
- MySQL入门指南
- XML DOM 入门指南
- MySQL入门指南
- 批处理
- 迭代法解题课后
- poj3579
- Mybatis前奏【Java Web 开发进化史】——万丈高楼从JDBC开始
- mac下配置matplotlib绘图
- thrift_入门指南
- 【学习】kudu、Impala、交互式查询
- BZOJ 1406 - 伪数论
- awk之RS、ORS与FS、OFS
- 封装性
- HDU 2955 —— Robberies 01背包
- 如何在Android上起一个定时器?
- BootStrap table 数据填充与分页应用总结
- UITableViewDataSource