`
yangyangmyself
  • 浏览: 234796 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Thrift实战案例

阅读更多
1、概述
前面一节,我们说了Thrift安装及开发环境准备工作,这一节把主要Thrift IDL规范回顾一下,不常用语法规范在这里不一一列举出来;我们可以把Thrift看作是一个编程语言,那么形成一套语法规范,如接口怎么定义、有什么数据类型、方法怎么定义、变量怎么申明与赋值、命名空间(包)、常量等一系列规定;回答上述的问题,我们就清楚Thrift IDL语法规范,自然知道如何编写thrift文件。

     

    2、数据类型

 

    2.1 基本数据类型

 

• bool: 布尔类型
• byte: 字节
• i16: 带符号16位整型
• i32: 带符号32位整型
• i64: 带符号64位整型
• double: 带符号64位浮点型
• string: 字符串类型(UTF-8编码)
Note: There is no support for unsigned integer types, due to the fact that there are no 
native unsigned integer types in many programming languages. Signed integers can be 
safely cast to their unsigned counterparts when necessary.

   

 

    2.2 特殊类型

binary: 二进制

 

 

    2.3 结构体类型(类似C语言风构),类似JavaBean定义实体类型

struct bean{
   1:i32 number=10,
   2:i64 bigNumber,
   3:double decimals,
   4:string name="thrifty"
}

 

    2.4 集合类型(包括list、set、map

 

• list (Maps to c++ STL vector, Java ArrayList etc)
• set (Maps to an STL set, Java HashSet etc)
  PHP doesn’t support sets - so it is treated similar to a List map
• map (Maps to an STL map, Java HashMap etc)
  All the above are the defaults but can be customized to correspond to different 
  types of any language. For this reason custom code generation directives have been 
  added.

    

 

    3、接口、方法、命名空间定义,关键字service,类似Java接口定义

 

namespace java com.java // 命名空间定义,规范:namespace + 语言 + 包路径
service Hello{ // 接口定义,类似Java接口定义
   string getWord(), // 方法定义,类似Java接口定义
   void writeWold(1:string words) //参数类型指定
}

 

 

    4、异常定义

exception InvalidOperation {
  1: i32 what,
  2: string why
}

 

    更多类型定义,如枚举等,请参考官网:https://thrift.apache.org/docs/idl

    

    5、实例步聚

 

    5.1 定义Thrift文件(hello.thrift)

namespace java com.java
service Hello{
   string getWord(),
   void writeWold(1:string words)
}

 

    5.2 生成Java文件(Hello.java)

    

//执行命令,以Java为例
thrift -r --gen java hello.thrift

 

    5.3 创建Maven项目,引入thrift包,将Hello.java拷入项目中

 

<dependency>
  <groupId>org.apache.thrift</groupId>
  <artifactId>libthrift</artifactId>
  <version>0.9.2</version>
</dependency>
<dependency>
  <groupId>commons-codec</groupId>
  <artifactId>commons-codec</artifactId>
  <version>1.9</version>
</dependency>
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-log4j12</artifactId>
  <version>1.5.8</version>
</dependency>
<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <version>1.2.12</version>
</dependency>

 

    5.4 编写Thrift接口实现

     

package com.java;
import org.apache.thrift.TException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
 * Hello World实现; Hello.Iface为Hello.java中的接口
 *
 */
public class HelloImpl implements Hello.Iface{
	
	private Logger log = LoggerFactory.getLogger(getClass());
	
	@Override
	public String getWord() throws TException {
		
		return "Hello World!";
	}
	
	@Override
	public void writeWold(String words) throws TException {
		log.info("【服务端】:接收客户端信息:"+ words);
	}
	
}

 

    5.5 编写Thrift服务端及客户端

    

/***
* 服务端
*/
package com.java;
import java.net.InetSocketAddress;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TBinaryProtocol.Factory;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TThreadPoolServer;
import org.apache.thrift.server.TThreadPoolServer.Args;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TTransportException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.java.Hello.Iface;
import com.java.Hello.Processor;

/**
 * Hello World服务端
 * @author oy
 *
 */
public class HelloServer {
	
	private static Logger log = LoggerFactory.getLogger(HelloServer.class);
	// 服务器IP地址
	private String ip;
	// 服务端绑定端口,即监听端口
	private int port;
	
	private static TServerSocket transport;
	
	private static Hello.Processor<Iface> processor;
	
	public HelloServer(String ip, int port){
		this.ip = ip ;
		this.port = port ;
		try {
			transport = new TServerSocket(new InetSocketAddress(this.ip, this.port));
			log.info("Thrif服务器绑定成功!");
		} catch (TTransportException e) {
			log.error("Thrif服务器绑定失败", e);
		}
	}
	
	public void startServer(Iface iface){
		processor = new Processor<Iface>(iface);
		// 协议层:二进制
		Factory factory = new TBinaryProtocol.Factory(true, true);
		// 传输层
		Args args = new Args(transport);
		// 执行处理器(绑定业务逻辑处理器)
		args.processor(processor); 
		args.protocolFactory(factory);
		// 服务
		TServer server = new TThreadPoolServer(args);    
        server.serve();    
	}
	
	public static void main(String[] args) {
		Iface hello = new HelloImpl();
		// 启动服务
		new HelloServer("localhost",9090).startServer(hello);
		log.info("Thrif服务器启动成功!");
	}
}

 

    

/**
* 客户端
*/
package com.java;
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;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Hello World客户端
 * @author oy
 *
 */
public class HelloClient {
	
	private static Logger log = LoggerFactory.getLogger(HelloClient.class);
	
	public static void main(String[] args) {
		 TTransport transport = null;    
	        try {    
	            transport = new TSocket("localhost", 9090);   
	            // 协议处理
	            TProtocol protocol = new TBinaryProtocol(transport);    
	            Hello.Client client = new Hello.Client(protocol); 
	            transport.open();
	            log.info("【客户端】:获取服务端信息:" + client.getWord()); 
	            client.writeWold("Hello World!");
	            transport.close();    
	            log.info("【客户端】Thrift客户端关闭连接!");  
	        } catch (TTransportException e) {    
	            e.printStackTrace();    
	        } catch (TException e) {    
	            e.printStackTrace();    
	        }    
	}
}

   

    项目相关代码,请收附件!

2
1
分享到:
评论

相关推荐

    Apache Hue 2小时轻松搞定大数据可视化终端视频教程

    手把手视频详细讲解项目开发全过程,需要的小伙伴自行百度网盘下载,链接见附件,永久有效。 课程简介 从实际企业需求角度... 6.Hue集成ThriftServer实战案例 7.Hue配置集成Impala-server 8.Hue集成Impala实战案例

    Node.js-nodejszookeeperthrift实现服务的高可用

    5. 实战案例和最佳实践:分享在生产环境中遇到的问题、解决方案,以及优化经验,提供具体的代码示例和调试技巧。 6. 持续迭代和维护:讨论如何维护和更新这样的系统,包括版本控制、测试自动化和性能监控。 这篇...

    HBase 实战

    在“HBase实战”一书中,包含了HBase的基本概念、进阶主题以及实战案例。以下是对书籍内容的知识点概括。 首先,书中会介绍HBase的基础知识。这部分内容通常包括了HBase的基本架构、数据模型、核心组件以及如何安装...

    从0到1实战微服务架构.pdf

    微服务架构作为当前最为流行的服务架构风格之一,相较于传统的单一架构模式,具备了业务逻辑简单、服务间松耦合、模块间边界清晰...通过详细的介绍和实战案例,让读者能够从零基础逐步成长为微服务架构方面的专业人才。

    美团外卖全链路线上性能测试实战

    通过具体的案例来深入理解线上压测的重要性及其实战效果。比如,2015年4月内发生的两次性能事故,分别是: 1. **线上Tair集群大面积超时**:流量双倍增长导致核心服务达到性能瓶颈,最终引发服务宕机,持续时间长达...

    Spark分布式内存计算框架视频教程

    知识点介绍、代码演示、逻辑分析、灵活举例、使用图形的方式详细演示代码的流程和细节、整合企业级实战案例,全面讲解并突出重点,让学习也变成一种快乐。 课程亮点 1,知识体系完备,阶段学习者都能学有所获。 2,...

    CMake快速入门教程实战

    在这个示例中,添加了thrift库的头文件目录/usr/include/thrift。SET(SRC_LIST...)定义了编译源文件的列表,这里列举了项目中的主要源文件。 在CMake中生成可执行程序和库时,需要对CMakeLists.txt文件进行不同的...

    WebSocket实战之——JavaScript例子

    一、详细代码案例详细解读一个简单html5WebSocket的Js实例教程,附带完整的javascriptwebsocket实例源码,以及实例代码效果演示页面,并对本实例的核心代码进行了深入解读。从WebSocket通讯三个阶段(打开握手、数据...

    advancedJava.rar

    在IT行业中,Java是一种广泛应用的编程语言,尤其在企业级应用和互联网服务中占据着重要地位。...这个压缩包"advancedJava.rar"可能包含了这些主题的相关教程、实战案例或代码示例,是提升Java技术栈的理想资源。

    HBase学习利器:HBase实战

    - **第7章:构建实际应用**:通过一系列具体的案例研究,展示如何使用HBase构建复杂的应用程序,涵盖了从需求分析到系统设计、实现再到测试和部署的全过程。 #### 三、HBase核心技术详解 **1. 数据存储模型**:...

    RPC.rar_I AM

    - 实战案例,展示如何在实际项目中应用RPC - 故障排查和性能优化技巧 总的来说,RPC是一项基础且重要的技术,对于理解分布式系统和构建高性能、高可用的服务至关重要。通过对"RPC.pptx"的深入学习,我们可以掌握...

    JAVA中即时通讯内容扩展研究.zip

    在Java中进行即时通讯(Instant Messaging,简称IM)内容扩展的研究,主要涉及到网络通信、多线程编程、数据...提供的"JAVA中即时通讯内容扩展研究.pdf"文件可能包含更详细的理论分析和实战案例,建议进一步查阅学习。

    spark 191-245课件

    2. Thrift JDBC/ODBC Server:Spark SQL支持JDBC和ODBC协议,通过Thrift服务器,可以使得任何支持JDBC或ODBC的应用程序都能连接到Spark SQL,进行数据操作和分析。 3. 综合案例2:测试与调试:此部分可能涉及如何...

    erlang版本的protobuf(erl_protobuffs)

    文章链接提供了更多关于`erl_protobuffs`的使用细节和实战案例,包括安装步骤、实际编码示例以及性能测试结果。通过阅读这篇文章,开发者可以更深入地理解如何在Erlang项目中有效利用`erl_protobuffs`,并解决可能...

Global site tag (gtag.js) - Google Analytics