【go从入门到精通】rpc和grpc的使用
package main
import (
"context"
"fmt"
"log"
"net"
"google.golang.org/grpc"
)
// 定义RPC服务
type GreeterService struct{}
// 定义RPC方法
func (s *GreeterService) Greet(ctx context.Context, req *GreetRequest) (*GreetResponse, error) {
return &GreetResponse{Message: "Hello, " + req.Name}, nil
}
// 定义请求结构体
type GreetRequest struct {
Name string
}
// 定义响应结构体
type GreetResponse struct {
Message string
}
// 注册服务
func RegisterService(s *grpc.Server, srv *GreeterService) {
RegisterGreeterServiceServer(s, srv)
}
// 启动RPC服务器
func StartServer(address string, s *GreeterService) error {
lis, err := net.Listen("tcp", address)
if err != nil {
return err
}
srv := grpc.NewServer()
RegisterService(srv, s)
return srv.Serve(lis)
}
// 客户端调用RPC方法
func CallService(address string, name string) (*GreetResponse, error) {
conn, err := grpc.Dial(address, grpc.WithInsecure(), grpc.WithBlock(), grpc.WithTimeout(5*time.Second))
if err != nil {
return nil, err
}
defer conn.Close()
client := NewGreeterServiceClient(conn)
response, err := client.Greet(context.Background(), &GreetRequest{Name: name})
if err != nil {
return nil, err
}
return response, nil
}
func main() {
// 服务端
address := "localhost:50051"
service := &GreeterService{}
if err := StartServer(address, service); err != nil {
log.Fatalf("failed to start server: %v", err)
}
// 客户端
response, err := CallService(address, "World")
if err != nil {
log.Fatalf("failed to call service: %v", err)
}
fmt.Println("Response:", response.Message)
}
这段代码展示了如何在Go中使用gRPC。首先定义了一个服务和一个方法,然后启动了一个gRPC服务器,并注册了这个服务。客户端代码创建了一个连接,并调用了服务器的方法。这是学习gRPC和RPC的一个基本例子。
评论已关闭