手写RPC框架,我学会了什么?(二):模型和思考

上一篇 谈到了动态代理在RPC框架中的作用,这一篇会继续谈谈框架设计时的一些模型、理念和简单的思考。

相关名词

服务接口(Service Interface) 服务提供者和消费者沟通的“桥梁”,通常需要通过打包成jar发布出去,比如:

public interfere IHelloService {
    String sayHi(String somebody);
}

服务实例类(Service Instance) 实现真正的业务逻辑,比如:

public class HelloServiceImpl implements IHelloService {
    @Override
    String sayHi(String somebody) {
        return "Hello, " + somebody + "!";
    }
}

服务提供者(Service Provider) 提供服务的一方,实际上也是服务实例类运行的地方。

服务消费者(Service Consumer) 使用服务的一方,调用接口提供的方法获得结果并进行后续处理,比如:

IHelloService helloService = RpcClient.getRemoteInstanceProxy(IHelloService.class);
String msg = helloService.sayHi("world");
//- 返回:Hello, world!

配置中心(Config Center) 提供服务提供者相关的信息,比如IP地址,监听的端口号,服务名等。比如:

10.100.100.01:8000 IHelloService
10.100.100.02:8000 IHelloService

服务注册(Service Register) 服务提供者向配置中心推送自身信息的行为。

框架需要做什么

服务提供者启动后,首先生成服务实例类,并维护一个“类名-实例类”的映射关系(Map)。接着向配置中心进行服务注册。

服务消费者启动后,首先从配置中心获得服务提供者的信息。接着尝试与某一个服务提供者建立通信。

当服务消费者调用RpcClient.getRemoteInstanceProxy()时,通过动态代理获得服务接口的一个“傀儡”实例。当调用接口的具体方法时,“傀儡”实例会通过Socket将调用信息,比如:类名、方法名、方法参数等发送给提供者。

提供者首先通过类名在Map中找到实例,再通过反射执行实例方法,最后再将执行结果回传给消费者。

    原文作者:日更专用小马甲
    原文地址: https://www.jianshu.com/p/2daba265833a
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