最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go?gRPC教程實(shí)現(xiàn)Simple?RPC

 更新時(shí)間:2022年06月15日 17:26:25   作者:煙花易冷人憔悴  
這篇文章主要為大家介紹了Go?gRPC教程實(shí)現(xiàn)Simple?RPC示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言

gRPC主要有4種請(qǐng)求和響應(yīng)模式,分別是簡(jiǎn)單模式(Simple RPC)、服務(wù)端流式(Server-side streaming RPC)、客戶(hù)端流式(Client-side streaming RPC)、和雙向流式(Bidirectional streaming RPC)。

  • 簡(jiǎn)單模式(Simple RPC):客戶(hù)端發(fā)起請(qǐng)求并等待服務(wù)端響應(yīng)。
  • 服務(wù)端流式(Server-side streaming RPC):客戶(hù)端發(fā)送請(qǐng)求到服務(wù)器,拿到一個(gè)流去讀取返回的消息序列。 客戶(hù)端讀取返回的流,直到里面沒(méi)有任何消息。
  • 客戶(hù)端流式(Client-side streaming RPC):與服務(wù)端數(shù)據(jù)流模式相反,這次是客戶(hù)端源源不斷的向服務(wù)端發(fā)送數(shù)據(jù)流,而在發(fā)送結(jié)束后,由服務(wù)端返回一個(gè)響應(yīng)。
  • 雙向流式(Bidirectional streaming RPC):雙方使用讀寫(xiě)流去發(fā)送一個(gè)消息序列,兩個(gè)流獨(dú)立操作,雙方可以同時(shí)發(fā)送和同時(shí)接收。

本篇文章先介紹簡(jiǎn)單模式。

新建proto文件

主要是定義我們服務(wù)的方法以及數(shù)據(jù)格式,我們使用上一篇的simple.proto文件。

1.定義發(fā)送消息的信息

message SimpleRequest{
    // 定義發(fā)送的參數(shù),采用駝峰命名方式,小寫(xiě)加下劃線,如:student_name
    string data = 1;//發(fā)送數(shù)據(jù)
}

2.定義響應(yīng)信息

message SimpleResponse{
    // 定義接收的參數(shù)
    // 參數(shù)類(lèi)型 參數(shù)名 標(biāo)識(shí)號(hào)(不可重復(fù))
    int32 code = 1;  //狀態(tài)碼
    string value = 2;//接收值
}

3.定義服務(wù)方法Route

// 定義我們的服務(wù)(可定義多個(gè)服務(wù),每個(gè)服務(wù)可定義多個(gè)接口)
service Simple{
    rpc Route (SimpleRequest) returns (SimpleResponse){};
}

4.編譯proto文件

我這里使用上一篇介紹的VSCode-proto3插件,保存后自動(dòng)編譯。

指令編譯方法,進(jìn)入simple.proto文件所在目錄,運(yùn)行:

protoc --go_out=plugins=grpc:./ ./simple.proto

創(chuàng)建Server端

1.定義我們的服務(wù),并實(shí)現(xiàn)Route方法

import (
	"context"
	"log"
	"net"
	"google.golang.org/grpc"
	pb "go-grpc-example/proto"
)
// SimpleService 定義我們的服務(wù)
type SimpleService struct{}
// Route 實(shí)現(xiàn)Route方法
func (s *SimpleService) Route(ctx context.Context, req *pb.SimpleRequest) (*pb.SimpleResponse, error) {
	res := pb.SimpleResponse{
		Code:  200,
		Value: "hello " + req.Data,
	}
	return &res, nil
}

該方法需要傳入RPC的上下文context.Context,它的作用結(jié)束超時(shí)或取消的請(qǐng)求。更具體的說(shuō)請(qǐng)參考該文章

2.啟動(dòng)gRPC服務(wù)器

