# 《RPC手撸专栏》第9章:服务提供者调用真实方法的实现

作者:冰河
星球:http://m6z.cn/6aeFbs (opens new window)
博客:https://binghe.gitcode.host (opens new window)
文章汇总:https://binghe.gitcode.host/md/all/all.html (opens new window)

沉淀,成长,突破,帮助他人,成就自我。

大家好,我是冰河~~

服务提供者接收到服务消费者的数据后,该如何实现调用真实的方法呢?

# 一、前言

如何实现服务提供者调用真实方法?

市面上比较成熟的RPC框架,例如Dubbo,都能够实现像调用本地方法一样调用远程方法,它屏蔽了底层远程通信的细节,使开发者仅仅添加几个简单的配置项或者添加几个简单的注解就可以实现远程过程调用,并且整个过程就像是在调用本地方法一样。

这种功能实在是太炫酷了,这也是Dubbo在早年间一经开源,便得到众多互联网大厂的青睐,并且很多互联网公司都借鉴了Dubbo的思想和设计,开发了自己的RPC框架。RPC框架已经称为设计和开发分布式系统必不可少的底层基础设施框架。

RPC框架这种调用远程方法的能力该如何实现呢?这就是本章要重点讨论的内容。

# 二、目标

服务提供者能够调用真实方法,RPC框架才能具备像调用本地方法一样调用远程方法的能力。

RPC框架不仅仅要实现自定义网络传输协议和自定义数据编解码,使服务消费者与服务提供者在此基础上进行数据通信,而且还要实现服务提供者调用真实方法的能力。只有服务提供者具备调用真实方法的能力,并且能够将调用真实方法返回的结果数据传递给服务消费者时,RPC框架才能具备像调用本地方法一样调用远程方法的能力,才能在调用远程方法时,真正屏蔽掉底层通信的细节,使开发人员真正专注与业务逻辑开发,避免过多的维护各种远程通信的细节问题。

本章,要实现的目标就是使bhrpc框架的服务提供者能够调用真实的方法,并且能够向服务消费者响应真实方法返回的结果数据。如图9-1所示。

图9-1 服务消费者、服务提供者与真实方法之间的交互流程

由图9-1可以看出,服务提供者具备调用真实方法的能力后,服务消费者、服务提供者和真实方法之间的交互流程如下所示。

(1)服务消费者根据相应的协议对必要的参数进行封装,将封装后的参数作为调用服务提供者的参数,向服务提供者发起调用。

(2)服务提供者接收到服务消费者传递过来的参数后,进行解析,找到对应的真实方法后,传递对应的参数调用真实的方法。

(3)真实方法执行业务逻辑后,将产生的结果数据响应给服务提供者。

(4)服务提供者接收到真实方法返回的结果数据后,根据相应的协议进行封装,将封装后的结果数据响应给服务消费者。

# 三、设计

如果让你独立设计服务提供者调用真实方法,你会如何设计呢?

一般情况下,在开发业务系统的过程中,如果要调用某个类的公有非静态方法时,大部分情况下,我们都是通过创建这类的对象实例,通过对象实例来调用这个类的公有非静态方法。

但是,可以试想一下,如果是开发一个通用型的RPC框架呢?是否可以通过直接创建某个类的对象实例来达到调用这个类中公有非静态方法的目的呢?答案很显然是不能这么做。

因为在设计和开发一个通用的RPC框架时,并不知道这个RPC框架会具体使用在哪些项目中,也不会事先知道使用RPC框架会具体调用哪个类的哪个方法。这就需要在设计RPC框架时,需要对服务提供者和服务消费者分别进行如下设计。

# 1.整体流程设计

可以将RPC框架中涉及到服务提供者、服务消费者和真实方法之间的整体交互流程设计成如图9-2所示。

图9-2 整体流程设计

图9-2中主要设计的是RPC框架中涉及到的服务消费者、服务提供者与真实方法之间的总体交互流程,其中的具体交互细节会在对服务提供者的设计、对服务消费者的设计和对服务提供者交互逻辑的设计中进行说明。

# 2.核心类实现关系

实现bhrpc框架的服务提供者调用真实方法的过程中,核心类之间的关系如图9-3所示。

图9-3 服务提供者调用真实方法核心类之间的关系

# 查看完整文章

加入冰河技术 (opens new window)知识星球,解锁完整技术文章与完整代码