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

Go語言實現(xiàn)開發(fā)一個簡單的gRPC Demo

 更新時間:2023年07月16日 11:08:02   作者:不背鍋運維  
這篇文章主要為大家詳細介紹了如何利用Go語言實現(xiàn)開發(fā)一個簡單的gRPC Demo,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起了解一下

Part1先決條件

獲得并安裝好Golang(https://go.dev/doc/install

Protocol buffer compiler(protobuf編譯器), protoc version 3(protoc工具版本建議為3版本),獲得并安裝:https://github.com/protocolbuffers/protobuf/releases

安裝protocol編譯器的Go插件

go?install?google.golang.org/protobuf/cmd/protoc-gen-go@v1.28
go?install?google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.2

Part2開發(fā)環(huán)境準備

準備go環(huán)境

wget?https://go.dev/dl/go1.20.5.linux-amd64.tar.gz
tar?-zxf?go1.20.5.linux-amd64.tar.gz
mv?go?/usr/local/

安裝protobuf編譯器protoc

wget?https://github.com/protocolbuffers/protobuf/releases/download/v23.4/protoc-23.4-linux-x86_64.zip
mkdir?protoc-23.4
mv?protoc-23.4-linux-x86_64.zip
cd?protoc-23.4
unzip?protoc-23.4-linux-x86_64.zip
rm?-rf?protoc-23.4-linux-x86_64.zip
cd?..
mv?protoc-23.4?/usr/local/

添加相關(guān)環(huán)境變量

export?GOROOT="/usr/local/go"
export?GOPATH="/home/tantianran/goCode"
export?GOPROXY="https://goproxy.cn,direct"
export?GO111MODULE="on"
export?PATH=$PATH:$GOROOT/bin:$GOPATH:$GOPATH/bin
export?PROTOC_HOME=/usr/local/protoc-23.4
export?PATH=$PATH:$PROTOC_HOME/bin

Part3實戰(zhàn):開發(fā)一個簡單的gRPC Demo

1.創(chuàng)建user-service模塊

tantianran@go-dev:~/goCode/src$?mkdir?user-service
tantianran@go-dev:~/goCode/src$?cd?user-service/
tantianran@go-dev:~/goCode/src/user-service$?go?mod?init

2.使用protobuf idl語言定義服務(wù)接口

創(chuàng)建service包

tantianran@go-dev:~/goCode/src/user-service$?mkdir?service
tantianran@go-dev:~/goCode/src/user-service$?cd?service/

service/users.proto內(nèi)容:

syntax = "proto3";
option go_package = "user-service/service";
// 服務(wù)和方法
service Users {
    rpc GetUser (UserGetRequest) returns (UserGetReply) {}
}
// 請求消息
message UserGetRequest {
    string email = 1;
    int32 id = 2;
}
// 響應(yīng)消息
message User {
    string id = 1;
    string first_name = 2;
    string last_name = 3;
    int32 age = 4;
}
message UserGetReply {
    User user = 1; // 嵌套
}

3.生成客戶端和服務(wù)端代碼

首先安裝用于編譯器的go語言插件protoc-gen-go

go?install?google.golang.org/protobuf/cmd/protoc-gen-go@latest

開始生成

tantianran@go-dev:~/goCode/src/user-service/service$?protoc?--go_out=.?--go_opt=paths=source_relative?--go-grpc_out=.?--go-grpc_opt=paths=source_relative?users.proto
tantianran@go-dev:~/goCode/src/user-service/service$?ls?-l
total?24
-rw-rw-r--?1?tantianran?tantianran???37?Jul?11?10:05?go.mod
-rw-rw-r--?1?tantianran?tantianran?3387?Jul?11?10:10?users_grpc.pb.go
-rw-rw-r--?1?tantianran?tantianran?8984?Jul?11?10:10?users.pb.go
-rw-rw-r--?1?tantianran?tantianran??362?Jul?11?10:09?users.proto

4.編寫服務(wù)器

創(chuàng)建server包

tantianran@go-dev:~/goCode/src$?cd?user-service/
tantianran@go-dev:~/goCode/src/user-service$?mkdir?server
tantianran@go-dev:~/goCode/src/user-service$?cd?server/

server/server.go

package?main
import?(
?"context"
?"log"
?"net"
?"os"
?users?"user-service/service"?//?導入之前生成的包
?"google.golang.org/grpc"
)
//?userService類型是Users服務(wù)的服務(wù)處理程序
type?userService?struct?{
?users.UnimplementedUsersServer?//?這個字段對于gRPC中的任何服務(wù)實現(xiàn)都是強制性的
}
func?(s?*userService)?GetUser(ctx?context.Context,?in?*users.UserGetRequest)?(*users.UserGetReply,?error)?{
?//?打印客戶端傳過來的數(shù)據(jù)
?log.Printf("已接收到郵件地址:?%s,?還有ID:?%d",?in.Email,?in.Id)
?//?自定義數(shù)據(jù)響應(yīng)給客戶端
?u?:=?users.User{
??Id:????????"user-782935",
??FirstName:?"tan",
??LastName:??"tianran",
??Age:???????30,
?}
?return?&users.UserGetReply{User:?&u},?nil
}
//?向gRPC服務(wù)器注冊Users服務(wù)
func?registerServices(s?*grpc.Server)?{
?users.RegisterUsersServer(s,?&userService{})
}
//?啟動gRPC服務(wù)器
func?startServer(s?*grpc.Server,?l?net.Listener)?error?{
?return?s.Serve(l)
}
func?main()?{
?listenAddr?:=?os.Getenv("LISTEN_ADDR")
?if?len(listenAddr)?==?0?{
??listenAddr?=?":50051"
?}
?lis,?err?:=?net.Listen("tcp",?listenAddr)
?if?err?!=?nil?{
??log.Fatal(err)
?}
?s?:=?grpc.NewServer()
?registerServices(s)
?log.Fatal(startServer(s,?lis))
}

5.編寫客戶端

tantianran@go-dev:~/goCode/src$?cd?user-service/
tantianran@go-dev:~/goCode/src/user-service$?mkdir?client/
tantianran@go-dev:~/goCode/src/user-service$?cd?client/

client/main.go

package?main
import?(
?"context"
?"log"
?"os"
?users?"user-service/service"?//?導入之前生成的包
?"google.golang.org/grpc"
)
//?建立與服務(wù)器的連接(通道)
func?setupGrpcConnection(addr?string)?(*grpc.ClientConn,?error)?{
?return?grpc.DialContext(
??context.Background(),
??addr,
??grpc.WithInsecure(),
??grpc.WithBlock(),
?)
}
//?創(chuàng)建客戶端與Users服務(wù)通信
func?getUserServiceClient(conn?*grpc.ClientConn)?users.UsersClient?{
?return?users.NewUsersClient(conn)
}
//?調(diào)用Users服務(wù)中的GetUser()方法
func?getUser(client?users.UsersClient,?u?*users.UserGetRequest)?(*users.UserGetReply,?error)?{
?return?client.GetUser(context.Background(),?u)
}
func?main()?{
?if?len(os.Args)?!=?2?{
??log.Fatal("缺少gRPC服務(wù)器地址")
?}
?conn,?err?:=?setupGrpcConnection(os.Args[1])
?if?err?!=?nil?{
??log.Fatal(err)
?}
?defer?conn.Close()
?c?:=?getUserServiceClient(conn)
?result,?err?:=?getUser(c,?&users.UserGetRequest{
??Email:?"tantianran@qq.com",
??Id:????801896,
?})
?if?err?!=?nil?{
??log.Fatal(err)
?}
?//?打印響應(yīng)
?log.Printf("收到響應(yīng):?%s?%s?%s?%d\n",?result.User.Id,?result.User.FirstName,?result.User.LastName,?result.User.Age)
}

Part4驗證效果

服務(wù)器

tantianran@go-dev:~/goCode/src/user-service/server$ go run server.go
2023/07/12 00:59:01 已接收到郵件地址: tantianran@qq.com, 還有ID: 801896

客戶端

tantianran@go-dev:~/goCode/src/user-service/client$ go run main.go localhost:50051
2023/07/12 00:59:01 收到響應(yīng): user-782935 tan tianran 30

以上就是Go語言實現(xiàn)開發(fā)一個簡單的gRPC Demo的詳細內(nèi)容,更多關(guān)于Go gRPC的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • GO語言協(xié)程創(chuàng)建使用并通過channel解決資源競爭

    GO語言協(xié)程創(chuàng)建使用并通過channel解決資源競爭

    這篇文章主要為大家介紹了GO語言協(xié)程創(chuàng)建使用并通過channel解決資源競爭,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-04-04
  • golang?xorm?自定義日志記錄器之使用zap實現(xiàn)日志輸出、切割日志(最新)

    golang?xorm?自定義日志記錄器之使用zap實現(xiàn)日志輸出、切割日志(最新)

    這篇文章主要介紹了golang?xorm?自定義日志記錄器,使用zap實現(xiàn)日志輸出、切割日志,包括連接postgresql數(shù)據(jù)庫的操作方法及?zap日志工具?,本文結(jié)合實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-10-10
  • Go使用Google?Gemini?Pro?API創(chuàng)建簡單聊天機器人

    Go使用Google?Gemini?Pro?API創(chuàng)建簡單聊天機器人

    這篇文章主要為大家介紹了Go使用Google?Gemini?Pro?API創(chuàng)建簡單聊天機器人實現(xiàn)過程詳解,本文將通過最新的gemini?go?sdk來實現(xiàn)命令行聊天機器人
    2023-12-12
  • golang 各種排序大比拼實例

    golang 各種排序大比拼實例

    這篇文章主要介紹了golang 各種排序大比拼實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 淺析Go設(shè)計模式之Facade(外觀)模式

    淺析Go設(shè)計模式之Facade(外觀)模式

    本文將介紹外觀模式的概念、結(jié)構(gòu)和工作原理,并提供一些在Go中實現(xiàn)外觀模式的示例代碼,通過使用外觀模式,可以降低代碼的耦合度,提高代碼的可維護性和可讀性,需要的朋友可以參考下
    2023-05-05
  • GoFrame框架gredis優(yōu)雅的取值和類型轉(zhuǎn)換

    GoFrame框架gredis優(yōu)雅的取值和類型轉(zhuǎn)換

    這篇文章主要為大家介紹了GoFrame框架gredis優(yōu)雅的取值和類型轉(zhuǎn)換,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • Golang中panic的實現(xiàn)示例

    Golang中panic的實現(xiàn)示例

    這篇文章主要介紹了Golang中panic的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-06-06
  • 手把手帶你走進Go語言之循環(huán)語句

    手把手帶你走進Go語言之循環(huán)語句

    在不少實際問題中有許多具有規(guī)律性的重復操作,因此在程序中就需要重復執(zhí)行某些語句。一組被重復執(zhí)行的語句稱之為循環(huán)體,能否繼續(xù)重復,決定循環(huán)的終止條件,本文給大家介紹的非常詳細,跟著小編往下看吧
    2021-09-09
  • go使用makefile腳本編譯應(yīng)用的方法小結(jié)

    go使用makefile腳本編譯應(yīng)用的方法小結(jié)

    makefile可以看作是make工具的腳本文件, 而make主要用來處理一系列命令。常用的比如用來編譯和打包文件, 在C/C++的編譯打包中應(yīng)用最廣泛了,這篇文章主要介紹了go使用makefile腳本編譯應(yīng)用,需要的朋友可以參考下
    2022-08-08
  • Golang中基于HTTP協(xié)議的網(wǎng)絡(luò)服務(wù)

    Golang中基于HTTP協(xié)議的網(wǎng)絡(luò)服務(wù)

    HTTP協(xié)議是基于TCP/IP協(xié)議棧的,并且它也是一個面向普通文本的協(xié)議。這篇文章主要詳細介紹了Golang中基于HTTP協(xié)議的網(wǎng)絡(luò)服務(wù),感興趣的小伙伴可以借鑒一下
    2023-04-04

最新評論

西华县| 惠安县| 柏乡县| 河间市| 太仓市| 和林格尔县| 垦利县| 威宁| 奈曼旗| 塘沽区| 青川县| 含山县| 肇东市| 新闻| 沙洋县| 南开区| 河池市| 温州市| 大竹县| 双城市| 江安县| 漾濞| 二连浩特市| 鄯善县| 迭部县| 龙游县| 城口县| 高安市| 镇江市| 准格尔旗| 金寨县| 鹰潭市| 九江县| 合肥市| 迁西县| 红河县| 晴隆县| 昭苏县| 治多县| 渝中区| 读书|