自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

從0到1:帶你完整寫一個 Golang Grpc 服務(wù)

開發(fā) 后端
在 $GOPATH/src 下新建 iswbm.com 目錄及三個子目錄(client,server,proto),在終端上進(jìn)入該目錄,執(zhí)行如下命令創(chuàng)建 go.mod。

# 1. 環(huán)境準(zhǔn)備

第一步:安裝 protoc

前往 protobuf,下載最新版的 protoc ,我下載的是 win 64

第二步:安裝 protoc-gen-go

前往 protobuf-go ,同樣下載最新版的 protoc,同樣下載的是 win 64

將下載后的 protoc.exe 和 protoc-gen-go 放到 %GOPATH%\bin\ 目錄下。

或者更簡單的方法,直接執(zhí)行如下命令就可以安裝

  1. go install google.golang.org/grpc/cmd/protoc-gen-go-grpc 

第三步:下載 grpc

  1. # 安裝 grpc  
  2. go get -u google.golang.org/grpc 
  3.  
  4. # gRPC運(yùn)行時接口編解碼支持庫 
  5. go get -u github.com/golang/protobuf/proto  

# 2. 項(xiàng)目目錄結(jié)構(gòu)

在 $GOPATH/src 下新建 iswbm.com 目錄及三個子目錄(client,server,proto),在終端上進(jìn)入該目錄,執(zhí)行如下命令創(chuàng)建 go.mod

  1. mkdir $GOPATH/src/iswbm.com/{client,server,proto} 
  2. cd mkdir $GOPATH/src/iswbm.com/ 
  3.  
  4. # 設(shè)置環(huán)境變量,確保 GO111MODULE 是開啟的 
  5. go env -w GO111MODULE=auto 
  6.  
  7. # 初始化項(xiàng)目 
  8. go mod init 

# 3. 編寫 proto 文件