const (
	// Address 監(jiān)聽(tīng)地址
	Address string = ":8000"
	// Network 網(wǎng)絡(luò)通信協(xié)議
	Network string = "tcp"
)
func main() {
	// 監(jiān)聽(tīng)本地端口
	listener, err := net.Listen(Network, Address)
	if err != nil {
		log.Fatalf("net.Listen err: %v", err)
	}
	log.Println(Address + " net.Listing...")
	// 新建gRPC服務(wù)器實(shí)例
	grpcServer := grpc.NewServer()
	// 在gRPC服務(wù)器注冊(cè)我們的服務(wù)
	pb.RegisterSimpleServer(grpcServer, &SimpleService{})
	//用服務(wù)器 Serve() 方法以及我們的端口信息區(qū)實(shí)現(xiàn)阻塞等待,直到進(jìn)程被殺死或者 Stop() 被調(diào)用
	err = grpcServer.Serve(listener)
	if err != nil {
		log.Fatalf("grpcServer.Serve err: %v", err)
	}
}

里面每個(gè)方法的作用都有注釋?zhuān)@里就不解析了。
運(yùn)行服務(wù)端

go run server.go
:8000 net.Listing...

創(chuàng)建Client端

import (
	"context"
	"log"
	"google.golang.org/grpc"
	pb "go-grpc-example/proto"
)
const (
	// Address 連接地址
	Address string = ":8000"
)
func main() {
	// 連接服務(wù)器
	conn, err := grpc.Dial(Address, grpc.WithInsecure())
	if err != nil {
		log.Fatalf("net.Connect err: %v", err)
	}
	defer conn.Close()
	// 建立gRPC連接
	grpcClient := pb.NewSimpleClient(conn)
	// 創(chuàng)建發(fā)送結(jié)構(gòu)體
	req := pb.SimpleRequest{
		Data: "grpc",
	}
	// 調(diào)用我們的服務(wù)(Route方法)
	// 同時(shí)傳入了一個(gè) context.Context ,在有需要時(shí)可以讓我們改變RPC的行為,比如超時(shí)/取消一個(gè)正在運(yùn)行的RPC
	res, err := grpcClient.Route(context.Background(), &req)
	if err != nil {
		log.Fatalf("Call Route err: %v", err)
	}
	// 打印返回值
	log.Println(res)
}

運(yùn)行客戶(hù)端

go run client.go
code:200 value:"hello grpc"

成功調(diào)用Server端的Route方法并獲取返回的數(shù)據(jù)。

總結(jié)

本篇介紹了簡(jiǎn)單RPC模式,客戶(hù)端發(fā)起請(qǐng)求并等待服務(wù)端響應(yīng)。

教程源碼地址:https://github.com/Bingjian-Zhu/go-grpc-example

參考:gRPC官方文檔中文版

