拼多多面试 说说以grpc为例和osi七层模型是如何对应的

拼多多面试:聊聊rpc的具体过程。以grpc为例,具体实现和osi七层模型是怎么一一对应的?

远程过程调用(RPC,Remote Procedure Call)是一种计算机通信协议,允许程序在不同地址空间中执行程序,而不需要显式编码这些远程交互的细节。gRPC 是一个高性能的开源 RPC 框架,开发者可以使用它轻松地实现跨语言的 RPC 服务。gRPC 基于 HTTP/2 协议,并使用 Protocol Buffers 作为序列化协议。下面我们详细讨论 gRPC 的具体实现过程及其与 OSI 七层模型的对应关系。

gRPC 的具体实现过程

1. 定义服务

首先,使用 Protocol Buffers(protobuf)定义服务和消息格式。比如,定义一个简单的计算器服务:

syntax = "proto3";service Calculator {  rpc Add (AddRequest) returns (AddResponse);}message AddRequest {  int32 a = 1;  int32 b = 2;}message AddResponse {  int32 result = 1;}

2. 生成代码

使用protoc 编译.proto 文件,生成客户端和服务器端的代码。对于 Java,可以这样生成:

protoc --java_out=. --grpc-java_out=. calculator.proto

3. 实现服务

在服务器端实现生成的服务接口:

public class CalculatorService extends CalculatorGrpc.CalculatorImplBase {  @Override  public void add(AddRequest request, StreamObserver<AddResponse> responseObserver) {    int sum = request.getA() + request.getB();    AddResponse response = AddResponse.newBuilder().setResult(sum).build();    responseObserver.onNext(response);    responseObserver.onCompleted();  }}

4. 启动服务器

public class CalculatorServer {  public static void main(String[] args) throws IOException, InterruptedException {    Server server = ServerBuilder.forPort(8080)        .addService(new CalculatorService())        .build()        .start();    System.out.println("Server started");    server.awaitTermination();  }}

5. 创建客户端

public class CalculatorClient {  public static void main(String[] args) {    ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 8080)        .usePlaintext()        .build();    CalculatorGrpc.CalculatorBlockingStub stub = CalculatorGrpc.newBlockingStub(channel);    AddRequest request = AddRequest.newBuilder().setA(10).setB(20).build();    AddResponse response = stub.add(request);    System.out.println("Response: " + response.getResult());    channel.shutdown();  }}

gRPC 与 OSI 七层模型的对应关系

  1. 物理层(Physical Layer)
  • 物理层涉及物理设备之间的实际连接。在 gRPC 的上下文中,这包括网络电缆、无线传输等硬件设备。gRPC 并不直接处理这部分内容。
  1. 数据链路层(Data Link Layer)
  • 数据链路层负责设备之间的数据帧传输和错误检测与纠正。在 gRPC 中,这一层通常由底层网络接口卡(NIC)和驱动程序处理。gRPC 并不直接操作数据链路层。
  1. 网络层(Network Layer)
  • 网络层负责数据包的路由选择和转发。gRPC 依赖 TCP/IP 协议栈中的 IP 协议来实现这一层的功能,确保数据包可以从客户端路由到服务器。
  1. 传输层(Transport Layer)
  • 传输层负责端到端的通信控制和错误检测。在 gRPC 中,这一层主要由 TCP 协议实现,提供可靠的、面向连接的传输。HTTP/2 运行在 TCP 之上。
  1. 会话层(Session Layer)
  • 会话层管理会话的建立、维护和终止。HTTP/2 在这个层次上提供了多路复用、流量控制、首部压缩等功能。gRPC 使用 HTTP/2 来管理多个并发 RPC 调用的会话。
  1. 表示层(Presentation Layer)
  • 表示层负责数据的语法和语义表示。在 gRPC 中,表示层的功能由 Protocol Buffers 实现,负责序列化和反序列化消息数据。
  1. 应用层(Application Layer)
  • 应用层是用户和网络之间的接口。gRPC 的应用层包括客户端和服务器端的应用程序代码,以及 gRPC 框架提供的库和接口,用于定义和调用远程服务。

总结

gRPC 是一个强大的框架,它通过以下方式实现跨语言、高性能的 RPC:

  1. 服务定义:使用 Protocol Buffers 定义服务和消息格式。
  2. 代码生成:使用protoc 编译.proto 文件生成客户端和服务器端代码。
  3. 服务实现:在服务器端实现服务接口,并启动服务器。
  4. 客户端调用:在客户端调用远程服务并处理响应。

gRPC 的各层实现与 OSI 七层模型的对应关系如下:

  • 物理层和数据链路层:由底层网络硬件和驱动程序处理。
  • 网络层:依赖 IP 协议进行数据包路由。
  • 传输层:使用 TCP 协议提供可靠传输。
  • 会话层:使用 HTTP/2 管理会话和多路复用。
  • 表示层:使用 Protocol Buffers 进行数据序列化。
  • 应用层:包括用户定义的服务逻辑和 gRPC 框架提供的功能。

通过这种方式,gRPC 实现了高效、可靠的远程过程调用,广泛应用于分布式系统和微服务架构中。

全部评论
面试题刷一刷
点赞 回复 分享
发布于 2024-07-01 15:25 北京

相关推荐

当年还在美团那个倒霉的&nbsp;Peppr&nbsp;团队工作时,我一直有个疑问:这群人每天到底在自嗨什么。每次开会一堆人围着一堆“看起来很高级”的文档转,模板统一、名词复杂、页数感人,每一页都在暗示一件事:“你不懂,是因为你不专业。”但现实是——代码照样写在&nbsp;💩&nbsp;山上,该出问题还是会出问题,这真的很逗,系统一出问题,文档的唯一作用就是证明:“我们当初确实认真写过文档。”所以本质区别到底是什么?是代码质量提升了,还是大家在精神层面完成了一次“工程师&nbsp;cosplay”?有句话说得好潮水退去才知道谁在裸泳。还记得当时的马哥、明哥(图&nbsp;1&nbsp;左)最爱反复强调一句话:“所有场景一定要想到。”、“这个场景为什么没考虑到?”不过他们这些话我是真的听进去了。不然我也不会在一年多前就说:这个项目活不过两年。顺带一提,那段时间还有个固定节目。每次下楼,总能听见我明哥在吐槽不同的人。我从他身后绕过去,经常能听到他一边抽烟一边说:“xx&nbsp;这小子太坑了,回头我一定要跟马哥说说。”于是深谙人情世故但真不会抽烟的我也会从口袋掏出一支低尼古丁含量的烟给自己点上,假意自己什么都没听到什么都不知道,只是来抽烟的。后来我才明白,这可能也是团队文化的一部分:问题永远在别人身上,而我们,永远在复盘里😂。
秋招白月光
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
3
15
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务