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

云原生應(yīng)用開發(fā)之Go 中構(gòu)建 gRPC

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

1.什么是 gRPC

gRPC 由谷歌開發(fā)的,是一種語言中立、平臺(tái)中立、開源的遠(yuǎn)程調(diào)用過程。

什么是遠(yuǎn)程調(diào)用過程?簡單理解就是公開本地應(yīng)用給其他應(yīng)用程序調(diào)用的方法。gRPC 是一項(xiàng)進(jìn)程間通信技術(shù),可以用來連接、調(diào)用、操作和調(diào)式分布式異構(gòu)應(yīng)用程序。也像 RPC 應(yīng)用程序的特點(diǎn)一樣:像調(diào)用本地函數(shù)一樣。

圖片

2.特點(diǎn)

gRPC 是一個(gè)高性能、開源和通用的 RPC 框架,面向移動(dòng)和 HTTP/2 設(shè)計(jì),帶來諸如雙向流、流控、頭部壓縮、單 TCP 連接上的多復(fù)用請(qǐng)求等特。這些特性使得其在移動(dòng)設(shè)備上表現(xiàn)更好,更省電和節(jié)省空間占用。

在 gRPC 里客戶端應(yīng)用可以像調(diào)用本地對(duì)象一樣直接調(diào)用另一臺(tái)不同的機(jī)器上服務(wù)端應(yīng)用的方法,使得您能夠更容易地創(chuàng)建分布式應(yīng)用和服務(wù)。

gRPC 默認(rèn)使用 protocol buffers,這是 Google 開源的一套成熟的結(jié)構(gòu)數(shù)據(jù)序列化機(jī)制,它的作用與 XML、json 類似,但它是二進(jìn)制格式,性能好、效率高(缺點(diǎn):可讀性差)。

3.gRPC 和 REST 區(qū)別

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

雖然 REST 和 gRPC 有點(diǎn)相似,但您應(yīng)該注意它們的工作方式存在區(qū)別:

gRPC 使用 HTTP/2 協(xié)議,而 REST 使用 HTTP 1.1

gRPC 使用協(xié)議緩沖區(qū)數(shù)據(jù)格式,而不是通常在 REST API 中使用的標(biāo)準(zhǔn) JSON 數(shù)據(jù)格式

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

4.Go 建立一個(gè) gRPC 服務(wù)器

我們從在 Go 中定義一個(gè)非常簡單的 gRPC 服務(wù)器開始。一旦我們有一個(gè)簡單的服務(wù)器啟動(dòng)并運(yùn)行,我們就可以著手創(chuàng)建一個(gè)能夠與之交互的 gRPC 客戶端。

gRPC 可以實(shí)現(xiàn)微服務(wù),將大的項(xiàng)目拆分為多個(gè)小且獨(dú)立的業(yè)務(wù)模塊,也就是服務(wù),各服務(wù)間使用高效的protobuf 協(xié)議進(jìn)行 RPC 調(diào)用,gRPC 默認(rèn)使用 protocol buffers ,這是 google 開源的一套成熟的結(jié)構(gòu)數(shù)據(jù)序列化機(jī)制(當(dāng)然也可以使用其他數(shù)據(jù)格式如 JSON )??梢杂?proto files 創(chuàng)建 gRPC 服務(wù),用 message 類型來定義方法參數(shù)和返回類型

安裝 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

然后寫一個(gè)服務(wù)器,通過監(jiān)聽 TCP 連接的端口。如下的 main 函數(shù):

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 導(dǎo)入官方的 gRPC 包,以便我們可以創(chuàng)建一個(gè)新的 gRPC 服務(wù)器,然后注冊(cè)我們想要公開的端點(diǎn),然后通過我們上面定義的現(xiàn)有 TCP 連接提供服務(wù):

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 編寫的最基礎(chǔ) gRPC 服務(wù)器,現(xiàn)在的功能還很有限。

5.添加一些功能

然后寫一個(gè)客戶端與前面的服務(wù)器進(jìn)行交互,創(chuàng)建一個(gè) client.proto 文件:

syntax = "proto3"; // 協(xié)議為proto3

package chat;

// 定義發(fā)送請(qǐng)求信息
message Message {
// 定義發(fā)送的參數(shù)
// 參數(shù)類型 參數(shù)名 標(biāo)識(shí)號(hào)(不可重復(fù))
string body = 1;
}

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

這個(gè) .proto 文件公開了我們的 ChatService,它具有一個(gè)單獨(dú)的 SayHello 函數(shù),可以由任何用任何語言編寫的 gRPC 客戶端調(diào)用。

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

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

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

您會(huì)看到這將生成一個(gè) chat/chat.pb.go 文件,該文件將包含生成的代碼,以便我們?cè)诖a中輕松調(diào)用。讓我們更新我們的 server.go 來注冊(cè)我們的 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 服務(wù)器定義更高級(jí)的功能,那么我們可以通過定義一個(gè)基于我們的 Server 結(jié)構(gòu)構(gòu)建的新方法來實(shí)現(xiàn),然后將該函數(shù)的名稱添加到我們的 chat.proto 文件中,以便我們的應(yīng)用程序可以將其公開為某種東西其他 gRPC 客戶端可以訪問。

完成這些最終更改后,讓我們嘗試運(yùn)行我們的服務(wù)器:

$ go run server.go
Go gRPC Beginners Tutorial!

驚人的!我們現(xiàn)在在我們的機(jī)器上的 localhost:8000 上啟動(dòng)并運(yùn)行了一個(gè)嶄新的、閃亮的新 gRPC 服務(wù)器!

6在 Go 中構(gòu)建 gRPC 客戶端

現(xiàn)在我們的服務(wù)器已經(jīng)啟動(dòng)并運(yùn)行了,讓我們看看如何構(gòu)建一個(gè)能夠與之交互的簡單客戶端。更新一下 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)

}

當(dāng)我們運(yùn)行它時(shí),我們應(yīng)該看到我們的客戶端從服務(wù)器收到了一個(gè)非常好的 Hello 消息,如下所示:

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

我們已經(jīng)成功創(chuàng)建了一個(gè)非常簡單的 gRPC 客戶端,它現(xiàn)在可以與我們的新 gRPC 服務(wù)器通信!

安裝問題

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

圖片

通過如下方式替換:

  • 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.總結(jié)

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

責(zé)任編輯:武曉燕 來源: 宇宙之一粟
相關(guān)推薦

2023-08-30 16:22:03

云原生云計(jì)算

2020-12-01 17:44:15

華為云Go語言云原生

2017-12-10 14:13:14

云服務(wù)云原生應(yīng)用程序

2022-02-21 09:00:00

云原生應(yīng)用開發(fā)

2022-11-30 18:38:50

2021-01-11 18:33:07

云原生

2025-02-04 13:53:18

NixGogRPC

2021-07-12 15:47:00

云計(jì)算云原生

2023-07-26 16:20:36

云原生云計(jì)算

2014-07-15 11:16:17

Go語言

2021-02-03 15:10:38

GoKubernetesLinux

2020-07-16 08:05:15

JavaGo

2014-12-04 14:10:22

移動(dòng)應(yīng)用云

2020-11-19 15:01:50

云原生IBMCloud Paks

2023-01-05 14:41:24

2022-10-21 11:07:19

亞馬遜云科技Serverless數(shù)據(jù)庫

2023-08-22 15:40:12

云原生云計(jì)算

2022-06-22 09:24:30

云原生Go 語言

2022-06-07 08:19:30

gRPCBallerina微服務(wù)

2024-05-10 13:14:41

技巧云原生應(yīng)用
點(diǎn)贊
收藏

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