日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql sock golang_golang thrift 总结一下网络上的一些坑

發(fā)布時間:2025/3/19 数据库 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql sock golang_golang thrift 总结一下网络上的一些坑 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

我們以hello world來大概分析一下golang中的thrift包,并且扒一扒網(wǎng)絡(luò)上有關(guān)thrift的一些坑

查看源碼,服務(wù)器定義如下:(詳見simple_server.go文件)

type TSimpleServer struct{

quit chanstruct{}

stopped int64

processorFactory TProcessorFactory //實(shí)質(zhì)是一個handler,用來相應(yīng)客戶端的請求

serverTransport TServerTransport //實(shí)質(zhì)是一個socket

inputTransportFactory TTransportFactory //實(shí)質(zhì)是傳輸協(xié)議的具體操作類(詳細(xì)可見transport.go文件中TTransport結(jié)構(gòu)體)

outputTransportFactory TTransportFactory //

inputProtocolFactory TProtocolFactory //實(shí)質(zhì)是傳輸協(xié)議(有compact、simplejson、json、binary四種協(xié)議,默認(rèn)是binary)

tputProtocolFactory TProtocolFactory //

}

在go語言中,創(chuàng)建一個thrift服務(wù)器有三種方法:(詳見simple_server.go文件)

func NewTSimpleServer2(processor TProcessor, serverTransport TServerTransport) *TSimpleServer {returnNewTSimpleServerFactory2(NewTProcessorFactory(processor), serverTransport)

}

func NewTSimpleServer4(processor TProcessor, serverTransport TServerTransport, transportFactory TTransportFactory, protocolFactory TProtocolFactory)*TSimpleServer {returnNewTSimpleServerFactory4(NewTProcessorFactory(processor),

serverTransport,

transportFactory,

protocolFactory,

)

}

func NewTSimpleServer6(processor TProcessor, serverTransport TServerTransport, inputTransportFactory TTransportFactory, outputTransportFactory TTransportFactory, inputProtocolFactory TProtocolFactory, outputProtocolFactory TProtocolFactory)*TSimpleServer {returnNewTSimpleServerFactory6(NewTProcessorFactory(processor),

serverTransport,

inputTransportFactory,

outputTransportFactory,

inputProtocolFactory,

outputProtocolFactory,

)

}

這三個函數(shù)分別調(diào)用了工廠函數(shù)

NewTSimpleServerFactory2;

NewTSimpleServerFactory4;

NewTSimpleServerFactory6;

func NewTSimpleServerFactory2(processorFactory TProcessorFactory, serverTransport TServerTransport) *TSimpleServer {returnNewTSimpleServerFactory6(processorFactory,

serverTransport,

NewTTransportFactory(),

NewTTransportFactory(),

NewTBinaryProtocolFactoryDefault(),

NewTBinaryProtocolFactoryDefault(),

)

}

func NewTSimpleServerFactory4(processorFactory TProcessorFactory, serverTransport TServerTransport, transportFactory TTransportFactory, protocolFactory TProtocolFactory)*TSimpleServer {returnNewTSimpleServerFactory6(processorFactory,

serverTransport,

transportFactory,

transportFactory,

protocolFactory,

protocolFactory,

)

}

func NewTSimpleServerFactory6(processorFactory TProcessorFactory, serverTransport TServerTransport, inputTransportFactory TTransportFactory, outputTransportFactory TTransportFactory, inputProtocolFactory TProtocolFactory, outputProtocolFactory TProtocolFactory)*TSimpleServer {return &TSimpleServer{

processorFactory: processorFactory,

serverTransport: serverTransport,

inputTransportFactory: inputTransportFactory,

outputTransportFactory: outputTransportFactory,

inputProtocolFactory: inputProtocolFactory,

outputProtocolFactory: outputProtocolFactory,

quit: make(chanstruct{}, 1),

}

}

好啦!現(xiàn)在假如我們需要創(chuàng)建一個以二進(jìn)制協(xié)議傳輸?shù)膖hrift服務(wù)器,那么可以用如下代碼簡單實(shí)現(xiàn):

serverTransport, err := thrift.NewTServerSocket("127.0.0.1:8808")if err !=nil {

fmt.Println("Error!", err)return}

handler := &rpcService{}

processor :=rpc.NewRpcServiceProcessor(handler)

server :=thrift.NewTSimpleServer2(processor, serverTransport)

fmt.Println("thrift server in localhost")

server.Serve()

