1 RPC框架基本概念:
1.1 函数调用:本地与远程
函数调用是编程中常见的操作,用于在程序中调用其他函数或方法。在本地函数调用中,函数直接在同一进程内执行。而在RPC(远程过程调用)中,函数调用跨越进程或网络,在不同的计算机上执行。
1.2 RPC概念模型
RPC是一种通信协议,它允许一个程序在一台计算机上调用另一个计算机上的函数,就像调用本地函数一样。在RPC模型中,客户端程序发起远程调用请求,服务器端执行相应的操作,并将结果返回给客户端。
1.3 RPC完整过程
RPC的完整过程包括以下步骤:
- 客户端调用本地stub(存根)函数,参数传递给stub。
- 客户端stub将参数封装成特定的消息格式,通过网络发送给服务器端。
- 服务器端stub接收到消息后,解析消息,获取调用的函数和参数。
- 服务器端stub调用本地实现的函数,并将结果返回给服务器端。
- 服务器端stub将结果封装成消息格式,通过网络发送给客户端。
- 客户端stub接收到消息后,解析消息,获取结果,并返回给调用者。
1.4 RPC的优势与劣势
优势:
- 简化分布式系统开发:RPC隐藏了底层网络通信细节,使得开发者可以像调用本地函数一样调用远程函数,简化了分布式系统的开发。
- 跨语言支持:RPC框架通常支持多种编程语言,允许不同语言的应用程序之间进行通信。
- 可扩展性:RPC框架可以支持大规模的分布式系统,通过添加更多的服务器节点来扩展系统的处理能力。
劣势:
- 性能开销:RPC需要通过网络进行通信,增加了额外的性能开销,特别是在远程调用频繁的情况下。
- 复杂性:RPC涉及网络通信和错误处理等复杂的细节,需要合理的设计和实现,增加了开发和维护的复杂性。
2 RPC框架分层设计:
2.1 分层概要
RPC框架通常包含多个分层,每个分层负责不同的功能。典型的分层包括编解码层、协议层和网络通信层。
2.2 编解码层
生成代码、数据格式、二进制编码、选型(兼容、通用、性能)
- 编解码层负责将函数调用参数和结果进行编码和解码,以便在网络上传输。这一层可以根据需要生成代码,生成对应语言的stub函数,用于客户端和服务器端的函数调用。
- 数据格式的选择可以是JSON、XML、二进制等。
- 二进制编码在性能方面通常更高效,因为数据体积更小,解析速度更快。
2.3 协议层:
基本概念(特殊结束符、变长协议)、协议解析
协议层定义了在网络通信中的消息格式和通信规则。它可以定义特殊的结束符或标记来区分不同的消息。变长协议允许消息长度是可变的,这样可以节省网络带宽。协议解析是在接收到消息后对消息进行解析,以获取调用的函数和参数。
2.4 网络通信层:
sockets-API的调用流程、网络库(提供易用API、功能、性能)
网络通信层负责实际的网络通信和数据传输。它使用sockets-API来与网络进行交互。网络库是对sockets-API的封装,提供更易用的API和更高级别的功能,如连接池、数据缓存等,以提高性能和减少开发复杂性。网络库通常也是RPC框架的底层支持。
3. RPC框架关键指标
3.1 稳定性:
- 保障策略:RPC框架需要具备一系列保障策略,例如请求超时机制、重试机制、故障恢复等,以确保在不稳定的网络环境下依然能够提供可靠的服务。
- 请求成功率:衡量RPC框架在正常运行情况下请求成功的比例,高成功率是稳定性的重要指标。
- 长尾请求:长尾请求是指一些耗时较长的请求,RPC框架需要有针对性的优化措施,以避免长尾请求对整体性能的影响。
- 注册中间件:RPC框架通常需要依赖注册中间件来管理服务的注册与发现,这对稳定性也有很大影响。
3.2 易用性:
- 开箱即用:RPC框架应该提供简单易用的API和配置,方便开发者快速上手使用。
- 周边工具:好的RPC框架应该提供周边工具来辅助开发和调试,例如调用链追踪、监控和日志系统。
- Suite(熔断、降级、限流):熔断、降级和限流是常用的服务保护和性能优化机制,RPC框架可以集成这些功能,方便开发者进行配置和使用。
3.3 扩展性:
RPC框架需要支持水平扩展,可以通过添加更多的服务器节点来增加整体处理能力。 支持集群和负载均衡,使得请求可以分布到不同的服务器节点上,避免单点故障和单一瓶颈。
3.4 观测性:
观测性是指RPC框架能够提供详尽的监控指标和性能数据,帮助开发者了解系统的运行状况和性能表现。 提供合适的监控指标和日志,有助于快速定位和解决问题。
3.5 高性能:
针对不同的场景,RPC框架需要具备高性能,包括请求处理速度和网络通信性能。根据不同的应用目标和性能需求,RPC框架应该提供不同的配置选项和优化策略,使得开发者可以根据实际情况调整性能。
4 RPC框架企业实践:
4.1 Kitex整体架构:
Kitex是一个开源的Golang RPC框架,它具备高性能、低延迟和易用性等特点。Kitex采用分层设计,包括编解码层、协议层和网络通信层。它还提供了丰富的周边工具,例如调用链追踪和监控。
4.2 Netpoll的背景和优势:
Netpoll是Kitex的网络通信层,它基于epoll的I/O多路复用技术,能够高效处理大量的并发连接。Netpoll的优势在于它能够充分利用系统资源,高效地处理请求,同时还能够自动进行负载均衡。
4.3 扩展性和性能优化实践:
Kitex支持集群部署和负载均衡,可以通过添加更多的服务器节点来扩展性能。此外,Kitex还提供了连接池和请求池等功能,用于优化资源的利用和复用,提高性能。
4.4 新微服务形态:合并部署:
合并部署是一种新的微服务部署方式,将多个服务合并到一个进程内,减少了网络通信开销和进程间切换开销,提高了性能。Kitex对合并部署提供了支持,能够更好地适应这种新的微服务形态。