grpc-go的環(huán)境搭建及入門

(一)環(huán)境搭建


1.安裝protoc工具

地址:https://github.com/protocolbuffers/protobuf/releases

找到需要的版本贮折,windows的下載protoc-3.12.4-win64.zip(版本可自行選擇)

或protoc-3.12.4-win32.zip(版本可自行選擇),找個(gè)地方解壓,然后將bin加入path


2.安裝protoc-gen-go 插件

地址:https://github.com/protocolbuffers/protobuf-go

下載成功后,然后進(jìn)入 protobuf-go\cmd\protoc-gen-go 目錄

執(zhí)行g(shù)o install 吭从,此時(shí)protoc-gen-go已經(jīng)安裝在gopath/bin 目錄下了


3.安裝protoc-gen-go-grpc 插件

地址:https://github.com/grpc/grpc-go

下載成功后,進(jìn)入grpc-go\cmd\protoc-gen-go-grpc目錄

執(zhí)行g(shù)o install 此時(shí)protoc-gen-go-grpc已經(jīng)安裝在gopath/bin 目錄下了


至此環(huán)境搭建已經(jīng)成功了恶迈,需要注意的是涩金,本人已將gopath加入path環(huán)境變量,如果不加入的話暇仲,可以自行將相關(guān)插件加入path


(二)入門


1.搭建server端


找個(gè)地方建個(gè)server文件夾(不要放在gopath下面)

進(jìn)入server目錄執(zhí)行g(shù)o mod init server (建立module)

在server目錄下面建個(gè)pb文件夾(此文件夾放.proto文件)

在pb文件夾下面建個(gè)arith.proto文件步做,內(nèi)容如下:

syntax?=?"proto3";

package?pb;

option?go_package?=?".;pb";

message?ArithRequest?{

????double??num1?=?1;

????double??num2?=?2;

}

message?ArithResponse?{

????double?result?=?1;

}

service?Arith?{

????rpc?multiply?(ArithRequest)?returns?(ArithResponse);???

????rpc?divide?(ArithRequest)?returns?(ArithResponse);

}

在pb目錄下執(zhí)行

protoc --go_out=. --plugin=grpc .\arith.proto

protoc --go-grpc_out=requireUnimplementedServers=false:. .\arith.proto

以上兩條是根據(jù)proto文件自動(dòng)生成go文件,至于proto的書寫規(guī)則奈附,去網(wǎng)上看看就知道了

回到server目錄下全度,建個(gè)server.go文件,內(nèi)容如下:

package?main

import?(

????"context"

????"errors"

????"log"

????"net"

????"server/pb"

????"google.golang.org/grpc"

)

type?Arith?struct{}

//乘法

func?(m?*Arith)?Multiply(ctx?context.Context,?req?*pb.ArithRequest)?(resp?*pb.ArithResponse,?err?error)?{

????resp?=?new(pb.ArithResponse)

????resp.Result?=?req.Num1?*?req.Num2

????return?resp,?nil

}

//?除法

func?(m?*Arith)?Divide(ctx?context.Context,?req?*pb.ArithRequest)?(resp?*pb.ArithResponse,?err?error)?{

????resp?=?new(pb.ArithResponse)

????if?req.Num2?==?0?{

????????return?nil,?errors.New("the dividend is 0")

????}

????resp.Result?=?req.Num1?/?req.Num2

????return?resp,?nil

}

func?main()?{

????lis,?err?:=?net.Listen("tcp",?"127.0.0.1:8888")

????if?err?!=?nil?{

????????log.Fatal("failed?to?listen:?%v",?err)

????}

????s?:=?grpc.NewServer()

????pb.RegisterArithServer(s,?&Arith{})

????log.Println("proto?server?start")

????err?=?s.Serve(lis)

????if?err?!=?nil?{

????????log.Fatal(err)

????}

}

在server目錄下執(zhí)行?go?run?server.go桅狠,服務(wù)端就建立起來了


2.搭建client客戶端


建個(gè)client文件夾讼载,進(jìn)入client目錄執(zhí)行?go?mod?init?client,建立pb文件夾中跌,進(jìn)入pb目錄,將server>pb>arith.proto文件拷貝至此菇篡,然后執(zhí)行

protoc --go_out=. --plugin=grpc .\arith.proto

protoc --go-grpc_out=requireUnimplementedServers=false:. .\arith.proto

然后在client目錄下面新建client.go文件漩符,內(nèi)容如下:

package?main

import?(

????"context"

????"log"

????"time"

????pb?"client/pb"

????"google.golang.org/grpc"

)

func?main()?{

? ? conn,?err?:=?grpc.Dial("localhost:8888",?grpc.WithInsecure(),?grpc.WithBlock())

????if?err?!=?nil?{

????????log.Fatalf("did?not?connect:?%v",?err)

????}

????defer?conn.Close()

????c?:=?pb.NewArithClient(conn)

????ctx,?cancel?:=?context.WithTimeout(context.Background(),?time.Second)

????defer?cancel()

????r,?err?:=?c.Multiply(ctx,?&pb.ArithRequest{Num1:?1.0,?Num2:?2.0})

????if?err?!=?nil?{

????????log.Fatal(err)

????}

????log.Printf("result:?%f",?r.Result)

????ctx2,?cancel2?:=?context.WithTimeout(context.Background(),?time.Second)

????defer?cancel2()

????r,?err?=?c.Divide(ctx2,?&pb.ArithRequest{Num1:?1.0,?Num2:?2.0})

????if?err?!=?nil?{

????????log.Fatal(err)

????}

????log.Printf("result:?%f",?r.Result)

}

然后執(zhí)行 go run client.go,就會(huì)得到結(jié)果:

2020/08/04 18:34:41 result: 2.000000

2020/08/04 18:34:41 result: 0.500000

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末驱还,一起剝皮案震驚了整個(gè)濱河市嗜暴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌议蟆,老刑警劉巖闷沥,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異咐容,居然都是意外死亡舆逃,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來路狮,“玉大人虫啥,你說我怎么就攤上這事⊙俜粒” “怎么了涂籽?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長砸抛。 經(jīng)常有香客問我评雌,道長,這世上最難降的妖魔是什么直焙? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任景东,我火速辦了婚禮,結(jié)果婚禮上箕般,老公的妹妹穿的比我還像新娘耐薯。我一直安慰自己,他們只是感情好丝里,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布曲初。 她就那樣靜靜地躺著,像睡著了一般杯聚。 火紅的嫁衣襯著肌膚如雪臼婆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天幌绍,我揣著相機(jī)與錄音颁褂,去河邊找鬼。 笑死傀广,一個(gè)胖子當(dāng)著我的面吹牛颁独,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播伪冰,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼誓酒,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了贮聂?” 一聲冷哼從身側(cè)響起靠柑,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吓懈,沒想到半個(gè)月后歼冰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡耻警,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年隔嫡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了甸怕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡畔勤,死狀恐怖蕾各,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情庆揪,我是刑警寧澤式曲,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站缸榛,受9級(jí)特大地震影響吝羞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜内颗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一钧排、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧均澳,春花似錦恨溜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至躺盛,卻和暖如春项戴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背槽惫。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國打工周叮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人界斜。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓仿耽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親各薇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子氓仲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容