Netty学习——Thrift的入门使用
Netty学习——Thrift的入门使用
希望你能够,了解并使用它。因为它是一个效率很高的框架
官网地址:http://thrift.apache.org/
1.Thrift数据类型
一门技术如果需要支持多门语言,那么这门技术的字符类型肯定会很少,因为数据类型需要是多门语言的交集。Thrift 不支持无符号类型,因为很多编程语言不存在无符号类型,如java
- byte:有符号字节
- i16:16位有符号整数
- i32:32位有符号整数
- i64:64位有符号整数
- doubule: 64位的浮点数
- string:字符串
2.thrift 容器类型 结构体(Struts)特别知名的一个RPC框架。
Thrift应该是一个首选两个系统之间的调用
集合中的元素可以出了service之外的任何类型,包括exception
Thrift容器类型
- list:一系列由T类型的数据组成的有序列表,元素可以重复
- set:一系列由T类型的元素组成的无需集合,元素不可重复
- map:一个字典结构,key为K类型,value为V类型,相当于java中的HashMap
3.Thrift工作原理
如何实现多语言之间的通信?
数据传输使用socket(多语言支持),数据再以特定的格式(如string)发送,接收方语言进行解码
定义thrift的文件,由thrift文件(IDL)生成双方语言的接口,model,在生成的model以及接口中会有解码编码的代码
Thrift IDL文件 demo (struct相当于protobuf的message)
4.thrift类型
- 结构体(Struct)
- 枚举(enum)
- 异常(exception)
- 服务(service):若干个方法的集合,相当于java中创建的interface一样
- 常量(const)
- 类型定义:Thrift支持C++一样的typedef定义:
- typedef i32 int
- typedef i64 long
- 命名空间格式:namespace 语言名字 路径
- 文件包含: include “global.thrift” 相当于C的include和java中的import
- 注释: #3 // /**/
- 可选和必选: required , optional (和PB一样,尽量都使用optional)
使用整体流程步骤:1.写thrift文件,生成java代码 2.程序中进行调用
1.写thrift文件,生成java代码
thrift , idea中也有编写插件,有代码提示和语法高亮,但是我这里revert了,没有语法提示。尴尬
namespace java thrift.generated typedef i16 short
typedef i32 int
typedef i64 long
typedef string String
typedef bool boolean struct Person{
1:optional String username,
2:optional int age,
3:optional boolean marrid
} 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:reuqired Person person) throws(1:DataException dataException)
}
生成代码: thrift --gen java data.thrift (前提,已经安装好thrift,如果没安装,请查看我的文章 - thrift安装教程)
如果没有提示,代表执行完成,查看你的目录,会多一个 gen-java目录
我是将这些文件移动到我的java文件目录下了。
但是看起来有很多错,没关系,这是因为我们还没有引用相关的jar包
在 search.maven.org 找到需要的jar包:"org.apache.thrift:libthrift-as3:0.13.0"
dependencies {
compile(
"io.netty:netty-all:4.1.43.Final",
"com.google.protobuf:protobuf-java-util:3.11.0",
"com.google.protobuf:protobuf-java:3.11.0",
"org.apache.thrift:libthrift-as3:0.13.0"
)
}
报错就消失了
2.程序中进行调用
实现类:继承上面自动生成的接口 (这个实现类,客户端和服务器端都能用)
package com.dawa.thrift; import org.apache.thrift.TException;
import thrift.generated.DataException;
import thrift.generated.PersionService;
import thrift.generated.Person; /**
* @Title: PersonServiceImpl
* @Author: 大娃
* @Date: 2019/12/4 15:29
* @Description:
*/
public class PersonServiceImpl implements PersionService.Iface {
@Override
public Person getPersonByUsername(String username) throws DataException, TException {
System.out.println("GET Client Param"+username); Person person = new Person();
person.setUsername("大娃");
person.setAge(20);
person.setMarried(false);
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.dawa.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 thrift.generated.PersionService; /**
* @Title: ThriftServer
* @Author: 大娃
* @Date: 2019/12/4 15:32
* @Description:
*/
public class ThriftServer {
public static void main(String[] args) throws Exception {
TNonblockingServerSocket socket = new TNonblockingServerSocket(8899);
//arg 构建时需要的一系列信息
THsHaServer.Args arg = new THsHaServer.Args(socket).minWorkerThreads(2).maxWorkerThreads(4);
PersionService.Processor<PersonServiceImpl> processor = new PersionService.Processor<>(new PersonServiceImpl());
arg.protocolFactory(new TCompactProtocol.Factory());
arg.transportFactory(new TFramedTransport.Factory());
arg.processorFactory(new TProcessorFactory(processor)); //启动Server
TServer server = new THsHaServer(arg);
System.out.println("Thrift Server Started!");
server.serve(); }
}
客户端代码
package com.dawa.thrift; import com.sun.security.ntlm.Server;
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 thrift.generated.PersionService;
import thrift.generated.Person; /**
* @Title: ThriftClient
* @Author: 大娃
* @Date: 2019/12/4 15:38
* @Description:
*/
public class ThriftClient {
public static void main(String[] args) {
TTransport tTransport = new TFramedTransport(new TSocket("localhost",8899),600);
TProtocol protocol = new TCompactProtocol(tTransport);
PersionService.Client client = new PersionService.Client(protocol); try {
//打开socket
tTransport.open();
//调用方法
Person person = client.getPersonByUsername("大娃");
System.out.println(person.getUsername());
System.out.println(person.getAge());
System.out.println(person.isMarried()); System.out.println("-----------------");
Person person1 = new Person();
person1.setUsername("二娃");
person1.setAge(29);
person1.setMarried(false);
//调用保存方法
client.savePerson(person1); } catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}finally {
tTransport.close();
}
}
}
运行客户端,再运行服务器端,运行成功,连接成功。数据传输成功,方法也能够前后端都调用
success:看似是本地调用,实际是通过socket,RPC的方式实现的远程调用。
Netty学习——Thrift的入门使用的更多相关文章
- Netty学习_Netty框架入门教程:Netty入门之HelloWorld实现
我们可能都学过Socket通信/io/nio/aio等的编程.如果想把Socket真正的用于实际工作中去,那么还需要不断的完善.扩展和优化.比如很经典的Tcp读包写包问题,或者是数据接收的大小,实际的 ...
- RPC学习----Thrift快速入门和Java简单示例
一.什么是RPC? RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议. RPC协议 ...
- Thrift快速入门
Thrift 简单示例 2017-01-19 16:47:57 首先通过先面两个示例简单感受一下Thrift(RPC)服务端与客户端之间的通信...... RPC学习----Thrift快速入门和Ja ...
- Netty学习——Apache Thrift 简介和下载安装
Netty学习——Apache Thrift 简介和下载安装 Apache Thrift 简介 本来由Facebook开发,捐献给了Apache,成了Apache的一个重要项目 可伸缩的,跨语言的服务 ...
- Netty学习笔记-入门版
目录 Netty学习笔记 前言 什么是Netty IO基础 概念说明 IO简单介绍 用户空间与内核空间 进程(Process) 线程(thread) 程序和进程 进程切换 进程阻塞 文件描述符 文件句 ...
- 全网首发,腾讯T3-3整理Netty学习方案(体系图+项目+学习文档)
前言: 想要学好一门技术,最起码要对他有一定的了解,起码听说过相应的底层原理的东西吧,最起码你要有一点能和别人交流的内容吧,下面是我精简的一点内容,希望对于大家了解netty能有一点帮助 Netty是 ...
- netty学习资料
netty学习资料推荐官方文档和<netty权威指南>和<netty in action>这两本书.下面收集下网上分享的资料 netty官方参考文档 Netty 4.x Use ...
- 从零开始学习jQuery (一) 入门篇
本系列文章导航 从零开始学习jQuery (一) 入门篇 一.摘要 本系列文章将带您进入jQuery的精彩世界, 其中有很多作者具体的使用经验和解决方案, 即使你会使用jQuery也能在阅读中发现些 ...
- Netty学习之客户端创建
一.客户端开发时序图 图片来源:Netty权威指南(第2版) 二.Netty客户端开发步骤 使用Netty进行客户端开发主要有以下几个步骤: 1.用户线程创建Bootstrap Bootstrap b ...
随机推荐
- 智学网电脑端查分小工具 已更新V2.2
特别鸣谢这段代码的源作者,我的大佬同学\(MetalkgLZH\).由于我没有做什么工作,这篇随笔基本不含相关技术细节. 再次强调,这个程序的主要部分由\(MetalkgLZH\)完成.技术细节与源码 ...
- 原生JS实现双向链表
1.前言 双向链表和单向链表的区别在于,在链表中,一个节点只有链向下一个节点的链接,而在双向链表中,链接是双向的:一个链向下一个元素,另一个链向前一个元素,如下图所示: 从图中可以看到,双向链表中,在 ...
- thinkphp5.1长连接-单例模式测试!
在控制器中 使用以下代码测试 for ($i = 0; $i < 1000; $i++) { $tmp['name'] = 'f_'.$i; $tmp['times'] = date('Y-m ...
- Python 基础之 I/O 模型
一.I/O模型 IO在计算机中指Input/Output,也就是输入和输出.由于程序和运行时数据是在内存中驻留,由CPU这个超快的计算核心来执行,涉及到数据交换的地方,通常是磁盘.网络等,就需要IO接 ...
- glsl shader简明教程系列1
glsl shader简明教程系列1 底层的东西我就不说了(自己去百度翻基础教程) 我直接说上层了(片段着色器) web编辑器还在开发中 有了编辑器 到时候可以把代码复制上去可以看到效果了 1 实 ...
- 02. JVM运行机制
JVM运行机制 JVM启动流程 JVM基本结构 内存模型 编译和解释运行的概念 一.JVM启动流程
- hdu 1874 畅通工程续 (floyd)
畅通工程续Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- 力扣(LeetCode)2的幂 个人题解
给定一个整数,编写一个函数来判断它是否是 2 的幂次方. 示例 1: 输入: 1 输出: true 解释: 20 = 1 示例 2: 输入: 16 输出: true 解释: 24 = 16 示这题是考 ...
- error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'cv::imshow'
用Python打开图像始终提示错误 error: OpenCV(4.1.1) C:\projects\opencv-python\opencv\modules\highgui\src\window.c ...
- objc里的伪指针TaggedPointer
如果你看过我前面两篇objc函数枢纽msgSend和你印象中的NSString是这样吗,相信已经多次看过它的身影了,到底它是何物何作用,我今日就来揭开谜团.我之所为称呼它为伪指针,是因为它像幽灵一样, ...