当前位置:首页 > 实用技巧 >

怎么集成netty(netty操作原理)

来源:原点资讯(www.yd166.com)时间:2024-02-21 13:37:42作者:YD166手机阅读>>

Gateway和Netty都有盲区的感觉;

一、Netty简介

Netty是一个异步的,事件驱动的网络应用框架,用以快速开发高可靠、高性能的网络应用程序。

怎么集成netty,netty操作原理(1)

传输服务:提供网络传输能力的管理;

协议支持:支持常见的数据传输协议;

核心模块:包括可扩展事件模型、通用的通信API、零拷贝字节缓冲;

二、Netty入门案例1、服务端启动

配置Netty服务器端程序,引导相关核心组件的加载;

public class NettyServer { public static void main(String[] args) { // EventLoop组,处理事件和IO EventLoopGroup parentGroup = new NioEventLoopGroup(); EventLoopGroup childGroup = new NioEventLoopGroup(); try { // 服务端启动引导类 ServerBootstrap serverBootstrap = new ServerBootstrap(); serverBootstrap.group(parentGroup, childGroup) .channel(NioserverSocketChannel.class).childhandler(new ChannelInit()); // 异步IO的结果 ChannelFuture channelFuture = serverBootstrap.bind(8082).sync(); channelFuture.channel().closeFuture().sync(); } catch (Exception e){ e.printStackTrace(); } finally { parentGroup.shutdownGracefully(); childGroup.shutdownGracefully(); } } }2、通道初始化

ChannelInitializer特殊的通道处理器,提供一种简单的方法,对注册到EventLoop的通道进行初始化;比如此处设置的编码解码器,自定义处理器;

public class ChannelInit extends ChannelInitializer<SocketChannel> { @Override protected void initChannel(SocketChannel socketChannel) { // 获取管道 ChannelPipeline pipeline = socketChannel.pipeline(); // Http编码、解码器 pipeline.addLast("DefHttpServerCodec",new HttpServerCodec()); // 添加自定义的handler pipeline.addLast("DefHttpHandler", new DefHandler()); } }3、自定义处理器

处理对服务器端发起的访问,通常包括请求解析,具体的逻辑执行,请求响应等过程;

public class DefHandler extends SimpleChannelInboundHandler<HttpObject> { @Override protected void channelRead0(ChannelHandlerContext ctx, HttpObject message) throws Exception { if(message instanceof HttpRequest) { // 请求解析 HttpRequest httpRequest = (HttpRequest) message; String uri = httpRequest.uri(); String method = httpRequest.method().name(); log.info("【HttpRequest-URI:" uri "】"); log.info("【HttpRequest-method:" method "】"); iterator<Map.Entry<String,String>> iterator = httpRequest.headers().iteratorAsString(); while (iterator.hasNext()){ Map.Entry<String,String> entry = iterator.next(); log.info("【Header-Key:" entry.getKey() ";Header-Value:" entry.getValue() "】"); } // 响应构建 ByteBuf content = Unpooled.copiedBuffer("Netty服务", charsetUtil.UTF_8); FullHttpResponse response = new DefaultFullHttpResponse (HttpVersion.HTTP_1_1, HttpResponseStatus.OK, content); response.headers().set(HttpHeaderNames.CONTENT_TYPE, "text/plain;charset=utf-8"); response.headers().set(HttpHeaderNames.CONTENT_LENGTH, content.readableBytes()); ctx.writeAndFlush(response); } } }4、测试请求

上面入门案例中,简单的配置了一个Netty服务器端,启动之后在浏览器中模拟访问即可;

http://127.0.0.1:8082/?id=1&name=Spring三、Gateway集成1、依赖层级

项目中Gateway网关依赖的版本为2.2.5.RELEASE,发现Netty依赖的版本为4.1.45.Final,是当下比较主流的版本;

<!-- 1、项目工程依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> <version>2.2.5.RELEASE</version> </dependency> <!-- 2、starter-gateway依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> <version>2.3.2.RELEASE</version> </dependency> <!-- 3、starter-webflux依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-reactor-netty</artifactId> <version>2.3.2.RELEASE</version> </dependency>2、自动化配置

在Gateway网关的自动化配置配置类中,提供了Netty配置的管理;

@AutoConfigureBefore({ HttpHandlerAutoConfiguration.class,WebFluxAutoConfiguration.class }) @ConditionalOnClass(DispatcherHandler.class) public class GatewayAutoConfiguration { @Configuration(proxyBeanMethods = false) @ConditionalOnClass(HttpClient.class) protected static class NettyConfiguration { @Bean @ConditionalOnProperty(name = "spring.cloud.gateway.httpserver.wiretap") public NettyWebServerFactoryCustomizer nettyServerWiretapCustomizer( Environment environment, ServerProperties serverProperties) { return new NettyWebServerFactoryCustomizer(environment, serverProperties) { @Override public void customize(NettyReactiveWebServerFactory factory) { factory.addServerCustomizers(httpServer -> httpServer.wiretap(true)); super.customize(factory); } }; } } }四、配置加载1、基础配置

在工程的配置文件中,简单做一些基础性的设置;

server: port: 8081 # 端口号 netty: # Netty组件 connection-timeout: 3000 # 连接超时2、属性配置类

在ServerProperties类中,并没有提供很多显式的Netty配置参数,更多信息需要参考工厂类;

@ConfigurationProperties(prefix = "server", ignoreUnknownFields = true) public class ServerProperties { private Integer port; public static class Netty { private Duration connectionTimeout; } }3、配置加载分析

怎么集成netty,netty操作原理(2)

