基于Spring开发的一个BIO-RPC框架(对新人很友好)
PART1:先来整体看下项目的构成

其中bio-rpc-core就是所谓的rpc框架
bio-rpc-example-client即所谓的服务调用方(你的项目中想要调用服务的地方)
bio-rpc-example-server即所谓的服务提供方(你的项目中写好服务想要供别人调用的地方)
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框架(对新人很友好)的更多相关文章
- 基于.netcore 开发的轻量Rpc框架
Rpc原理详解 博客上已经有人解释的很详细了,我就不在解释了.传送门 项目简介 项目是依赖于.net core2.0版本,内部都是依靠IOC来实现的,方便做自定义扩展.底层的通信是采用socket,s ...
- 基于Netty和SpringBoot实现一个轻量级RPC框架-协议篇
基于Netty和SpringBoot实现一个轻量级RPC框架-协议篇 前提 最近对网络编程方面比较有兴趣,在微服务实践上也用到了相对主流的RPC框架如Spring Cloud Gateway底层也切换 ...
- 基于Netty和SpringBoot实现一个轻量级RPC框架-Server篇
前提 前置文章: Github Page:<基于Netty和SpringBoot实现一个轻量级RPC框架-协议篇> Coding Page:<基于Netty和SpringBoot实现 ...
- 基于Netty和SpringBoot实现一个轻量级RPC框架-Client篇
前提 前置文章: <基于Netty和SpringBoot实现一个轻量级RPC框架-协议篇> <基于Netty和SpringBoot实现一个轻量级RPC框架-Server篇> 前 ...
- 基于Netty和SpringBoot实现一个轻量级RPC框架-Client端请求响应同步化处理
前提 前置文章: <基于Netty和SpringBoot实现一个轻量级RPC框架-协议篇> <基于Netty和SpringBoot实现一个轻量级RPC框架-Server篇> & ...
- 一个入门rpc框架的学习
一个入门rpc框架的学习 参考 huangyong-rpc 轻量级分布式RPC框架 该程序是一个短连接的rpc实现 简介 RPC,即 Remote Procedure Call(远程过程调用),说得通 ...
- 基于Spring开发的DUBBO服务接口测试
基于Spring开发的DUBBO服务接口测试 知识共享主要内容: 1. Dubbo相关概念和架构,以及dubbo服务程序开发步骤. 2. 基于Spring开发框架的dubbo服务接口测试相关配置. 3 ...
- 基于HTTP/2和protobuf的RPC框架:GRPC
谷歌发布的首款基于HTTP/2和protobuf的RPC框架:GRPC Google 刚刚开源了grpc, 一个基于HTTP2 和 Protobuf 的高性能.开源.通用的RPC框架.Protobu ...
- 从 Spring Cloud 看一个微服务框架的「五脏六腑」
原文:https://webfe.kujiale.com/spring-could-heart/ Spring Cloud 是一个基于 Spring Boot 实现的微服务框架,它包含了实现微服务架构 ...
随机推荐
- Jquery实现鼠标移到某个对象,弹出显示层。
/** * 鼠标移上去显示层 * @param divId 显示的层ID * @returns */ $.fn.myHoverTip = function(divId) { var div = $(& ...
- 使用邮件监控Mxnet训练
1. 前言 受到小伙伴的启发,就自己动手写了一个使用邮件监控Mxnet训练的例子.整体不算复杂. 2. 打包训练代码 需要进行监控训练,所以需要将训练的代码打包进一个函数内,通过传参的方式进行训练.还 ...
- pseudocode of zigzag conversion
1.Title : The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of ...
- 最佳时间买入卖出股票 Best Time to Buy and Sell Stock LeetCode
LeetCode 我们有一个股票的数组,数组是每时间的钱,我们只能买入一次和卖出一次,求我们的最大收益. 我们知道了一个数组,那么我们可以在低价买入,然后高价卖出,但是需要知道我们的低价需要在高价之前 ...
- SimpleDateFormat时间格式化存在线程安全问题
想必大家对SimpleDateFormat并不陌生.SimpleDateFormat 是 Java 中一个非常常用的类,该类用来对日期字符串进行解析和格式化输出,但如果使用不小心会导致非常微妙和难以调 ...
- LINUX 笔记-命令执行顺序 && ,||
&& 格式:命令1 && 命令2 说明:命令1返回真(即返回0,成功被执行)后,命令2才能够被执行 例:/apps/bin目录将会被移到/apps/dev/bin目录下 ...
- DNS over TLS到底有多牛?你想知道的都在这儿
DNS over TLS,让电信.移动等各种ISP无法监视你的浏览轨迹...... SSL证书有助于客户端浏览器和网站服务器之间的加密连接. 这意味着在连接期间,所有的通信和活动都被遮蔽. 但通常意义 ...
- PHP简洁之道
前言 前几天在GitHub看到一篇写PHP简洁之道的译文,觉得还不错,所以转在了自己的博客中,只不过有一些地方好像没有翻译,再加上排版上的一些小问题,所以决定自己翻译一遍. 原文地址:https:// ...
- JavaScript--我发现,原来你是这样的JS(再说引用类型,基本包装类型与个体内置对象)
一.介绍 本篇是续上一篇的,引用类型的后篇,本篇主要是说基本包装类型和个体内置对象.如果你能收获一些知识,那我很高兴,很满足,哈哈哈,希望大家能愉快看完.如果你想学好一门技术,要不忘初心,方得始终. ...
- Setup and Configure the vsftpd server in CentOS 7 operation system
############################################################################## 1. close the firewall ...