一、异步事件驱动NIO框架Netty介绍
简介:介绍Netty来源,版本,目前在哪些主流公司和产品框架使用
1、Netty是由JBOSS提供的一个java开源看框架,是业界最流行的NIO框架,整合了多种协议
包括FTP,SMTP,HTTP等各种二进制文本协议)的实验经验,精心设计的框架,在多个大型商业项目中得到充分验证。
1):API使用简单
2):成熟,稳定
3):社区活跃,有很多种NIO框架,如mina
4) :经过大规模的验证(互联网,大数据,网络游戏,电信行业
2、哪些主流框架产品在用?
1): 搜索引擎框架(ElasticSerach,github里面的搜索是用es做的:底层是用Netty去做的通信的)。
2):Hadoop:子项目Avro项目,底层是用Netty作为底层通信框架
3):阿里巴巴的开源框架RPC框架 Dubbo
地址:http://dubbo.apache.org/zh-cn
二、使用JDK自带BIO编写一个Client-Server通信
1、BIO网络编程实战之编写BioServer服务端
简介:使用jdk自带的Bio编写一个统一时间服务,这也是java的socket编程
代码如下:
package com.weizhaoyang;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;public class BioServer {public static final int PORT=8080;public static void main(String[] args) throws IOException {ServerSocket server=null;try{server=new ServerSocket(PORT);System.out.println("the server is start in port:"+PORT);Socket socket=null;while(true){socket = server.accept();new Thread(new TimeServerHandler(socket)).start();}}catch(Exception e){}finally{if(server!=null){System.out.println("the time server close");server.close();}}}}package com.weizhaoyang;import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.Socket;import java.util.Date;public class TimeServerHandler implements Runnable{private Socket socket;public TimeServerHandler(Socket socket){this.socket=socket;}@Overridepublic void run() {BufferedReader in=null;PrintWriter out=null;try{in=new BufferedReader(new InputStreamReader(this.socket.getInputStream()));out=new PrintWriter(this.socket.getOutputStream(),true);String body=null;while((body=in.readLine())!=null&&body.length()!=0){System.out.println("the time server receive msg"+body);out.println(new Date().toString());}}catch(Exception e){e.printStackTrace();}finally{if(in!=null){try{in.close();}catch(Exception e){e.printStackTrace();}}if(out!=null){try{out.close();}catch(Exception e){e.printStackTrace();}}if(this.socket!=null){try{this.socket.close();}catch(Exception e){e.printStackTrace();}}}}}package com.weizhaoyang;import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.Socket;public class BioClient {private static final int PORT=8080;private static final String HOST="127.0.0.1";public static void main(String[] args) {Socket socket=null;BufferedReader in=null;PrintWriter out=null;try{socket=new Socket(HOST,PORT);in=new BufferedReader(new InputStreamReader(socket.getInputStream()));out=new PrintWriter(socket.getOutputStream(),true);out.println("i am client");String resp=in.readLine();System.out.println("当前服务时间"+resp);}catch(Exception e){e.printStackTrace();}finally{if(in!=null){try{in.close();}catch(Exception e){e.printStackTrace();}}if(out!=null){try{out.close();}catch(Exception e){e.printStackTrace();}}if(socket!=null){try{socket.close();}catch(Exception e){e.printStackTrace();}}}}}
运行的结果如下:
三、BIO编写Client/Server通信优缺点分析
简介:讲解BIO的优缺点,为啥不能高并发情况下性能弱
上面用BIO写了时间同步服务器,在很多项目的时候,做一些时间同步也是很有必要的,如果项目部署了很多的服务器,如果要同步每个服务的时间点,就需要这样的服务统一对应他们的时间。
1、服务端启动好,就在那里阻塞,accpet,等待客户端进行连接
2、一有连接进来,然后就会给它分配一个线程,处理对应的请求。
3、在TimeServerHandler处理对应的业务逻辑,编码和解码事件都会在这个类处理。
优点:模型简单
编码简单
缺点:性能瓶颈,请求数和线程数属于 N:N关系
高并发情况下,CPU切换线程上下文损耗大
案例:web服务器Tomcat7之前都使用BIO进行,7之后使用NIO,一个线程对应多个请求进行轮询的操作,或者一个线程池去操作。
改进:伪NIO,使用线程池处理业务逻辑,还会出现阻塞的。