Thrit用的不多,也不够深入,这里小记一笔。
关于Thrift环境如何安装,可以参考官网。
或者直接下载windows版本的thrift-0.9.2.exe
Thrit跟Java有数据类型的映射关系:
/** * The first thing to know about are types. The available types in Thrift are: * * bool Boolean, one byte * byte Signed byte * i16 Signed 16-bit integer - short * i32 Signed 32-bit integer - int * i64 Signed 64-bit integer - long * double 64-bit floating point value - double * string String * binary Blob (byte array) * map<t1,t2> Map from one type to another * list<t1> Ordered list of one type * set<t1> Set of unique elements of one type */
我就不罗嗦了了,能看到这里的都能自动理解。
RPC的核心就是传参调用,参数抛不开基本数据类型、集合,更常用的是自定义对象。
在Thrift中,需要将自定义对象预先定义,类似于C语言编译要求。或者可以include其他thrift文件。
这里用Profile作为对象载体,这里Java的class对应Thrit中的struct,interface对应service。
做一个操作Profile的接口实现,代码如下:
namespace java org.zlex.support.thrift struct Profile { 1: string name, 2: i32 score, 3: bool enable } service ProfileService { string updateName(1:Profile profile, 2:string name) i32 updateScore(1:Profile profile, 2:i32 score) map<string,string> toMap(1:Profile profile) }
保存为Profile.thrift
执行命令,生成Java代码:
thrift -r -gen java Profile.thrift
生成的代码详见附件。自动生成的代码中,冗余还是不少。修改代码的冲动闪过,保持原生态。
针对接口做个实现类:
/** * Mar 14, 2013 */ package org.zlex.support.thrift.impl; import java.util.HashMap; import java.util.Map; import org.apache.thrift.TException; import org.zlex.support.thrift.Profile; import org.zlex.support.thrift.ProfileService.Iface; /** * * @author snowolf * @version 1.0 * @since 1.0 */ public class ProfileServiceImpl implements Iface { /* * (non-Javadoc) * * @see * org.zlex.support.thrift.ProfileService.Iface#updateName(org.zlex.support * .thrift.Profile, java.lang.String) */ @Override public String updateName(Profile profile, String name) throws TException { profile.setName(name); return profile.getName(); } /* * (non-Javadoc) * * @see * org.zlex.support.thrift.ProfileService.Iface#updateScore(org.zlex.support * .thrift.Profile, int) */ @Override public int updateScore(Profile profile, int score) throws TException { profile.setScore(profile.getScore() + score); return profile.getScore(); } /* * (non-Javadoc) * * @see * org.zlex.support.thrift.ProfileService.Iface#toMap(org.zlex.support.thrift * .Profile) */ @Override public Map<String, String> toMap(Profile profile) throws TException { Map<String, String> map = new HashMap<String, String>(); map.put("name", profile.getName()); map.put("score", "" + profile.getScore()); map.put("isEnable", "" + profile.isEnable()); return map; } }
做一个Server实现,“非阻塞&高效二进制编码”:
/** * Mar 14, 2013 */ package org.zlex.support.thrift; import org.apache.log4j.Logger; import org.apache.thrift.TProcessorFactory; import org.apache.thrift.protocol.TCompactProtocol; import org.apache.thrift.server.THsHaServer; import org.apache.thrift.server.TServer; import org.apache.thrift.transport.TFramedTransport; import org.apache.thrift.transport.TNonblockingServerSocket; import org.apache.thrift.transport.TTransportException; import org.zlex.support.thrift.impl.ProfileServiceImpl; /** * * @author snowolf * @version 1.0 * @since 1.0 */ public class Server { /** * Logger for this class */ private static final Logger logger = Logger.getLogger(Server.class); /** * */ private int port; /** * @param port */ public Server(int port) { this.port = port; } /** * */ @SuppressWarnings({ "rawtypes", "unchecked" }) public void start() { try { TNonblockingServerSocket socket = new TNonblockingServerSocket(port); final ProfileService.Processor processor = new ProfileService.Processor( new ProfileServiceImpl()); THsHaServer.Args arg = new THsHaServer.Args(socket); // 高效率的、密集的二进制编码格式进行数据传输 // 使用非阻塞方式,按块的大小进行传输,类似于 Java 中的 NIO arg.protocolFactory(new TCompactProtocol.Factory()); arg.transportFactory(new TFramedTransport.Factory()); arg.processorFactory(new TProcessorFactory(processor)); TServer server = new THsHaServer(arg); logger.info("服务启动-使用:非阻塞&高效二进制编码"); server.serve(); } catch (TTransportException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } }
服务器测试用例:
/** * Mar 14, 2013 */ package org.zlex.support.thrift; import org.junit.Before; import org.junit.Test; /** * * @author snowolf * @version 1.0 * @since 1.0 */ public class ServerTest { public final static int PORT = 9999; private Server server; @Before public void init() { server = new Server(PORT); } @Test public void test() { server.start(); } }
客户端测试用例:
/** * Mar 14, 2013 */ package org.zlex.support.thrift; import static org.junit.Assert.*; import java.util.Map; import org.apache.thrift.TApplicationException; import org.apache.thrift.TException; import org.apache.thrift.protocol.TCompactProtocol; import org.apache.thrift.protocol.TProtocol; import org.apache.thrift.transport.TFramedTransport; import org.apache.thrift.transport.TSocket; import org.apache.thrift.transport.TTransport; import org.apache.thrift.transport.TTransportException; import org.junit.Test; /** * * @author snowolf * @version 1.0 * @since 1.0 */ public class ClientTest { public final static int PORT = 9999; public static final String address = "localhost"; public static final int clientTimeout = 30000; @Test public void test() { TTransport transport = new TFramedTransport(new TSocket(address, PORT, clientTimeout)); TProtocol protocol = new TCompactProtocol(transport); ProfileService.Client client = new ProfileService.Client(protocol); try { transport.open(); Profile profile = new Profile(); profile.setName("Snowolf"); Map<String, String> map = client.toMap(profile); assertEquals(map.get("name"),"Snowolf"); } catch (TApplicationException e) { System.out.println(e.getMessage() + " " + e.getType()); } catch (TTransportException e) { e.printStackTrace(); } catch (TException e) { e.printStackTrace(); } transport.close(); } }
Client调用Server接口,将Profile对象交由Server处理,转换为Map。
如果需要Thirft承载高并发的负载,可以通过nginx来完成负载均衡的实现,详见
Nginx扩展(一):nginx_tcp_proxy_module
小记完毕,Go Home!
相关推荐
Thrift是一种高效的、跨语言的服务框架,最初由Facebook开发,现在是Apache的顶级项目。它提供了强大的代码生成工具,可以从接口定义文件(IDL)生成多种编程语言的客户端和服务端代码,使得不同语言之间可以轻松地...
总之,结合Wireshark和Thrift dissector,我们可以深入洞察Thrift协议的网络交互,这对于开发、调试和维护Thrift服务具有极大的价值。请确保正确配置和使用这些工具,以便充分利用它们的功能,提升你的工作效率。
Thrift是一种开源的跨语言服务开发框架,由Facebook于2007年创建,现在是Apache软件基金会的项目。它的主要目标是通过定义一种中间语言(IDL,Interface Definition Language)来简化不同编程语言之间的通信,使得...
Thrift是Facebook开源的一款高性能、跨语言的服务框架,它的设计目标是高效地在不同编程语言之间进行通信。本文将基于Thrift的Java实现,总结学习过程中的一些关键知识点,旨在帮助理解Thrift的工作原理以及如何在...
在IT行业中,Thrift是一种高性能、可扩展的跨语言服务开发框架,由Facebook开源,用于构建分布式服务。它通过定义一种中间表示(IDL,接口定义语言)来描述服务,然后自动生成不同编程语言的代码,使得不同语言之间...
Thrift是一种开源的跨语言服务开发框架,由Facebook于2007年开源,现在由Apache软件基金会维护。它的主要功能是定义数据结构和服务接口,然后自动生成多种编程语言的代码,实现这些接口,使得不同语言之间可以进行...
Thrift是一种开源的跨语言服务开发框架,由Facebook于2007年设计并发布,其目的是为了在各种编程语言之间提供高效的、轻量级的通信机制。Thrift通过定义一种中间表示(IDL,Interface Definition Language)来描述...
而Thrift则是一种开源的软件框架,用于构建可伸缩的服务,它支持多种编程语言,包括C++,并且允许不同语言之间进行高效的数据交换。在这个“C++(Qt)下的thrift的使用示例”中,我们将探讨如何在Qt项目中集成和使用...
### Netty+Thrift 实现高并发高性能的关键技术解析 #### 一、引言 在当前互联网技术高速发展的背景下,高性能、高并发的服务框架成为众多企业和开发者追求的目标。Netty作为一款高性能、异步事件驱动的网络应用...
Thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, ...
Thrift SASL 0.3.0 是一个用于在分布式系统中实现安全传输层协议的开源库。Thrift 是一个跨语言的服务开发框架,而SASL(Simple Authentication and Security Layer)则是它的一个扩展,提供了身份验证和数据保护...
Thrift 环境配置方法 Thrift 是一个跨语言的 RPC 框架,由 Facebook 开发,用于建立高性能的服务之间的远程过程调用。为了使用 Thrift,需要配置好相关的环境,这篇文章将介绍 Thrift 环境配置的方法。 Thrift ...
在Windows环境下,使用QT结合Thrift进行开发是一项常见的任务,特别是在构建跨平台的服务或应用时。这个样例项目提供了一种方法,使开发者能够在QT环境中有效地利用Thrift框架。让我们详细了解一下这些技术以及如何...
Apache Thrift is an open source cross language serialization and RPC framework. With support for over 15 programming languages, Apache Thrift can play an important role in a range of distributed ...
虚拟机Centos安装thrift涉及到的操作系统环境是Linux,尤其是Centos版本的操作系统。Thrift是一个跨语言的服务开发框架,它主要用于开发可扩展的跨语言服务。以下是根据提供的文件信息整理的详细知识点。 1. 下载...
【 Maven-Thrift-Server:构建Thrift服务的Maven实践】 在软件开发中,Thrift是一种高效的跨语言服务开发框架,由Facebook开发并开源。它允许定义数据类型和服务接口,然后自动生成各种编程语言的代码,使得不同...
Thrift是一种开源的跨语言服务开发框架,由Facebook于2007年开发并开源,后来成为Apache软件基金会的顶级项目。Thrift的核心思想是通过定义一种中间描述文件(.thrift),来实现数据结构和服务接口的跨语言共享。这...
mac 想安装低版本thrift 0.9.3太难了,高版本比较简单 直接执行 brew install thrift.rb 即可安装
Thrift是一种开源的跨语言服务开发框架,由Facebook开发并贡献给Apache基金会。它通过定义一种中间语言(IDL,Interface Definition Language)来描述服务接口,然后自动生成多种编程语言的客户端和服务端代码,大大...