grpc

code
apt install protoc-gen-go    
apt install protobuf-compiler

proto

https://www.coder.work/article/198885 https://blog.csdn.net/qq_33565142/article/details/109647937 https://www.codeleading.com/article/69695861845/

code
protoc --go_out=plugins=grpc:. test.proto
code
syntax = "proto3";

package mdfk2020;
option go_package="./mdfk2020";
//定義Service名稱,
service SaySomethingService{ 
  //定義api名稱,傳入參數與回傳值
  rpc MDFK2020 (MDFKRequest) returns (MDFKResponse) {}
}

//傳入參數的spec
message MDFKRequest {
  string name = 1;  
}

//回傳值的spec
message MDFKResponse {
  string data = 1;
}

server

code
package main

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

    pb "hello/test"

    "google.golang.org/grpc"
)

const (
    port = ":8787"
)

type server struct{}

func main() {
    // Create gRPC Server
    lis, err := net.Listen("tcp", port)
    if err != nil {
        log.Fatalf("failed to listen: %v", err)
    }
    s := grpc.NewServer()
    log.Println("gRPC server is running.")

    pb.RegisterSaySomethingServiceServer(s, &server{})
    if err := s.Serve(lis); err != nil {
        log.Fatalf("failed to serve: %v", err)
    }
}

//
func (s *server) MDFK2020(ctx context.Context, in *pb.MDFKRequest) (*pb.MDFKResponse, error) {
    fmt.Println("i receive:", in.Name)
    return &pb.MDFKResponse{Data: "Hello " + in.Name}, nil
}

client

code
package main

import (
    "context"

    "log"
    "time"

    pb "hello/test"

    "google.golang.org/grpc"
)

const (
    address = "localhost:8787"
)

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.NewSaySomethingServiceClient(conn)
    mdfk2020(c, "GG")

}

//
func mdfk2020(c pb.SaySomethingServiceClient, name string) {

    ctx, cancel := context.WithTimeout(context.Background(), time.Second)
    defer cancel()
    res, err := c.MDFK2020(ctx, &pb.MDFKRequest{Name: name})
    if err != nil {
        log.Fatalf("could not mkdfk2020: %v", err)
    }
    log.Printf("gRPC response: %s", res.Data)
}