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

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

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

前言

gRPC主要有4種請求和響應模式,分別是簡單模式(Simple RPC)、服務端流式(Server-side streaming RPC)、客戶端流式(Client-side streaming RPC)、和雙向流式(Bidirectional streaming RPC)。

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

本篇文章先介紹簡單模式。

新建proto文件

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

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

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

2.定義響應信息

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

3.定義服務方法Route

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

4.編譯proto文件

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

指令編譯方法,進入simple.proto文件所在目錄,運行:

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

創(chuàng)建Server端

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

import (
	"context"
	"log"
	"net"
	"google.golang.org/grpc"
	pb "go-grpc-example/proto"
)
// SimpleService 定義我們的服務
type SimpleService struct{}
// Route 實現(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é)束超時或取消的請求。更具體的說請參考該文章

2.啟動gRPC服務器

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

里面每個方法的作用都有注釋,這里就不解析了。
運行服務端

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() {
	// 連接服務器
	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é)構體
	req := pb.SimpleRequest{
		Data: "grpc",
	}
	// 調(diào)用我們的服務(Route方法)
	// 同時傳入了一個 context.Context ,在有需要時可以讓我們改變RPC的行為,比如超時/取消一個正在運行的RPC
	res, err := grpcClient.Route(context.Background(), &req)
	if err != nil {
		log.Fatalf("Call Route err: %v", err)
	}
	// 打印返回值
	log.Println(res)
}

運行客戶端

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

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

總結(jié)

本篇介紹了簡單RPC模式,客戶端發(fā)起請求并等待服務端響應。

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

參考:gRPC官方文檔中文版

更多關于Go gRPC教程Simple RPC的資料請關注腳本之家其它相關文章!

相關文章

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

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

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

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

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

    Go語言LeetCode題解682棒球比賽

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

    OpenTelemetry-go的SDK使用方法詳解

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

    關于golang監(jiān)聽rabbitmq消息隊列任務斷線自動重連接的問題

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

    Go項目在linux服務器的部署詳細步驟

    在今天的軟件開發(fā)中,使用Linux作為操作系統(tǒng)的比例越來越高,而Golang語言則因為其高效、簡潔和并發(fā)性能等特點,也被越來越多的開發(fā)者所青睞,這篇文章主要給大家介紹了關于Go項目在linux服務器的部署詳細步驟,需要的朋友可以參考下
    2023-09-09
  • Go語言中嵌入C語言的方法

    Go語言中嵌入C語言的方法

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

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

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

    golang?RPC包原理和使用詳細介紹

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

    go語言分布式id生成器及分布式鎖介紹

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

最新評論

扎鲁特旗| 通州区| 安多县| 芦溪县| 义马市| 右玉县| 天全县| 车致| 华宁县| 垦利县| 赤城县| 建阳市| 云和县| 潜江市| 津南区| 泰顺县| 卫辉市| 夏邑县| 通城县| 广饶县| 凤阳县| 宿迁市| 景谷| 额济纳旗| 临猗县| 台北市| 奇台县| 临城县| 洛南县| 荣昌县| 仁寿县| 杭锦旗| 扶绥县| 临江市| 平武县| 磐石市| 龙门县| 虎林市| 石棉县| 墨竹工卡县| 宿迁市|