Netty:一个非阻塞的客户端/服务器框架

简介: Netty:一个非阻塞的客户端/服务器框架 Netty是一个异步事件驱动的网络应用框架,为Java网络应用的开发带来了一些新活力。Netty由协议服务器和客户端所组成,可用于快速开发可维护的高性能软件。
Netty:一个非阻塞的客户端/服务器框架

Netty是一个异步事件驱动的网络应用框架,为Java网络应用的开发带来了一些新活力。Netty由协议服务器和客户端所组成,可用于快速开发可维护的高性能软件。Netty应用框架及其工具简化了网络编程,而且由Netty社区进行维护。

Netty还被归类为NIO客户端/服务器框架,用它能够快速、简易地开发网络应用,使得TCP和UDP套接字服务器的网络编程得以简化和更加合理。
内建的HTTP协议支持WebSocket,允许框架运行在Servlet容器内。新版的Netty同时支持非阻塞I/O和阻塞I/O通信。

Netty的特性:
1、传输服务包括:套接字和数据报、HTTP通道、虚拟机内部管道
2、协议支持以下扩展:HTTP、Web Socket、Google Protocol Buffer、SSL-StartTLS、大文件传输、RTSP、Zlib或gzip压缩、二进制协议、其它遗留的文本格式
3、核心:可扩展的事件模型、统一通信API、零拷贝能力的富字节缓冲
Netty设计:
Netty在设计上针对多种传输类型,集成了一套统一的API、阻塞和非阻塞的套接字。Netty的事件模型是可扩展的,可以把关注点进行明确隔离。Netty的线程模型提供了在单线程或类SEDA这样的线程池之间选择的灵活性,而且线程是高可自定义的,对数据报的支持实现了真正的无连接通信,Netty的管道抽象与安全线程、动态可变性相结合,使得框架得到有力支撑。
注:SEDA,即Staged Event Driven Architecture,阶段化的事件驱动架构。SEDA的思路是将原先由一个线程完成的任务,分割为相对独立的多个阶段。每个阶段由专用的一组线程负责执行,阶段之间用过队列交互。采用SEDA方式,只有在并发量提高到一定程度,并发成为系统瓶颈时才能体现价值。就单个操作而言,由于队列的传递,其延迟一定是有所上升的。
可以参考这篇论文《 SEDA: an Architecture for Well-Conditioned, Scalable Internet Services
SEDA是加州大学伯克利分校研究的一套优秀的高性能互联网服务器架构模型,其设计目标是:支持大规模并发处理、简化系统开发、支持处理监测、支持系统资源管理。
两种目前广泛使用的网络服务器架构模型:
1)多线程服务器(Threaded Server)
工作原理:对于每一个request,dispatcher都会为其创建并分配一个线程,该线程负责这个请求的处理。此方式又名为(Thread-per-request)。


优点:执行粒度是整个完整的处理流程,处理逻辑清晰,易于开发。
缺点:当随着处理请求的不断增加,会导致并发执行的线程数量太多。过多的线程数量会导致系统在线程调度和资源争用上的开销过大,从而引起系统性能急剧下降,导致系统处理能力下降。
改进措施:引入线程池(Bounded Thread Pools)
系统最多只能创建一定数量的线程。当所有线程都饱和运行时,新到达的处理请求只能等待,或者被抛弃。
缺点:执行粒度仍然是完整的处理流程,难以检测系统性能瓶颈的根源以及进行相应调整。
2)事件驱动并发处理(Event-Driven Concurrency)
将处理流程分割成多个步骤,每一个步骤都实现为一个有限状态机(FSM)。
工作原理:所有的处理请求会作为Event进入系统,由Scheduler负责传递给相应FSM。FSM的处理结果也以Event形式输出给Scheduler。新的Event会再次被Scheduler进行转发给下一个FSM,直至处理完成。


优点:
1、随着处理量的增加,系统负荷是以线形增长。当达到系统饱和处理能力后,系统的处理能力不会下降。
2、由于将各处理步骤独立实现,易于进行系统监测和调整。
缺点:
Scheduler的设计和实现过于复杂,针对于不同的应用和系统的逻辑变更需要不同的实现。

SEDA架构
 (近似于Event-Driven Concurrency,但是没有其中的Scheduler)将每一个处理步骤独立为一个Stage。

Stage结构:
1)一个接受输入的Event Queue;
2)一个应用开发者编写的Event Handler;
3)一个Controller用于对执行过程进行控制。包括并发线程数量、批处理数量等等;
4)一个Thread Pool用于并发处理;
Stage的输入通过Event Queue获得。Stage的输出会以Event形式推送到其他Stage的Event Queue中。Stage之间的这种连接关系由应用开发人员指定。
带来的问题:Event Queue尽管减少了模块间的耦合性,但是会降低响应速度。

