在项目aorb中能够使用了微服务架构,然后引入了RPC,现在目前开发中,晚点再来完善这篇文章。现在先记录一些主要的概念。

IDL 接口定义语言

IDL(Interface Definition Language,接口定义语言)是一种用于定义软件组件之间接口的语言。IDL允许开发人员定义程序模块之间的接口,使得不同语言、平台和系统能够通过统一的接口进行通信。IDL的主要作用是定义数据类型和RPC(Remote Procedure Call,远程过程调用)的接口。

Proto接口定义的意义

Proto接口定义是指使用Protocol Buffers(protobuf)来定义数据结构和服务接口。protobuf是由Google开发的一种高效的二进制序列化格式,常用于配置文件、数据存储格式和通信协议。

  1. 跨语言支持:proto文件可以生成多种语言的代码,包括C++、Java、Python等,确保不同语言的系统可以互相通信。
  2. 高效传输:protobuf序列化后的数据体积小,解析速度快,适合网络传输。
  3. 版本兼容:proto文件可以通过增加新字段来实现向后兼容,不影响旧的客户端和服务器。

RPC(Remote Procedure Call,远程过程调用)

RPC是一种通过网络从远程计算机程序上执行子程序的协议,仿佛是在本地执行一样。RPC隐藏了底层的网络通信细节,使得开发者可以像调用本地方法一样调用远程方法。

IDL和RPC的关系

IDL用于定义RPC接口,指定远程调用所需的参数和返回值类型。通过IDL定义的接口,可以自动生成客户端和服务器的桩代码(stub),这些代码负责处理序列化和反序列化、网络通信等底层细节,使得开发者可以专注于业务逻辑。

RESTful和gRPC的关系

RESTful和gRPC是两种不同的网络通信风格和框架,它们各自服务于不同的应用场景和需求。下面是它们之间的关系和区别:

  1. RESTful (Representational State Transfer):

    • RESTful是一种基于HTTP协议的设计风格,它利用HTTP的方法(如GET、POST、PUT、DELETE等)来操作资源。
    • RESTful服务通常使用JSON或XML作为数据交换格式。
    • RESTful API设计简单,易于理解和使用,适合于跨平台和跨语言的场景。
    • 由于基于HTTP,RESTful服务天然支持浏览器和各种HTTP客户端,易于缓存和负载均衡。
  2. gRPC (Google Remote Procedure Call):

    • gRPC是由Google开发的高性能、开源的通用RPC框架。
    • gRPC使用Protocol Buffers(protobuf)作为接口定义语言(IDL)和数据序列化格式。
    • gRPC支持多种语言,并提供了跨语言的接口调用能力。
    • gRPC支持双向流式传输,适合于需要高性能和低延迟的场景,如微服务架构。
    • gRPC默认使用HTTP/2作为传输协议,支持多路复用和服务端推送等特性。

关系:

  • RESTful和gRPC都是用于构建分布式系统和微服务的通信协议,但它们的设计理念和使用场景有所不同。
  • RESTful更多地依赖于HTTP协议的特性,而gRPC则是一个独立的RPC框架,虽然它也使用了HTTP/2协议,但其核心在于protobuf的序列化和高效的RPC调用。
  • 在实际应用中,选择RESTful还是gRPC取决于具体的需求,如性能要求、开发语言、团队熟悉度、生态系统支持等。

总结: RESTful和gRPC是两种互补的技术,它们各自在不同的领域和场景中发挥作用。开发者可以根据项目的具体需求和约束来选择最合适的通信方式。

.pb.go和_grpc.pb.go文件

