1. 程式人生 > 其它 >grpc客戶端和服務端利用protoc進行通訊

grpc客戶端和服務端利用protoc進行通訊

./message/message.proto

syntax = "proto3";

option go_package="./;message";

package message;
//訂單請求引數
message OrderRequest {
  string orderId = 1; //1,2編號
  int64 timeStamp = 2;
}
//訂單資訊
message OrderInfo {
  string OrderId = 1;
  string OrderName = 2;
  string OrderStatus = 3;
}
//訂單服務service定義
service OrderService{
  rpc GetOrderInfo(OrderRequest) returns (OrderInfo);
}

//執行:protoc --go_out=plugins=grpc:. message.proto //生成:message.pb.go

./Client.go

package main

import (
    "WLBC/GRPC2/message"
    "context"
    "fmt"
    "google.golang.org/grpc"
    "time"
)

func main(){
    conn, err := grpc.Dial("localhost:8090", grpc.WithInsecure())
    if err != nil {
        panic(err.Error())
    }
    defer conn.Close()

    orderServiceClient :
= message.NewOrderServiceClient(conn) orderRequest := &message.OrderRequest{OrderId: "201907300001", TimeStamp: time.Now().Unix()} orderInfo, err := orderServiceClient.GetOrderInfo(context.Background(), orderRequest) if orderInfo != nil { fmt.Println(orderInfo.GetOrderId()) fmt.Println(orderInfo.GetOrderName()) fmt.Println(orderInfo.GetOrderStatus()) } }

./Server.go

package main

import (
    "WLBC/GRPC2/message"
    "context"
    "errors"
    "fmt"
    "google.golang.org/grpc"
    "net"
    "time"
)

type OrderServiceImpl struct {
}

//具體的方法實現
func (os *OrderServiceImpl) GetOrderInfo(ctx context.Context, request *message.OrderRequest) (*message.OrderInfo, error) {
    orderMap := map[string]message.OrderInfo{
        "201907300001": message.OrderInfo{OrderId: "201907300001", OrderName: "衣服", OrderStatus: "已付款"},
        "201907310001": message.OrderInfo{OrderId: "201907310001", OrderName: "零食", OrderStatus: "已付款"},
        "201907310002": message.OrderInfo{OrderId: "201907310002", OrderName: "食品", OrderStatus: "未付款"},
    }
    var response *message.OrderInfo
    current := time.Now().Unix()
    if request.TimeStamp > current {
        *response = message.OrderInfo{OrderId: "0", OrderName: "", OrderStatus: "訂單資訊異常"}
    } else {
        result := orderMap[request.OrderId]
        if result.OrderId != "" {
            fmt.Println(result)
            return &result, nil
        } else {
            return nil, errors.New("server error")
        }
    }
    return response, nil
}

func main() {
    server := grpc.NewServer()
    message.RegisterOrderServiceServer(server, new(OrderServiceImpl))
    lis, err := net.Listen("tcp", ":8090")
    if err != nil {
        panic(err.Error())
    }
    server.Serve(lis)
}
Mamba never out