另外我在網(wǎng)上查看這方面資料的時候,發(fā)現(xiàn)大家都用的NewTSimpleServer4這個函數(shù),然后自己又創(chuàng)建一遍NewTTransportFactory以及NewTBinaryProtocolFactoryDefault。

現(xiàn)在我們分析一下源碼,發(fā)現(xiàn)此舉實(shí)乃多此一舉。這是第一坑。

接下來說說如何用golang thrift編寫客戶端,查看網(wǎng)絡(luò)上的一些寫法,發(fā)現(xiàn)根本用不了,服務(wù)器會阻塞住!還是從源碼來分析:

在thrift自動生成的代碼中,會生成一個關(guān)于客戶端的示例。

//Autogenerated by Thrift Compiler (0.9.3)//DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING

package main

import ("flag"

"fmt"

"git.apache.org/thrift.git/lib/go/thrift"

"math"

"net"

"net/url"

"os"

"strconv"

"strings"

"vic/rpc")

func Usage() {

fmt.Fprintln(os.Stderr,"Usage of", os.Args[0], "[-h host:port] [-u url] [-f[ramed]] function [arg1 [arg2...]]:")

flag.PrintDefaults()

fmt.Fprintln(os.Stderr,"\nFunctions:")

fmt.Fprintln(os.Stderr,"Video request(string vid, string cid, string platform, string url, string clientVersion)")

fmt.Fprintln(os.Stderr)

os.Exit(0)

}

func main() {

flag.Usage=Usagevar host string

var port int

var protocol string

var urlString string

var framed bool

var useHttp bool

varparsedUrl url.URLvartrans thrift.TTransport

_=strconv.Atoi

_=math.Abs

flag.Usage=Usage

flag.StringVar(&host, "h", "localhost", "Specify host and port")

flag.IntVar(&port, "p", 9090, "Specify port")

flag.StringVar(&protocol, "P", "binary", "Specify the protocol (binary, compact, simplejson, json)")

flag.StringVar(&urlString, "u", "", "Specify the url")

flag.BoolVar(&framed, "framed", false, "Use framed transport")

flag.BoolVar(&useHttp, "http", false, "Use http")

flag.Parse()if len(urlString) > 0{

parsedUrl, err :=url.Parse(urlString)if err !=nil {

fmt.Fprintln(os.Stderr,"Error parsing URL:", err)

flag.Usage()

}

host=parsedUrl.Host

useHttp= len(parsedUrl.Scheme) <= 0 || parsedUrl.Scheme == "http"}else ifuseHttp {

_, err := url.Parse(fmt.Sprint("http://", host, ":", port))if err !=nil {

fmt.Fprintln(os.Stderr,"Error parsing URL:", err)

flag.Usage()

}

}

cmd := flag.Arg(0)varerr errorifuseHttp {

trans, err=thrift.NewTHttpClient(parsedUrl.String())

}else{

portStr :=fmt.Sprint(port)if strings.Contains(host, ":") {

host, portStr, err=net.SplitHostPort(host)if err !=nil {

fmt.Fprintln(os.Stderr,"error with host:", err)

os.Exit(1)

}

}

trans, err=thrift.NewTSocket(net.JoinHostPort(host, portStr))if err !=nil {

fmt.Fprintln(os.Stderr,"error resolving address:", err)

os.Exit(1)

}ifframed {

trans=thrift.NewTFramedTransport(trans)

}

}if err !=nil {

fmt.Fprintln(os.Stderr,"Error creating transport", err)

os.Exit(1)

}

defer trans.Close()varprotocolFactory thrift.TProtocolFactoryswitchprotocol {case "compact":

protocolFactory=thrift.NewTCompactProtocolFactory()break

case "simplejson":

protocolFactory=thrift.NewTSimpleJSONProtocolFactory()break

case "json":

protocolFactory=thrift.NewTJSONProtocolFactory()break

case "binary", "":

protocolFactory=thrift.NewTBinaryProtocolFactoryDefault()break

default:

fmt.Fprintln(os.Stderr,"Invalid protocol specified:", protocol)

Usage()

os.Exit(1)

}

client :=rpc.NewVideoServiceClientFactory(trans, protocolFactory)if err := trans.Open(); err !=nil {

fmt.Fprintln(os.Stderr,"Error opening socket to", host, ":", port, " ", err)

os.Exit(1)

}switchcmd {case "request":if flag.NArg()-1 != 5{

fmt.Fprintln(os.Stderr,"Request requires 5 args")

flag.Usage()

}

argvalue0 := flag.Arg(1)

value0 :=argvalue0

argvalue1 := flag.Arg(2)

value1 :=argvalue1

argvalue2 := flag.Arg(3)

value2 :=argvalue2

argvalue3 := flag.Arg(4)

value3 :=argvalue3

argvalue4 := flag.Arg(5)

value4 :=argvalue4

fmt.Print(client.Request(value0, value1, value2, value3, value4))

fmt.Print("\n")break

case "":

Usage()break

default:

fmt.Fprintln(os.Stderr,"Invalid function", cmd)

}

}

