我的netty之旅(3)(apache thrift)

Netty整合thrift通讯,java与pathon通讯 Thrift 架构 Thrift是一个跨语言的服务部署框架,最初由Facebook于2007年开发,2008年进入Apache开源项目。Thrift通过IDL(Interface Definition Language,接口定义语言)来定义RPC(Remote Procedure Call,远程过程调用)的接口和数据类型,然后通过thrift编译器生成不同语言的代码(目前支持C++,Java, P... 阅读详情

前几天记录了一下protobuf,现在还有一种新的方案就叫thrift.是facebook最初做的项目,后来捐给apache作为开源项目在使用。使用方法如下
第一步,下载个thrift的软件包,可以直接去apache的官方( http://www.apache.org/ )按照系统要求下载,然后拖拽到本地,配置一下环境变量就可以了,
弄完了输入  thrift --version   测试一下 ,如果显示版本号就是正确,没有问题
第二步是 创建thrift的idl文件,具体每字段代表什么属性建议详细查资料,因为太多了我就不做太多介绍

namespace java com.thrift

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

struct Person {
	1: optional String username,
	2: optional int age,
	3: optional boolean married 
}

exception DataException {
	1: optional String message,
	2: optional String callStack,
	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)

}

第三步是输入命令 ,就会生成java文件,copy到自己需要的文件夹就可以
thrift --gen java tutorial.thrift 
在这里插入图片描述
第四步导包

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

第五步是 写个java的class类文件,实现上面生成的接口文件

package com.thrift;

import org.apache.thrift.TException;

public class PersonServiceImpl implements PersonService.Iface {

	@Override
	public Person getPersonByUsername(String username) throws DataException, TException {
		System.out.println(username);
		Person person = new Person();
		person.setUsername(username);
		person.setAge(50);
		person.setMarried(true);
		return person;
	}

	@Override
	public void savePerson(Person person) throws DataException, TException {
		System.out.println("got client param:");
		System.out.println(person.getUsername());
		System.out.println(person.getAge());
		System.out.println(person.isMarried());
	}

}

然后写服务端代码

package com.thrift;

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;

public class ThriftServer {
	public static void main(String[] args) throws TTransportException {

		TNonblockingServerSocket serverSocket = new TNonblockingServerSocket(8899);
		THsHaServer.Args arg = new THsHaServer.Args(serverSocket).minWorkerThreads(2).maxWorkerThreads(4);
		PersonService.Processor<PersonServiceImpl> processor = new PersonService.Processor<>(new PersonServiceImpl());
		// 压缩协议
		arg.protocolFactory(new TCompactProtocol.Factory());
		// 发送数据
		arg.transportFactory(new TFramedTransport.Factory());
		arg.processorFactory(new TProcessorFactory(processor));
		TServer tserver = new THsHaServer(arg);
		System.out.println("Thrift server start!");
		tserver.serve();
	}
}

和client端代码

package com.thrift;

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;

public class ThriftClient {

	public static void main(String[] args) {

		TTransport transport = new TFramedTransport(new TSocket("localhost", 8899), 600);
		TProtocol tProtocol = new TCompactProtocol(transport);
		PersonService.Client client = new PersonService.Client(tProtocol);

		try {
			transport.open();
			System.out.println("------------------------");
			Person personByUsername = client.getPersonByUsername("张三");
			System.out.println("name:" + personByUsername.getUsername());
			System.out.println("age:" + personByUsername.getAge());
			System.out.println("married:" + personByUsername.isMarried());

			Person person = new Person();
			person.setAge(40);
			person.setUsername("郑丹丹");
			person.setMarried(true);
			client.savePerson(person);

			System.out.println("----------------");
		} catch (Exception e) {
			throw new RuntimeException(e.getMessage(), e);
		} finally {
			transport.close();
		}

	}
}

此框架可以在多种不同的语言之间实现接口调用,只要生成的idl文件是同一个就可以,通过修改生成代码的命令,就可以生成不同的文件
TProtocol(协议层),定义数据传输格式,例如:

TBinaryProtocol:二进制格式;
TCompactProtocol:压缩格式;
TJSONProtocol:JSON格式;
TSimpleJSONProtocol:提供JSON只写协议, 生成的文件很容易通过脚本语言解析;
TDebugProtocol:使用易懂的可读的文本格式,以便于debug
TTransport(传输层),定义数据传输方式,可以为TCP/IP传输,内存共享或者文件共享等)被用作运行时库。

