面试专题:常见远程调用有哪几种?设计RPC框架需要注意什么?

2023-12-17 15:57:05 浏览数 (1)

前言

本文主要来讲解一下什么是远程调用,这在微服务架构中是十分常见的,跨服务进行通信就是远程调用,它允许一个系统(或组件)通过网络调用另一个系统(或组件)的方法或服务。这种调用方式可以跨越不同的机器、网络协议和编程语言,使得分布式系统的设计和实现变得更加灵活和可扩展。在面试中如果问到微服务,服务之间怎么调用,也是必问的。今天就来分析一下这个面试题。常见远程调用有哪几种?远程调用需要注意什么?

常见远程调用

RESTful API

RESTful API是一种基于HTTP协议的远程调用方式。它通过HTTP方法(如GET、POST、PUT、DELETE等)来操作资源(如数据、服务等)。RESTful API具有简单、易于理解、可扩展性强等优点,因此在互联网应用中得到了广泛应用。

典型框架:springcloud的openfeign和ribbon,目前比较流行的远程服务调用,而且直接使用http调用十分简单。

RPC(Remote Procedure Call)

RPC是一种远程过程调用协议,它允许客户端通过网络调用服务器端的方法或服务。RPC通常使用特定的协议(如gRPC、Thrift等)进行通信,支持多种编程语言和平台,它屏蔽底层通信细节,允许客户端直接调用服务器上的函数或服务,并得到返回的结果。RPC在使用形式上像调用本地函数或服务一样去调用远程的函数或服务。RPC的主要优点是简单易用,性能较好,但相对于RESTful API,其可扩展性和灵活性较差。

典型框架:dubbo,比较老的分布式系统可能还是使用dubbo。

消息队列

消息队列是一种异步的远程调用方式。它通过发送和接收消息来实现系统之间的通信。消息队列的主要优点是解耦、可扩展性好、容错能力强,但相对于RPC和RESTful API,其实时性较差。

典型框架:rocketmq,rabbitmq或者kafka

异步响应

典型代表就是WebFlux Spring Data Reactive,这是目前比较新的的远程调用方式,可以处理一些请求频繁,要求及时响应的业务,如果不了解这个,面试的时候可以不说这一点。WebFlux这个事件驱动框架,是一个基于Reactor模式的Web框架,它支持响应式编程模型,可以实现非阻塞式的异步响应,在WebFlux中,异步响应的实现主要依赖于以下几个核心组件:

WebClient

是一个非阻塞式的HTTP客户端,它可以用于发送HTTP请求并接收响应。WebClient使用响应式流(Reactive Streams)来处理数据,支持异步非阻塞式的数据处理。

Mono和Flux

Mono和Flux是Reactor模式中的两个核心类,它们分别表示单个值和多个值的异步序列。在WebFlux中,Mono和Flux用于处理异步响应的数据流。

函数式编程

WebFlux支持函数式编程模型,可以使用函数式编程的方式来处理异步响应。函数式编程可以帮助我们更好地组织代码,提高代码的可读性和可维护性。

路由器(Router)

路由器是WebFlux中的一个核心组件,它用于处理HTTP请求并返回响应。在WebFlux中,路由器可以使用函数式编程的方式来定义路由规则,从而实现异步响应。

RPC设计

远程调用设计需要考虑的提供方和调用方也可以说消费组和生产者,两者调用里路程如下:

由于调用是通过网络传输,所以需要远程调用,并且需要传输数据,需要定义数据格式,调用方也是需要通过远程调用获取数据,并且解析数据格式,得到最终结果。

提供方

提供方负责实现被调用的服务或方法。在设计提供方时,需要考虑以下几点:

  • 服务或方法的定义:明确服务或方法的输入参数、输出结果、异常处理等。
  • 接口设计:选择合适的接口风格(如RESTful、RPC等),并定义清晰的接口规范。
  • 性能优化:考虑如何提高服务的响应速度、降低延迟、提高吞吐量等。
  • 容错处理:设计合适的容错策略,如重试、熔断、降级等。

调用方

调用方负责发起远程调用请求。在设计调用方时,需要考虑以下几点:

  • 调用方式:根据实际需求选择合适的远程调用方式(如RESTful API、RPC等)。
  • 错误处理:如何处理远程调用过程中可能出现的异常和错误。
  • 性能监控:如何监控远程调用的性能指标,如响应时间、成功率等。
  • 负载均衡:如何在多个提供方之间分配请求负载。

总结

远程调用是分布式系统中的一种常见通信方式。在设计远程调用时,需要考虑提供方和调用方的实现,以及性能、容错、可扩展性等因素。不同的远程调用方式有不同的优缺点,需要根据实际需求进行选择。在面试的时候,回答这个问题,尽量往自己熟悉的框架说,比如熟悉springcloud,可以多说一下springcloud的服务调用原理,避免给自己采坑。

我正在参与2023腾讯技术创作特训营第四期有奖征文,快来和我瓜分大奖!

0 人点赞