在Go语言中使用Protocol Buffers (protobuf) 时,通常会生成两个主要的Go文件,分别是 auth_grpc.pb.goauth.pb.go。这两个文件的作用如下:

  1. auth.pb.go:

    • 这个文件是由protobuf编译器根据.proto文件中的消息定义生成的。它包含了所有在.proto文件中定义的消息(messages)、枚举(enums)和任何其他非RPC相关的数据结构的Go语言实现。
    • auth.pb.go 文件主要负责序列化和反序列化数据,以及提供对消息结构的访问。例如,如果你在.proto文件中定义了一个名为 Token 的消息,auth.pb.go 将包含一个名为 Token 的Go结构体以及用于操作这个结构体的函数,如 MarshalUnmarshalNew 等。
  2. auth_grpc.pb.go:

    • 这个文件是由protobuf编译器根据.proto文件中的服务定义(service definitions)生成的,特别是当.proto文件中包含了gRPC服务定义时。
    • auth_grpc.pb.go 文件包含了gRPC服务的客户端和服务器端的Go语言实现。它定义了用于远程过程调用(RPC)的接口和方法,包括服务端接口(server interfaces)、客户端存根(client stubs)以及用于处理RPC请求和响应的代码。
    • 例如,如果你在.proto文件中定义了一个名为 AuthService 的gRPC服务,auth_grpc.pb.go 将包含用于实现这个服务的Go接口和方法,如 AuthServiceServerAuthServiceClient 以及具体的方法实现,如 LoginLogout 等。

总结来说,auth.pb.go 负责处理数据结构和序列化/反序列化,而 auth_grpc.pb.go 负责处理RPC通信和服务的实现。这两个文件共同工作,使得在Go语言中使用protobuf和gRPC变得更加高效和方便。

auth_grpc.pb.go文件结构

在这个 auth_grpc.pb.go 文件中,各个部分的作用如下:

  1. 包声明和导入:

    • package auth 声明了这个文件属于 auth 包。
    • import 语句导入了必要的包,如 contextgrpccodesstatus
  2. 常量定义:

    • 定义了服务方法的全局唯一方法名,如 AuthService_Login_FullMethodName
  3. 客户端接口定义:

    • AuthServiceClient 接口定义了客户端可以调用的所有服务方法,如 LoginVerify 等。
    • authServiceClient 结构体实现了 AuthServiceClient 接口,提供了实际的客户端调用逻辑。
  4. 服务端接口定义:

    • AuthServiceServer 接口定义了服务端需要实现的所有服务方法。
    • UnimplementedAuthServiceServer 结构体提供了未实现方法的默认实现,通常用于确保服务端实现了所有必要的方法。
  5. 服务注册:

    • RegisterAuthServiceServer 函数用于在 gRPC 服务器上注册 AuthService 服务。
  6. 服务方法处理函数:

    • _AuthService_Login_Handler,这些函数定义了如何处理每个服务方法的请求和响应。
  7. 服务描述:

    • AuthService_ServiceDesc 描述了 AuthService 服务的元数据,包括服务名、处理函数类型、方法列表等。

你的逻辑应该写在服务端接口的实现中。具体来说,你需要创建一个结构体,该结构体实现了 AuthServiceServer 接口,并在该结构体中为每个服务方法提供具体的业务逻辑实现。例如:

type authServiceServer struct {
	UnimplementedAuthServiceServer
	// 这里可以添加你的业务逻辑需要的字段
}

func (s *authServiceServer) Login(ctx context.Context, req *LoginRequest) (*LoginResponse, error) {
	// 实现登录逻辑
	// ...
}

func (s *authServiceServer) Verify(ctx context.Context, req *VerifyRequest) (*VerifyResponse, error) {
	// 实现验证逻辑
	// ...
}

// 实现其他服务方法...

func main() {
	// 创建 gRPC 服务器
	server := grpc.NewServer()
	// 注册你的服务实现
	RegisterAuthServiceServer(server, &authServiceServer{})
	// 启动服务器
	// ...
}

在这个例子中,authServiceServer 结构体实现了 AuthServiceServer 接口,并提供了 LoginVerify 等方法的具体实现。在 main 函数中,你创建了一个 gRPC 服务器,并将你的服务实现注册到服务器上。这样,当客户端调用这些服务方法时,服务器就会执行你提供的逻辑。