Thrift简明教程

简介: Thrift是个RPC框架,它的目标是为各种流行的开发语言提供便利的RPC调用机制,而不需要使用那些开销巨大的方式,比如SOAP。Thrift使用语言中立的服务定义文件(IDL,接口描述语言),描述数据类型和服务接口。

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();
            }
        }
    }
}

工程结构目录


img_6f36421716efed0b872b90760758800b.png
image.png

https://github.com/ljheee/thrift-demo

目录
相关文章
|
前端开发 网络协议 Dubbo
超详细Netty入门,看这篇就够了!
本文主要讲述Netty框架的一些特性以及重要组件,希望看完之后能对Netty框架有一个比较直观的感受,希望能帮助读者快速入门Netty,减少一些弯路。
92942 32
超详细Netty入门,看这篇就够了!
|
10月前
|
机器学习/深度学习 人工智能 算法
《一文读懂!Q-learning状态-动作值函数的直观理解》
Q-learning算法是强化学习领域的核心,广泛应用于机器人控制、游戏AI和自动驾驶等领域。其关键在于理解状态-动作值函数(Q值),即智能体在特定状态下采取某动作的长期价值评估。通过不断与环境交互,智能体根据奖励信号更新Q值,逐步优化行为策略,最终实现累积奖励最大化。掌握Q值计算及其更新机制,是深入理解强化学习的基础,也是设计高效AI系统的关键。
499 25
|
消息中间件 存储 分布式计算
大数据-103 Spark Streaming Kafka Offset管理详解 Scala自定义Offset
大数据-103 Spark Streaming Kafka Offset管理详解 Scala自定义Offset
279 0
|
Dubbo 网络协议 Java
RPC框架:一文带你搞懂RPC
这篇文章全面介绍了RPC(远程过程调用)的概念、原理和应用场景,解释了RPC如何工作以及为什么在分布式系统中广泛使用,并探讨了几种常用的RPC框架如Thrift、gRPC、Dubbo和Spring Cloud,同时详细阐述了RPC调用流程和实现透明化远程服务调用的关键技术,包括动态代理和消息的编码解码过程。
RPC框架:一文带你搞懂RPC
|
11月前
|
机器学习/深度学习 JSON API
淘宝图片搜索接口(Taobao.item_search_img)
淘宝图片搜索接口(Taobao.item_search_img)允许开发者通过上传商品图片或提供图片地址,获取相似的淘宝商品列表。该接口基于深度学习和计算机视觉技术,支持注册账号、申请权限、构造请求参数、调用接口、解析响应数据等步骤。适用于电商平台购物体验提升、商家商品优化与推广、商品推荐系统和图片版权保护等场景。
1262 4
|
人工智能 API 决策智能
swarm Agent框架入门指南:构建与编排多智能体系统的利器 | AI应用开发
Swarm是OpenAI在2024年10月12日宣布开源的一个实验性质的多智能体编排框架。其核心目标是让智能体之间的协调和执行变得更轻量级、更容易控制和测试。Swarm框架的主要特性包括轻量化、易于使用和高度可定制性,非常适合处理大量独立的功能和指令。【10月更文挑战第15天】
2296 6
|
传感器 存储 监控
使用Python进行物联网设备控制与数据收集
通过这些步骤和示例,可以看到Python在物联网领域的广泛应用和强大功能。Python不仅能够轻松实现硬件控制和数据处理,还能通过丰富的库和工具支持高效的开发、部署和运维。随着物联网技术的不断发展,Python将继续在智能家居、工业自动化、智慧城市等领域发挥重要作用,为开发者提供更多的创新和高效的解决方案。
|
存储 JavaScript 前端开发
深度剖析JavaScript中的变量世界:概念、用例与避坑指南
【4月更文挑战第3天】探索JavaScript变量:了解var、let、const的差异,掌握数据类型、用例及避免错误的策略。声明变量时注意作用域和可变性,如var的函数作用域,let和const的块级作用域。理解基本数据类型(Number、String等)和对象类型。示例包括用户输入、计算、控制流程和函数参数。警惕未声明、作用域混淆、类型不匹配和未初始化的错误,遵循最佳实践,如明确命名、避免冗余和适时复用,利用类型检查工具提升代码质量。
374 1
|
关系型数据库 MySQL Java
Docker Dockerfile 使用方法
Dockerfile 介绍 当使用Docker构建容器化应用程序时,Dockerfile是一个用于定义容器镜像的文本文件。它包含了一系列指令,告诉Docker如何从基础镜像(通常是官方或自定义的操作系统镜像)构建出最终的镜像,以及如何配置容器中的环境、文件和应用程序。 Dockerfile 的编写是构建容器的基础,它允许您定义容器的构建步骤、环境和配置。通过合理使用各种指令,您可以构建出一个满足应用程序需求的定制化镜像,从而实现应用的容器化部署。
444 3