当前位置: 首页 > 后端技术 > Java

如何从0到1设计一个类Dubbo的RPC框架

时间:2023-04-01 15:27:21 Java

之前分享了如何从0到1设计一个MQ消息队列,今天讲的是《如何从0到1设计一个DubboRPC框架》,重点测试:你对RPC框架底层原理的掌握程度。并考验你整体的RPC框架系统设计能力。RPC及RPC框架1、RPC(RemoteProcedureCall)是一种远程过程调用,主要解决远程通信的问题,不需要了解底层网络的通信机制。2.RPC框架RPC框架负责屏蔽底层传输方式(TCP或UDP)、序列化方式、通信细节。在实际使用中,无需关心底层通信和调用过程的细节,让业务方专注于业务代码的实现。国内知名的PRC框架,阿里的HSF和Dubbo(开源)Dubbo发展的由来1.业务规模小。例如,早期的一个应用JavaWar包,将所有功能打包,部署在单机服务器上。调用接口也比较方便。不涉及任何分布式场景。2、业务规模变大随着业务的快速发展,业务越来越多,子系统也越来越多。例如:淘宝的交易系统、商品系统、用户系统、评价系统……涌现了上百个系统。系统越来越复杂,业务代码还是耦合在一起。比如最早的淘宝denali项目,包含了所有业务系统的代码,打包部署时间很长。而且随着各个业务线的快速发展,业务代码耦合在一起。上线后,急需回滚代码,拉分支,合并大量代码。这个过程非常痛苦。这时候你会发现技术已经成为业务的瓶颈,急需将业务分离出来,分别部署。3、Dubbo和HSF的出现应用系统一旦涉及到拆分部署,问题就来了。迫切需要一种有效的应用程序之间的通信方式来满足这一要求,这涉及到分布式远程调用。于是,淘宝把denali按照业务单元拆分成了这样的系统:UM(UserManger),SM(ShopManager)..和几十个工程代码。然后根据业务单元,将所有调用相关接口划分为业务单元:UIC(用户中心服务)、SIC(门店中心服务)等,基于业务单元集群部署,按照业务单元提供服务商业。于是,RPC框架就来了。阿里内部使用HSF,开源的RPC框架:Dubbo。RPC框架的核心设计前面mikechen提到了RPC的核心目标:主要是解决分布式系统中服务之间的调用问题。其实这一步涉及的知识体系很多:需要对通信、远程调用、消息机制等有深刻的理解和掌握,从理论、硬件层面、操作系统层面和语言层面都需要用过的。实现方式很清楚。一、RPC框架的三大核心作用1)服务提供者(Server)对外提供后台服务,并将自己的服务信息注册到注册中心2)注册中心用于服务端注册远程服务和客户端发现服务。目前主要注册中心可以通过zookeeper、eureka、consul等开源框架实现。例如:阿里的Dubbo使用zookeeper实现注册中心。3)服务消费者(Client)从注册中心获取远程服务的注册信息,然后进行远程过程调用。2、RPC远程调用流程1)服务调用者(客户端)在本地调用服务;2)cli??entstub接到调用后,负责将方法、参数等组装成可以在网络上传输的消息体;在Java中,就是序列化过程3)clientstub找到服务地址,通过网络向server发送消息;4)服务器存根收到消息后进行解码,也就是Java中的反序列化过程;5)serverstub根据解码结果对消息进行解码调用本地服务;6)本地服务执行处理逻辑;7)本地服务将结果返回给服务器存根;8)服务器存根将返回结果打包成消息,用Java序列化;9)serverstub对打包后的消息进行打包10)clientstub接收消息,解码,Java反序列化;11)服务调用者(客户端)得到最终结果。RPC框架的目标是对步骤2到10进行封装。RPC框架涉及到的技术1.建立通信首先解决通信问题,主要是通过在客户端和服务器之间建立一个TCP连接,所有远程的数据交换过程调用在此连接中传输。2、服务寻址1)服务注册首先需要向服务中心注册服务。其实就是在注册中心的一个注册,里面存放着服务的IP,端口,调用方式(协议,序列化方式)等。在zookeeper中,服务注册其实就是在zookeeper中创建一个znode节点,里面存放着上述服务信息。2)服务发现当服务消费者第一次调用服务时,会通过注册中心找到对应服务的IP地址列表,并缓存到本地以供后续使用。当消费者调用服务时,不会再次请求注册中心,而是通过负载均衡算法直接从IP列表中选择服务提供者的服务器来调用服务。3)注册服务的可靠寻址方式(主要提供服务发现)是RPC实现的基石。比如可以使用zookeeper来实现注册服务等。服务提供者启动后,主动向服务(注册)中心注册机器ip、端口和提供的服务列表。服务消费者启动时,从服务(注册)中心获取服务提供者的地址列表,可以实现软负载均衡和故障转移。提供者需要定期向注册中心发送心跳。一段时间后没有收到提供者的心跳,则认为提供者停止了服务,相应的服务从注册中心下架等。3.网络传输数据使用什么协议,如何传输对数据进行序列化和反序列化4、很多NIO通信的RPC框架都是直接基于netty的IO通信框架,比如阿里巴巴的HSF、dubbo、HadoopAvro,推荐使用Netty作为底层通信框架。5.服务调用例如:机器B在本地调用(通过proxy代理)后得到一个返回值,此时需要将返回值传回给机器A,机器A也需要序列化,然后通过网络将二进制数据传回给A机器,当A机器收到这些返回值后,会再次进行反序列化操作。总之,实现RPC并不难。更深入的理解可以参考Dubbo源码分析,看看Dubbo是如何解决这些问题的。作者简介:mikechen,十余年BAT架构经验,资深技术专家,曾就职于阿里、淘宝、百度。关注作者公众号:回复【架构】,可查看mikechen原创300期+BAT架构技术系列文章和大厂面试题1000+答案合集。