学习RPC最开始是因为在公司开发过程中,本地项目跑起来后访问的却是不同环境上的页面(测试/开发)。并且前端获取数据的方法不再是直接调用AJax或Axios,而是封装后的SOA。并且在开发和测试的环境中来回跳转也让我有点懵逼。
学完才发现还真是个好东西,但是Demo还是不能完全消化。

一、RPC的演变


1、单一应用架构(ORM)
当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的数据访问框架(ORM) 是关键。

2、垂直应用架构(MVC)
当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。此时,用于加速前端页面开发的 Web框架(MVC) 是关键。

3、分布式服务架构(RPC)
当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的分布式服务框架(RPC),提供统一的服务是关键。
例如:各个团队的服务提供方就不要各自实现一套序列化、反序列化、网络框架、连接池、收发线程、超时处理、状态机等“业务之外”的重复技术劳动,造成整体的低效。

4、流动计算架构(SOA)
当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA)是关键。

二、RPC定义及架构

RPC(Remote Procedure Call Protocol)远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。简言之,RPC使得程序能够像访问本地系统资源一样,去访问远端系统资源。比较关键的一些方面包括:通讯协议、序列化、资源(接口)描述、服务框架、性能、语言支持等。
简单来说,RPC就是通过配置一个注册中心的地址。一个应用(称为服务提供者)将某个接口(interface)“暴露”出去,另外一个应用(称为服务消费者)通过“引用”这个接口(interface),然后调用了一下,就很神奇的可以调用到另外一个应用的方法了。给我们的感觉就好像调用了一个本地方法一样。即便两个应用不是在同一个 JVM 中甚至两个应用都不在同一台机器中。

Dubbo就是当前最主流的RPC框架,它是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。
涉及到的技术为:动态代理、序列化和反序列化、IO/NIO、Socket通信、服务注册中心


而RPC的架构组件至少包含:
1、客户端(Client):服务调用方(服务消费者)
2、客户端存根(Client Stub):存放服务端地址信息,将客户端的请求参数数据信息打包成网络消息,再通过网络传输发送给服务端
3、服务端存根(Server Stub):接收客户端发送过来的请求消息并进行解包,然后再调用本地服务进行处理
4、服务端(Server):服务的真正提供者

其实通过客户端存根和上图就可以知道,客户端和服务端是有通过存根联系的,并非完全的解耦合。这对后面的代码理解很重要。


三、Demo

GitHub传送门
看了旧后台的SoaClient后可以发现,若是获取到的请求为get直接返回错误'code' => 1012, 'msg' => 'ip is no allow!';若是post请求则通过php的curl.php库发送post请求,将请求的url和参数发生过去,也同样用此接受并转化为json格式返回给前端。
其中发送的URL就是那些端口、Service、方法的拼接。这些都需要客户端提前知晓。所以Deno中的业务也无法完全实现解耦合可以理解为客户端可以看得到Service的接口方法而看不到具体的实现,相当于一个前后端分离业务中的SOA体系。
整体下来对于IO/NIO以及Socker还是不够熟练,这周末有时间打算学一下。

四、公司SOA架构


懒得再开一帖,还得找图,就直接贴这了。
公司的客户端用的是SOA体系,当然请求的时候还是用到了ThreadLocal线程池、MQ队列等等,目前只把SOA相关的打通。值得一提的是最后SoaClient执行的是HTTP的方法,在httpClient底层是加入了各种协议之后最终调用了InternalHttpClientthis.execChain.execute(route, wrapper, localcontext, execAware);实现。后端用的是ETCD分布式存储,用来做配置集中化,配置统一集中管理且可以动态修改配置并实时生效。应该是交接用RPC,Demo信息太少了看不出来。

Last modification:November 25th, 2020 at 11:55 am
喵ฅฅ