PART1:先来整体看下项目的构成
其中bio-rpc-core就是所谓的rpc框架
bio-rpc-example-client即所谓的服务调用方(你的项目中想要调用服务的地方)
bio-rpc-example-server即所谓的服务提供方(你的项目中写好服务想要供别人调用的地方)
github地址:https://github.com/Luyu05/BioRpcExample
PART2:这个框架咋用?
服务使用方
1.首先,在想要调用服务的地方(bio-rpc-example-client)引入框架的jar包,本例中如下图
2.跟普通的要托管给spring的bean一样,在配置文件中引入bean的基本信息,值得注意的是这里的这个类NetComClientProxy(框架里的核心部分)
3.在想要使用的地方,通过@resource等让spring帮助我们完成自动注入,此时就可以像调用本地类的方法一样调用远程的方法了~
4.至此服务使用方讲解完成,是不是很简单,下面看看服务提供方需要做什么(你会发现比这里更简单)
服务提供方
1.第一步与上面类似,引入框架jar包
2.第二步,在你想要对外提供的类的上方,加上一个注解
3.值得注意的是,还需要在服务提供方与服务使用方的pom文件中引入对应的api的jar包,如下图
4.大功告成,启动项目试试,先启动server(服务提供端:bio-rpc-example-server),再启动client(服务调用端:bio-rpc-example-client),如果看到下面内容,就说明你已经成功了~你现在已经可以把服务部署到老王的PC上(我们称为A),再在你本机上(称为B)调用A上定义的类以及方法(B是怎么知道A上定义的方法的具体细节的?还记得我们引入的定义类的api包吗),最重要的是方法的执行过程耗费的是A机器的资源,与你也就是B机器没啥太大关系,你只要负责发送调用请求,再收方法执行结果就行了。
PART3 框架是咋实现的,为啥我通过简单的几个注解,还有配置的bean就可以用老王的机器执行我的任务了?
1.Server
1.1 在web启动的配置文件中,定义了原始类为框架核心的类-NetComServerFactory,项目启动时,会自动实例化该bean
1.2 NetComServerFactory中首先会执行bean定义时的property标签对应的set方法
1.3 接下来执行从ApplicationContextAware继承的setApplicationContext方法
1.4 setApplicationContext中,调用了一个有趣的方法applicationContext.getBeansWithAnnotation(RpcProviderService.class)
1.5 这个方法将带有@RpcProviderService标签的bean 都找到,然后在setApplicationContext中将这些bean 以类名字为主键 bean本身为value 放到了一个map里,名字是serviceMap
1.6 接下来执行afterPropertiesSet方法,该方法继承自InitializingBean接口
1.7 在afterPropertiesSet方法中,开启了一个新的线程来在服务端启动一个端口,来监听客户端的请求,由于基于bio所以这时候新的线程内部会堵塞
1.8 获取到连接后,服务端对每一个客户端到来的连接都创建一个新线程,获取客户端输入对象-反序列化并解析对象
1.9 根据客户端的请求传来的接口信息,从之前的serviceMap中根据类名字找到对应的类,通过反射获取对应类的实例并调用目标方法
1.10 将反射调用的结果,封装并传给客户端,关闭连接
2.Client
2.1 在web启动的配置文件中,定义了要使用的服务端的bean,原始类为框架核心的类--NetComClientProxy,项目启动时,会自动实例化该bean
2.2 在NetComClientProxy中继承自FactoryBean的getObject方法中return了一个自定义的代理类,Proxy.newProxyInstance(xxx)
2.3 接上,覆写了invoke方法,使得代理每次调用原始接口方法的时候,都会调用这个invoke方法;
2.4 该方法将当前方法的信息、类信息封装为请求,一并通过socket发送到服务端,并接收服务端的响应,将结果返回给调用方。
github地址:https://github.com/Luyu05/BioRpcExample
基于Spring开发的一个BIO-RPC框架(对小白很友好)