成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Golang 語言編寫 gRPC 實戰項目

開發 前端
本文我們介紹怎么使用 grpc 開發“分布式系統”。這里使用引號是因為分布式系統是一個大概念,本文我們先介紹使用 grpc 開發分布式系統中的 service。

 [[425759]]

1、介紹

在之前的幾篇文章中,我們介紹了 protobuf 和 grpc,本文我們介紹怎么使用 grpc 開發“分布式系統”。這里使用引號是因為分布式系統是一個大概念,本文我們先介紹使用 grpc 開發分布式系統中的 service。

grpc 是 google 開源的 rpc 框架,使用 grpc 可以方便開發 rpc service;protobuf 是一種接口設計語言(IDL),grpc 框架使用的 IDL 是 protobuf。如果有讀者朋友還不了解 protobuf 和 grpc,建議先翻閱之前的幾篇文章。

本文是介紹使用 grpc 開發一個實戰項目 - ToDoList,目標是幫助讀者朋友們熟悉項目開發流程,該實戰項目包含 server service 和 client service。server 主要負責數據操作,client 主要負責業務邏輯處理。

2、server

首先,我們創建 proto 目錄,并創建 proto 文件,編寫 protobuf,設計項目的 service,接著創建 pb 目錄,使用 protoc 編譯我們編寫好的 proto 文件,生成 pb 文件。然后,我們創建 service 目錄,編寫生成的 pb 文件中接口定義的方法。最后,我們創建 grpc 服務器。

server 目錄

  1. ├── dao 
  2. │   ├── mysql.go 
  3. │   └── toDoList.go 
  4. ├── main.go 
  5. ├── pb 
  6. │   ├── todoPb 
  7. │   │   ├── toDoList.pb.go 
  8. │   │   └── toDoList_grpc.pb.go 
  9. │   └── userPb 
  10. │       ├── user.pb.go 
  11. │       └── user_grpc.pb.go 
  12. ├── proto 
  13. │   ├── toDoList.proto 
  14. │   └── user.proto 
  15. └── service 
  16.     └── toDoList.go 

編寫 proto 文件