TSocket:阻塞式socker;
TFramedTransport:以frame为单位进行传输,非阻塞式服务中使用;
TFileTransport:以文件形式进行传输;
TMemoryTransport:将内存用于I/O,java实现时内部实际使用了简单的ByteArrayOutputStream;
TZlibTransport:使用zlib进行压缩, 与其他传输方式联合使用,当前无java实现;

Thrift支持的服务模型

TSimpleServer:简单的单线程服务模型,常用于测试;
TThreadPoolServer:多线程服务模型,使用标准的阻塞式IO;
TNonblockingServer:多线程服务模型,使用非阻塞式IO(需使用TFramedTransport数据传输方式);

Thrift实际上是实现了C/S模式,通过代码生成工具将thrift文生成服务器端和客户端代码(可以为不同语言),从而实现服务端和客户端跨语言的支持。用户在Thirft文件中声明自己的服务,这些服务经过编译后会生成相应语言的代码文件,然后客户端调用服务,服务器端提服务便可以了。

netty+thrift高并发高性能 立即下载

相关推荐

springside-engine:服务器引擎使用Netty + Thrift + Spring Boot

泉边引擎 基于Spring Boot的嵌入式后端引擎。 它支持Netty + Thrift,还支持Jetty或Tomcat + Restful。 它将与其他项目集成以提供: 动态配置 服务注册,负载均衡和路由规则 重试和短路 指标监控器 分布式跟踪日志 除了提供Java智能客户端之外,它还将提供代理来支持其他语言。

Thrift & Netty

1 thrift协议  优点:thrift协议性能高,官方类库可扩展性好,提供了多种语言的类库,基于.thrift这种类似头文件的中间格式方便文档共享。  缺点:官方文档不够详尽,使用过程中(java版 libthrift.jar)遇到一些坑:        1 基本类型写入时要调用set方法,如果用字段赋值的方式则写不进去(默认情况下会给POJO生成public的字段,初学者很容易被坑)

简单之美 1万+

跨越移植陷阱:ESP-IDF下LVGL与ILI9341的组件化集成与常见避坑指南

本文详细解析了在ESP-IDF环境下将LVGL图形库与ILI9341显示屏驱动进行组件化集成的完整流程。重点介绍了移植过程中的关键配置策略、内存管理优化技巧以及常见问题解决方案,帮助开发者有效规避内存溢出、显示异常等典型陷阱,实现高效稳定的嵌入式GUI开发。

yhn456789的博客 623

《Netty学习打卡--从小白到放弃》----- 12 - netty 之thrift 初识thrift

学习要点 - 1.Thrift是什么 - 2.Thrift架构 - 3.Thrift能做什么 - 4.TProtocol - 5.Thrift TTransPort - 6.Thrift支持哪几种Server模型 - 7.Thrift IDL文件有哪几种基本数据类型 - 8.Thrift 支持哪几种容器 - 9.Thrift 关键字 1.Thrift是什么? ...

那一抹回忆 646

LangChain Agent Skills 实战指南:12个案例玩转智能体技能封装与编排

大语言模型应用开发中,智能体(Agent)的能力扩展正从零散的函数调用走向标准化封装。Agent Skills 将某项具体能力组织为带说明、代码与依赖的技能目录,让模型能自动发现和调度,其核心价值在于解决工具数量膨胀后的维护混乱与调用失控问题。与 Tool 的单一执行、MCP 的协议连接不同,Skill 更强调能力的语义描述与组合复用,配合 LangGraph 的状态编排和 LangSmith 的可观测性,可构建生产级智能体系统。在实际场景中,Agent Skills 可覆盖 RAG 知识库问答、多轮记忆保

weixin_34335458的博客 407

Python爬虫案例:从39问医生网爬取口腔科的在线问答记录(单轮问答)

本次实验爬取39问医生网中口腔科分类下的所有在线单轮问答记录,每页32条,共100页,总数据量为3200条,最终结果以excel格式保存。

JieBao11的博客 1640

Netty的高性能之道

Netty 是一个高性能、异步事件驱动的 NIO 框架,它提供了对 TCP、UDP 和文件传输的支持,作为一个异步 NIO 框架,Netty 的所有 IO 操作都是异步非阻塞的,通过 Future-Listener 机制,用户可以方便的主动获取或者通过通知机制获得 IO 操作结果。Netty 现在都在用的是4.x,5.x版本已经废弃,Netty 4.x 需要JDK 6以上版本支持。

zhiyikeji的博客 1870

以太网硬件核心:MAC、PHY、MII与交换机原理与实战排查