  • 基于配置的属性,定制化管理Netty服务的信息;

public class NettyWebServerFactoryCustomizer implements WebServerFactoryCustomizer<NettyReactiveWebServerFactory>{ private final Environment environment; private final ServerProperties serverProperties; @Override public void customize(NettyReactiveWebServerFactory factory) { PropertyMapper propertyMapper = PropertyMapper.get().alwaysApplyingWhenNonNull(); ServerProperties.Netty nettyProperties = this.serverProperties.getNetty(); propertyMapper.from(nettyProperties::getConnectionTimeout).whenNonNull() .to((connectionTimeout) -> customizeConnectionTimeout(factory, connectionTimeout)); } }

  • NettyReactiveWeb服务工厂,基于上述入门案例,创建WebServer时,部分参数信息出自LoopResources接口;

public class NettyReactiveWebServerFactory extends AbstractReactiveWebServerFactory { private ReactorResourceFactory resourceFactory; @Override public WebServer getWebServer(HttpHandler httpHandler) { HttpServer httpServer = createHttpServer(); ReactorHttpHandlerAdapter handlerAdapter = new ReactorHttpHandlerAdapter(httpHandler); NettyWebServer webServer = new NettyWebServer(httpServer, handlerAdapter, this.lifecycleTimeout); webServer.setRouteProviders(this.routeProviders); return webServer; } private HttpServer createHttpServer() { HttpServer server = HttpServer.create(); if (this.resourceFactory != null) { LoopResources resources = this.resourceFactory.getLoopResources(); server = server.tcpConfiguration( (tcpServer) -> tcpServer.runOn(resources).addressSupplier(this::getListenAddress)); } return applyCustomizers(server); } }五、周期管理方法1、控制类

怎么集成netty,netty操作原理(3)

Gateway项目中,Netty服务核心控制类,通过NettyReactiveWebServerFactory工厂类创建,对Netty生命周期的管理提供了一层包装;

public class NettyWebServer implements WebServer { private final HttpServer httpServer; private final ReactorHttpHandlerAdapter handlerAdapter; /** * 启动方法 */ @Override public void start() throws WebServerException { if (this.disposableServer == null) { this.disposableServer = startHttpServer(); // 控制台日志 logger.info("Netty started on port(s): " getPort()); startDaemonAwaitThread(this.disposableServer); } } private DisposableServer startHttpServer() { HttpServer server = this.httpServer; if (this.routeProviders.isEmpty()) { server = server.handle(this.handlerAdapter); } return server.bindNow(); } /** * 停止方法 */ @Override public void stop() throws WebServerException { if (this.disposableServer != null) { // 释放资源 if (this.lifecycleTimeout != null) { this.disposableServer.disposeNow(this.lifecycleTimeout); } else { this.disposableServer.disposeNow(); } // 对象销毁 this.disposableServer = null; } } }2、管理类

Netty组件中抽象管理类,以安全的方式构建Http服务;

public abstract class HttpServer { public static HttpServer create() { return HttpServerBind.INSTANCE; } public final DisposableServer bindNow() { return bindNow(Duration.ofSeconds(45)); } public final HttpServer handle(BiFunction<? super HttpServerRequest, ? super HttpServerResponse, ? extends Publisher<Void>> handler) { return new HttpServerHandle(this, handler); } }

END

怎么集成netty,netty操作原理(4)

,

栏目热文

netty 文件分发(netty详细步骤)

netty 文件分发(netty详细步骤)

一、异步非阻塞通信1.1 传统BIO1.2 非阻塞NIO1.3 拓展:AIO1.4 I/O多路复用机制1.4.1 sel...

2024-02-21 13:52:34查看全文 >>

netty文件传输(netty传输二进制文件)

netty文件传输(netty传输二进制文件)

本系列Netty源码解析文章基于 4.1.56.Final版本主从Reactor组完整结构.png在?《Netty如何高...

2024-02-21 13:35:28查看全文 >>

netty大文件传输框架(netty大文件上传)

netty大文件传输框架(netty大文件上传)

今天我们来完成一个使用netty进行文件传输的任务。在实际项目中,文件传输通常采用FTP或者HTTP附件的方式。事实上通...

2024-02-21 13:48:27查看全文 >>

怎么写netty(netty入门教程文档)

怎么写netty(netty入门教程文档)

思维导图前言本文主要讲述netty框架的一些特性以及重要组件,希望看完之后能对Netty框架有一个比较直观的感受,希望能...

2024-02-21 13:34:19查看全文 >>

netty 怎么通信(netty怎么维护长连接)

netty 怎么通信(netty怎么维护长连接)

摘自 rickiyang 51CTO技术栈 很早以前就写过关于 Netty 的使用,最近发现还有网友在看之前写的那篇 N...

2024-02-21 13:23:06查看全文 >>

为什么要学习netty(netty有必要学吗)

为什么要学习netty(netty有必要学吗)

2021年了,终于开始系统性总结Netty相关的东西了。这会是Netty系列的第一篇,我想先聊聊 “为什么要学习Nett...

2024-02-21 13:41:47查看全文 >>

netty框架教学(netty框架工作原理)

netty框架教学(netty框架工作原理)

一 什么是 Netty? 能做什么?netty 是一个致力于创建高性能网络应用程序的成熟的 IO 框架。相比较与直接使用...

2024-02-21 13:48:53查看全文 >>

如何使用netty(netty调用方法)

如何使用netty(netty调用方法)

前言Netty 祭天,法力无边。哈哈哈 , Netty 这组件,哪怕你从来没主动用过,但是它无时无刻都在你身边。可以说,...

2024-02-21 13:20:02查看全文 >>

奥迪哪些车型使用贯穿尾灯(奥迪贯穿式尾灯的有哪些车型)

奥迪哪些车型使用贯穿尾灯(奥迪贯穿式尾灯的有哪些车型)

说到豪华小型SUV,大家最先想到的是谁呢?奥迪Q3作为奥迪旗下的畅销车,与宝马X1、奔驰GLA等车型同为豪华小型SUV代...

2024-02-21 13:20:56查看全文 >>

奥迪贯穿尾灯哪几款车有(奥迪贯穿尾灯哪几款车有的)

奥迪贯穿尾灯哪几款车有(奥迪贯穿尾灯哪几款车有的)

日前,外媒曝光了一组全新奥迪S5 Sportback的谍照,这似乎是新车的谍照第一次被曝光,它是下一代奥迪A5的性能版,...

2024-02-21 13:49:40查看全文 >>

文档排行