基于Spring开发的一个BIO-RPC框架(对小白很友好)

 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


posted @ 2017-11-20 20:33  丨核桃牛奶  阅读(680)  评论(0编辑  收藏  举报