View Code

我們一部分一部分來分析分析:

flag.Usage =Usagevar host string

var port int

var protocol string

var urlString string

var framed bool

var useHttp bool

varparsedUrl url.URLvartrans thrift.TTransport

_=strconv.Atoi

_=math.Abs

flag.Usage=Usage

flag.StringVar(&host, "h", "localhost", "Specify host and port")

flag.IntVar(&port, "p", 9090, "Specify port")

flag.StringVar(&protocol, "P", "binary", "Specify the protocol (binary, compact, simplejson, json)")

flag.StringVar(&urlString, "u", "", "Specify the url")

flag.BoolVar(&framed, "framed", false, "Use framed transport")

flag.BoolVar(&useHttp, "http", false, "Use http")

flag.Parse()

這些代碼是設(shè)置了一些程序的啟動命令,例如默認(rèn)地址是loacalhost,我們可以根據(jù)client.exe -h xxx.xxx.xxx.xxx之類的命令來修改

我們發(fā)現(xiàn)這些代碼都不是我們需要的,pass,繼續(xù)看

if len(urlString) > 0{

parsedUrl, err :=url.Parse(urlString)if err !=nil {

fmt.Fprintln(os.Stderr,"Error parsing URL:", err)

flag.Usage()

}

host=parsedUrl.Host

useHttp= len(parsedUrl.Scheme) <= 0 || parsedUrl.Scheme == "http"}else ifuseHttp {

_, err := url.Parse(fmt.Sprint("http://", host, ":", port))if err !=nil {

fmt.Fprintln(os.Stderr,"Error parsing URL:", err)

flag.Usage()

}

}

cmd := flag.Arg(0)varerr errorifuseHttp { trans, err = thrift.NewTHttpClient(parsedUrl.String())}else{

portStr :=fmt.Sprint(port)if strings.Contains(host, ":") {

host, portStr, err=net.SplitHostPort(host)if err !=nil {

fmt.Fprintln(os.Stderr,"error with host:", err)

os.Exit(1)

}

}

trans, err= thrift.NewTSocket(net.JoinHostPort(host, portStr))

if err !=nil {

fmt.Fprintln(os.Stderr,"error resolving address:", err)

os.Exit(1)

}ifframed {

trans=thrift.NewTFramedTransport(trans)

}

}

這部分主要作用是解析url參數(shù),從中取得host以及port。并且用于生成一個TTransport,上面紅線加粗的函數(shù)定義在源碼中如下:

func NewTHttpClient(urlstr string) (TTransport, error) {returnNewTHttpClientWithOptions(urlstr, THttpClientOptions{})

}

func NewTSocket(hostPortstring) (*TSocket, error) {return NewTSocketTimeout(hostPort, 0)

}

細(xì)心的朋友們可能發(fā)現(xiàn)了端倪,第二個函數(shù)的返回值是一個TSocket指針,并不是TTransport,是不是有啥問題?不急,我們看看這兩個結(jié)構(gòu)體的定義就知道了:

type TTransport interface{

io.ReadWriteCloser

Flusher

ReadSizeProvider//Opens the transport for communication

Open() error//Returns true if the transport is open

IsOpen() bool}

原來TTransport是一個接口類型,而TSocket則實(shí)現(xiàn)了該接口!

目前為止,我們獲得了創(chuàng)建客戶端所需要的關(guān)鍵代碼:

trans, err =thrift.NewTHttpClient(parsedUrl.String())

trans, err= thrift.NewTSocket(net.JoinHostPort(host, portStr))

OK,繼續(xù)分析示例!

varprotocolFactory thrift.TProtocolFactoryswitchprotocol {case "compact":

protocolFactory=thrift.NewTCompactProtocolFactory()break

case "simplejson":

protocolFactory=thrift.NewTSimpleJSONProtocolFactory()break

case "json":

protocolFactory=thrift.NewTJSONProtocolFactory()break

case "binary", "":

protocolFactory=thrift.NewTBinaryProtocolFactoryDefault()break

default:

fmt.Fprintln(os.Stderr,"Invalid protocol specified:", protocol)

Usage()

os.Exit(1)

}

