rpc框架与分布式服务框架的区别,rpc和分布式

  rpc框架与分布式服务框架的区别,rpc和分布式

  00-1010简介1、面试官:2、面试官:3、面试官:4、面试官:深入分析现有的http协议接口,或者RestFul接口,为什么要使用RPC技术?RPC工作原理概要:RPC执行过程概要:

  00-1010年之前,搭建小规模系统时,使用单一架构,一台服务器部署一个应用和数据库就足够了。

  但是现代互联网公司的业务在逐渐扩大,服务也在逐渐细分。很多服务需要通过远程分布式接口进行调用和通信,即不同的服务不部署在同一个服务器上。比如,订单服务在服务A上,支付服务在另一个服务上,可以同步调用,也可以异步调用。这时候就需要远程调用不同的服务。使用它时,调用远程服务就像调用本地服务一样。通过引入一个jar包,我们可以调用this.xxx()。

  要点:RPC技术一定是以后工作的必要基础。熟练掌握其中一个,知道原理,看源代码,甚至自己写一个。

  00-1010公司用什么RPC框架?能介绍一下RPC的工作原理吗?

  问题分析:面试官想知道基础设施是不是和我们项目用的一样好,可以直接用。如果另一个不一样,应该没有问题。毕竟原理和技术都差不多,就说一个你最熟悉的吧。

  答:RPC是分布式计算的CS模式。客户端总是向服务器发送请求来执行多个进程。服务器接受请求,使用客户端提供的参数,并在计算完成后将结果返回给客户端。

  应用最广泛的Spring Cloud基于Spring Boot的特点,整合了开源行业的优秀组件,提供了一套微服务架构的服务治理解决方案。

  国内开源框架中,阿里的Dubbo应用广泛,后来捐赠给了Apache。腾讯的Tars框架,Thrift框架,以及基于Thrift二次开发的RPC框架,比如美团的Mtthrift。

  RPC的一般原理基本相同。(此时向面试官要纸和笔,并画图解释RPC的原理)

  这张图既不是太复杂给自己挖坑,也不是简单马虎。

  1-5逐行解释:

  服务RPC集成后,服务(这里的服务是图中的提供者)会注册自己唯一的ID、IP地址、端口信息等。RPC框架注册中心(图中的注册中心部分)。当消费者想要调用服务时,他通过由提供者注册的服务的唯一ID去注册中心查找可用于调用的在线服务,并返回IP列表(3.notify部分)。第三步:消费者按照一定的策略实际调用服务(4.invoke),比如从Registry返回的可用IP列表中随机或轮换训练。最后是统计功能。RPC框架都提供监控功能来监控服务的健康状况。有清晰的流程图来控制线上扩张和服务的线上线下(5.count),每一步都有解释。面试官表示很满意,并继续问了更多的问题。

  00-1010服务启动时,在注册表中注册服务的基本信息。如果服务提供商挂断,注册中心如何知道服务不可用?

  答:服务掉线分为主动离线和心跳检测。

  比如服务发布时,重启前请通知注册中心:我要重启了,有流量进来不要给我,让其他机器服务,等我重启成功流量进来,或者直接在管理后台手动移除机器。这是主动注销。

  心跳检测是为了应对异常的离线服务(比如断电断网)。这时候如果注册表不知道服务已经断开,一旦调用就会出问题。为了避免这种情况,注册表增加了心跳检测功能,会检测服务提供者(提供商)的心跳,比如每30s发送一次心跳。如果三个心跳的结果没有返回值,则该服务被认为是离线的。快速更新消费者的服务列表,并告诉消费者呼叫另一台机器。

  问题分析:本文阐述了服务器挂机时注册表的感受问题。你以为这个问题就完了?还没有。你已经成功给自己挖了一个坑,面试官可能还会继续深挖。如果服务商挂了注册中心就可以解决,那么注册中心本身就不会挂?继续提问。

  00-1010如果注册表挂了,比如你用Zookeeper,服务之间可以互相调用吗?

  答:首先注册表挂机有两种情况。如果数据库挂起,ZK仍然可以使用,因为ZK会在缓存中缓存注册商列表。

  其次,ZK本身就是一个集群。如果一台机器挂起,ZK将选择群集中的其他机器作为主机器继续提供服务。如果整个集群挂机,那也没问题,因为调用者会在本地缓存注册中心获取的服务列表。省略了与注册中心的交互,消费者和提供者直接相连。这些战略是

  是可配置的。

  问题分析:面试是一个自由交流时间,任何一个点都可能被发散继续深入挖掘,刨根问题,总有你覆盖不到的知识盲区,目的不是为难你,是想了解你的技术沉淀深度。

  

 

  