更多關(guān)于Go gRPC教程Simple RPC的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • golang中sync.Map并發(fā)創(chuàng)建、讀取問(wèn)題實(shí)戰(zhàn)記錄

    golang中sync.Map并發(fā)創(chuàng)建、讀取問(wèn)題實(shí)戰(zhàn)記錄

    這篇文章主要給大家介紹了關(guān)于golang中sync.Map并發(fā)創(chuàng)建、讀取問(wèn)題的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • Golang中的Slice與數(shù)組及區(qū)別詳解

    Golang中的Slice與數(shù)組及區(qū)別詳解

    數(shù)組是一種具有固定長(zhǎng)度的基本數(shù)據(jù)結(jié)構(gòu),在golang中與C語(yǔ)言一樣數(shù)組一旦創(chuàng)建了它的長(zhǎng)度就不允許改變,數(shù)組的空余位置用0填補(bǔ),不允許數(shù)組越界。今天小編通過(guò)實(shí)例代碼操作給大家詳細(xì)介紹lang中的Slice與數(shù)組的相關(guān)知識(shí),一起看看吧
    2020-02-02
  • Go語(yǔ)言LeetCode題解682棒球比賽

    Go語(yǔ)言LeetCode題解682棒球比賽

    這篇文章主要為大家介紹了Go語(yǔ)言LeetCode題解682棒球比賽示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • OpenTelemetry-go的SDK使用方法詳解

    OpenTelemetry-go的SDK使用方法詳解

    這篇文章主要介紹了OpenTelemetry-go的SDK使用方法,OpenTelemetry幫我們實(shí)現(xiàn)了相應(yīng)語(yǔ)言的SDK,所以我們只需要進(jìn)行調(diào)用即可,本文根據(jù)官方文檔實(shí)例講解,需要的朋友可以參考下
    2022-09-09
  • 關(guān)于golang監(jiān)聽(tīng)rabbitmq消息隊(duì)列任務(wù)斷線自動(dòng)重連接的問(wèn)題

    關(guān)于golang監(jiān)聽(tīng)rabbitmq消息隊(duì)列任務(wù)斷線自動(dòng)重連接的問(wèn)題

    這篇文章主要介紹了golang監(jiān)聽(tīng)rabbitmq消息隊(duì)列任務(wù)斷線自動(dòng)重連接,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • Go項(xiàng)目在linux服務(wù)器的部署詳細(xì)步驟

    Go項(xiàng)目在linux服務(wù)器的部署詳細(xì)步驟

    在今天的軟件開(kāi)發(fā)中,使用Linux作為操作系統(tǒng)的比例越來(lái)越高,而Golang語(yǔ)言則因?yàn)槠涓咝А⒑?jiǎn)潔和并發(fā)性能等特點(diǎn),也被越來(lái)越多的開(kāi)發(fā)者所青睞,這篇文章主要給大家介紹了關(guān)于Go項(xiàng)目在linux服務(wù)器的部署詳細(xì)步驟,需要的朋友可以參考下
    2023-09-09
  • Go語(yǔ)言中嵌入C語(yǔ)言的方法

    Go語(yǔ)言中嵌入C語(yǔ)言的方法

    這篇文章主要介紹了Go語(yǔ)言中嵌入C語(yǔ)言的方法,實(shí)例分析了Go語(yǔ)言中cgo工具的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • 淺談Golang?Slice切片如何擴(kuò)容的實(shí)現(xiàn)

    淺談Golang?Slice切片如何擴(kuò)容的實(shí)現(xiàn)

    本文主要介紹了淺談Golang?Slice切片如何擴(kuò)容的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • golang?RPC包原理和使用詳細(xì)介紹

    golang?RPC包原理和使用詳細(xì)介紹

    golang的rpc支持三個(gè)級(jí)別的RPC:TCP、HTTP、JSONRPC。但Go的RPC包是獨(dú)一無(wú)二的RPC,它和傳統(tǒng)的RPC系統(tǒng)不同,它只支持Go開(kāi)發(fā)的服務(wù)器與客戶(hù)端之間的交互,因?yàn)樵趦?nèi)部,它們采用了Gob來(lái)編碼
    2022-09-09
  • go語(yǔ)言分布式id生成器及分布式鎖介紹

    go語(yǔ)言分布式id生成器及分布式鎖介紹

    這篇文章主要為大家介紹了go語(yǔ)言分布式id生成器及分布式鎖介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04

最新評(píng)論

花垣县| 陆川县| 田林县| 修文县| 化隆| 伊春市| 利辛县| 武义县| 文水县| 武强县| 澜沧| 宾川县| 汉寿县| 上栗县| 松江区| 当雄县| 玉溪市| 广州市| 外汇| 龙川县| 清河县| 通海县| 浮山县| 彭州市| 新巴尔虎左旗| 永济市| 德昌县| 沙田区| 南澳县| 噶尔县| 宁国市| 茌平县| 德保县| 松潘县| 巴林左旗| 老河口市| 博罗县| 江孜县| 邯郸市| 晋城| 祁东县|