一、异步事件驱动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;
}
@Override
public 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,使用线程池处理业务逻辑,还会出现阻塞的。