`
yangyangmyself
  • 浏览: 233818 次
  • 性别: 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,...

    WebSocket实战之——JavaScript例子

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

    advancedJava.rar

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

    HBase学习利器:HBase实战

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

    大规模分布式系统架构与设计实战.完整版

    在Java环境下,实现分布式服务的关键技术包括RPC(远程过程调用)框架,例如Apache Thrift、gRPC和Dubbo。这些框架简化了跨网络节点调用服务的过程,提供了高效的通信机制。此外,服务注册与发现也是必不可少的,如...

    分布式服务框架原理与实践_李林锋pdf(带目录)

    12. **实战案例**:书中可能会包含实际项目中的案例分析,帮助读者理解如何将理论知识应用于实际场景。 通过阅读《分布式服务框架原理与实践_李林锋著.pdf》,开发者和架构师可以深入了解分布式服务的设计与实施,...

    RPC.rar_I AM

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

Global site tag (gtag.js) - Google Analytics