上一篇 谈到了动态代理在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中找到实例,再通过反射执行实例方法,最后再将执行结果回传给消费者。