## 理解GRPC的使用
GRPC是一個使用[緩沖協議](https://developers.google.com/protocol-buffers)和[HTTP/2](https://http2.github.io/)構建的高性能RPC框架。在Go中創建GRPC客戶端與使用Go HTTP客戶端有很多相同的復雜性。
為了演示基本的客戶端使用情況,最簡單的方法是實現一個服務器。這個配方將創建一個歡迎服務,它接受問候和名稱并返回歡迎語句。
本文不會探討有關GRPC的一些細節,例如流媒體。
### 實踐
1. 安裝第三方庫:
安裝GRPC
https://github.com/grpc/grpc/blob/master/INSTALL.md.
```
go get github.com/golang/protobuf/proto
go get github.com/golang/protobuf/protoc-gen-go
```
2. 建立 greeter.proto:
```
syntax = "proto3";
package greeter;
service GreeterService{
rpc Greet(GreetRequest) returns (GreetResponse) {}
}
message GreetRequest {
string greeting = 1;
string name = 2;
}
message GreetResponse{
string response = 1;
}
```
運行
```
protoc --go_out=plugins=grpc:. greeter.proto
```
3. 建立 server.go:
```
package main
import (
"fmt"
"net"
"github.com/agtorre/go-cookbook/chapter6/grpc/greeter"
"google.golang.org/grpc"
)
func main() {
grpcServer := grpc.NewServer()
greeter.RegisterGreeterServiceServer(grpcServer, &Greeter{Exclaim: true})
lis, err := net.Listen("tcp", ":4444")
if err != nil {
panic(err)
}
fmt.Println("Listening on port :4444")
grpcServer.Serve(lis)
}
```
4. 建立 greeter.go:
```
package main
import (
"fmt"
"github.com/agtorre/go-cookbook/chapter6/grpc/greeter"
"golang.org/x/net/context"
)
// Greeter 實現了protoc生成的接口
type Greeter struct {
Exclaim bool
}
// Greet 實現grpc Greet
func (g *Greeter) Greet(ctx context.Context, r *greeter.GreetRequest) (*greeter.GreetResponse, error) {
msg := fmt.Sprintf("%s %s", r.GetGreeting(), r.GetName())
if g.Exclaim {
msg += "!"
} else {
msg += "."
}
return &greeter.GreetResponse{Response: msg}, nil
}
```
5. 建立 client.go:
```
package main
import (
"context"
"fmt"
"github.com/agtorre/go-cookbook/chapter6/grpc/greeter"
"google.golang.org/grpc"
)
func main() {
conn, err := grpc.Dial(":4444", grpc.WithInsecure())
if err != nil {
panic(err)
}
defer conn.Close()
client := greeter.NewGreeterServiceClient(conn)
ctx := context.Background()
req := greeter.GreetRequest{Greeting: "Hello", Name: "Reader"}
resp, err := client.Greet(ctx, &req)
if err != nil {
panic(err)
}
fmt.Println(resp)
req.Greeting = "Goodbye"
resp, err = client.Greet(ctx, &req)
if err != nil {
panic(err)
}
fmt.Println(resp)
}
```
6. 分別運行server.go和greeter.go,然后在另一個命令行運行client.go,這會輸出:
```
response:"Hello Reader!"
response:"Goodbye Reader!"
```
### 說明
GRPC服務器設置為偵聽端口4444.一旦客戶端連接,它就可以發送請求并從服務器接收響應。 請求,響應和支持的方法的結構由protoc生成的。實際上,當針對GRPC服務器進行集成時,應該提供.proto文件,該文件可用于自動生成客戶端 。
除了客戶端之外,protoc命令還會為服務器生成存根,所需的只是填寫實現細節。 生成的Go代碼也具有JSON標記,并且可以為JSON REST服務重用相同的結構。 我們的代碼設置了一個不安全的客戶端。 要安全地處理GRPC,你需要使用SSL證書。
* * * *
學識淺薄,錯誤在所難免。歡迎在群中就本書提出修改意見,以饗后來者,長風拜謝。
Golang中國(211938256)
beego實戰(258969317)
Go實踐(386056972)
- 前言
- 第一章 I/O和文件系統
- 常見 I/O 接口
- 使用bytes和strings包
- 操作文件夾和文件
- 使用CSV格式化數據
- 操作臨時文件
- 使用 text/template和HTML/templates包
- 第二章 命令行工具
- 解析命令行flag標識
- 解析命令行參數
- 讀取和設置環境變量
- 操作TOML,YAML和JSON配置文件
- 操做Unix系統下的pipe管道
- 處理信號量
- ANSI命令行著色
- 第三章 數據類型轉換和解析
- 數據類型和接口轉換
- 使用math包和math/big包處理數字類型
- 貨幣轉換和float64注意事項
- 使用指針和SQL Null類型進行編碼和解碼
- 對Go數據編碼和解碼
- Go中的結構體標簽和反射
- 通過閉包實現集合操作
- 第四章 錯誤處理
- 錯誤接口
- 使用第三方errors包
- 使用log包記錄錯誤
- 結構化日志記錄
- 使用context包進行日志記錄
- 使用包級全局變量
- 處理恐慌
- 第五章 數據存儲
- 使用database/sql包操作MySQL
- 執行數據庫事務接口
- SQL的連接池速率限制和超時
- 操作Redis
- 操作MongoDB
- 創建存儲接口以實現數據可移植性
- 第六章 Web客戶端和APIs
- 使用http.Client
- 調用REST API
- 并發操作客戶端請求
- 使用OAuth2
- 實現OAuth2令牌存儲接口
- 封裝http請求客戶端
- 理解GRPC的使用
- 第七章 網絡服務
- 處理Web請求
- 使用閉包進行狀態處理
- 請求參數驗證
- 內容渲染
- 使用中間件
- 構建反向代理
- 將GRPC導出為JSON API
- 第八章 測試
- 使用標準庫進行模擬
- 使用Mockgen包
- 使用表驅動測試
- 使用第三方測試工具
- 模糊測試
- 行為驅動測試
- 第九章 并發和并行
- 第十章 分布式系統
- 第十一章 響應式編程和數據流
- 第十二章 無服務器編程
- 第十三章 性能改進