计算机网络通信的基础依赖于一套完整的硬件协议栈。在OSI模型中,数据链路层和物理层是实现设备间可靠、高效数据传输的基石。其核心原理在于将上层数据包封装成帧,并通过特定的介质访问控制与物理信号转换机制进行传输。这一过程的技术价值在于为上层应用提供了透明、稳定的通信信道,是互联网和所有局域网通信的物理承载。在嵌入式系统、网络设备开发及运维等应用场景中,深入理解底层硬件交互至关重要。本文将聚焦于以太网硬件的两大核心组件:负责逻辑成帧与流量控制的MAC控制器,以及负责数模转换与链路协商的PHY芯片。它们通过MII、

dgqvhtlwq472235338的博客 422

Netty框架入门学习--Thrift的使用

Apache Thrift 是一个可伸缩的,跨语言的服务开发框架,将软件栈与代码生成引擎相结合,在C++、Java、Python、PHP、JavaScripti等语言中可以高效、无缝地构建服务。 准备工作: 1.Apache Thrift software framework,Thrift官方文档 2.下载安装Thrift,下载地址:http://thrift.apache.org/downl...

return 1346

CSS字体样式全攻略

🧱 让文字有空间感,适合标题或LOGO。🖋️适合插画、创意工作者的个人页面。🔥 适合标题、品牌名,视觉冲击力强。🧘‍♀️适合极简设计、文化类网站。✨适合科技类网站、博客、作品集。🚀适合游戏、AI、科技类项目。🐰 适合儿童类网站或节日氛围。📖适合时尚、生活方式类内容。🌫️ 适合神秘、梦幻主题。🌃 夜店风、科技感十足。具体效果是文字会上下跳动。

dreams_dream的博客 1804

GCC调试黑科技:-fomit-frame-pointer优化下如何保证栈回溯能力

本文深入探讨了GCC编译器在启用`-fomit-frame-pointer`优化选项时如何保证栈回溯能力。通过分析`.eh_frame`段的结构与DWARF调试信息,提供了从编译选项配置到实战调试的完整解决方案,帮助开发者在性能优化与调试能力之间找到最佳平衡点。

u6v7w8x的博客 904

Netty的深入浅出--13.Apache Thrift的简单项目实战

