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,使用线程池处理业务逻辑,还会出现阻塞的。

相关文章
|
SQL 关系型数据库 数据库
学习分布式事务Seata看这一篇就够了,建议收藏
学习分布式事务Seata看这一篇就够了,建议收藏
23377 2
|
数据库 对象存储
2025年 | 4月云大使推广奖励规则
【近期云大使规则升级】①上线老用户返佣规则。②企业云大使提现功能上线。③优化推广奖励限制。④调整用户关联周期。⑤新增沉睡用户返利 。⑥推荐企业认证新用户首购最高奖励45%。
2025年 | 4月云大使推广奖励规则
|
JSON 算法 Java
Nettyの网络聊天室&扩展序列化算法
通过本文的介绍,我们详细讲解了如何使用Netty构建一个简单的网络聊天室,并扩展序列化算法以提高数据传输效率。Netty的高性能和灵活性使其成为实现各种网络应用的理想选择。希望本文能帮助您更好地理解和使用Netty进行网络编程。
239 12
|
存储 NoSQL MongoDB
MongoDB GridFS
10月更文挑战第24天
174 1
|
存储 运维 架构师
Netty API网关实操系列(二)
Netty API网关实操系列(二)
|
安全 应用服务中间件 API
Netty API网关实操系列(一)
Netty API网关实操系列(一)
|
Arthas Kubernetes 调度
一次线上Xxl-Job定时任务调度失败的排查与解决
在XXL-JOB系统中,每分钟执行一次的任务出现调度异常:首次调度成功,第二次调度失败,但第三次调度显示的是第二次任务的执行时间。问题源于调度中心发送的心跳请求未得到执行器响应,导致连接被Envoy代理关闭。Envoy在等待心跳响应时,后续调度请求被阻塞,直至连接因超时关闭。调度中心收到503响应后也会关闭连接,从而影响第三次调度。解决方案是更新执行器以处理心跳请求或配置Istio Sidecar以绕过Envoy代理特定流量。
4286 1
|
消息中间件 分布式计算 网络协议
初识Netty
Netty是 一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。Netty是一个NIO客户端服务器框架,可以快速轻松地开发网络应用程序,例如协议服务器和客户端。它极大地简化了TCP和UDP套接字服务器等网络编程
1083 0
|
网络协议 前端开发 算法
配置之道:深入研究Netty中的Option选项
配置之道:深入研究Netty中的Option选项
951 0
|
缓存 NoSQL Java
【二十六】springboot整合jedis和redisson布隆过滤器处理缓存穿透
【二十六】springboot整合jedis和redisson布隆过滤器处理缓存穿透
699 0

热门文章

最新文章