凡科代理建站登录,哪里做网站比较稳定,深圳科技有限公司 网站建设,广东衍发建设管理有限公司公司网站Gateway和Netty都有盲区的感觉#xff1b; 一、Netty简介
Netty是一个异步的#xff0c;事件驱动的网络应用框架#xff0c;用以快速开发高可靠、高性能的网络应用程序。 传输服务#xff1a;提供网络传输能力的管理#xff1b;
协议支持#xff1a;支持常见的数据传输… Gateway和Netty都有盲区的感觉 一、Netty简介
Netty是一个异步的事件驱动的网络应用框架用以快速开发高可靠、高性能的网络应用程序。 传输服务提供网络传输能力的管理
协议支持支持常见的数据传输协议
核心模块包括可扩展事件模型、通用的通信API、零拷贝字节缓冲
二、Netty入门案例
1、服务端启动
配置Netty服务器端程序引导相关核心组件的加载
public class NettyServer {public static void main(String[] args) {// EventLoop组处理事件和IOEventLoopGroup 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 ChannelInitializerSocketChannel {Overrideprotected void initChannel(SocketChannel socketChannel) {// 获取管道ChannelPipeline pipeline socketChannel.pipeline();// Http编码、解码器pipeline.addLast(DefHttpServerCodec,new HttpServerCodec());// 添加自定义的handlerpipeline.addLast(DefHttpHandler, new DefHandler());}
}3、自定义处理器
处理对服务器端发起的访问通常包括请求解析具体的逻辑执行请求响应等过程
public class DefHandler extends SimpleChannelInboundHandlerHttpObject {Overrideprotected 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】);IteratorMap.EntryString,String iterator httpRequest.headers().iteratorAsString();while (iterator.hasNext()){Map.EntryString,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;charsetutf-8);response.headers().set(HttpHeaderNames.CONTENT_LENGTH, content.readableBytes());ctx.writeAndFlush(response);}}
}4、测试请求
上面入门案例中简单的配置了一个Netty服务器端启动之后在浏览器中模拟访问即可
http://127.0.0.1:8082/?id1nameSpring三、Gateway集成
1、依赖层级
项目中Gateway网关依赖的版本为2.2.5.RELEASE发现Netty依赖的版本为4.1.45.Final是当下比较主流的版本
!-- 1、项目工程依赖 --
dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-gateway/artifactIdversion2.2.5.RELEASE/version
/dependency!-- 2、starter-gateway依赖 --
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-webflux/artifactIdversion2.3.2.RELEASE/version
/dependency!-- 3、starter-webflux依赖 --
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-reactor-netty/artifactIdversion2.3.2.RELEASE/version
/dependency2、自动化配置
在Gateway网关的自动化配置配置类中提供了Netty配置的管理
AutoConfigureBefore({ HttpHandlerAutoConfiguration.class,WebFluxAutoConfiguration.class })
ConditionalOnClass(DispatcherHandler.class)
public class GatewayAutoConfiguration {Configuration(proxyBeanMethods false)ConditionalOnClass(HttpClient.class)protected static class NettyConfiguration {BeanConditionalOnProperty(name spring.cloud.gateway.httpserver.wiretap)public NettyWebServerFactoryCustomizer nettyServerWiretapCustomizer(Environment environment, ServerProperties serverProperties) {return new NettyWebServerFactoryCustomizer(environment, serverProperties) {Overridepublic 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服务的信息
public class NettyWebServerFactoryCustomizerimplements WebServerFactoryCustomizerNettyReactiveWebServerFactory{private final Environment environment;private final ServerProperties serverProperties;Overridepublic 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;Overridepublic 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、控制类 Gateway项目中Netty服务核心控制类通过NettyReactiveWebServerFactory工厂类创建对Netty生命周期的管理提供了一层包装
public class NettyWebServer implements WebServer {private final HttpServer httpServer;private final ReactorHttpHandlerAdapter handlerAdapter;/*** 启动方法*/Overridepublic 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();}/*** 停止方法*/Overridepublic 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, ? superHttpServerResponse, ? extends PublisherVoid handler) {return new HttpServerHandle(this, handler);}
}ENDENDEND