日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
創(chuàng)新互聯(lián)應(yīng)用開發(fā)之Go中構(gòu)建gRPC

1.什么是 gRPC

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

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、成都小程序開發(fā)、集團企業(yè)網(wǎng)站建設(shè)等服務(wù)項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了灌陽免費建站歡迎大家使用!

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

2.特點

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

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

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

3.gRPC 和 REST 區(qū)別

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

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

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

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

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

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

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

gRPC 可以實現(xiàn)微服務(wù),將大的項目拆分為多個小且獨立的業(yè)務(wù)模塊,也就是服務(wù),各服務(wù)間使用高效的protobuf 協(xié)議進行 RPC 調(diào)用,gRPC 默認使用 protocol buffers ,這是 google 開源的一套成熟的結(jié)構(gòu)數(shù)據(jù)序列化機制(當然也可以使用其他數(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

然后寫一個服務(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 導入官方的 gRPC 包,以便我們可以創(chuàng)建一個新的 gRPC 服務(wù)器,然后注冊我們想要公開的端點,然后通過我們上面定義的現(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.添加一些功能

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

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

package chat;

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

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

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

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

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

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

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

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

$ go run server.go
Go gRPC Beginners Tutorial!

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

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

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

}

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

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

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

安裝問題

如果遇到 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.總結(jié)

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


文章標題:創(chuàng)新互聯(lián)應(yīng)用開發(fā)之Go中構(gòu)建gRPC
網(wǎng)頁網(wǎng)址:http://www.dlmjj.cn/article/djcjghj.html