深入浅出 RPC | 青训营

72 阅读3分钟

RPC(Remote Procedure Call)是一种通信协议,用于两个进程之间的远程调用。在分布式系统中,RPC是非常重要的通信方式,它允许我们在不同的服务器之间调用函数并传递参数,在网络中传输大规模的数据

RPC 的原理

RPC的原理是客户端通过代理把请求发送到远程服务器,服务器收到请求后执行相应的函数,并返回执行结果。客户端会阻塞等待服务器的响应,即使客户端和服务器不在一个物理机器上,它们也可以通过网络互相进行调用以达到远程调用效果。

RPC 的实现

使用RPC协议进行RPC通信的大多数开源库都是基于某种协议实现的,比如gRPC、Thrift、Dubbo等。以gRPC为例,其基于http/2协议实现,通过protobuf序列化技术传输并编码请求和响应数据。以下是一个gRPC的示例代码:

syntax = "proto3";

package chatai.rpc;

service HelloService {
  rpc SayHello (HelloRequest) returns (HelloResponse) {}
}

message HelloRequest {
  string name = 1;
}

message HelloResponse {
  string message = 1;
}

以上定义了一个HelloService的服务,含有一个SayHello的方法。指定输入参数为HelloRequest类型,输出类型为HelloResponse类型。接下来,我们可以使用gRPC框架为该服务生成客户端和服务端的代码:

$ protoc --go_out=plugins=grpc:. hello.proto

接着,在服务端可以这样实现:

type HelloServiceServer struct{}

func (s *HelloServiceServer) SayHello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloResponse, error) {
    return &pb.HelloResponse{Message: "Hello, " + req.Name}, nil
}

func main() {
    lis, err := net.Listen("tcp", ":8080")
    if err != nil {
        log.Fatalf("failed to listen: %v", err)
    }
    s := grpc.NewServer()
    pb.RegisterHelloServiceServer(s, &HelloServiceServer{})
    if err := s.Serve(lis); err != nil {
        log.Fatalf("failed to serve: %v", err)
    }
}

在客户端可以这样实现:

func main() {
    var conn *grpc.ClientConn
    conn, err := grpc.Dial(":8080", grpc.WithInsecure())
    if err != nil {
        log.Fatalf("did not connect: %v", err)
    }
    defer conn.Close()
    c := pb.NewHelloServiceClient(conn)
    ctx, cancel := context.WithTimeout(context.Background(), time.Second)
    defer cancel()
    r, err := c.SayHello(ctx, &pb.HelloRequest{Name: "ChatAi"})
    if err != nil {
        log.Fatalf("could not greet: %v", err)
    }
    log.Printf("Greeting: %s", r.Message)
}

RPC 的优缺点

RPC作为一种通信方式,它的优势在于:

  • 隐藏了底层的网络通讯细节,提供简洁的接口;
  • 跨语言、跨平台等方面都做得很好,可以在多种不同的系统之间进行远程通讯;
  • 减少了开发者对于网络通讯协议的开发和测试负担,节省了开发时间。

RPC的劣势在于:

  • 对网络抖动和中断敏感,需要考虑重试等机制,确保消息发送和接收的可靠性;
  • 开发、调试和维护都需要较高的技术水平。

结语

可以看到,RPC作为一种通信方式,确实可以让我们的系统更加灵活和高效。掌握RPC的应用和实现可以让开发者更高效地创建分布式系统。以上介绍了RPC的基本原理、实现方式和优缺点,希望读者可以通过本文的介绍,对RPC有更清晰的认识,并能够自己实践和应用RPC协议。

当然,本文只是对RPC的简单介绍,实际上RPC还有更多的细节和需要进一步理解的问题。读者可以通过查阅相关资料来更深入地了解RPC协议的实现和应用。

最后,希望本文对读者有所帮助,感谢您的阅读!