client := rpc.NewVideoServiceClientFactory(trans, protocolFactory)if err := trans.Open(); err !=nil {

fmt.Fprintln(os.Stderr,"Error opening socket to", host, ":", port, " ", err)

os.Exit(1)

}

switch語句是根據(jù)我們所輸入的參數(shù),選擇傳輸協(xié)議。最后通過NewVideoServiceClientFactory函數(shù) 完成客戶端的創(chuàng)建

最后,總結(jié)一下,假如我們要創(chuàng)建一個以二進(jìn)制為傳輸協(xié)議,那么我們可以編寫如下代碼來完成:

transport, err := thrift.NewTSocket(net.JoinHostPort("127.0.0.1", "8808"))if err !=nil {

fmt.Fprintln(os.Stderr,"error resolving address:", err)

os.Exit(1)

}

protocolFactory :=thrift.NewTBinaryProtocolFactoryDefault()

client :=NewRpcServiceClientFactory(transport, protocolFactory)if err := transport.Open(); err !=nil {

fmt.Fprintln(os.Stderr,"Error opening socket to 127.0.0.1:8808", " ", err)

os.Exit(1)

}

defer transport.Close()

res, _ := client.SayHi(“World”)

有疑問加站長微信聯(lián)系(非本文作者)

總結(jié)

以上是生活随笔為你收集整理的mysql sock golang_golang thrift 总结一下网络上的一些坑的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 在线看片黄 | a√在线视频 | 日韩精品一区二区三区高清免费 | 在线99| 欧美日韩在线国产 | 特级精品毛片免费观看 | 欧美1| 精品无码久久久久久久久果冻 | 亚洲人一区 | 亚洲系列| 高跟丝袜av | 毛片网站在线 | 黄色av网站免费在线观看 | 一本一道久久综合 | 97在线视频免费观看 | 国产超碰在线观看 | 欧美成人免费在线观看视频 | 日本一区二区三区网站 | 成人免费看| 天天干天天噜 | 日韩精品一区在线播放 | 性猛交xxxx乱大交孕妇2十 | 潘金莲一级淫片免费放动漫 | 一区不卡av | 啪啪无遮挡 | 欧美 日韩 国产 成人 在线 91 | 少妇极品熟妇人妻无码 | 色眯眯av| 色香色香欲天天天影视综合网 | 黄色的视频网站 | 中文一二区 | 精品久久久久久中文字幕 | 国产欧美一区二区三区精品酒店 | 99在线播放 | 三大队在线观看 | 无码日本精品xxxxxxxxx | 国产人妖ts | 另类激情视频 | 日本一区二区三区在线观看 | 国产手机在线播放 | 日韩综合在线观看 | 人人看人人澡 | 日韩成人动漫在线观看 | 波多野结衣网站 | 青青操免费 | 在线能看的av | 成年人在线播放视频 | 一级免费a | 欧美中文网 | 日韩色影院 | 都市激情自拍偷拍 | 免费国产黄色片 | 欧美视频三区 | 国产精品第3页 | 一级伦理片 | 国产精品99999 | 欧美日韩小视频 | 看污网站| 九九综合九九综合 | 天堂va蜜桃一区二区三区漫画版 | 91久久极品少妇xxxxⅹ软件 | 成人午夜福利视频 | 日本三级生活片 | 女同性做爰三级 | 少妇饥渴难耐 | 日韩理论片在线观看 | 91精品免费 | 久久成年人视频 | 亚洲国产一区视频 | 乱色熟女综合一区二区三区 | 久久窝窝 | 一级国产片| 午夜免费看片 | av中文字幕免费观看 | 美日韩免费视频 | 亚洲综合在线五月 | 麻豆视频在线观看免费网站 | 色欧美亚洲| 99涩涩| 精品国产乱码久久久久久闺蜜 | 黄色不卡av | 精品一区二区三区三区 | 国产精品色呦呦 | 天堂成人网 | 黄色av网址在线观看 | a在线免费观看 | 亚洲精品嫩草 | 人妻激情偷乱频一区二区三区 | 精品国产乱码久久久久久预案 | 精品人妻一区二区三区日产乱码 | 青娱乐在线视频免费观看 | 久久国产露脸精品国产 | 少妇色 | 久久久久久9 | 夜夜操免费视频 | 爽爽视频在线观看 | 国产噜噜噜噜噜久久久久久久久 | 写真福利片hd在线播放 | 国产91av在线播放 |