編寫 proto/simple.proto

  1. syntax = "proto3"
  2.  
  3. package proto; 
  4. option go_package ="/proto"
  5.  
  6. // 定義發(fā)送請求信息 
  7. message SimpleRequest{ 
  8.   // 參數(shù)類型 參數(shù)名稱 標(biāo)識號 
  9.   string data = 1; 
  10.  
  11. // 定義響應(yīng)信息 
  12. message SimpleResponse{ 
  13.   int32 code = 1; 
  14.   string value = 2; 
  15.  
  16. // 定義我們的服務(wù)(可以定義多個服務(wù),每個服務(wù)可以定義多個接口) 
  17. service Simple{ 
  18.   rpc GetSimpleInfo(SimpleRequest) returns (SimpleResponse){}; 

在 iswbm.com 目錄下,執(zhí)行如下命令

  1. protoc --go_out=. ./proto/simple.proto 
  2. protoc --go-grpc_out=. ./proto/simple.proto 

完成后,會在當(dāng)前目錄下生成一個 simple 目錄,該目錄下有一個 simple.pb.go 和 simple_grpc.pb.go

# 4. 編寫 server.go

  1. package main 
  2.  
  3. import ( 
  4.     "context" 
  5.     pb "iswbm.com/proto" 
  6.     "google.golang.org/grpc" 
  7.     "log" 
  8.     "net" 
  9.  
  10. const ( 
  11.     Address string = ":8000" 
  12.     Network string = "tcp" 
  13.  
  14. // 定義我們的服務(wù) 
  15. type SimpleService struct{ 
  16.     pb.UnimplementedSimpleServer 
  17.  
  18. // 實(shí)現(xiàn) GetSimpleInfo 方法 
  19. func (s *SimpleService) GetSimpleInfo(ctx context.Context, req *pb.SimpleRequest) (*pb.SimpleResponse, error) { 
  20.     data := req.Data 
  21.     log.Println("get from client: ", data) 
  22.     resp := &pb.SimpleResponse{ 
  23.         Code:  8888, 
  24.         Value: "grpc"
  25.     } 
  26.     return resp, nil 
  27.  
  28. func main() { 
  29.  
  30.     // 1.監(jiān)聽端口 
  31.     listener, err := net.Listen(Network, Address) 
  32.     if err != nil { 
  33.         log.Fatalf("net.listen err: %v", err) 
  34.     } 
  35.     log.Println(Address, " net listening..."
  36.     // 2.實(shí)例化gRPC服務(wù)端 
  37.     grpcServer := grpc.NewServer() 
  38.  
  39.     // 3.注冊我們實(shí)現(xiàn)的服務(wù) SimpleService 
  40.     pb.RegisterSimpleServer(grpcServer, &SimpleService{}) 
  41.  
  42.     // 4.啟動gRPC服務(wù)端 
  43.     err = grpcServer.Serve(listener) 
  44.     if err != nil { 
  45.         log.Fatalf("grpc server err: %v",err) 
  46.     } 
  47.  

完成后,先安裝依賴包

  1. go install 

執(zhí)行如下命令運(yùn)行服務(wù)端

  1. > go run server/server.go 
  2. 2021/07/28 18:31:42 :8000  net listening... 

# 5. 編寫 client.go

  1. package main 
  2.  
  3. import ( 
  4.     "context" 
  5.     "google.golang.org/grpc" 
  6.     "log" 
  7.     pb "iswbm.com/proto" 
  8.  
  9. const ( 
  10.     Address string = ":8000" 
  11.  
  12. func main() { 
  13.     // 1.創(chuàng)建于gRPC服務(wù)端的連接 
  14.     conn, err := grpc.Dial(Address, grpc.WithInsecure()) 
  15.     if err != nil { 
  16.         log.Fatalf("dial conn err: %v", err) 
  17.     } 
  18.     defer conn.Close() 
  19.  
  20.     // 2.創(chuàng)建grpc客戶端 
  21.     client := pb.NewSimpleClient(conn) 
  22.  
  23.     // 3.調(diào)用服務(wù)端提供的服務(wù) 
  24.     req := pb.SimpleRequest{ 
  25.         Data: "Hello,Server"
  26.     } 
  27.     resp, err := client.GetSimpleInfo(context.Background(), &req) 
  28.     if err != nil { 
  29.         log.Fatalf("resp err: %v", err) 
  30.     } 
  31.     log.Printf("get from server,code: %v,value: %v", resp.Code, resp.Value) 
  32.  

執(zhí)行如下命令運(yùn)行,立馬就能收到來自 server 返回的消息

  1. > go run client/client.go 
  2. 2021/07/28 18:54:35 get from server,code: 8888,value: grpc 

同時,在 server 端也會打印來自 client 端的消息

  1. > go run server/server.go 
  2. 2021/07/28 18:51:59 :8000  net listening... 
  3. 2021/07/28 18:54:35 get from client:  Hello,Server 
本文轉(zhuǎn)載自微信公眾號「Go編程時光」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系Go編程時光公眾號。

 

責(zé)任編輯:武曉燕 來源: Go編程時光
相關(guān)推薦

2017-06-27 09:26:53

運(yùn)維app開發(fā)

2021-03-10 09:52:38

開發(fā)技能架構(gòu)

2019-10-22 08:12:49

消息隊(duì)列分布式系統(tǒng)

2022-09-19 08:07:28

Goweb 程序

2019-10-29 15:46:07

區(qū)塊鏈區(qū)塊鏈技術(shù)

2022-06-10 14:52:46

開源項(xiàng)目字節(jié)跳動

2023-10-16 22:03:36

日志包多線程日志包

2016-11-28 16:23:23

戴爾

2022-05-09 08:35:43

面試產(chǎn)品互聯(lián)網(wǎng)

2020-02-25 22:00:22

機(jī)器人人工智能系統(tǒng)

2021-02-04 08:11:25

Redis集群架構(gòu)

2021-07-01 07:03:32

開發(fā)Webpack代碼

2021-03-10 09:21:00

Spring開源框架Spring基礎(chǔ)知識

2023-03-06 11:35:55

經(jīng)營分析體系

2017-05-25 12:40:06

SOA微服務(wù)系統(tǒng)

2021-01-26 05:13:12

錕斤拷String 二進(jìn)制

2021-10-03 22:06:43

LinuxTar軟件

2023-03-05 23:11:07

Go語言服務(wù)

2020-04-07 15:12:07

微服務(wù)架構(gòu)數(shù)據(jù)

2021-01-27 07:24:38

TypeScript工具Java
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號