Thrift快速入门开发demo

embedded/2024/10/21 15:27:06/

Thrift快速入门开发demo

一、认识Thrift

thrift是什么?一个RPC 代码生成框架,使用它的IDL(Interface Defination Language,接口定义语言)定义你想要实现的接口,然后它就会生成对应语言的远程调用框架代码,用户只需要实现接口逻辑,不用关心具体的细节。

tutorial:http://digital-madness.in/blog/wp-content/uploads/2012/11/BSD_08_2013.8-18.pdf

二、快速入门开发一个Demo

2.1 开发逻辑

  1. 编写IDL文件
  2. 使用IDL文件生成对应Java代码
  3. 拷贝Java代码到对应项目目录
  4. 实现接口逻辑
  5. 编写server端
  6. 编写client端

thrift --gen java /users/ccl/workspace/demo

2.2 编写IDL文件

Thrift具体语法参考官方文档Thrift interface description language

  • data.thrift
namespace java thrift.gentypedef i16 short
typedef i32 int
typedef i64 long
typedef bool boolean
typedef string Stringstruct Person{1: optional String username;2: optional int age;3: optional boolean marriage;
}exception DataException{1: optional String massage;2: optional String callback;3: optional String date;
}service PersonService{Person getPersonByUsername(1: required String username) throws(1: DataException dataException);void savePerson(1:required Person person) throws(1: DataException dataException);}

以下逐行解释:

namespace java thrift.gen

namespace定义命名空间,是一个关键字。生成的java代码会放在thrift.gen包目录下。

typedef i16 short
typedef i32 int
typedef i64 long
typedef bool boolean
typedef string String

IDL语言定义了一系列通用的基本数据类型,对应多种语言的数据类型。这里使用typedef关键字显示地为idl和java中的数据类型做一个别名替换,方便后续代码编写。

struct Person{1: optional String username;2: optional int age;3: optional boolean marriage;
}

struct结构体对应java中的class。这里我们定义了一个Person类。IDL规定定义数据要包含类似 1:的位置提示符。optional表示可选的,这里无多大意义。

exception DataException{1: optional String massage;2: optional String callback;3: optional String date;
}

exception关键字定义了异常类型,用法和struct一致,只是关键字名称改变。

service PersonService{Person getPersonByUsername(1: required String username) throws(1: DataException dataException);void savePerson(1:required Person person) throws(1: DataException dataException);
}

service关键字定义了一个服务。生成的java代码也是一个类,类中定义了两个方法。我们需要实现这两个方法的接口。

2.3 生成java代码

两种方法:

  • 自己安装thrift然后运行命令 thrift --gen java gen-java
    • 生成的代码就会放在gen-java目录下
  • 在线thrift编译平台
    • 版本号要与jar包一致

不出意外,会生成

  • DataException.java
  • Person.java
  • PesonService.java

三个文件,放在package thrift.gen下。这三个类都封装好许多底层代码。

2.4 实现接口逻辑

现在,我们需要自己实现PersonService类中的两个方法。

在pom.xml下引入maven依赖

<dependency><groupId>org.apache.thrift</groupId><artifactId>libthrift</artifactId><version>0.9.3</version>
</dependency>

版本号根据安装的thrift决定。

  • PersonServiceImpl.java
import org.apache.thrift.

http://www.ppmy.cn/embedded/43162.html

相关文章

预热 618,编程好书推荐——提升你的代码力

文章目录 &#x1f4cb;前言&#x1f3af;编程好书推荐&#x1f4d8; Java领域的经典之作&#x1f40d; Python学习者的宝典&#x1f310; 前端开发者的权威指南&#x1f512; 并发编程的艺术&#x1f916; JVM的深入理解&#x1f3d7; 构建自己的编程语言&#x1f9e0; 编程智…

k8s问题

文章目录 本地搭K8s集群 bilibili什么是声明式API&#xff1f;kubectl apply Etcd数据库有什么特性&#xff0c;为什么K8S选用了Etcd数据库&#xff1f;K8S中一个node的生命周期是怎样的&#xff1f;服务发现机制介绍docker的实现原理介绍如果只是使用Linux命名空间进行分离&am…

【quarkus系列】创建quarkus第一个应用程序

文章目录 序言环境准备创建项目项目分析程序代码构建访问项目 序言 Quarkus 是一个设计用于 Kubernetes 和云原生环境的 Java 框架&#xff0c;具有快速启动时间、低内存消耗和强大的开发者体验。溪源将带您一步步创建一个简单的 Quarkus 应用程序。 环境准备 在开始之前&am…

python基础语法

如上图所示&#xff0c;这是首先新建一个python文件&#xff0c; 代码的美观特别重要。 变量可以视为一块用来储存数据的空间。&#xff08;想象成一个纸盒子&#xff09; 表示‘赋值运算符’ 不是数学上的‘比较相等’ 变量命名的规则 使用变量 1.读取变量的值 a10 prin…

CTFHUB技能树——SSRF(二)

目录 上传文件 ​FastCGI协议 Redis协议 上传文件 题目描述&#xff1a;这次需要上传一个文件到flag.php了.祝你好运 index.php与上题一样&#xff0c;使用POST请求的方法向flag.php传递参数 //flag.php页面源码 <?phperror_reporting(0);if($_SERVER["REMOTE_ADDR&…

多任务学习模型-AdaTT

AdaTT&#xff08;Adaptive Task-to-Task Fusion Network&#xff09;是一种多任务学习模型&#xff0c;由Meta提出。它旨在通过自适应融合机制有效地模拟复杂的任务关系&#xff0c;并促进特定任务和共享知识的联合学习。 1.AdaTT模型 AdaTT模型的核心特点&#xff1a; 自适…

Go语言数据库框架 — Gorm

Go入门之Gorm 框架_go gorm-CSDN博客 未完待续

element+ 引入图标报错 Failed to resolve import “@element-plus/icons-vue“ from “

element 引入图标报错 Internal server error: Failed to resolve import “element-plus/icons-vue” from “src\components\TimeLine.vue”. Does the file exist? 原因&#xff1a;element-plus需要单独引入 icons 文档 pnpm install element-plus/icons-vue之后就可以…