Linux服务器开发相关视频分析:
大厂RPC面试必须问的一些问题
100行代码完成你的用户模式协议栈|
RPC(Remote procedure Call)是一个熟悉又陌生的术语,但只要涉及到通信,就需要某种类型的网络协议。您以前可能使用过HTTP,但是RPC 和HTTP 之间有什么区别? RPC 还有哪些常见选项?
1. RPC是什么
RPC可以分为两部分:用户调用接口+具体网络协议。前者是开发者必须考虑的,后者是由框架来实现的。
例如,如果您定义一个函数,并期望该函数在输入为“Hello World”时输出“OK”,则该函数是本地调用。如果远程服务可以接收“Hello World”并返回“OK”,那么这就是远程调用。我同意远程呼叫功能名称的服务。因此,用户界面将是输入、输出和远程函数名称。例如,如果使用SRPC开发,客户端代码将如下所示:
int main(){ Example:SRPCClient client(IP, PORT); //用户定义的请求结构EchoResponse resp; //用户定义的响应结构req.set_message(‘Hello World’); //Echo return 调用名为0 的远程函数。 框架实现了特定的网络协议,将开发者想要发送和接收的内容封装成特定的应用层协议进行网络发送和接收。这里可以和HTTP做一个清晰的比较。
HTTP也是一种网络协议,但是包的内容是固定的,必须是请求行+请求头+请求体。 RPC 是一种自定义网络协议,由支持的RPC 协议等决定。 SRPC 的协议有: SRPC/thrift/BRPC/tRPC 这些RPC协议与HTTP并行,属于应用层协议。我们再想一想。虽然HTTP只包含特定的网络协议,但它也可以返回通用的HTTP/1.1 200 OK,这是为什么呢?
这里需要明确的是:用户界面的功能是什么?有两个最重要的特征。
找到要调用的服务。使消息向上和向下兼容。我们分别看一下HTTP和RPC是如何解析的。
因此,HTTP 调用减少了用户调用接口的函数数量,但代价是牺牲了一些消息的前向/后向兼容性自由度。不过,RPC和HTTP之间的大多数协议都是可以互操作的,允许开发者根据自己的习惯来选择技术。是不是很神奇呢?接下来,看看RPC 的分层架构,了解为什么存在不同的RPC 框架以及RPC 和HTTP 协议如何相互通信。
2. RPC有什么
了解SRPC的架构级别、RPC框架有哪些层以及SRPC当前支持哪些功能。
用户代码(客户端发送函数/服务端函数实现) IDL序列化(protobuf/thrift序列化) 数据结构(protobuf/thrift/json) 压缩(none/gzip/zlib/snappy/lz4) 协议(搜狗-std/百度-std/) ) Thrifmed/TRPC) 通信(TCP/HTTP) 首先,我们将关注三个层面:
图中从左到右显示了用户交互最多和最少的级别。 IDL 层根据开发人员定义的请求/响应结构生成代码。现在protobuf和thrift被我们朋友使用得比较频繁,上面提到的所有用户界面和向前向后兼容性问题都由IDL层解决了。 SRPC对这两个IDL的用户界面实现如下:
thrift:IDL 纯手动解析。使用srpc时,用户不需要链接thrift库。 protobuf:服务定义部分纯手动解析。 RPC 之所以能够互相通信,是因为RPC 能够互相通信。
由于RPC 是HTTP 的并行层,因此理论上第二列和第三列可以成对组合。如果您想在第二列中发送特定的RPC 协议,则只需专门化HTTP 相关内容即可。通过按照HTTP需要的协议,按照HTTP需要的格式发送,就可以实现RPC和HTTP的互操作。
[文章奖励] 我需要C/C++ Linux Server Architect 的学习材料。添加群812855908(教材包括C/C++、Linux、golang技术、Nginx、ZeroMQ、MySQL、Redis、fastdfs、MongoDB、ZK、流媒体、CDN、P2P、K8S、Docker、TCP/IP、协程、DPDK、ffmpeg , ETC。)
3. RPC的生命周期
此时,您可以使用SRPC 来查看通过方法发送请求、处理响应和返回的整个过程是如何工作的。
根据上图,你可以看到压缩层、序列化层和协议层实际上是相互独立的,允许各种压缩。任何算法、IDL 或协议都不需要或不需要更改现有代码。这是美丽的建筑。
我们已经讨论了代码生成,但是它有什么作用?正如您所看到的,生成的代码是用户调用接口和框架代码之间的桥梁。作为示例,显示了最简单的protobuf 自定义协议。
语法=’proto3′;message EchoRequest{ string message=1;};message EchoResponse{ string message=1;};service 示例{ rpc Echo(EchoRequest) returns (EchoResponse);};我们已经定义了请求、响应和远程。您可以通过运行命令example.srpc.h 来生成服务的函数名称。
protoc example.proto –cpp_out=./–proto_path=./srpc_generator protobuf ./example.proto ./让我们看一下生成的代码可以做什么。
//服务端代码类Service : public srpc:RPCService{public: //用户必须自己派生并实现相应的虚函数Echo(EchoRequest *request, EchoResponse *response, srpc:RPCContext *ctx)=0;}; 代码使用EchoDone=std:functionvoid (echoresponse * , srpc:rpccontext *); class SRPCClient : public srpc:SRPCClient {public: //异步接口void Echo(const EchoRequest *req, EchoDonened); ous interface void (const EchoRequest quest *req, EchoResponse *resp, srpc:RPCSyncContext * sync_ctx); //半同步接口WFFuturestd:pairechoresponse, srpc:rpcsynccontext async_Echo(const EchoRequest *req);}; SRPC生成的客户端代码包括:同步接口、半同步接口和异步接口,在文章的开头我们展示了如何使用同步接口。
服务器界面更加简单。作为服务器,您所需要做的就是接收请求、处理逻辑并返回响应。至此,框架已经完成了网络发送接收、解压、反序列化等工作。一切完成后,生成的代码将用于调用您实现的派生服务类中的功能逻辑。
由于协议定义了客户端/服务器,因此您实际上可以获得第2 部分中提到的一些服务器类型。
SRPCServerSRPCHttpServerBRPCServerTRPCServerThriftServer.
4. 一个完整的server例子
最后我们用一个完整的服务器例子来看看用户调用接口是如何使用的以及如何使用HTTP作为协议之间的客户端。前面提到,srpc_generator在接口生成过程中会自动生成空的用户代码。这里打开server.pb_骨骼.cc,直接修改并运行以下两行。
#include ‘example.srpc.h’#include ‘workflow/WFFacilities.h’ 使用命名空间srpc;static WFFacilities:WaitGroup wait_group(1);void sig_handler(int Signo){ wait_group.done();}class ExampleServiceImpl : public Example:Service{public: void Echo(EchoRequest *request, EchoResponse *response, srpc:RPCContext *ctx) override { response-set_message(‘OK’); //这里添加具体逻辑。只需回复OK }};int main(){ unsigned Short port=80; //我们需要启动Http 服务SRPCHttpServer,因此我们构建SRPCHttpServer ExampleService(example_impl) 服务器。stop(); return 0;} 安装srpc 后,您可以使用以下命令在Linux : 上编译可执行文件:
g++ -o server server.pb_sculpture.cc example.pb.cc -std=c++11 -lsrpc 现在使用curl发起HTTP请求。
$curl -i 127.0.0.1:80/Example/Echo -H ‘Content-Type: application/json’ -d ‘{message:’Hello World’}’HTTP/1.1 200 OKSRPC-Status: 1SRPC-Error: 0Content-Type: application/jsonContent-Encoding3336 0 IdentityContent-Length: 16Connection: Keep-Alive{‘message’:’OK’}
5. 总结
今天我们基于C++实现的开源项目SRPC详细分析了RPC的基本原理。 SRPC整体代码风格干净,架构层次精致。如果您使用C++,那么这是学习RPC 架构的好地方。
希望通过这篇文章你能够清楚的了解什么是RPC以及它的接口是什么。您还将通过与HTTP 协议互操作来了解协议级别。更重要的是,你可以知道每一层的具体垂直层次。每个的常见使用模式是什么?如果您对更多功能感兴趣,还可以阅读SRPC源码来了解更多信息。
原创文章,作者:小条,如若转载,请注明出处:https://www.sudun.com/ask/85038.html