java的远程调用核心在于解决rpc序列化和反序列化,但是要完成一个远程调用,最花力气的并不是rpc的问题,rpc的方案已经有非常多的方案可以完成了,主要的问题在于通讯机制、负载、选举策略、服务治理等方向,这些方向与本篇文章越扯越远,我在这里只分享如何实现一个java的远程调用。
为了快速方便,项目是基于springboot开发的,2年前的项目了,写这个项目是当时我对springcloud与dubbo还有spring的一些理解,应该能给正在学习这些技术的人起到一些帮助。
设计思想是开发一个开箱即用的starter,提供了基本的配置,允许一个实现类同时暴露多个服务(与dubbo不一样),允许跨外网远程调用等等,有些有意思的地方,最新的分支版本在rewrite-1.0,稳定可用的版本在master,更多细节请查看项目说明实现思路:
一、自定义注解或配置文件配置必要的信息
1、在竞选leader上需要指定一个端口,不指定将使用当前服务端口2、在跨外网调用上需要指定目标ip或者dns,可以多个
二、starter的实现
1、注解到一个class上即可,如果class实现了多个接口,会将多个接口全部开放
2、这里使用的是hessian的序列化方案,所以生产者在spring框架启动完成后第一时间进行bean的扫描创建注册到springbean中。
3、在第二步的同时会进行路由信息生成
4、当生产者完成注册后会进行资源就绪事件的发布
5、收到事件触发starter的配置中心进行整个starter的启动前的自动配置,其中包含有网络环境检测,启动配置扫描,启动参数自动配置、初始化并启动消费者扫描器、初始化服务路由器、初始化路由缓存组件、初始化网络模块、最后输出配置信息
6、当消费者进行消费的时候会进行提前的预装配bean进行注入,这里优先内网调用,其次进行外网调用。这里可以实现生产者新增加一个服务,消费者无需重启既可以调用到,因为路由信息是全网分发的,只要能分发到路由信息即可进行调用。资源注入的时候会自动初始化bean进行注入。