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的入门使用的更多相关文章

  1. Netty学习_Netty框架入门教程:Netty入门之HelloWorld实现

    我们可能都学过Socket通信/io/nio/aio等的编程.如果想把Socket真正的用于实际工作中去,那么还需要不断的完善.扩展和优化.比如很经典的Tcp读包写包问题,或者是数据接收的大小,实际的 ...

  2. RPC学习----Thrift快速入门和Java简单示例

    一.什么是RPC? RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议. RPC协议 ...

  3. Thrift快速入门

    Thrift 简单示例 2017-01-19 16:47:57 首先通过先面两个示例简单感受一下Thrift(RPC)服务端与客户端之间的通信...... RPC学习----Thrift快速入门和Ja ...

  4. Netty学习——Apache Thrift 简介和下载安装

    Netty学习——Apache Thrift 简介和下载安装 Apache Thrift 简介 本来由Facebook开发,捐献给了Apache,成了Apache的一个重要项目 可伸缩的,跨语言的服务 ...

  5. Netty学习笔记-入门版

    目录 Netty学习笔记 前言 什么是Netty IO基础 概念说明 IO简单介绍 用户空间与内核空间 进程(Process) 线程(thread) 程序和进程 进程切换 进程阻塞 文件描述符 文件句 ...

  6. 全网首发,腾讯T3-3整理Netty学习方案(体系图+项目+学习文档)

    前言: 想要学好一门技术,最起码要对他有一定的了解,起码听说过相应的底层原理的东西吧,最起码你要有一点能和别人交流的内容吧,下面是我精简的一点内容,希望对于大家了解netty能有一点帮助 Netty是 ...

  7. netty学习资料

    netty学习资料推荐官方文档和<netty权威指南>和<netty in action>这两本书.下面收集下网上分享的资料 netty官方参考文档 Netty 4.x Use ...

  8. 从零开始学习jQuery (一) 入门篇

    本系列文章导航 从零开始学习jQuery (一) 入门篇 一.摘要 本系列文章将带您进入jQuery的精彩世界, 其中有很多作者具体的使用经验和解决方案,  即使你会使用jQuery也能在阅读中发现些 ...

  9. Netty学习之客户端创建

    一.客户端开发时序图 图片来源:Netty权威指南(第2版) 二.Netty客户端开发步骤 使用Netty进行客户端开发主要有以下几个步骤: 1.用户线程创建Bootstrap Bootstrap b ...

随机推荐

  1. 【XSY2488】【HDU5818】Joint Stacks

    这题合并栈让我们想到了左偏树. 我们可以维护val值为时间,dis值为size的左偏树,定义两个根root1和root2,表示两个栈的栈顶,建大根的左偏树. 接下来的插入,删除,两个栈合并都是左偏树的 ...

  2. [2018-10-29] python开发个人资源共享网--第二天

    创建Django目录 startproject my_project 创建APP startapp my_app 手动创建的文件夹 log 日志 media 用户上传下载 static 静态文件 配置 ...

  3. 1、Hibernate-入门

    一.概述 1.什么是Hibernate: Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,h ...

  4. NOIP模拟 34

    次芝麻,喝喝喝,长寿花! 什么鬼畜题面...一看就不是什么正经出题人 skyh双双双AK了..太巨了... T1 次芝麻 稍稍手玩就能发现分界点以一个优美的方式跳动 然后就愉快地帮次货们次掉了这个题- ...

  5. python学习之【第九篇】:Python中的变量作用域

    1.前言 Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的. 2.变量作用域 变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称.Python的作 ...

  6. 2684亿!阿里CTO张建锋:不是任何一朵云都撑得住双11

    2019天猫双11 成交额2684亿! "不是任何一朵云都能撑住这个流量.中国有两朵云,一朵是阿里云,一朵叫其他云."11月11日晚,阿里巴巴集团CTO张建锋表示,"阿里 ...

  7. 『题解』LibreOJ6277 数列分块入门 1

    更好的阅读体验 Portal Portal1: LibreOJ Description 给出一个长为\(n\)的数列,以及\(n\)个操作,操作涉及区间加法,单点查值. Input 第一行输入一个数字 ...

  8. ssm整合的登录

    新建一个web工程,主要结构如下: 数据库创建如下: 控制层的代码FormController 类 package codeRose.controller; import org.springfram ...

  9. 使用AForge录制视频

    使用AForge录制视频,基于Winform开发 (一)首先导入AForge包 需要先导入 using AForge.Video;using AForge.Video.FFMPEG; 两个工具包 (二 ...

  10. IP网段的判断

    一.    OSI七层模型 表示 说明 作用 应用层 HTTP.ftp 协议 表示层 UTF-8 将应用层协议翻译成计算机可识别的语言 会话层 管理传输层 传输层 TCP/UDP 建立以及断开连接 网 ...