4、面试官:

你对 RPC 了解的很透彻,那你能否自己写一个 RPC 框架?可以简答描述下思路也行。

 

  答:这个问题,虽然没有自己动手写过,但是我阅读过源码,大致实现思路是这样的。(画图给面试官)

  

 

  客户端 invoke 方法编写,使用 JDK 的动态代理技术,客户端调用远程服务方法时调用的是 InvocationHandler 的 invoke 方法。客户端 Filter 方法编写,完善的 RPC 框架少不了监控、路由、降级、鉴权等功能。创建 Socket,在 Filter 方法中实现 Client.write 方法,其逻辑为从连接池(ChannelPool)中获取连接,然后将数据写进 Channel。实现数据序列化、压缩,目的减少网络传输的数据量,向服务端发送 request 数据,这里可以使用 Netty 异步通讯框架。服务端收到客户端发过的消息后,从 Channel 中将消息读出来之前,也会先经反序列化解压。请求就到了服务端 Filter 中。请求依次经过监控、鉴权方法。根据客户端传递来的服务信息和参数,通过反射调用相应的业务服务并拿到业务处理结果。然后在 ResponseFilter 中将返回结果写入 Channel。服务端序列化、压缩等,发送给客户端。客户端收到消息后,经过客户端反序列化、解压缩,后交给 ResponseThreadPoolProcessor 线程池处理。ResponseThreadPoolProcessor 收到消息后,就将结果返回给之前的方法调用,整个调用请求就结束了。面试官:可以可以,确实是看了,这个问题就到这。(面试官心理:虽然目前项目里不会让你真正去写一个 RPC 框架,知其然知其所以然,遇到这类 RPC 相关问题一定能搞定了,项目组正好缺一个这样的人)

  

 

  

深入分析

 

  

已经有 http 协议接口,或者说 RestFul 接口,为什么还要使用 RPC 技术?

在接⼝不多的情况下,使用 http 确实是一个明智的选择,比如在初创企业,我们不确定业务能顺利开展下去,可能面临随时倒闭,开发人员也不足,这个时候使用简洁高效的技术,先把东西做出来是最明智的选择,无需一步登天。

 

  系统与系统交互较少的情况下,使用 http 协议优点显而易见:开发简单、测试也比较直接、部署方便,利用现成的 http 协议进行系统间通讯,如果业务真的慢慢做大,系统也慢慢扩大,RPC 框架的好处就显示出来 了,⾸先 RPC 支持长链接,通信不必每次都要像 http 一样去重复 3 次握⼿,减少了网络开销。

  其次就是 RPC 框架一般都有注册中心模块,有完善的监控管理功能,服务注册发现、服务下线、服务动态扩展等都方便操作,服务化治理效率大大提高。

  基于 TCP 协议实现的 RPC,能更灵活地对协议字段进行定制,相比 http 能减少网络传输字节数,降低网络开销(握手)提高性能。实现更大的吞吐量和并发数,但是需要更多的关注底层复杂的细节, 对开发人员的要求也高,增加开发成本。

  

 

  

总结

在面试官夺命三连问的攻击下,前三个题目一定要掌握,最后一个加分项徒手写 RPC 深入分析,可以大大拉升面试官对你的好感,只要有亮点,即使其他问题答得不好,那么问题也不大。

 

  

 

  

RPC 工作原理总结:

Provider:服务提供方,CS 模型中的 Server。

 

  Consumer: 调用远程服务服务消费方,CS 模型中的 Client。

  Registry:服务注册与发现的服务管理中心。

  Monitor:统计服务的调用次数和调用时间的监控中心。

  Container:服务运行容器,如 jetty。

  

 

  

RPC 执行过程总结:

服务容器负责启动,加载,运行服务提供者。服务提供者在启动时,向注册中心注册自己提供的服务,暴露自己的 IP 和端口信息。服务消费者在启动时,向注册中心订阅自己所需的服务。注册中心返回服务提供者列表给消费者,如果有变更,注册中心将基于长连接推送给数据消费者。服务消费者,从提供这地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另外一台服务调用。服务消费者和提供者,在内存中累计调用次数和调用时间,定时发送一次统计数据到监控中心。以上就是公司一般使用的分布式RPC框架及其原理的详细内容,更多关于分布式RPC框架原理的资料请关注盛行IT其它相关文章!

 

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: