首頁  >  文章  >  後端開發  >  golang grpc怎麼部署

golang grpc怎麼部署

PHPz
PHPz原創
2023-04-04 17:19:04654瀏覽

近年來,golang語言得到了越來越多的開發者的青睞,其輕量、高並發的特性在一些大型企業的後台服務中應用廣泛。隨著微服務和雲端原生技術的普及,golang在服務端領域的應用越來越多,golang的rpc框架grpc也得到了廣泛的應用。

本文主要介紹grpc的部署,在部署之前,需要先了解golang和grpc的基礎概念。

一、golang基礎概念

golang是一種靜態型別、編譯型、並髮型的程式語言,其誕生源自於Google公司。 golang語言中有一些特殊的概念需要了解。

  1. goroutine:golang中的輕量級線程,也是實現高並發的主要手段。
  2. channel:golang中的一種特殊的資料類型,用於goroutine之間的通訊。
  3. select:golang中用於多路復用channel的關鍵字。
  4. defer:golang中用來延遲執行函數的關鍵字。
  5. interface:golang中定義行為的一種方式。

二、grpc基礎概念

grpc是一款高效能、開源通用的rpc框架,由Google公司開發並開源。 grpc支援多種語言,包括golang、C 、Java等。 grpc的特點是:

  1. 支援多種序列化協議,包括protobuf和json等。
  2. 基於http2協議,支援雙向流、流控和頭壓縮等高階特性。
  3. 支援自訂認證、負載平衡等擴充。

三、grpc部署

有了基礎概念之後,接下來介紹grpc的部署。

  1. 寫grpc服務端程式碼

假設我們要寫一個簡單的grpc服務端程序,程式碼如下:

package main

import (
    "context"
    "fmt"
    "log"
    "net"

    "google.golang.org/grpc"
    pb "path/to/your/proto"
)

const (
    port = ":50051"
)

type server struct{}

func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
    log.Printf("Received: %v", in.Name)
    return &pb.HelloReply{Message: "Hello " + in.Name}, nil
}

func main() {
    lis, err := net.Listen("tcp", port)
    if err != nil {
        log.Fatalf("failed to listen: %v", err)
    }
    s := grpc.NewServer()
    pb.RegisterGreeterServer(s, &server{})
    if err := s.Serve(lis); err != nil {
        log.Fatalf("failed to serve: %v", err)
    }
}
  1. 寫grpc客戶端程式碼

假設我們要寫一個簡單的grpc客戶端程序,程式碼如下:

package main

import (
    "context"
    "log"
    "os"
    "time"

    "google.golang.org/grpc"
    pb "path/to/your/proto"
)

const (
    address     = "localhost:50051"
    defaultName = "world"
)

func main() {
    conn, err := grpc.Dial(address, grpc.WithInsecure(), grpc.WithBlock())
    if err != nil {
        log.Fatalf("did not connect: %v", err)
    }
    defer conn.Close()
    c := pb.NewGreeterClient(conn)

    name := defaultName
    if len(os.Args) > 1 {
        name = os.Args[1]
    }
    ctx, cancel := context.WithTimeout(context.Background(), time.Second)
    defer cancel()
    r, err := c.SayHello(ctx, &pb.HelloRequest{Name: name})
    if err != nil {
        log.Fatalf("could not greet: %v", err)
    }
    log.Printf("Greeting: %s", r.Message)
}
  1. #生成二進位檔案

編譯指令如下:

$ go build -o greeter_server ./server/main.go
$ go build -o greeter_client ./client/main.go
  1. 執行grpc服務端程式
$ ./greeter_server

運行之後會看到以下輸出:

2021/05/07 10:37:30 Listening on :50051
  1. 執行grpc客戶端程式
$ ./greeter_client

執行後會看到如下輸出:

2021/05/07 10:38:28 Greeting: Hello world

其中,world為預設參數,也可以傳入其他參數,例如:

$ ./greeter_client Tim

運行之後會看到如下輸出:

2021/05/07 10:39:22 Greeting: Hello Tim

四、總結

本文主要介紹了grpc的部署,其中包括編寫grpc服務端程式、編寫grpc客戶端程式、編譯生成二進位文件和運行grpc服務端和客戶端程式。如果想深入了解golang和grpc,可以參考官方文件和其他相關資料。

以上是golang grpc怎麼部署的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn