牛牛网站建设,网站建设视频教程百度云,营销方案餐饮,南昌中企动力做的网站怎么样之前分享了如何从0到1设计一个MQ消息队列#xff0c;今天谈谈“如何从0到1设计一个Dubbo的RPC框架”#xff0c;重点考验#xff1a; 你对RPC框架的底层原理掌握程度。 以及考验你的整体RPC框架系统设计能力。 RPC和RPC框架 1.RPC#xff08;Remote Procedure Call#x… 之前分享了如何从0到1设计一个MQ消息队列今天谈谈“如何从0到1设计一个Dubbo的RPC框架”重点考验 你对RPC框架的底层原理掌握程度。 以及考验你的整体RPC框架系统设计能力。 RPC和RPC框架 1.RPCRemote Procedure Call 即远程过程调用, 主要解决远程通信间的问题不需要了解底层网络的通信机制。 2.RPC框架 RPC框架负责屏蔽底层的传输方式TCP或者UDP、序列化方式、以及通信细节。 实际使用中并不需要关心底层通信细节和调用过程让业务端专注于业务代码的实现。 国内大家熟知的PRC框架阿里的HSF和Dubbo开源 Dubbo的发展由来 1. 业务规模小 比如早期一个应用Java War包将所有功能都打包部署在一个单机服务器调用接口也比较方便不涉及到任何分布式场景。 2.业务规模变大 随着业务的快速发展业务越来越多、子系统也越来越多时。比如淘宝的交易系统、商品系统、用户系统、评价系统…上百个系统的出现。 系统变得越来越复杂业务代码依然耦合在一起。比如最早期的淘宝denali工程包含所有业务系统的代码就仅打包部署都需要很长的时间。 并且随着每个业务线的快速发展业务代码耦合在一起上线后出现问题急需要回滚代码拉分支、大量的代码merge工作这个过程极其痛苦。 这个时候你会发现技术已经成了业务的瓶颈急需把业务单独抽离出来各自单独部署。 3.Dubbo和HSF的出现 应用系统一旦涉及到拆分部署问题就来了急需一种高效的应用程序间的通讯手段来完成这种需求这就会涉及到分布式远程调用。 于是淘宝就把denali按照业务为单位拆分成了类似这样的系统UMUserManger、SMShopManager..等等几十个工程代码。 再按照业务为单位把所有调用相关的接口以业务为单元进行拆分UIC用户中心服务、SIC店铺中心服务…等等以业务为单位集群部署按照业务提供服务。 所以RPC的框架来了阿里内部使用HSF以及开源的RPC 框架Dubbo。 RPC框架的核心设计 前面优知mikechen提到了RPC的核心目标主要是解决分布式系统中服务之间的调用问题。 其实走到这一步涉及的知识体系非常的多要求对通信、远程调用、消息机制等有深入的理解和掌握要求的都是从理论、硬件级、操作系统级以及所采用的语言的实现都有清楚的理解。 1.RPC框架三个核心角色 1服务提供者Server 对外提供后台服务将自己的服务信息注册到注册中心 2注册中心Registry 用于服务端注册远程服务以及客户端发现服务。 目前主要的注册中心可以借由 zookeepereurekaconsuletcd 等开源框架实现。 比如阿里的Dubbo就是采用zookeeper实现注册中心。 3服务消费者Client 从注册中心获取远程服务的注册信息然后进行远程过程调用。 2.RPC远程调用过程 1服务调用方client调用以本地调用方式调用服务 2client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体在Java里就是序列化的过程 3client stub找到服务地址并将消息通过网络发送到服务端 4server stub收到消息后进行解码,在Java里就是反序列化的过程 5server stub根据解码结果调用本地的服务 6本地服务执行处理逻辑 7本地服务将结果返回给server stub 8server stub将返回结果打包成消息Java里的序列化 9server stub将打包后的消息通过网络并发送至消费方 10client stub接收到消息并进行解码, Java里的反序列化 11服务调用方client得到最终结果。 RPC框架的目标就是要2~10这些步骤都封装起来。 RPC框架涉及技术 1.建立通信 首先要解决通讯的问题主要是通过在客户端和服务器之间建立TCP连接远程过程调用的所有交换的数据都在这个连接里传输。 2.服务寻址 1服务注册 首先需要把服务注册到服务中心。其实就是在注册中心进行一个登记注册中心存储了该服务的IP、端口、调用方式协议、序列化方式等。在zookeeper中进行服务注册实际上就是在zookeeper中创建了一个znode节点该节点存储了上面所说的服务信息。 2服务发现 服务消费者在第一次调用服务时会通过注册中心找到相应的服务的IP地址列表并缓存到本地以供后续使用。当消费者调用服务时不会再去请求注册中心而是直接通过负载均衡算法从IP列表中取一个服务提供者的服务器调用服务。 3注册服务 可靠的寻址方式主要是提供服务的发现是RPC的实现基石比如可以zookeeper来实现注册服务等等。 服务提供者启动后主动向服务注册中心注册机器ip、端口以及提供的服务列表。 服务消费者启动时向服务注册中心获取服务提供方地址列表可实现软负载均衡和Failover。 提供者需要定时向注册中心发送心跳一段时间未收到来自提供者的心跳后认为提供者已经停止服务从注册中心上摘取掉对应的服务等等。 3.网络传输 数据传输采用什么协议数据该如何序列化和反序列化 4.NIO通信 当前很多RPC框架都直接基于netty这一IO通信框架比如阿里巴巴的HSF、dubboHadoop Avro推荐使用Netty 作为底层通信框架。 5.服务调用 比如B机器进行本地调用通过代理Proxy之后得到了返回值此时还需要再把返回值发送回A机器同样也需要经过序列化操作然后再经过网络传输将二进制数据发送回A机器而当A机器接收到这些返回值之后则再次进行反序列化操作 总之要实现一个RPC不算难难的是实现一个高性能高可靠的RPC框架后续将剖析Dubbo看看Dubbo是如何来解决这些难题。 你可能也喜欢: RPC框架的实现原理及RPC架构组件详解深度剖析RPC框架的核心设计