Thrit用的不多,也不够深入,这里小记一笔。
关于Thrift环境如何安装,可以参考官网。
或者直接下载windows版本的thrift-0.9.2.exe
Thrit跟Java有数据类型的映射关系:
/** * The first thing to know about are types. The available types in Thrift are: * * bool Boolean, one byte * byte Signed byte * i16 Signed 16-bit integer - short * i32 Signed 32-bit integer - int * i64 Signed 64-bit integer - long * double 64-bit floating point value - double * string String * binary Blob (byte array) * map<t1,t2> Map from one type to another * list<t1> Ordered list of one type * set<t1> Set of unique elements of one type */
我就不罗嗦了了,能看到这里的都能自动理解。
RPC的核心就是传参调用,参数抛不开基本数据类型、集合,更常用的是自定义对象。
在Thrift中,需要将自定义对象预先定义,类似于C语言编译要求。或者可以include其他thrift文件。
这里用Profile作为对象载体,这里Java的class对应Thrit中的struct,interface对应service。
做一个操作Profile的接口实现,代码如下:
namespace java org.zlex.support.thrift struct Profile { 1: string name, 2: i32 score, 3: bool enable } service ProfileService { string updateName(1:Profile profile, 2:string name) i32 updateScore(1:Profile profile, 2:i32 score) map<string,string> toMap(1:Profile profile) }
保存为Profile.thrift
执行命令,生成Java代码:
thrift -r -gen java Profile.thrift
生成的代码详见附件。自动生成的代码中,冗余还是不少。修改代码的冲动闪过,保持原生态。
针对接口做个实现类:
/** * Mar 14, 2013 */ package org.zlex.support.thrift.impl; import java.util.HashMap; import java.util.Map; import org.apache.thrift.TException; import org.zlex.support.thrift.Profile; import org.zlex.support.thrift.ProfileService.Iface; /** * * @author snowolf * @version 1.0 * @since 1.0 */ public class ProfileServiceImpl implements Iface { /* * (non-Javadoc) * * @see * org.zlex.support.thrift.ProfileService.Iface#updateName(org.zlex.support * .thrift.Profile, java.lang.String) */ @Override public String updateName(Profile profile, String name) throws TException { profile.setName(name); return profile.getName(); } /* * (non-Javadoc) * * @see * org.zlex.support.thrift.ProfileService.Iface#updateScore(org.zlex.support * .thrift.Profile, int) */ @Override public int updateScore(Profile profile, int score) throws TException { profile.setScore(profile.getScore() + score); return profile.getScore(); } /* * (non-Javadoc) * * @see * org.zlex.support.thrift.ProfileService.Iface#toMap(org.zlex.support.thrift * .Profile) */ @Override public Map<String, String> toMap(Profile profile) throws TException { Map<String, String> map = new HashMap<String, String>(); map.put("name", profile.getName()); map.put("score", "" + profile.getScore()); map.put("isEnable", "" + profile.isEnable()); return map; } }
做一个Server实现,“非阻塞&高效二进制编码”:
/** * Mar 14, 2013 */ package org.zlex.support.thrift; import org.apache.log4j.Logger; 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; import org.zlex.support.thrift.impl.ProfileServiceImpl; /** * * @author snowolf * @version 1.0 * @since 1.0 */ public class Server { /** * Logger for this class */ private static final Logger logger = Logger.getLogger(Server.class); /** * */ private int port; /** * @param port */ public Server(int port) { this.port = port; } /** * */ @SuppressWarnings({ "rawtypes", "unchecked" }) public void start() { try { TNonblockingServerSocket socket = new TNonblockingServerSocket(port); final ProfileService.Processor processor = new ProfileService.Processor( new ProfileServiceImpl()); THsHaServer.Args arg = new THsHaServer.Args(socket); // 高效率的、密集的二进制编码格式进行数据传输 // 使用非阻塞方式,按块的大小进行传输,类似于 Java 中的 NIO arg.protocolFactory(new TCompactProtocol.Factory()); arg.transportFactory(new TFramedTransport.Factory()); arg.processorFactory(new TProcessorFactory(processor)); TServer server = new THsHaServer(arg); logger.info("服务启动-使用:非阻塞&高效二进制编码"); server.serve(); } catch (TTransportException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } }
服务器测试用例:
/** * Mar 14, 2013 */ package org.zlex.support.thrift; import org.junit.Before; import org.junit.Test; /** * * @author snowolf * @version 1.0 * @since 1.0 */ public class ServerTest { public final static int PORT = 9999; private Server server; @Before public void init() { server = new Server(PORT); } @Test public void test() { server.start(); } }
客户端测试用例:
/** * Mar 14, 2013 */ package org.zlex.support.thrift; import static org.junit.Assert.*; import java.util.Map; import org.apache.thrift.TApplicationException; import org.apache.thrift.TException; 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; import org.apache.thrift.transport.TTransportException; import org.junit.Test; /** * * @author snowolf * @version 1.0 * @since 1.0 */ public class ClientTest { public final static int PORT = 9999; public static final String address = "localhost"; public static final int clientTimeout = 30000; @Test public void test() { TTransport transport = new TFramedTransport(new TSocket(address, PORT, clientTimeout)); TProtocol protocol = new TCompactProtocol(transport); ProfileService.Client client = new ProfileService.Client(protocol); try { transport.open(); Profile profile = new Profile(); profile.setName("Snowolf"); Map<String, String> map = client.toMap(profile); assertEquals(map.get("name"),"Snowolf"); } catch (TApplicationException e) { System.out.println(e.getMessage() + " " + e.getType()); } catch (TTransportException e) { e.printStackTrace(); } catch (TException e) { e.printStackTrace(); } transport.close(); } }
Client调用Server接口,将Profile对象交由Server处理,转换为Map。
如果需要Thirft承载高并发的负载,可以通过nginx来完成负载均衡的实现,详见
Nginx扩展(一):nginx_tcp_proxy_module
小记完毕,Go Home!
相关推荐
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!
前端分析-2023071100789
基于kinect的3D人体建模C++完整代码.cpp
搞机工具箱10.1.0.7z
GRU+informer时间序列预测(Python完整源码和数据),python代码,pytorch架构,适合各种时间序列直接预测。 适合小白,注释清楚,都能看懂。功能如下: 代码基于数据集划分为训练集测试集。 1.多变量输入,单变量输出/可改多输出 2.多时间步预测,单时间步预测 3.评价指标:R方 RMSE MAE MAPE,对比图 4.数据从excel/csv文件中读取,直接替换即可。 5.结果保存到文本中,可以后续处理。 代码带数据,注释清晰,直接一键运行即可,适合新手小白。
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!
基于ANSYS LSDyna的DEM-SPH-FEM耦合模拟滑坡入水动态行为研究,基于ANSYS LSDyna的DEM-SPH-FEM耦合的滑坡入水模拟分析研究,基于ansys lsdyna的滑坡入水模拟dem-sph-fem耦合 ,基于ANSYS LSDyna; 滑坡入水模拟; DEM-SPH-FEM 耦合,基于DEM-SPH-FEM耦合的ANSYS LSDyna滑坡入水模拟
auto_gptq-0.6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
复件 复件 建设工程可行性研究合同[示范文本].doc
13考试真题最近的t64.txt
好用我已经解决报错问题
# 踏入C语言的奇妙编程世界 在编程的广阔宇宙中,C语言宛如一颗璀璨恒星,以其独特魅力与强大功能,始终占据着不可替代的地位。无论你是编程小白,还是有一定基础想进一步提升的开发者,C语言都值得深入探索。 C语言的高效性与可移植性令人瞩目。它能直接操控硬件,执行速度快,是系统软件、嵌入式开发的首选。同时,代码可在不同操作系统和硬件平台间轻松移植,极大节省开发成本。 学习C语言,能让你深入理解计算机底层原理,培养逻辑思维和问题解决能力。掌握C语言后,再学习其他编程语言也会事半功倍。 现在,让我们一起开启C语言学习之旅。这里有丰富教程、实用案例、详细代码解析,助你逐步掌握C语言核心知识和编程技巧。别再犹豫,加入我们,在C语言的海洋中尽情遨游,挖掘无限可能,为未来的编程之路打下坚实基础!
auto_gptq-0.4.2-cp38-cp38-win_amd64.whl
自动立体库设计方案.pptx
# 踏入C语言的奇妙编程世界 在编程的广阔宇宙中,C语言宛如一颗璀璨恒星,以其独特魅力与强大功能,始终占据着不可替代的地位。无论你是编程小白,还是有一定基础想进一步提升的开发者,C语言都值得深入探索。 C语言的高效性与可移植性令人瞩目。它能直接操控硬件,执行速度快,是系统软件、嵌入式开发的首选。同时,代码可在不同操作系统和硬件平台间轻松移植,极大节省开发成本。 学习C语言,能让你深入理解计算机底层原理,培养逻辑思维和问题解决能力。掌握C语言后,再学习其他编程语言也会事半功倍。 现在,让我们一起开启C语言学习之旅。这里有丰富教程、实用案例、详细代码解析,助你逐步掌握C语言核心知识和编程技巧。别再犹豫,加入我们,在C语言的海洋中尽情遨游,挖掘无限可能,为未来的编程之路打下坚实基础!
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!
# 踏入C语言的奇妙编程世界 在编程的广阔宇宙中,C语言宛如一颗璀璨恒星,以其独特魅力与强大功能,始终占据着不可替代的地位。无论你是编程小白,还是有一定基础想进一步提升的开发者,C语言都值得深入探索。 C语言的高效性与可移植性令人瞩目。它能直接操控硬件,执行速度快,是系统软件、嵌入式开发的首选。同时,代码可在不同操作系统和硬件平台间轻松移植,极大节省开发成本。 学习C语言,能让你深入理解计算机底层原理,培养逻辑思维和问题解决能力。掌握C语言后,再学习其他编程语言也会事半功倍。 现在,让我们一起开启C语言学习之旅。这里有丰富教程、实用案例、详细代码解析,助你逐步掌握C语言核心知识和编程技巧。别再犹豫,加入我们,在C语言的海洋中尽情遨游,挖掘无限可能,为未来的编程之路打下坚实基础!
用deepseek变现实操流程,小白必看。