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

云原生應用開發之Go 中構建 gRPC

云計算 云原生
通過本文我們已經了解了如何在 Go 中構建一個簡單的 gRPC 客戶端和服務器。我們構建了一個基本服務器,它接受來自客戶端的傳入消息,然后向這些客戶端返回響應。

1.什么是 gRPC

gRPC 由谷歌開發的,是一種語言中立、平臺中立、開源的遠程調用過程。

什么是遠程調用過程?簡單理解就是公開本地應用給其他應用程序調用的方法。gRPC 是一項進程間通信技術,可以用來連接、調用、操作和調式分布式異構應用程序。也像 RPC 應用程序的特點一樣:像調用本地函數一樣。

圖片

2.特點

gRPC 是一個高性能、開源和通用的 RPC 框架,面向移動和 HTTP/2 設計,帶來諸如雙向流、流控、頭部壓縮、單 TCP 連接上的多復用請求等特。這些特性使得其在移動設備上表現更好,更省電和節省空間占用。

在 gRPC 里客戶端應用可以像調用本地對象一樣直接調用另一臺不同的機器上服務端應用的方法,使得您能夠更容易地創建分布式應用和服務。

gRPC 默認使用 protocol buffers,這是 Google 開源的一套成熟的結構數據序列化機制,它的作用與 XML、json 類似,但它是二進制格式,性能好、效率高(缺點:可讀性差)。

3.gRPC 和 REST 區別

它類似于 REST API 通信,通過它,您可以有效地將應用程序中的功能公開給使用 HTTP 連接作為通信媒介的其他應用程序。

雖然 REST 和 gRPC 有點相似,但您應該注意它們的工作方式存在區別:

gRPC 使用 HTTP/2 協議,而 REST 使用 HTTP 1.1

gRPC 使用協議緩沖區數據格式,而不是通常在 REST API 中使用的標準 JSON 數據格式

使用 gRPC,您可以根據需要利用 HTTP/2 功能,例如服務器端流式傳輸、客戶端流式傳輸甚至雙向流式傳輸。

4.Go 建立一個 gRPC 服務器

我們從在 Go 中定義一個非常簡單的 gRPC 服務器開始。一旦我們有一個簡單的服務器啟動并運行,我們就可以著手創建一個能夠與之交互的 gRPC 客戶端。

gRPC 可以實現微服務,將大的項目拆分為多個小且獨立的業務模塊,也就是服務,各服務間使用高效的protobuf 協議進行 RPC 調用,gRPC 默認使用 protocol buffers ,這是 google 開源的一套成熟的結構數據序列化機制(當然也可以使用其他數據格式如 JSON )。可以用 proto files 創建 gRPC 服務,用 message 類型來定義方法參數和返回類型

安裝 golang 的proto工具包:

go get -u github.com/golang/protobuf/proto

在開始建立 gRPC 之前,確保已安裝 Protocol Buffers v3:

go get -u github.com/golang/protobuf/protoc-gen-go

在 Go 中安裝 gRPC:

go get google.golang.org/grpc

然后寫一個服務器,通過監聽 TCP 連接的端口。如下的 main 函數:

package main

import (
"log"
"net"
)

func main() {

lis, err := net.Listen("tcp", ":8000")
if err != nil {
log.Fatalf("Fail to listen: %v", err)
}
}

接下來,我們要從 golang.org 導入官方的 gRPC 包,以便我們可以創建一個新的 gRPC 服務器,然后注冊我們想要公開的端點,然后通過我們上面定義的現有 TCP 連接提供服務:

package main

import (
"log"
"net"

"google.golang.org/grpc"
)

func main() {

lis, err := net.Listen("tcp", ":8000")
if err != nil {
log.Fatalf("Fail to listen: %v", err)
}

grpcServer := grpc.NewServer()

if err := grpcServer.Serve(lis); err != nil {
log.Fatalf("Fail to serve: %v", err)
}
}

這是用 go 編寫的最基礎 gRPC 服務器,現在的功能還很有限。

5.添加一些功能

然后寫一個客戶端與前面的服務器進行交互,創建一個 client.proto 文件:

syntax = "proto3"; // 協議為proto3

package chat;

// 定義發送請求信息
message Message {
// 定義發送的參數
// 參數類型 參數名 標識號(不可重復)
string body = 1;
}

// 定義我們的服務(可定義多個服務,每個服務可定義多個接口)
service ChatService {
rpc SayHello(Message) returns (Message) {}
}

這個 .proto 文件公開了我們的 ChatService,它具有一個單獨的 SayHello 函數,可以由任何用任何語言編寫的 gRPC 客戶端調用。

這些 .proto 定義通常在各種形狀和大小的客戶端之間共享,以便它們可以生成自己的代碼來與我們的 gRPC 服務器通信。

讓我們使用 protoc 工具生成 Go 特定的 gRPC 代碼:

$ protoc --go_out=plugins=grpc:chat chat.proto

您會看到這將生成一個 chat/chat.pb.go 文件,該文件將包含生成的代碼,以便我們在代碼中輕松調用。讓我們更新我們的 server.go 來注冊我們的 ChatService,如下所示:

package main

import (
"fmt"
"log"
"net"

"github.com/tutorialedge/go-grpc-beginners-tutorial/chat"
"google.golang.org/grpc"
)

func main() {

fmt.Println("Go gRPC Beginners Tutorial!")

lis, err := net.Listen("tcp", fmt.Sprintf(":%d", 9000))
if err != nil {
log.Fatalf("failed to listen: %v", err)
}

s := chat.Server{}

grpcServer := grpc.NewServer()

chat.RegisterChatServiceServer(grpcServer, &s)

if err := grpcServer.Serve(lis); err != nil {
log.Fatalf("failed to serve: %s", err)
}
}

