Thrift简明教程
Thrift是个RPC框架,它的目标是为各种流行的开发语言提供便利的RPC调用机制,而不需要使用那些开销巨大的方式,比如SOAP。
Thrift使用语言中立的服务定义文件(IDL,接口描述语言),描述数据类型和服务接口。这个文件会被用作引擎的输入,编译器生成代码为每种支持的语言生成RPC客户端代码库。这种静态生成的设计让它非常容易被开发者所使用,而且因为类型验证都发生在编译期而非运行期,所以代码可以很有效率地运行。
Apache Thrift,它采用接口描述语言(IDL)定义并创建服务,支持可扩展的跨语言服务开发,所包含的代码生成引擎可以在多种语言中,如 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk 等创建高效的、无缝的服务,其传输数据采用二进制格式,相对 XML 和 JSON 体积更小,对于高并发、大数据量和多语言的环境更有优势。
Thrift 服务开发流程,简单概述如下:
1、定义IDL文件(xxx.thrift文件)
2、用xxx.thrift文件生成Java代码(服务接口文件)
3、服务端实现(创建服务):实现服务接口,开启服务器
4、客户端实现(服务消费):引入接口,进行远程调用。
Thrift 环境
总体感觉,安装thrift环境,不算简单,而且很多人不清楚安装的那些,到底能干啥?
Mac 安装thrift可参考:https://blog.csdn.net/u010827436/article/details/44303897
目前感觉,安装thrift的目的,就是能够使用thrift 命令,将xxx.thrift文件生成Java代码(仅个人简单的理解);而生成Java代码有多种方式,安装thrift对初学者来说,占据学习的一部分事件,不推荐。
下面快速开始一个简单的Demo,供初学者对thrift有一个直观的了解。
1、定义一个IDL接口描述文件
namespace java com.ljheee.thrift service QueryService{ string query(1:string query) }
这个IDL接口描述文件,采用平台中立、语言中立的方式,描述数据类型和服务接口;即RPC调用过程中,调用方与服务提供方之间通信,传输的什么数据结构、调用的哪个服务接口,是需要在这个.thrift文件中约定清楚的。
具体文件含义参考:
2、用xxx.thrift文件生成Java代码(服务接口文件)
如果已经安装了thrift环境,那么可以直接使用命令
thrift -gen java demoHello.thrift
生成Java代码的命令,win、Mac下都相同。命令执行后,会生成一个gen-java文件夹。
如果还没有安装thrift,不要紧,我这里提供一个下载,先快速上手,预览全观。(复制里面全部内容,新建文件到对QueryService.java)
https://github.com/ljheee/thrift-demo/blob/master/src/main/java/com/ljheee/thrift/service/QueryService.java
其实由第1步的QueryService.thrift文件,大概可以看出,定义了一个Java service,里面有一个方法query(String query)。可以预测,它大概是要定义一个接口:
public interface QueryService { public String query(String query) ; }
事实上,就是这样。该接口就是服务提供方和服务调用方之间的约定。服务端通过完成接口的具体实现,对外提供服务,客户端引入该Java接口,进行远程调用。当然这只是简单描述,thrift生成的QueryService接口里面也有很多它特定的东西,如传输协议、序列化方式等。
3、服务端实现(创建服务)
实现服务接口,开启服务器。
把第2步生成的Java文件(QueryService.java),copy到服务器端工程,注意package不要错,然后新建类implements QueryService.Iface
package com.ljheee.thrift.service.impl; import com.ljheee.thrift.service.QueryService; import org.apache.thrift.TException; public class QueryServiceImpl implements QueryService.Iface { @Override public String query(String query) throws TException { return "Hello,"+query; } }
开启服务器,等待客户端远程调用
package com.ljheee.thrift; import com.ljheee.thrift.service.QueryService; import com.ljheee.thrift.service.impl.QueryServiceImpl; 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; public class Server { public static final int SERVER_PORT = 9999; public static final String SERVER_IP = "localhost"; public static final int TIMEOUT = 30000; public static void main(String[] args) { try { System.out.println("QueryService TSimpleServer start ...."); TProcessor tprocessor = new QueryService.Processor<QueryService.Iface>(new QueryServiceImpl()); // 简单的单线程服务模型,一般用于测试 TServerSocket serverTransport = new TServerSocket(SERVER_PORT); TServer.Args tArgs = new TServer.Args(serverTransport); tArgs.processor(tprocessor); tArgs.protocolFactory(new TBinaryProtocol.Factory()); // tArgs.protocolFactory(new TCompactProtocol.Factory()); // tArgs.protocolFactory(new TJSONProtocol.Factory()); TServer server = new TSimpleServer(tArgs); server.serve(); } catch (Exception e) { System.out.println("Server start error!!!"); e.printStackTrace(); } } }
4、客户端实现(服务消费)
引入生成接口,进行远程调用。
同样把第2步生成的Java文件(QueryService.java),copy到客户端工程里面。本系统为演示方便,在同一个工程中放入了server 和Client的类。
package com.ljheee.thrift; import com.ljheee.thrift.service.QueryService; 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; /** * Created by lijianhua04 on 2018/7/27. */ public class Client { public static final int SERVER_PORT = 9999; public static final String SERVER_IP = "localhost"; public static final int TIMEOUT = 30000; public static void main(String[] args) { TTransport transport = null; try { transport = new TSocket(SERVER_IP, SERVER_PORT, TIMEOUT); // 协议要和服务端一致 TProtocol protocol = new TBinaryProtocol(transport); // TProtocol protocol = new TCompactProtocol(transport); // TProtocol protocol = new TJSONProtocol(transport); QueryService.Client client = new QueryService.Client(protocol); transport.open(); String result = client.query("ljh"); System.out.println("Thrify client result =: " + result); } catch (TTransportException e) { e.printStackTrace(); } catch (TException e) { e.printStackTrace(); } finally { if (null != transport) { transport.close(); } } } }
工程结构目录
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
前端优化系列 - JS解析性能分析
前言 通常,我们觉得页面已经写得非常好,但性能却不尽如人意,在Trace就看到一大堆JS在执行,却不知在执行什么逻辑。JS执行为什么会这么耗时,它们到底在执行什么逻辑呢? 本文尝试从各个维度详细解析JS的性能消耗情况,找出导致页面性能大幅下降的真正杀手。 JS性能 一般来说,页面资源的性能消耗包括加载和执行。在加载方面,各类资源基本是平等的,主要与资源大小和网络有关。 在执行方面,差异就非常大,比如, (1)图片的解码和渲染,可能在十毫秒级就处理完了; (2)CSS解析,样式重计算,排版,估计在百毫秒级也可以处理完; (3)而JS的Parse/Compile + JS Execution,可能好几秒才能完成。 关于JS的性能消耗,已经有非常优秀的文档,详细请参考:The Cost Of JavaScript。 我们先来看一个页面完整的JS执行情况, 从上图可以看到,页面的JS执行(v8.run)占了绝大部分时间,甚至单个JS执行超过2.8秒。那么,这些JS执行的消耗到底在哪里?是在执行业务逻辑,还是在干别的事情? 我们先看看一组基准测试的数据, 按Octane基准测试,70%以上的时间...
- 下一篇
Java的几个不错的网站
Java核心技术卷 本丛书非常详细的讲解Java的核心概念、语法、重要特性和开发方法,包含大量案例,最近正在拜读。 Java白皮书,由Java设计者编写,阐述Java的一个简短的概述以及11个Java特性关键术语 上述11个特性的pdf阐述版 oracle官网/Java oracle官网/Java(中文) Java SE8 的 API Java Language and Virtual Machine Specifications Java Bug Database
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8安装Docker,最新的服务器搭配容器使用
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- 设置Eclipse缩进为4个空格,增强代码规范
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS8编译安装MySQL8.0.19
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Hadoop3单机部署,实现最简伪集群
- CentOS7,CentOS8安装Elasticsearch6.8.6