Thrift 简介:

Thrift 是一款高性能、开源的 RPC 框架,产自 Facebook 后贡献给了 Apache,Thrift 囊括了整个 RPC 的上下游体系,自带序列化编译工具,因为 Thrift 采用的是二进制序列化,并且与 gRPC 一样使用的都是长连接建立 client 与 server 之间的通讯,相比于比传统的使用XML,JSON,SOAP等短连接的解决方案性能要快得多。
本篇只介绍 Golang 关于 Thrift 的基础使用。

安装

  • 安装 Thrift 的 Golang 库有两种方案:

    1. 直接通过 go get 命令安装,缺点是因为不可抗拒的网络因素大部分人可能会失败:$ go get git.apache.org/thrift.git/lib/go/thrift
    2. 通过源码安装:
      • 在 $GOPATH 的 src 目录下创建多层级目录:git.apache.org/thrift.git/lib/go
      • 从 github 上下载 thrift 0.10.0 的源码 ,解压后进入 thrift-0.10.0/lib/go 目录下,将 thrift 目录 copy 到刚创建的 $GOPATH/src/git.apache.org/thrift.git/lib/go 目录下
      • 在任意目录下执行 $ go install git.apache.org/thrift.git/lib/go/thrift 就完成了 golang 的 thrift 库的安装
  • 安装 Thrift 的 IDL 编译工具(可省去)

    1. windows 平台下安装:

      直接下载:thrift complier 下载地址,下载完成后改名为:thrift.exe 并将其放入到系统环境变量下即可使用

    2. Linux 平台下安装:

      从 github 上下载 thrift 0.10.0 的源码,解压后进入:thrift-0.10.0/compiler/cpp 目录执行如下命令完成编译后,将其放入到系统环境变量下即可使用:
      $ mkdir cmake-build
      $ cd cmake-build
      $ cmake ..
      $ make

  • 验证是否安装成功:

    $ thrift -version,如果打印出来:Thrift version 0.10.0 表明 complier 安装成功

实践:

下面我们使用 Thrift 定义一个接口,该接口实现对传入的数据进行大写的格式化处理。

  • 创建 golang 项目 ThriftDemo 工程:

Paste_Image.png
  1. client目录下的 client.go 实现了客户端用于发送数据并打印接收到 server 端处理后的数据
  2. server 目录下的 server.go 实现了服务端用于接收客户端发送的数据,并对数据进行大写处理后返回给客户端
  3. thrift_file 用于存放 thrift 的 IDL 文件: *.thrift
  • 定义 Thrift RPC 接口

example.thrift:

namespace py example

struct Data {
: string text
} service format_data {
Data do_format(:Data data),
}
  • 编译 thrift 文件

    进入 thrift_file 目录执行:$ thrift -out .. --gen go example.thrift,就会在 thrift_file 的同级目录下生成 golang 的包:example,其中 format_data-remote 是生成的测试代码可以不用特别关注

Paste_Image.png
  • 实现 server 端:
package main

import (
"ThriftDemo/example"
"strings"
"git.apache.org/thrift.git/lib/go/thrift"
"fmt"
"log"
) type FormatDataImpl struct {} func (fdi *FormatDataImpl) DoFormat(data *example.Data) (r *example.Data, err error){
var rData example.Data
rData.Text = strings.ToUpper(data.Text) return &rData, nil
} const (
HOST = "localhost"
PORT = ""
) func main() { handler := &FormatDataImpl{}
processor := example.NewFormatDataProcessor(handler)
serverTransport, err := thrift.NewTServerSocket(HOST + ":" + PORT)
if err != nil {
log.Fatalln("Error:", err)
}
transportFactory := thrift.NewTFramedTransportFactory(thrift.NewTTransportFactory())
protocolFactory := thrift.NewTBinaryProtocolFactoryDefault() server := thrift.NewTSimpleServer4(processor, serverTransport, transportFactory, protocolFactory)
fmt.Println("Running at:", HOST + ":" + PORT)
server.Serve()
}
  • 实现 client 端
package main

import (
"git.apache.org/thrift.git/lib/go/thrift"
"net"
"fmt"
"ThriftDemo/example"
"log"
) const (
HOST = "localhost"
PORT = ""
) func main() {
tSocket, err := thrift.NewTSocket(net.JoinHostPort(HOST, PORT))
if err != nil {
log.Fatalln("tSocket error:", err)
}
transportFactory := thrift.NewTFramedTransportFactory(thrift.NewTTransportFactory())
transport := transportFactory.GetTransport(tSocket)
protocolFactory := thrift.NewTBinaryProtocolFactoryDefault() client := example.NewFormatDataClientFactory(transport, protocolFactory) if err := transport.Open(); err != nil {
log.Fatalln("Error opening:", HOST + ":" + PORT)
}
defer transport.Close() data := example.Data{Text:"hello,world!"}
d, err := client.DoFormat(&data)
fmt.Println(d.Text)
}
  • 执行验证结果:

    1. 先启动 server,之后再执行 client
    2. client 侧控制台如果打印的结果为: HELLO,WORLD! ,证明 Thrift 的 RPC 接口定义成功