然后我們將必須定義 SayHello 方法,該方法將接收一條消息,讀取消息的正文,然后返回它自己的消息:

package chat

import (
"log"

"golang.org/x/net/context"
)

type Server struct {
}

func (s *Server) SayHello(ctx context.Context, in *Message) (*Message, error) {
log.Printf("Receive message body from client: %s", in.Body)
return &Message{Body: "Hello From the Server!"}, nil
}

如果我們想為我們的 gRPC 服務器定義更高級的功能,那么我們可以通過定義一個基于我們的 Server 結構構建的新方法來實現,然后將該函數的名稱添加到我們的 chat.proto 文件中,以便我們的應用程序可以將其公開為某種東西其他 gRPC 客戶端可以訪問。

完成這些最終更改后,讓我們嘗試運行我們的服務器:

$ go run server.go
Go gRPC Beginners Tutorial!

驚人的!我們現在在我們的機器上的 localhost:8000 上啟動并運行了一個嶄新的、閃亮的新 gRPC 服務器!

6在 Go 中構建 gRPC 客戶端

現在我們的服務器已經啟動并運行了,讓我們看看如何構建一個能夠與之交互的簡單客戶端。更新一下 client.go 文件:

package main

import (
"log"

"golang.org/x/net/context"
"google.golang.org/grpc"

"github.com/tutorialedge/go-grpc-beginners-tutorial/chat"
)

func main() {

var conn *grpc.ClientConn
conn, err := grpc.Dial(":8000", grpc.WithInsecure())
if err != nil {
log.Fatalf("did not connect: %s", err)
}
defer conn.Close()

c := chat.NewChatServiceClient(conn)

response, err := c.SayHello(context.Background(), &chat.Message{Body: "Hello From Client!"})
if err != nil {
log.Fatalf("Error when calling SayHello: %s", err)
}
log.Printf("Response from server: %s", response.Body)

}

當我們運行它時,我們應該看到我們的客戶端從服務器收到了一個非常好的 Hello 消息,如下所示:

$ go run client.go
2022/07/07 23:23:01 Response from server: Hello From the Server!

我們已經成功創建了一個非常簡單的 gRPC 客戶端,它現在可以與我們的新 gRPC 服務器通信!

安裝問題

如果遇到 go get google.golang.org/grpc 安裝出錯,如下:

圖片

通過如下方式替換:

  • git clone https://github.com/grpc/grpc-go.git $GOPATH/src/google.golang.org/grpc
  • git clone https://github.com/golang/net.git $GOPATH/src/golang.org/x/net
  • git clone https://github.com/golang/text.git $GOPATH/src/golang.org/x/text
  • go get -u github.com/golang/protobuf/{proto,protoc-gen-go}
  • git clone https://github.com/google/go-genproto.git $GOPATH/src/google.golang.org/genproto
  • cd $GOPATH/src/
  • go install google.golang.org/grpc

7.總結

通過本文我們已經了解了如何在 Go 中構建一個簡單的 gRPC 客戶端和服務器。我們構建了一個基本服務器,它接受來自客戶端的傳入消息,然后向這些客戶端返回響應。

責任編輯:武曉燕 來源: 宇宙之一粟
相關推薦

2023-08-30 16:22:03

云原生云計算

2020-12-01 17:44:15

華為云Go語言云原生

2017-12-10 14:13:14

云服務云原生應用程序

2022-02-21 09:00:00

云原生應用開發

2022-11-30 18:38:50

2021-01-11 18:33:07

云原生

2023-07-26 16:20:36

云原生云計算

2021-07-12 15:47:00

云計算云原生

2014-12-04 14:10:22

移動應用云

2020-07-16 08:05:15

JavaGo

2025-06-04 10:08:00

Go開發云原生

2025-02-04 13:53:18

NixGogRPC

2021-02-03 15:10:38

GoKubernetesLinux

2014-07-15 11:16:17

Go語言

2020-11-19 15:01:50

云原生IBMCloud Paks

2023-01-05 14:41:24

2022-10-21 11:07:19

亞馬遜云科技Serverless數據庫

2022-06-22 09:24:30

云原生Go 語言

2024-05-10 13:14:41

技巧云原生應用

2023-08-22 15:40:12

云原生云計算
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 午夜看电影在线观看 | 91精品国产91久久久久久丝袜 | 国产精品亚洲一区二区三区在线 | 91精品国产综合久久久久蜜臀 | 中文字幕日韩在线 | 风间由美一区二区三区在线观看 | 91社区在线观看高清 | 国产精品欧美一区二区 | 日韩av在线免费 | 91精品国产91久久久久久吃药 | 81精品国产乱码久久久久久 | 91黄色免费看 | 精品三区 | 亚洲欧美国产一区二区三区 | 日韩影院一区 | 亚洲成人网在线观看 | 亚洲日韩中文字幕一区 | 人人色视频| 日韩精品一区二区三区在线观看 | av天天澡天天爽天天av | 久久成人免费观看 | 亚洲欧美日韩成人在线 | 日韩精品一区二区三区在线播放 | 欧美一区二区三区久久精品 | 日韩中文一区二区三区 | 久久精品国产免费 | 亚洲欧美日韩成人在线 | 少妇久久久久 | 久久久久久国产精品免费 | 久久久久久久av麻豆果冻 | 国产精品久久久久久久久久久久午夜片 | 懂色中文一区二区三区在线视频 | 99精品在线观看 | 久久免费视频1 | 日韩欧美国产精品 | 国产精品不卡视频 | 成人性视频免费网站 | 亚洲a视频| 久久国产精品亚洲 | 午夜看看 | 亚洲一区久久 |