go語(yǔ)言gRPC簡(jiǎn)單例子

一個(gè)簡(jiǎn)單的用go語(yǔ)言開發(fā)gRPC程序例子。

安裝gRPC

gRPC的安裝需要3塊內(nèi)容

1. 安裝gRPC環(huán)境

這個(gè)環(huán)境包括gRPC編譯運(yùn)行時(shí)刻需要的庫(kù)。

$ go get google.golang.org/grpc

2. 安裝 Protocol Buffers v3

這個(gè)是protoc編譯器, 用來編譯.proto文件生成gRPC服務(wù)的go代碼。

直接從下面鏈接下載二進(jìn)制發(fā)布包即可:
https://github.com/google/protobuf/releases

選擇平臺(tái)對(duì)應(yīng)的zip包
protoc-<version>-<platform>.zip

解開之后在bin目錄下面會(huì)有一個(gè)protoc可執(zhí)行文件

3. 安裝protoc plugin for Go

這個(gè)工具在go編譯protoc文件的時(shí)候需要用到廓块。

$ go get -u github.com/golang/protobuf/protoc-gen-go

安裝完之后可執(zhí)行程序protoc-gen-go會(huì)存放在$GOROOT/bin或者$GOPATH/bin下面。

一個(gè)ToUpper的例子

這個(gè)例子是一個(gè)ToUpper程序,接收客戶端請(qǐng)求包含一個(gè)傳入字符串參數(shù)最欠,服務(wù)端返回大寫字符串示罗。

1. 定義protoc文件

$ cat proto/toupper.proto 
syntax = "proto3";

package proto;

// The service definition.
service ToUpper{
  // Sends a greeting
  rpc Upper (UpperRequest) returns (UpperReply) {}
}

// The request message
message UpperRequest {
  string name = 1;
}

// The response message
message UpperReply {
  string message = 1;
}

定義了一個(gè)ToUpper服務(wù)惩猫,定義了兩個(gè)消息UpperRequest和UpperReply分別用來接收和回復(fù)消息。

2. 定義服務(wù)端代碼

$ cat main/server.go 
package main

import (
    "log"
    "net"
    "strings"

    "golang.org/x/net/context"
    "google.golang.org/grpc"
 pb "toupper/proto"
    "google.golang.org/grpc/reflection"
)

const (
    port = ":50051"
)

type server struct{}

func (s *server) Upper(ctx context.Context, in *pb.UpperRequest) (*pb.UpperReply, error) {
    log.Printf("Received: %s", in.Name)
    return &pb.UpperReply{Message: strings.ToUpper(in.Name)}, nil
}

func main() {
    lis, err := net.Listen("tcp", port)
    if err != nil {
        log.Fatalf("failed to listen: %v", err)
    }
    s := grpc.NewServer()
    pb.RegisterToUpperServer(s, &server{})
    // Register reflection service on gRPC server.
    reflection.Register(s)
    if err := s.Serve(lis); err != nil {
        log.Fatalf("failed to serve: %v", err)
    }
}

3. 客戶端代碼

$ cat main/client.go 
package main

import (
    "log"
    "os"

    "golang.org/x/net/context"
    "google.golang.org/grpc"
 pb "toupper/proto"
)

const (
    address     = "localhost:50051"
)

func main() {
  // Set up a connection to the server.
    conn, err := grpc.Dial(address, grpc.WithInsecure())
    if err != nil {
        log.Fatalf("did not connect: %v", err)
    }
    defer conn.Close()
    c := pb.NewToUpperClient(conn)

    // Contact the server and print out its response.
    name := "hello world"
    if len(os.Args) > 1 {
        name = os.Args[1]
    }
    r, err := c.Upper(context.Background(), &pb.UpperRequest{Name: name})
    if err != nil {
        log.Fatalf("could not greet: %v", err)
    }
    log.Printf("Response: %s", r.Message)
}

工程目錄結(jié)構(gòu)如下

toupper
├── main
│   ├── client.go
│   └── server.go
├── makefile
└── proto
    └── toupper.proto

