RPC框架分层设计|青训营

110 阅读2分钟

RPC(远程过程调用)框架常见的分层设计可以参考以下几层:

  1. 传输层(Transport Layer):该层负责处理底层的网络通信,实现消息的传输和可靠性保证。例如可以使用TCP、UDP等协议作为传输载体。
  2. 序列化层(Serialization Layer):该层负责将数据结构和对象进行序列化和反序列化,以便通过网络进行传输。常见的序列化格式包括JSON、Protocol Buffers、Thrift等。
  3. 传输协议层(Protocol Layer):该层定义了远程调用的协议规范,包括消息格式、请求和响应的语义等。常见的传输协议包括HTTP、gRPC、Thrift等。
  4. 服务描述层(Service Description Layer):该层定义了服务接口的描述和规范,以便客户端和服务端通过接口进行调用。常见的服务描述语言包括IDL(接口描述语言)如Protocol Buffers、Thrift等。
  5. 代理层(Proxy Layer):该层负责在客户端和服务端之间进行代理和转发,处理网络通信细节,提供客户端调用接口的透明性。代理层可以实现负载均衡、容错、安全认证等功能。
  6. 服务发现与注册层(Service Discovery and Registration Layer):该层负责服务的注册、发现和路由,让客户端能够动态地发现可用的服务实例,并进行负载均衡和容错处理。
  7. 业务逻辑层(Business Logic Layer):该层是真正实现业务逻辑的地方,包括服务的实现、处理请求、数据处理等。

🌰:一个使用Go语言编写的简单RPC示例,演示如何使用Go语言的net/rpc包实现一个简单的RPC服务和客户端: sever.go

package main

import (
	"errors"
	"log"
	"net"
	"net/rpc"
)

// 定义一个数学计算服务
type MathService struct{}

// 定义计算的方法
func (m *MathService) Add(args *Args, result *int) error {
	*result = args.A + args.B
	return nil
}

// 定义请求参数结构
type Args struct {
	A, B int
}

func main() {
	// 创建MathService实例
	math := new(MathService)

	// 注册MathService服务
	rpc.Register(math)

	// 监听TCP连接
	l, err := net.Listen("tcp", ":1234")
	if err != nil {
		log.Fatal("listen error:", err)
	}

	log.Println("RPC server is listening on port 1234...")

	// 处理连接
	for {
		conn, err := l.Accept()
		if err != nil {
			log.Fatal("accept error:", err)
		}

		// 创建一个新的goroutine处理连接
		go rpc.ServeConn(conn)
	}
}

client.go


package main

import (
	"log"
	"net/rpc"
)

// 定义请求参数结构
type Args struct {
	A, B int
}

func main() {
	// 连接RPC服务
	client, err := rpc.Dial("tcp", "localhost:1234")
	if err != nil {
		log.Fatal("dialing error:", err)
	}

	// 调用远程方法
	args := &Args{A: 10, B: 20}
	var result int
	err = client.Call("MathService.Add", args, &result)
	if err != nil {
		log.Fatal("call error:", err)
	}

	log.Println("Result:", result)
}