接着之前的项目上创建一个文件夹thrift,在str目录下与main文件夹平级: 在idea中添加插件使用,它的插件相比来说比protobuf的插件要强大很多: 创建文件data.thrift里面包含其中设置命令空间为java路径 将thrift里面的数据类型定义成java类型,这样看起来比较舒服,而且使用起来也比较方便,现在对比发现相比之前那个protobuf来说好用多了o(...

moxiaolin的博客 478

WorkBuddy KiCad 实战:国产 AI 搭子不只会写代码,传感器板从零走到可审查

真正可用的 PCB 教程不能承诺“一键打样”。本课把 WorkBuddy 放在需求拆分、文件生成和审查记录的位置,KiCad 负责 ERC、DRC 与制造文件,工程师负责最终判断。 本课不会用“AI 一键完成”制造错觉,而是把 WorkBuddy、KiCad 8.0、Python 3.11 与人工审阅组成一条可复现链路。你会从“已确认的接口表、器件库来源、板框与电源方案”出发,得到“KiCad 工程、原理图、初始 BOM、ERC 报告与审查记录”,并学会用真实命令、错误信号和停止条件判断成果能不能进入下一阶

yueyeguzhuo的专栏 210

Java解析SZY206-2016规约:从字节流到业务对象的完整实践

在工业物联网和能源自动化领域,设备与平台间的可靠数据通信依赖于标准的传输规约。这些规约定义了二进制报文的帧结构、数据单元标识和传输规则,是设备间“对话”的语法基础。理解规约的原理,是实现稳定数据采集与解析的关键技术价值。以广泛应用的SZY206-2016水资源监测数据传输规约为例,其报文包含起始符、长度域、地址域、数据域及校验码等核心部分。在Java工程实践中,解析此类规约常面临字节序处理、粘包拆包、校验验证及复杂数据单元映射等挑战。通过设计“帧解析器”与“数据域解析器”两级架构,并结合对象池、条件解析等高

weixin_33858485的博客 431

ESP32-IDF开发之旅 网络篇⑩ Web配网

本文介绍了基于ESP32S3的Web配网实现方案。作者通过移植开源项目,在ESP32S3上实现了WiFi配置功能,包括AP模式创建、HTTP服务器搭建、NVS存储读写等核心功能。文章详细解析了代码结构,包含WiFi初始化、事件处理、NVS存储管理和HTML页面服务等关键模块。实现方案采用AP+STA双模式,支持通过网页扫描WiFi并保存配置信息,适用于物联网设备的网络配置场景。代码中使用了FreeRTOS任务、ESP-IDF事件组等技术,并提供了完整的错误处理和日志记录功能。

单片机菜鸟哥的博客 350

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

解决Hive启动报错:org.apache.thrift.transport.TTransportException: Cannot write to null outputStream

在配置好hiveserver2和Metastore两个服务后使用脚本hive-server-manager.sh start启动服务。-- hiveserver2的高可用参数,开启此参数可以提高hiveserver2的启动速度 -->

2301_79362607的博客 5000

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Java操作hive报错:org.apache.thrift.transport.TTransportException: SASL authentication not

现象 Java操作hive报错, 关键的文本信息 org.apache.thrift.transport.TTransportException: SASL authentication not complete 写的比较简单,就是用Java以jdbc方式直接操作hive,排查后发现竟然是关闭ResultSet对象发生在Connection关闭之后造成的! ...

欧阳方超的专栏 4076

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

跨语言RPC框架Thrift详解

一、 概念Apache的Thrift软件框架,是用来进行可伸缩的、跨语言的服务开发,它通过一个代码生成引擎来构建高效、无缝的服务,这些服务能够实现跨语言调度,目前支持的语言有: C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, OCaml and Delphi

zw19910924的专栏 1万+

netty-thrift-demo

处理器 public class PersonHandler implements PersonService.Iface { HashMap&lt;String, Person&gt; people = new HashMap&lt;&gt;(); @Override public Person getPersonByName(String name) throws My...

godme 669

Netty学习(七)-Netty编解码技术以及ProtoBuf和Thrift的介绍

谈到序列化我们自然想到java提供的Serializable接口,在java中我们如果需要序列化只需要继承该接口就可以通过输入输出流进行序列化和反序列化。但是在提供很用户简单的调用的同时他也存在很多问题. 目前的序列化过程中使用java本身的肯定是不行,使用二进制编码的话又的我们自己去手写,所以为了让我们少搬砖前辈们早已经写好了工具让我们调用,目前社区比较活跃的有google的Protobuf和thrift

rickiyang的博客 4296

Netty的深入浅出--12.Apache Thrift的了解

简单来说Thrift是一种可扩展的跨语言的服务器,功能基本上和protobuf是一样的,更好用,功能更加强大,不过相对来说比protobuf更难学。 下载thrift,安装thrift的编译器(和protobuf差不多) 这个实例就是以python作为客户端,来调用java的服务端,中间使用Thrift这个RPC来实现调用(这一章节讨论的那个东西到现在是不是尽在直尺了o(* ̄︶ ̄*)o...

moxiaolin的博客 467

Java:Netty与Thrift整合的例子

Netty与Thrift整合的例子

netyeaxi的专栏 1459

netty学习笔记9-thrift入门

需求:使用thrift完成简单的RPC的通信1. 编写.thrift文件(idl文件)namespace java com.baidu.thrift typedef i32 int typedef bool boolean typedef string String struct Person{ 1: int age, 2: String name, 3: boolean ...

hami700100332的博客 659

《Netty学习打卡--从小白到放弃》----- 13 - netty 之thrift 简单RPC通信

打卡日期(2019-07-12) 学习要点 简单实现thrift客户端与服务器端通信 - 1.编写thrift文件 - 2.利用thrift自动生成代码工具,将.thrift文件转换成需要的开发语言文件 - 3.编写服务端代码 - 4.编写客户端代码 1.编写thrift文件 #包名 namespace java com.dragon.thrift #定义数据类型 typede...

那一抹回忆 373

Netty的深入浅出--14.Thrift的原理和架构解析

下面是Thrift的架构图 your code就是我们写的代码 FooService.Client就是我们下面调用返回的对象 Foo.Write()/Read(),对于读出和写入在Thrift的框架下面已经帮我们写好了 TProtocol,描述的是数据以怎样一种形式进行传递,TTransport底层的数据传输 其中,TCompactProtocol相比TBinaryPro...

moxiaolin的博客 488

java nifty_Nifty:基于Netty实现了Thrift的客户端和服务器

Project Status:???? Unmaintained????This project is archived and no longer maintained. At the time of archiving, open issues and pull requests were closed and tagged with 2018-05-archive. For pre-existing u...

weixin_39825872的博客 240
上一篇: git常用命令,subtree命令
下一篇: java利用freemark和itext出pdf文件
devotemyself
博客等级 码龄8年 16粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值