makefile文件

$ cat makefile 

PB=proto/toupper.pb.go

all: client server

server: $(PB)
    go build main/server.go
client: $(PB)
    go build main/client.go
$(PB):
    protoc -I proto toupper.proto --go_out=plugins=grpc:proto

clean:
    rm -f $(PB) client server

編譯

$ make
protoc -I proto toupper.proto --go_out=plugins=grpc:proto
go build main/client.go
go build main/server.go

注意在編譯前需要把前面安裝的protoc和protoc-gen-go設(shè)置到PATH環(huán)境變量蚜点。
編譯完總共會(huì)生成3個(gè)文件:

  1. proto/toupper.pb.go
  2. 可執(zhí)行文件client, 和
  3. 可執(zhí)行文件server

運(yùn)行

在終端直接運(yùn)行server:

$ ./server 

在另一個(gè)終端運(yùn)行client:

$ ./client 
2017/10/27 15:54:10 Response: HELLO WORLD
$ ./client abcd
2017/10/27 15:54:14 Response: ABCD

這時(shí)我們可以看到在服務(wù)端的輸出:

2017/10/27 15:54:10 Received: hello world
2017/10/27 15:54:14 Received: abcd

參考

https://grpc.io/docs/quickstart/go.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末轧房,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子绍绘,更是在濱河造成了極大的恐慌奶镶,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件陪拘,死亡現(xiàn)場(chǎng)離奇詭異厂镇,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)左刽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門捺信,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人欠痴,你說我怎么就攤上這事迄靠∶胱桑” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵掌挚,是天一觀的道長(zhǎng)雨席。 經(jīng)常有香客問我,道長(zhǎng)吠式,這世上最難降的妖魔是什么陡厘? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮奇徒,結(jié)果婚禮上雏亚,老公的妹妹穿的比我還像新娘。我一直安慰自己摩钙,他們只是感情好罢低,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著胖笛,像睡著了一般网持。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上长踊,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天功舀,我揣著相機(jī)與錄音,去河邊找鬼身弊。 笑死辟汰,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的阱佛。 我是一名探鬼主播帖汞,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼凑术!你這毒婦竟也來了翩蘸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤淮逊,失蹤者是張志新(化名)和其女友劉穎催首,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體泄鹏,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡郎任,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了备籽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舶治。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出歼疮,到底是詐尸還是另有隱情杂抽,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布韩脏,位于F島的核電站缩麸,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏赡矢。R本人自食惡果不足惜杭朱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望吹散。 院中可真熱鬧弧械,春花似錦、人聲如沸空民。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)界轩。三九已至画饥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間浊猾,已是汗流浹背抖甘。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留葫慎,地道東北人衔彻。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像偷办,于是被迫代替她去往敵國(guó)和親艰额。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

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

  • 轉(zhuǎn)載自:http://blog.csdn.net/yeasy/article/details/52190007爽篷。 ...
    sirai閱讀 3,445評(píng)論 1 1
  • 參考:http://www.reibang.com/p/8c6c009bc500 http://blog.csdn...
    F麥子閱讀 2,702評(píng)論 2 1
  • 一.什么是GRPC?作用是什么?優(yōu)點(diǎn)在哪里? 定義:(Google Remote Procedure Call P...
    RunningMan_Fly閱讀 9,463評(píng)論 13 10
  • json與protobuf做數(shù)據(jù)傳輸對(duì)比:json用起來的確很方便悴晰。但相對(duì)于protobuf數(shù)據(jù)量更大些慢睡。做一個(gè)移...
    Gospel元嘉閱讀 4,837評(píng)論 0 4
  • 為了給2016的自己獎(jiǎng)勵(lì)逐工,我決定給自己予以一件物質(zhì)獎(jiǎng)勵(lì)來激勵(lì)自己2017年繼續(xù)完成年度目標(biāo),可惜的是囊中羞澀漂辐,過完...
    倚小白閱讀 376評(píng)論 0 0