很久以前Java服务端的高性能非常让人失望,但是随着新的JDK的逐步完善,Java服务端的高并发开发让人愈发喜悦。怎么说呢?请看下文;
一、IO的发展阶段
- (B)IO:(Blocking) IO;
- NIO:Non-Blocking IO,JDK1.4发布,JDK5更新了Selector;
- AIO:Asynchronized (Non-Blocking) IO,JDK7发布;
各种IO的数据操作流程
- NIO
- NIO在Linux操作系统上是一个实实在在的异步非阻塞IO,其操作流程如下:
- NIO的API向Linux内核注册一个监听器
Selector
,之后就等待内核对NIO的API的回调; - NIO的API通知Linux内核,可以和客户端建立连接,这个时候如果有客户端请求,那么客户端就和Linux内核进行三次握手建立连接;连接建立成功后就通知NIO的API连接建立成功;
- 当客户端吧数据发送到Linux内核的缓存中的时候,那么Linux内核就会把通知NIO的API读取数据;
- NIO的API向Linux内核注册一个监听器
- NIO在Linux操作系统上是一个实实在在的异步非阻塞IO,其操作流程如下:
Netty的实现RPC思路
- Netty
- Netty是对NIO的封装,即Netty是一种非阻塞通信框架;
- Netty + Spring + Refection + ZK 实现RPC思路
- Spring启动,①Spring会创建配置在其配置文件中的Bean;②在这些Bean中有我们的编写的类A,类A实现了Spring的ApplicationContextAware接口,当Spring启动后就会调用类A的对象的setApplicationContextAware方法;
- 在setApplicationContextAware方法中,我们可以使用setter方法传入的参数context获取所有的装配有我们自己编写的注解的对象(装配有这些注解的类就是要发布服务的类),我们把这些对象存储到一个Map中;
- 启动Netty服务,即向ZK发送注册请求;
- 当有客户端想发起请求的时候,先去ZK获取想要的服务的服务器列表,挑选其中一个发送请求到服务器,Netty接收到请求后,就会把请求的细节屏蔽,我们只需要在相应的Handler中利用反射调用Map中的对象的相应方法,并把Handler中的返回值在OutterHandler中返回即可;
- 上面的整个流程组合在一起,就完成了一次远程调用;
网友评论