RPC相关面试题

RPC相关面试题

一、HTTP 和 RPC 有哪些不同?

答:RPC (远程过程调用) 和 HTTP (超文本传输协议)是两种不同的通信协议,虽然都是应用层协议,但它们在设计目的、实现方式和使用场景等方面有很大区别。
1)RPC 用于在分布式系统中实现远程方法调用,使应用程序能够像调用本地方法一样调用远程服务; RPC 通常基于特定的通信协议和编码机制,例如,基于 TCP 和自定义协议头实现消息传输,可以提供更高的性能;RPC 更多运用于服务端之间的通信。
2)HTTP 用于在客户端和服务器之间传输超文本文档,用于在 Web 应用程序之间进行通信;HTTP 基于 TCP 协议,通过请求-响应模型进行通信,采用文本格式的消息头和消息体;HTTP 可同时运用于服务器端、后端和前端的通信。
最后,HTTP是RPC框架网络传输的一种可选方式。

二、RPC 框架有哪些?

答:常见的RPC框架有由 Google 开发的 gRPC,Alibaba开发并开源的Apache Dubbo,FaceBook开发并开源的 Apache Thrift,SpringCloud和SpringCloudAlibaba中默认使用的Feign。

三、Dubbo是如何分层的?

答:1)服务接口层 (Service):Dubbo的最顶层,定义了服务接口和数据模型。服务接口层提供给服务消费者和提供者实现的约定,独立于具体的实现技术和框架。服务接口层一般以 Java 接口的形式定义,包含服务的方法签名,参数,返回值类型等信息。
2)配置层(Config):Dubbo 的配置中心,负责管理和加载各种配置信息。在 Dubbo 中可以通过配置文件或者编程方式来配置框架的注册中心、通信协议、负载均衡策略等。以 ServiceConfig 和 ReferenceConfig 为中心,可以直接 new 配置类,也可以通过 spring 解析配置生成配置类。
3)服务代理层(Proxy):Dubbo 的核心层,负责将服务的接口转换为服务的具体调用。在服务提供者端,服务代理层将具体的方法调用转换为服务实现的调用,并将结果返回给服务消费者。在服务消费者端,服务代理层将服务接口转换为具体的方法调用,同时处理与服务提供者之间的通信细节,例如网络传输、负载均衡、容错等。服务接口透明代理,生成服务的客户端 Stub 和服务端 Skeleton,以 ServiceProxy 为中心,扩展接口为 ProxyFactory。
4)服务注册层(Registry):负责将服务提供者的地址和服务接口信息注册到注册中心,以供服务消费者发现和调用。在 Dubbo 中,注册中心可以是 Zookeeper、Etcd 等分布式协调服务,服务注册层负责与注册中心进行交互,将服务信息注册与注销。以服务URL为中心,扩展接口为 RegistryFactory、Registry、RegistryService。可能没有服务注册中心,此时服务提供者直接暴露服务。
5)集群层(Cluster):封装多个提供者的路由和负载均衡,并桥接注册中心,以 Invoker 为中心,扩展接口为 Cluster、Directory、Router 和 LoadBalance。将多个服务提供方组合为一个服务提供方,实现对服务消费方来透明,只需要与一个服务提供者进行交互。
6)监控层(Monitor):负责收集和展示Dubbo框架的运行状态和性能指标。以 Statistics 为中心,扩展接口为MonitorFactory、Monitor、MonitorService。
7)远程调用层(Protocol):封装 RPC 调用,以 Invocation 和 Result 为中心,扩展接口为Protocol、Invoker、Exporter。Protocol 是服务域,是 Invoker 暴露和引用的主功能入口,负责 Invoker的生命周期管理。Invoker 是实体域,是 Dubbo 的核心模型,其它模型都向它靠拢,或转换成它,它代表一个可执行体,可向它发起 invoke 调用,它有可能是一个本地的实现,也可能是一个远程的实现,也可能是一个集群实现。
8)信息交换层(Exchange):封装请求响应模式,同步转异步,以 Request 和 Response为中心,扩展接口为 Exchanger、ExchangeChannel、ExchangeClient、ExchangeServer。
9)网络传输层(Transport):抽象 mina 和 netty 为统一接口,以 Message 为中心,扩展接口为 Channel、Transport、Client、Server、Codec。
10)序列化层(Serialize):可以复用的一些工具,扩展接口为 Serialization、ObjectInput、ObjectOutput、ThreadPool。

四、常见的序列化协议有哪些?各自的优缺点?

1)JDK序列化
优点:不需要引入额外的依赖,只要一个对象实现了 Serializable 接口,就可以实现序列化。
缺点:序列化后的数据体积比较大,性能不是很高,可读性差。
2)JSON
优点:可读性好,便于理解和调试。支持跨语言,几乎所有编程语言都有 JSON 的解析和生成库。
缺点:由于 JSON 使用文本格式存储数据,需要额外的字符表示键、值和数据结构,序列化后的数据量相对较大。不能够很好的处理复杂数据结构和循环引用,可能导致性能下降或序列化失败。
3)Kryo
优点:高性能,序列化和反序列化速度快。支持循环引用和自定义序列化器,适用于复杂的数据结构。无需实现 Serializable 接口,可以序列化任意对象。
缺点:不支持跨语言,只适用于 Java。对象的序列化格式不友好,不易读懂和调试。
4)Hessian
优点:二进制序列化,序列化后的数据量较小,网络传输效率高。支持跨语言,适用于分布式系统中的服务调用。
缺点:性能比 JSON 略低,因为需要将对象转换为二进制格式。对象必须实现 Serializable 接口,限制了可序列化的对象范围。
5)Protobuf
优点:高效的二进制序列化,序列化后数据量极小。支持跨语言,提供了多种语言的实现库。支持版本化和向前向后兼容性。
缺点:配置相对复杂,需要先定义数据结构的消息格式。对象的序列化格式不友好,不易读懂和调试。

  • 16
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值