性能及有效性:
Netty不仅提供了良好的稳定性,还提供了更好的吞吐量和更低的延迟性能,把内存复制限制到最低需求上,零拷贝能力富字节缓冲特性使内核能够管理DMA复制。这减少了CPU和系统总线的负担,提升了框架的有效性。
可扩展性与集成:
Netty有可扩展能力,支持扩展到上千种连接类型,而且在维持有效性的同时没有性能瓶颈。这些连接的可靠性都非常高,而且不会失效。Netty易于扩展和构建。Netty还提供了灵活的集成性能,可以与很多环境比如Linux、Java、C#、C++、Python等环境集成。
安全:Netty提供了完整的SSL/TLS和StartTLS支持。
Netty官方提供了很多指南、文档以及JavaDoc和例子供开发者参考。
Netty目前的最新稳定版是4.0.23版。
下载地址: http://dl.bintray.com/netty/downloads/netty-4.0.23.Final.tar.bz2

目录
相关文章
|
2月前
|
监控 前端开发 安全
Netty 高性能网络编程框架技术详解与实践指南
本文档全面介绍 Netty 高性能网络编程框架的核心概念、架构设计和实践应用。作为 Java 领域最优秀的 NIO 框架之一,Netty 提供了异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。本文将深入探讨其 Reactor 模型、ChannelPipeline、编解码器、内存管理等核心机制,帮助开发者构建高性能的网络应用系统。
219 0
|
6月前
|
算法 Java 容器
Netty源码—4.客户端接入流程
本文主要介绍了关于Netty客户端连接接入问题整理、Reactor线程模型和服务端启动流程、Netty新连接接入的整体处理逻辑、新连接接入之检测新连接、新连接接入之创建NioSocketChannel、新连接接入之绑定NioEventLoop线程、新连接接入之注册Selector和注册读事件、注册Reactor线程总结、新连接接入总结
|
网络协议 前端开发
netty的TCP服务端和客户端实现
本文介绍了使用Netty框架实现TCP服务端和客户端的步骤,包括添加Netty依赖、编写服务端和客户端的代码,涉及NioEventLoopGroup、ServerBootstrap、Bootstrap、ChannelInitializer等核心组件,以及如何启动服务端监听和客户端连接。
875 4
|
7月前
|
人工智能 搜索推荐 程序员
用 Go 语言轻松构建 MCP 客户端与服务器
本文介绍了如何使用 mcp-go 构建一个完整的 MCP 应用,包括服务端和客户端两部分。 - 服务端支持注册工具(Tool)、资源(Resource)和提示词(Prompt),并可通过 stdio 或 sse 模式对外提供服务; - 客户端通过 stdio 连接服务器,支持初始化、列出服务内容、调用远程工具等操作。
1767 4
|
8月前
|
网络协议 开发者 Python
Socket如何实现客户端和服务器间的通信
通过上述示例,展示了如何使用Python的Socket模块实现基本的客户端和服务器间的通信。Socket提供了一种简单且强大的方式来建立和管理网络连接,适用于各种网络编程应用。理解和掌握Socket编程,可以帮助开发者构建高效、稳定的网络应用程序。
425 10
|
10月前
|
存储 开发工具 git
[Git] 深入理解 Git 的客户端与服务器角色
Git 的核心设计理念是分布式,每个仓库既可以是客户端也可以是服务器。通过 GitHub 远程仓库和本地仓库的协作,Git 实现了高效的版本管理和代码协作。GitHub 作为远程裸仓库,存储项目的完整版本历史并支持多客户端协作;本地仓库则通过 `.git` 文件夹独立管理版本历史,可在离线状态下进行提交、回滚等操作,并通过 `git pull` 和 `git push` 与远程仓库同步。这种分布式特性使得 Git 在代码协作中具备强大的灵活性和可靠性。
262 18
[Git] 深入理解 Git 的客户端与服务器角色
|
11月前
|
存储 人工智能 自然语言处理
ChatMCP:基于 MCP 协议开发的 AI 聊天客户端,支持多语言和自动化安装 MCP 服务器
ChatMCP 是一款基于模型上下文协议(MCP)的 AI 聊天客户端,支持多语言和自动化安装。它能够与多种大型语言模型(LLM)如 OpenAI、Claude 和 OLLama 等进行交互,具备自动化安装 MCP 服务器、SSE 传输支持、自动选择服务器、聊天记录管理等功能。
2540 16
ChatMCP:基于 MCP 协议开发的 AI 聊天客户端,支持多语言和自动化安装 MCP 服务器
|
12月前
|
开发框架 .NET C#
在 ASP.NET Core 中创建 gRPC 客户端和服务器
本文介绍了如何使用 gRPC 框架搭建一个简单的“Hello World”示例。首先创建了一个名为 GrpcDemo 的解决方案,其中包含一个 gRPC 服务端项目 GrpcServer 和一个客户端项目 GrpcClient。服务端通过定义 `greeter.proto` 文件中的服务和消息类型,实现了一个简单的问候服务 `GreeterService`。客户端则通过 gRPC 客户端库连接到服务端并调用其 `SayHello` 方法,展示了 gRPC 在 C# 中的基本使用方法。
253 5
在 ASP.NET Core 中创建 gRPC 客户端和服务器
|
Python
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
使用Python的socket库实现客户端到服务器端的图片传输,包括客户端和服务器端的代码实现,以及传输结果的展示。
610 3
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
|
JSON 数据格式 Python
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
本文介绍了如何使用Python的socket模块实现客户端到服务器端的文件传输,包括客户端发送文件信息和内容,服务器端接收并保存文件的完整过程。
617 1
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输