BigData~02:NIO(Netty)

很久以前Java服务端的高性能非常让人失望,但是随着新的JDK的逐步完善,Java服务端的高并发开发让人愈发喜悦。怎么说呢?请看下文;

一、IO的发展阶段

  1. (B)IO:(Blocking) IO;
  2. NIO:Non-Blocking IO,JDK1.4发布,JDK5更新了Selector;
  3. AIO:Asynchronized (Non-Blocking) IO,JDK7发布;

各种IO的数据操作流程

  1. NIO
    • NIO在Linux操作系统上是一个实实在在的异步非阻塞IO,其操作流程如下:
      • NIO的API向Linux内核注册一个监听器Selector,之后就等待内核对NIO的API的回调;
      • NIO的API通知Linux内核,可以和客户端建立连接,这个时候如果有客户端请求,那么客户端就和Linux内核进行三次握手建立连接;连接建立成功后就通知NIO的API连接建立成功;
      • 当客户端吧数据发送到Linux内核的缓存中的时候,那么Linux内核就会把通知NIO的API读取数据;

Netty的实现RPC思路

  1. 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中返回即可;
      • 上面的整个流程组合在一起,就完成了一次远程调用;

你可能感兴趣的:(BigData~02:NIO(Netty))