golang使用grpc

golang使用grpc

目前正在學習後端有關概念, 瞭解到了grpc. 本文將簡述一個簡單demo的搭建.

rpc理解

個人網絡通訊概念還停留在比較基礎的地方, 直覺來講就是發送一個get/post請求, 設定必定的參數格式, 這樣對方再解析你的數據, 基於此完成通信.
而rpc則不使用這種顯式的通信方式, 經過proto與生成grpc文件, 裏面提供方法, 供client與server經過方法來進行通信. 簡單來講, 就是若是你之前要告訴server你好, 須要發送一個完整網絡請求, 可是如今你只須要調用一個hello方法就能夠了git

環境依賴以及安裝

  • golang
  • grpc
    go get -u google.golang.org/grpc
  • protoc
    go get -u github.com/golang/protobuf/protoc-gen-go
  • 環境變量配置
    export PATH=$PATH:$GOPATH/bin

項目目錄結構

grpc_test/
|-- client
|   `-- client.go
|-- proto
|   |-- greeter.pb.go
|   `-- greeter.proto
`-- server
    `-- server.go

DEMO

1. 編寫proto文件

syntax = "proto3";
  package proto;

  service Hello {
      rpc Hello (Request) returns (Response) {}
  }
  message Request {
      string Name = 1;
  }
  message Response {
      string Msg = 1;
  }

很是簡單, 提供了request, response對象, 而且提供了hello方法.github

2. 生成grpc文件

執行protoc -I ./ ./greeter.proto --go_out=plugins=grpc:../proto/
前面的./與./greeter.proto是上面的proto文件的文件夾以及文件, 後面的../proto是輸出目錄, 運行成功的時候, 會生成greeter.pb.go文件. 有興趣能夠詳細去讀裏面的代碼.golang

3. 編寫服務端腳本

package main
import (
    "fmt"
    "net"
    "context"
    grpc "google.golang.org/grpc"
    proto "grpc_test/proto"     // 引用剛纔生成grpc代碼
)

const(
    Address = "127.0.0.1:8801"   // 監聽的端口
)

type Greeter struct {}
// 實現proto中定義的hello方法
func (greeter *Greeter) Hello(ctx context.Context, request *proto.Request) (*proto.Response, error){
    fmt.Println("get client info, name is: ", request.Name)
    response_msg := "Hello " + request.Name
    return &proto.Response{Msg:response_msg}, nil 
}

func main(){
    service := Greeter{}
    conn, err := net.Listen("tcp", Address)   // tcp監聽端口
    if err != nil{
        fmt.Println(err)
        return
    }   
    fmt.Println("tcp listening...")
    defer conn.Close()
    server := grpc.NewServer()
    proto.RegisterHelloServer(server, &service)  // 將tcp服務於grpc進行綁定
    fmt.Println("server serve.....")
    if err := server.Serve(conn); err != nil{
        fmt.Println(err)
        return
    }   
}

4. 編寫客戶端腳本

package main

import (
    "context"
    "fmt"
    grpc "google.golang.org/grpc"
    proto "grpc_test/proto"    //引用grpc代碼
)

const(
    Address = "127.0.0.1:8801"    // 服務監聽的端口
)

func main() {
    conn, err := grpc.Dial(Address, grpc.WithInsecure())
    if err != nil{
        fmt.Println(err)
    }   
    defer conn.Close()
    client := proto.NewHelloClient(conn)    //  自動生成方法, 由於proto文件中service的名字是hello
    name := "jhonsmith"
    result, err := client.Hello(context.Background(), &proto.Request{Name:name})   // 調用grpc方法, 對服務端進行通信
    if err != nil{
        fmt.Println(err)
    }   
    fmt.Println("I see, u see. I say ", name, "u say ", result.Msg)
}

終わり。後端

相關文章
相關標籤/搜索