讀者朋友們如果還不熟悉 protobuf,建議翻閱之前介紹 protobuf 的文章,限于篇幅,本文不再贅述。示例代碼如下:

  1. syntax = "proto3"
  2.  
  3. option go_package = "./todoPb"
  4.  
  5. service ToDoList { 
  6.   rpc CreateToDoList (ToDoListDetail) returns (CreateToDoListResult) {} 
  7.   rpc ReadToDoList (ToDoListPage) returns (ReadToDoListByPage) {} 
  8.  
  9. message ToDoListDetail { 
  10.   // @inject_tag: form:"id" xorm:"'id' not null pk autoincr" 
  11.   int64 id = 1
  12.  
  13. ... 

完整代碼,請查閱 github。

生成 pb 文件

接著,我們使用 protoc 編譯 proto 文件,生成 pb 文件,關于怎么使用 protoc 編譯 proto 文件,在之前的文章已經詳細介紹,限于篇幅,本文不再贅述,編譯命令如下:

  1. protoc --go_out=./pb --go-grpc_out=./pb proto/* && protoc-go-inject-tag -XXX_skip=xorm -input=./pb/todoPb/toDoList.pb.go 

執行以上命令,將在 pb 目錄中自動生成 pb 文件。

編寫接口定義的方法

至此,我們開始編寫 golang 代碼,在 service 目錄中創建 go 文件,實現生成的 pb 文件中接口定義的方法。

  1. ... 
  2.  
  3. type ToDoList struct { 
  4.  pb.UnimplementedToDoListServer 
  5.  
  6. func (t *ToDoList) CreateToDoList(ctx context.Context, in *pb.ToDoListDetail) (*pb.CreateToDoListResult, error) { 
  7.  log.Printf("id: %d content:%v datetime:%d\n", in.GetId(), in.GetContent(), in.GetDatetime()) 
  8.  record, err := dao.Add(ctx, in) 
  9.  data := &pb.CreateToDoListResult{Record: record} 
  10.  return data, err 
  11.  
  12. ... 

閱讀上面這段代碼,可以發現我們把數據庫操作相關代碼設計在 dao 包中。service 中通過調用 dao 包的方法操作數據庫,另外,其他數據操作組件也可以在 service 中調用。

完整代碼,請查閱 github。

創建 gRPC 服務器

在完成 service 代碼編寫之后,我們創建 grpc server,然后注冊服務。

  1. ... 
  2.  
  3. server := grpc.NewServer() 
  4.  pb.RegisterToDoListServer(server, new(service.ToDoList)) 
  5.  
  6. ... 

完整代碼,請查閱 github。

以上就是使用 grpc 創建 rpc service 的一般流程,在生產環境項目中,還需要完善一些公共方法,比如配置文件讀取、錯誤碼定義、參數驗證等。為了讀者朋友們容易理解,該實戰項目中未涉及這部分內容,感興趣的讀者朋友們可以嘗試自己實現該部分內容。

3、client

client 主要負責業務邏輯,本文介紹的實戰項目使用 gin 框架實現路由。通常,client service 的 pb 文件拷貝 server service 生成的 pb 文件。

首先,我們創建 controller 目錄,調用 server service 的方法,然后,使用 gin 框架設計路由。

client 目錄

  1. ├── controller 
  2. │   └── toDoList.go 
  3. ├── main.go 
  4. ├── pb 
  5. │   ├── todoPb 
  6. │   │   ├── toDoList.pb.go 
  7. │   │   └── toDoList_grpc.pb.go 
  8. │   └── userPb 
  9. │       ├── user.pb.go 
  10. │       └── user_grpc.pb.go 
  11. └── router 
  12.     └── router.go 

拷貝 server service 生成的 pb 文件

client 直接拷貝 server service 生成的 pb 文件,不需要編寫 proto 文件,然后使用 protoc 編譯 proto 文件,生成 pb 文件。

編寫 controller 代碼,調用 server service 的方法

在 controller 目錄中創建 go 文件,編寫 controller 方法,并創建客戶端,使用創建的客戶端調用 server service 的方法。

  1. func CreateToDoList(ctx *gin.Context) { 
  2.  
  3. ... 
  4.  
  5. cc := NewToDoListClient() 
  6.  defer func() { 
  7.   err := cc.Close() 
  8.   if err != nil { 
  9.    log.Fatalf("conn close error=%v", err) 
  10.   } 
  11.  }() 
  12.  cli := pb.NewToDoListClient(cc) 
  13.  ctx1, cancel := context.WithTimeout(context.Background(), time.Second) 
  14.  defer cancel() 
  15.  res, err := cli.CreateToDoList(ctx1, param) 
  16.    
  17. ... 

完整代碼,請查閱 github。

創建 gin 路由

編寫完 controller 之后,創建 router 目錄,在 router 目錄中創建 gin 路由,用于訪問 controller 中的方法。

  1. ... 
  2.  
  3. r := gin.Default() 
  4.  apiV1 := r.Group("/v1"
  5.  todolist := apiV1.Group("/todolist"
  6.  { 
  7.   todolist.POST("/add", controller.CreateToDoList) 
  8.  
  9. ... 

完整代碼,請查閱 github。

4、總結

本文我們介紹了怎么使用 grpc 開發 service。讀者朋友們閱讀完本文,可以了解使用 grpc 開發 service 的一般開發流程,建議感興趣的讀者朋友們,實現項目中 user service 的代碼編寫。

 

責任編輯:張燕妮 來源: Golang語言開發棧
相關推薦

2021-09-13 05:02:49

GogRPC語言

2021-09-01 23:29:37

Golang語言gRPC

2021-10-10 23:02:49

Golang語言代碼

2022-02-20 23:15:46

gRPCGolang語言

2025-01-13 06:00:00

Go語言gRPC

2023-03-01 08:33:37

gRPC健康檢查代碼

2022-04-29 11:52:02

API代碼HTTP

2024-09-04 08:09:51

2021-06-09 23:36:46

Golang語言版本

2021-05-28 08:58:41

Golang網卡metrics

2018-08-01 15:10:02

GolangPython語言

2021-12-05 23:14:24

微服務GolanggRPC

2021-10-26 09:26:21

編程技能開發

2021-12-13 01:24:14

語言Golang panic

2021-06-29 23:40:19

Golang語言并發

2023-09-06 07:17:57

2020-11-01 17:13:22

DotNET 5語言gRPC

2021-11-08 23:09:07

Go排序數據

2021-12-27 03:36:09

語言For Golang

2021-08-03 09:07:39

GolangGrpc服務
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩欧美成人一区二区三区 | 日韩中文字幕第一页 | av日韩高清 | 国产一区二区影院 | 久久亚洲一区二区三区四区 | 成人性生交大片免费看中文带字幕 | 亚洲精品自在在线观看 | 欧美自拍日韩 | 国产精品一区二区在线观看 | 亚洲日本一区二区三区四区 | www.亚洲区 | 久久久成人网 | 国产激情视频在线免费观看 | 天天干天天爱天天爽 | 天天干天天色 | 国产99久久 | 中文字幕 在线观看 | 日本三级在线 | 国产免费又黄又爽又刺激蜜月al | 日韩欧美国产精品 | 欧美 中文字幕 | 超碰一区二区 | 中文字幕在线第二页 | 久久在视频 | 久久国产激情视频 | 国产精品久久久久久网站 | 日本不卡一区 | 1级黄色大片 | 欧美成人性生活 | 亚洲成人精品在线 | av一区在线观看 | 91精品久久久久久久久久入口 | 日韩视频免费在线 | 欧美日韩亚| a级片在线观看 | 久久亚洲国产精品 | 亚洲综合天堂网 | 在线观看视频亚洲 | 亚洲男人的天堂网站 | 桃色五月 | 黄色一级大片在线观看 |