NOTE
rpc
1. Golang RPC server client 2. gRPC hello_server.proto Generate Go files server client
This is a historical learning note and may contain outdated or incomplete understanding.
1. Golang RPC
- server
import (
"fmt"
"net"
"net/http"
"net/rpc"
)
type Panda int
func (this *Panda) Getinfo(argType int, replyType *int) error {
fmt.Println("Parameter passed by the remote call:", argType)
*replyType = 1 + argType
return nil
}
func main() {
pd := new(Panda)
// Register the service. Register exposes all public methods of pd.
rpc.Register(pd)
rpc.HandleHTTP()
ln, err := net.Listen("tcp", "127.0.0.1:10086")
if err != nil {
fmt.Println("Listen failed")
}
http.Serve(ln, nil)
}
- client
import (
"fmt"
"net/rpc"
)
func main() {
cli, err := rpc.DialHTTP("tcp", "127.0.0.1:10086")
if err != nil {
fmt.Println("Network connection failed")
}
var val int
// Remote function call: method, input argument, output argument
err = cli.Call("Panda.Getinfo", 123, &val)
if err != nil {
fmt.Println("call failed")
}
fmt.Println("Remote call result:", val)
}
2. gRPC
- hello_server.proto
syntax = "proto3";
option go_package = ".;my_grpc_proto";
service HelloServer {
rpc SayHello (HelloRequest) returns (HelloResponse) {
}
}
message HelloRequest {
string name = 1;
}
message HelloResponse {
string message = 1;
}
- Generate the Go file
protoc --go_out=./ *.proto
- server
package main
import (
"fmt"
"google.golang.org/grpc"
"my_demo/proto_test/grpc/protobuf"
"net"
"context"
)
const (
post = "127.0.0.1:18881"
)
// The object must correspond to the service defined in the proto file.
type server struct{}
// Implement the RPC SayHello interface.
func (this *server) SayHello(ctx context.Context, in *protobuf.HelloRequest) (*protobuf.HelloResponse, error) {
return &protobuf.HelloResponse{Message: "hello" + in.Name}, nil
}
func main() {
// Create the network listener.
ln, err := net.Listen("tcp", post)
if err != nil {
fmt.Println("Network error", err)
}
// Create a gRPC server handle.
srv := grpc.NewServer()
// Register the server struct with the gRPC service.
protobuf.RegisterHelloServerServer(srv, &server{})
// Listen for gRPC requests.
err = srv.Serve(ln)
if err != nil {
fmt.Println("Network startup error", err)
}
}
- client
package main
import (
"context"
"fmt"
"google.golang.org/grpc"
"my_demo/proto_test/grpc/protobuf"
)
const (
post = "127.0.0.1:18881"
)
func main() {
// Connect the client to the server.
conn, err := grpc.Dial(post, grpc.WithInsecure())
if err != nil {
fmt.Println("Failed to connect to server", err)
}
defer conn.Close()
// Obtain the gRPC client handle.
c := protobuf.NewHelloServerClient(conn)
// Remotely call the SayHello interface.
r1, err := c.SayHello(context.Background(), &protobuf.HelloRequest{Name: "panda"})
if err != nil {
fmt.Println("could not get Hello server ..", err)
return
}
fmt.Println("HelloServer resp: ", r1.Message)
}
Discussion
Sign in with GitHub to comment. Discussions are stored as GitHub Issues.View on GitHub