Netty(一)

简介: Netty(一)

一、异步事件驱动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编程

代码如下:

  1. package com.weizhaoyang;

  2. import java.io.IOException;
  3. import java.net.ServerSocket;
  4. import java.net.Socket;

  5. public class BioServer {
  6.    public static final int PORT=8080;

  7.    public static void main(String[] args) throws IOException {
  8.        ServerSocket server=null;
  9.        try{
  10.            server=new ServerSocket(PORT);
  11.            System.out.println("the server is start  in port:"+PORT);
  12.            Socket socket=null;
  13.            while(true){
  14.                socket = server.accept();
  15.                new Thread(new TimeServerHandler(socket)).start();
  16.            }
  17.           }catch(Exception e){
  18.        }finally{
  19.            if(server!=null){
  20.                System.out.println("the time server close");
  21.                server.close();
  22.            }
  23.        }
  24.    }
  25. }
  26. package com.weizhaoyang;
  27. import java.io.BufferedReader;
  28. import java.io.InputStreamReader;
  29. import java.io.PrintWriter;
  30. import java.net.Socket;
  31. import java.util.Date;

  32. public class TimeServerHandler implements Runnable{
  33.    private Socket socket;
  34.    public TimeServerHandler(Socket socket){
  35.        this.socket=socket;
  36.    }
  37.    @Override
  38.    public void run() {
  39.        BufferedReader  in=null;
  40.        PrintWriter  out=null;
  41.        try{
  42.            in=new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
  43.            out=new PrintWriter(this.socket.getOutputStream(),true);
  44.            String body=null;
  45.            while((body=in.readLine())!=null&&body.length()!=0){
  46.                System.out.println("the time server receive msg"+body);
  47.                out.println(new Date().toString());
  48.            }

  49.        }catch(Exception e){
  50.            e.printStackTrace();
  51.        }finally{
  52.            if(in!=null){
  53.                try{
  54.                    in.close();
  55.                }catch(Exception e){
  56.                    e.printStackTrace();
  57.                }
  58.            }
  59.            if(out!=null){
  60.                try{
  61.                    out.close();
  62.                }catch(Exception e){
  63.                    e.printStackTrace();
  64.                }
  65.            }
  66.            if(this.socket!=null){
  67.                try{
  68.                   this.socket.close();
  69.                }catch(Exception e){
  70.                    e.printStackTrace();
  71.                }
  72.            }
  73.        }
  74.    }
  75. }
  76. package com.weizhaoyang;

  77. import java.io.BufferedReader;
  78. import java.io.InputStreamReader;
  79. import java.io.PrintWriter;
  80. import java.net.Socket;

  81. public class BioClient {
  82.    private static final int PORT=8080;
  83.    private static final String HOST="127.0.0.1";
  84.    public static void main(String[] args) {
  85.        Socket socket=null;
  86.        BufferedReader in=null;
  87.        PrintWriter out=null;
  88.        try{
  89.           socket=new Socket(HOST,PORT);
  90.            in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
  91.            out=new PrintWriter(socket.getOutputStream(),true);
  92.            out.println("i am client");
  93.            String resp=in.readLine();
  94.            System.out.println("当前服务时间"+resp);
  95.        }catch(Exception e){
  96.            e.printStackTrace();
  97.        }finally{
  98.            if(in!=null){
  99.                try{
  100.                    in.close();
  101.                }catch(Exception e){
  102.                    e.printStackTrace();
  103.                }
  104.            }
  105.            if(out!=null){
  106.                try{
  107.                    out.close();
  108.                }catch(Exception e){
  109.                    e.printStackTrace();
  110.                }
  111.            }
  112.            if(socket!=null){
  113.                try{
  114.                    socket.close();
  115.                }catch(Exception e){
  116.                    e.printStackTrace();
  117.                }
  118.            }
  119.        }

  120.    }
  121. }

运行的结果如下:

三、BIO编写Client/Server通信优缺点分析

   简介:讲解BIO的优缺点,为啥不能高并发情况下性能弱

上面用BIO写了时间同步服务器,在很多项目的时候,做一些时间同步也是很有必要的,如果项目部署了很多的服务器,如果要同步每个服务的时间点,就需要这样的服务统一对应他们的时间。

1、服务端启动好,就在那里阻塞,accpet,等待客户端进行连接

2、一有连接进来,然后就会给它分配一个线程,处理对应的请求。

3、在TimeServerHandler处理对应的业务逻辑,编码和解码事件都会在这个类处理。

优点:模型简单

         编码简单

缺点:性能瓶颈,请求数和线程数属于  N:N关系

         高并发情况下,CPU切换线程上下文损耗大

案例:web服务器Tomcat7之前都使用BIO进行,7之后使用NIO,一个线程对应多个请求进行轮询的操作,或者一个线程池去操作。

改进:伪NIO,使用线程池处理业务逻辑,还会出现阻塞的。

相关文章
|
网络协议 前端开发 安全
Netty
Netty
907 1
|
NoSQL 数据可视化 MongoDB
Windows MongoDB的安装及配置图文说明(非常详细)
Windows MongoDB的安装及配置图文说明(非常详细)
1577 0
|
2月前
|
人工智能 开发框架 安全
浅谈 Agent 开发工具链演进历程
模型带来了意识和自主性,但在输出结果的确定性和一致性上降低了。无论是基础大模型厂商,还是提供开发工具链和运行保障的厂家,本质都是希望提升输出的可靠性,只是不同的团队基因和行业判断,提供了不同的实现路径。本文按四个阶段,通过串联一些知名的开发工具,来回顾 Agent 开发工具链的演进历程。
543 49
|
6月前
|
前端开发
SpringBoot2.3.1集成Knife4j接口文档
SpringBoot2.3.1集成Knife4j接口文档
534 57
|
存储 Java API
Netty指南
Netty指南
342 2
|
存储 Java 测试技术
阿里巴巴java开发手册
这篇文章是关于阿里巴巴Java开发手册的整理,内容包括编程规约、异常日志、单元测试、安全规约、MySQL数据库使用以及工程结构等方面的详细规范和建议,旨在帮助开发者编写更加规范、高效和安全的代码。
|
存储 负载均衡 监控
redis 集群模式(redis cluster)介绍
redis 集群模式(redis cluster)介绍
|
Arthas Kubernetes 调度
一次线上Xxl-Job定时任务调度失败的排查与解决
在XXL-JOB系统中,每分钟执行一次的任务出现调度异常:首次调度成功,第二次调度失败,但第三次调度显示的是第二次任务的执行时间。问题源于调度中心发送的心跳请求未得到执行器响应,导致连接被Envoy代理关闭。Envoy在等待心跳响应时,后续调度请求被阻塞,直至连接因超时关闭。调度中心收到503响应后也会关闭连接,从而影响第三次调度。解决方案是更新执行器以处理心跳请求或配置Istio Sidecar以绕过Envoy代理特定流量。
3684 1
|
NoSQL Java MongoDB
如何在Spring Boot应用中集成MongoDB数据库
如何在Spring Boot应用中集成MongoDB数据库