Go -- RPC 之 Thrift的更多相关文章

  1. RPC框架Thrift例子-PHP调用C++后端程序

    更新 2016-02-22: Response对象不用主动创建. 前言 前段时间用了一下Facebook的开源RPC框架Thrift,做PHP客户端调用C++后端程序,真心觉得Thrift不错! 本文 ...

  2. rpc之thrift

    rpc之thrift 一.介绍 thrift是一个rpc(remove procedure call)框架,可以实现不同的语言(java.c++.js.python.ruby.c#等)之间的相互调用. ...

  3. HTTP与RPC(Thrift)

    什么是RPC 从网络协议来说,Http协议与Rpc同属于应用层, 他们的底层都是tcp协议. RPC(即Remote Procedure Call,远程过程调用)和HTTP(HyperText Tra ...

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

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

  5. rpc框架: thrift/avro/protobuf 之maven插件生成java类

    thrift.avro.probobuf 这几个rpc框架的基本思想都差不多,先定义IDL文件,然后由各自的编译器(或maven插件)生成目标语言的源代码,但是,根据idl生成源代码这件事,如果每次都 ...

  6. .Net RPC框架Thrift的用法

      关于Thrift 下面是来自百度百科关于Thrift的介绍: thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和引擎,以构建在 C++, Java, Go ...

  7. rpc框架thrift

    跨语言的rpc框架 新建一个thrift文件 # ping service demoservice PingService { string ping(), ping函数的返回类型是字符串} serv ...

  8. 【RPC】Thrift ICE 等 RPC 框架相关资料

    RPC框架-Thrift-ICE Apache Thrift - Documentation Apache Thrift - Index of tutorial/ Apache Thrift - Ab ...

  9. RPC之Thrift学习实战

    关于Thrift的学习实战请参考:http://blog.csdn.net/column/details/slimina-thrift.html

随机推荐

  1. c++:printf和cout那个更好更快些

    现在群里在讨论cout和printf那个快的问题,但我个人觉得printf好: 因为:printf对于一些数据大,以及保留小数位,字符……可以显示出明显的优势如“%s %d %c…………” 虽然pri ...

  2. python:json

    json是用来传输数据的字符串,{"key1":"values1","key2":{"key3":"value ...

  3. GIL 线程/进程池 同步异步

    GIL 什么是GIL 全局解释器锁,本质是一把互斥锁,是加在cpython解释器上的一把锁, 同一个进程内的所有线程需要先抢到GIL锁,才能执行python代码 为什么要有GIL cpython解释器 ...

  4. One-to-one

    创建模型 在本例中,Place 和 Restaurant 为一对一关系 from django.db import models class Place(models.Model): name = m ...

  5. STM32开发笔记之——CMSIS DAP

    都说开发stm32都是使用kail iar+jatg/swd的方式,然而arm公司已经开发出了CMSIS DAP的开源下载工具,全称是CoreSight Debug Access Port,网络上有大 ...

  6. python中join()函数讲解

    本文简述的是string.join(words[, sep]),它的功能是把字符串或者列表,元组等的元素给连接起来,返回一个字符串,和split()函数与正好相反,看下面的代码理解. a=[" ...

  7. PAT Basic 1049

    1049 数列的片段和 给定一个正数数列,我们可以从中截取任意的连续的几个数,称为片段.例如,给定数列 { 0.1, 0.2, 0.3, 0.4 },我们有 (0.1) (0.1, 0.2) (0.1 ...

  8. Windows phone UI虚拟化和数据虚拟化(二)

    书接上回的Windows phone UI虚拟化和数据虚拟化(一)我们学习了wp的ui虚拟化.今天来和大家分享一下wp的数据虚拟化. 并同时感谢我的同事dgwutao在编写此文时给我的巨大帮助,3ks ...

  9. 大数据学习——hbase的shell客户端基本使用

    1  基本shell命令 1 在hbase的 bin目录下进入命令行 ./hbase shell 2 查看有哪些表 list 3 创建一个表 create 't_user_info', {NAME = ...

  10. SQLserver查看某个视图的创建语句

    1.已经创建好的视图,查看视图创建时的源码 sp_helptext  '视图名' 如下: sp_helptext 'V_user' 方式2: sa账户登录SQLserver,选择视图---右键---- ...