RPC原理

本文介绍了RPC的基本概念,服务在启动时如何注册到注册中心,以及服务掉线时的主动下线和心跳检测机制。当注册中心如Zookeeper挂掉时,服务间仍能通过缓存和直连方式保持调用。文中还提及了RPC框架如SpringCloud和Dubbo,并概述了自建RPC框架的基本思路,涉及客户端invoke、Filter、Socket通信、数据序列化和反序列化等关键环节。

目录

一、什么是RPC:

引言

1、什么是RPC:

重点!!!

 原理流程如下:

二、服务启动的时候服务基本信息被注册到注册中心,如果服务提供者挂了,注册中心如何知道服务不可用了呢?

    重点问题:服务掉线分为主动下线和心跳检测

1、主动下线:

2、心跳检测:

三、如果注册中心挂了,比如你用的是 Zookeeper,如果 Zookeeper 挂了,那服务之间还能相互调用吗?

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

总结

RPC 工作原理总结:

RPC 执行过程总结:


一、什么是RPC:

引言


以前在做一个规模不大的系统的时候,用的是单体架构,一台服务器部署上一个应用和数据库也就够了。

但是现代化互联网公司业务逐渐扩大,服务逐渐细分,很多服务之间需要通过远程分布式接口调用通讯,即不同的服务不是部署在同一个服务器上,比如订单服务在 A 服务上,付款服务在另一个服务上,有同步调用、也有异步调用,这个时候我们就需要远程调用不同的服务,使用的时候调用远程服务就像调用本地服务一样,引入一个 jar 包,就能通过 this.xxx( ) 一样调用远程服务,这背后的机制就是通过 RPC 技术。

1、什么是RPC:

RPC是远程过程调用(Remote Procedure Call)的缩写形式。

本地过程调用(LPC)LPC用在多任务操作系统中,使得同时运行的任务能互相会话。这些任务共享内存空间使任务同步和互相发送信息。远程过程调用(RPC)RPC类似于LPC,只是在网上工作。

RPC 是一个分布式计算的 CS 模式,总是由 Client 向 Server 发出一个执行若干过程请求,Server 接受请求,使用者客户端提供的参数,计算完成之后将结果返回给客户端。

重点!!!

其实简单来说,本地过程调用(LPL)就是在多任务的操作系统中,能够使得同时运行的任务能互相调用,它们共享内存空间,使得可以任务同步进行,互发消息进行调用。

而远程过程调用(RPC)可以想象成把远程所有的服务组合在一起当成一个虚拟的大系统,网络就类似于它们的共享内存,它们通过网络使得任务能够同步进行、能够互发消息进行调用!!!

使用最广泛的 Spring Cloud,基于 Spring Boot 特性整合了开源行业中优秀的组件,整体对外提供了一套在微服务架构中服务治理的解决方案。国内开源的框架中,使用比较广泛的有阿里的 Dubbo。

2、RPC的原理:

 原理流程如下:

1、 服务集成 RPC 后,服务(这里的服务就是图中的 Provider,服务提供者)启动后会通过 Register(注册)模块,把服务的唯一 ID 和 IP 地址,端口信息等注册到 RPC 框架注册中心(图中的 Registry 部分。


2、当调用者(Consumer)想要调用服务的时候,通过 Provider 注册时的的服务唯一 ID 去注册中心查找在线可供调用的服务,返回一个 IP 列表(3.notify 部分)。


3、第三步 Consumer 根据一定的策略,比如随机 or 轮训从 Registry 返回的可用 IP 列表真正调用服务(4.invoke)。


4、最后是统计功能,RPC 框架都提供监控功能,监控服务健康状况,控制服务线上扩展和上下线(5.count)
 

二、服务启动的时候服务基本信息被注册到注册中心,如果服务提供者挂了,注册中心如何知道服务不可用了呢?

    重点问题:服务掉线分为主动下线心跳检测

1、主动下线:

比如服务由于发行新版本时,在重启之前先主动通知注册中心:我要重启了,有流量进来先不要分给我,让别的机器服务,等我重启成功后在放流量进来,或者是在管理后台手动直接摘掉机器,这个是主动下线

2、心跳检测:

心跳检测是处理服务非正常下线(如断电断网)的情况,这个时候如果注册中心不知道该服务已经掉线,一旦被其调用就会带来问题。为了避免出现这样的情况,注册中心增加一个心跳检测功能,它会对服务提供者(Provider)进行心跳检测,比如每隔 30s 发送一个心跳,如果三次心跳结果都没有返回值,就认为该服务已下线,赶紧更新 Consumer 的服务列表,告诉 Consumer 调用别的机器。

三、如果注册中心挂了,比如你用的是 Zookeeper,如果 Zookeeper 挂了,那服务之间还能相互调用吗?

答:首先注册中心挂掉也要分两种情况,如果数据库挂了,ZK 还是能用的,因为 ZK 会缓存注册机列表在缓存里。

其次 ZK 本身就是一个集群的,一台机器挂了,ZK 会选举出集群中的其他机器作为 Master 继续提供服务,如果整个集群都挂了也没问题,因为调用者本地会缓存注册中心获取的服务列表。省略和注册中心的交互,Consumer 和 Provider 采用直连方式,这些策略都是可配置的。

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

1、客户端 invoke 方法编写,使用 JDK 的动态代理技术,客户端调用远程服务方法时调用的是 InvocationHandler 的 invoke 方法。


2、客户端 Filter 方法编写,完善的 RPC 框架少不了监控、路由、降级、鉴权等功能。


3、创建 Socket,在 Filter 方法中实现 Client.write 方法,其逻辑为从连接池(ChannelPool)中获取连接,然后将数据写进 Channel。


4、实现数据序列化、压缩,目的减少网络传输的数据量,向服务端发送 request 数据,这里可以使用 Netty 异步通讯框架。


5、服务端收到客户端发过的消息后,从 Channel 中将消息读出来之前,也会先经反序列化解压。


6、请求就到了服务端 Filter 中。请求依次经过监控、鉴权方法。


7、根据客户端传递来的服务信息和参数,通过反射调用相应的业务服务并拿到业务处理结果。然后在 ResponseFilter 中将返回结果写入 Channel。


8、服务端序列化、压缩等,发送给客户端。


9、、客户端收到消息后,经过客户端反序列化、解压缩,后交给 ResponseThreadPoolProcessor 线程池处理。


10、ResponseThreadPoolProcessor 收到消息后,就将结果返回给之前的方法调用,整个调用请求就结束了。
 

总结
 

RPC 工作原理总结:

Provider:服务提供方,CS 模型中的 Server。
Consumer: 调用远程服务服务消费方,CS 模型中的 Client。
Registry:服务注册与发现的服务管理中心。
Monitor:统计服务的调用次数和调用时间的监控中心。
Container:服务运行容器,如 jetty。

RPC 执行过程总结:

1、服务容器负责启动,加载,运行服务提供者。


2、服务提供者在启动时,向注册中心注册自己提供的服务,暴露自己的 IP 和端口信息。


3、服务消费者在启动时,向注册中心订阅自己所需的服务。


4、注册中心返回服务提供者列表给消费者,如果有变更,注册中心将基于长连接推送给数据消费者。


5、消费者,从提供这地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另外一台服务调用。


6、服务消费者和提供者,在内存中累计调用次数和调用时间,定时发送一次统计数据到监控中心。
 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值