Golang RPC 远程调用
以下是一个简单的Golang RPC(使用gRPC)服务定义和客户端调用的例子。
首先,我们需要定义一个服务接口:
// proto/greeter.proto
syntax = "proto3";
package greeter;
service Greeter {
rpc Greet(GreetRequest) returns (GreetResponse) {}
}
message GreetRequest {
string name = 1;
}
message GreetResponse {
string message = 1;
}
然后使用protobuf编译器生成Golang代码:
protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative proto/greeter.proto
服务端代码:
package main
import (
"context"
"fmt"
"google.golang.org/grpc"
"net"
)
// 实现Greeter服务接口
type GreeterServer struct{}
// Greet实现Greeter服务的RPC调用
func (s *GreeterServer) Greet(ctx context.Context, req *greeter.GreetRequest) (*greeter.GreetResponse, error) {
return &greeter.GreetResponse{Message: "Hello, " + req.Name}, nil
}
func main() {
listener, err := net.Listen("tcp", ":50051")
if err != nil {
fmt.Println("failed to listen:", err)
return
}
s := grpc.NewServer()
greeter.RegisterGreeterServer(s, &GreeterServer{})
if err := s.Serve(listener); err != nil {
fmt.Println("failed to serve:", err)
return
}
}
客户端代码:
package main
import (
"context"
"fmt"
"google.golang.org/grpc"
)
func main() {
conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure(), grpc.WithBlock(), grpc.WithTimeout(context.Background(), 5*time.Second))
if err != nil {
fmt.Println("failed to dial:", err)
return
}
defer conn.Close()
client := greeter.NewGreeterClient(conn)
response, err := client.Greet(context.Background(), &greeter.GreetRequest{Name: "World"})
if err != nil {
fmt.Println("failed to greet:", err)
return
}
fmt.Println("Greeting:", response.Message)
}
在这个例子中,我们定义了一个名为Greeter
的服务,并在服务端实现了Greet
方法。然后在客户端,我们连接到服务器,并调用Greet
方法。这个过程展示了如何使用gRPC在Golang中创建和使用RPC服务。
评论已关闭