当前位置: 首页 > news >正文

Gateway集成Netty服务

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 ChannelInitializer<SocketChannel> {@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 SimpleChannelInboundHandler<HttpObject> {@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+"】");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) {@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 WebServerFactoryCustomizer<NettyReactiveWebServerFactory>{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 Publisher<Void>> handler) {return new HttpServerHandle(this, handler);}
}

ENDENDEND

相关文章:

Gateway集成Netty服务

Gateway和Netty都有盲区的感觉&#xff1b; 一、Netty简介 Netty是一个异步的&#xff0c;事件驱动的网络应用框架&#xff0c;用以快速开发高可靠、高性能的网络应用程序。 传输服务&#xff1a;提供网络传输能力的管理&#xff1b; 协议支持&#xff1a;支持常见的数据传输…...

SpringMVC控制层private方法中出现注入的service对象空指针异常

一、现象 SpringMVC中controller里的private接口中注入的service层的bean为null&#xff0c;而同一个controller中访问修饰符为public和protected的方法不会出现这样的问题。 controller中的方法被AOP进行了代理&#xff0c;普通Controller如果没有AOP&#xff0c;private方法…...

【Unity】P4 脚本文件(基础)

Unity脚本文件&#xff08;基础&#xff09;适配的C#代码编辑器如何添加一个脚本文件获取蘑菇当前位置基础代码改变物体位置帧与帧更新前言 上一篇博文主要围绕Unity Inspector部分&#xff0c;围绕组件&#xff0c;资源文件&#xff0c;父子节点部分做介绍。 链接&#xff1a;…...

(2023版)零基础入门网络安全/Web安全,收藏这一篇就够了

由于我之前写了不少网络安全技术相关的文章和回答&#xff0c;不少读者朋友知道我是从事网络安全相关的工作&#xff0c;于是经常有人私信问我&#xff1a; 我刚入门网络安全&#xff0c;该怎么学&#xff1f; 要学哪些东西&#xff1f; 有哪些方向&#xff1f; 怎么选&#x…...

Vue3电商项目实战-登录模块2【05-登录-表单校验、06-登录-消息提示组件封装、07-登录-账户登录、08-登录-手机号登录、09-退出登录】

文章目录05-登录-表单校验06-登录-消息提示组件封装07-登录-账户登录08-登录-手机号登录09-退出登录05-登录-表单校验 文档&#xff1a;https://vee-validate.logaretm.com/v4/ 支持vue3.0 第一步&#xff1a;安装 执行命令 npm i vee-validate4.0.3 第二步&#xff1a;导入 …...

Python 中都有哪些常见的错误和异常?

本文首发自「慕课网」&#xff0c;想了解更多IT干货内容&#xff0c;程序员圈内热闻&#xff0c;欢迎关注&#xff01; 作者| 慕课网精英讲师 朱广蔚 Python 程序的执行过程中&#xff0c;当发生错误时会引起一个事件&#xff0c;该事件被称为异常。例如&#xff1a; 如果程…...

51单片机-1

1&#xff0c;单片机内部集成了CPU&#xff0c;RAM&#xff0c;ROM&#xff0c;定时器&#xff0c;中断系统&#xff0c;通讯接口等一系列电脑的常用硬件功能。单片机和计算机相比&#xff0c;单片机是一个袖珍版计算机 2&#xff0c;单片机里有中央处理器&#xff08;CPU&…...

【Azure 架构师学习笔记】-Azure Data Factory (4)-触发器详解-事件触发器

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Data Factory】系列。 接上文【Azure 架构师学习笔记】-Azure Data Factory (3)-触发器详解-翻转窗口 前言 事件触发指的是存储事件&#xff0c;所以在新版的ADF 中&#xff0c;已经明确了是“存储事件”&#xff0c;…...

【项目设计】高并发内存池(三)[CentralCache的实现]

&#x1f387;C学习历程&#xff1a;入门 博客主页&#xff1a;一起去看日落吗持续分享博主的C学习历程博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a; 也许你现在做的事情&#xff0c;暂时看不到成果&#xff0c;但不要忘记&…...

2023年,35岁测试工程师只能被“优化裁员”吗?肯定不是····

国内的互联网行业发展较快&#xff0c;所以造成了技术研发类员工工作强度比较大&#xff0c;同时技术的快速更新又需要员工不断的学习新的技术。因此淘汰率也比较高&#xff0c;超过35岁的基层研发类员工&#xff0c;往往因为家庭原因、身体原因&#xff0c;比较难以跟得上工作…...

gitlab部署使用,jenkins部署使用

gitlab部署使用&#xff0c;jenkins部署使用在线安装gitlab下载gitlab安装gitlab使用gitlab设置中文修改管理员密码创建组,创建项目,创建用户jenkins下载jenkins安装jenkin使用jenkins更改管理员密码配置拉取代码配置登录gitlab拉取代码的账号密码配置项目配置gitlab仓库配置构…...

从零开始的机械臂yolov5抓取gazebo仿真(环境搭建篇下)

sunday功能包使用介绍以及开源 sunday我给自己机械臂的命名&#xff0c;原型是innfos的gluon机械臂。通过sw模型文件转urdf。Sunday项目主要由六个功能包sunday_description、sunday_gazebo、sunday_moveit_config、yolov5_ros、vacuum_plugin、realsense_ros_gazebo组成&…...

GCC编译器 MinGW的下载安装使用教程

哎 总所周知 gcc可以用来编译C 和C。在linux广泛应用&#xff0c;那么window怎么使用gcc呢。就要用到gcc的window工具----MInGW&#xff0c;安装好之后&#xff0c;直接可以在windows的dos界面编译。下面讲解安装使用过程。1.官网下载MinGW - Minimalist GNU for Windows downl…...

【项目实战】SpringMVC配置全局属性,是实现WebMvcConfigurer接口,还是直接继承WebMvcConfigurationSupport类?

一、说明 官方推荐以下两种方式来配置全局的SpringMVC的相关属性 方式一:实现WebMvcConfigurer接口(推荐)方式二:直接继承WebMvcConfigurationSupport类。介绍一下两者区别吧。 二、 WebMvcConfigurer介绍 WebMvcConfigurer是一个接口,用于配置全局的SpringMVC的相关属…...

房产营销、地产中介如何高效低成本获客?

数字化对企业而言&#xff0c;机遇和挑战并存。房产企业可借助数字化加强日益扩大的业务规模和业务领域管理&#xff0c;以提升管理效率&#xff0c;降低管理难度&#xff1b;基于数字化技术加强客户的服务体验&#xff0c;进而收集多业态客户和场景数据&#xff0c;拓展创新业…...

Kotlin-作用域函数

在对象的上下文中执行代码块。当您在提供lambda表达式的对象上调用这样的函数时&#xff0c;它会形成一个临时作用域。在此范围内&#xff0c;可以不带名称地访问对象。这样的函数称为作用域函数。 let run with apply also 作用域函数不会引入任何新的技术功能&#xff0c;但它…...

QNX7.1 交叉编译开源库

1.下载QNX7.1 SDK并解压 ITL:~/work/tiqnx710$ ls -l 总用量 16 drwxrwxr-x 4 xxx4096 1月 28 13:38 host -rwxrwxr-x 1 xxx 972 1月 28 13:38 qnxsdp-env.bat -rwxrwxr-x 1 xxx 1676 1月 28 13:38 qnxsdp-env.sh drwxrwxr-x 3 xxx 4096 1月 28 13:38 target xxxITL:~/work/ti…...

论文投稿指南——中文核心期刊推荐(外国语言)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…...

Fabric系列 - 链码-内部链码的特性

(1)Fabric repo下的案例 Chaincode(1.4的目录结构) fabric/examples/chaincode/go ├── example02 #一个简单的转账合约 ├── eventsender #发送事件通知 ├── passthru #调用其他链码(或者其他channel的链码)example02 (转账) 一个简单的转账合约。该链码简单实…...

NetApp SnapCenter 备份管理 ——借助应用程序一致的数据备份管理,简化混合云操作

NetApp SnapCenter 简单、可扩展、赋权&#xff1a;跨 Data Fabric 的企业级数据保护和克隆管理 主要优势 • 利用与应用程序集成的工作流和预定义策略简化备份、恢复和克隆管理。 • 借助基于存储的数据管理功能提高性能和可用性&#xff0c;并缩短测试和开发用时。 • 提供基…...

从嵌入式系统会议看技术生态构建:硬件开发与软件工程的融合实践

1. 从一场成功的会议到下一年的蓝图&#xff1a;嵌入式系统会议的幕后与启示刚结束的芝加哥嵌入式系统大会&#xff08;ESC Chicago&#xff09;被主办方评价为“一次巨大的成功”。作为一名在硬件开发与软件领域摸爬滚打了十几年的工程师&#xff0c;我深知这类行业顶级会议的…...

网页项目之大五人格测试:认识真实的自己

大五人格测试&#xff1a;认识真实的自己 你是否曾好奇&#xff0c;自己的人格特质是什么&#xff1f;为什么有些人天生善于社交&#xff0c;有些人却更喜欢独处&#xff1f;为什么有人总是追求完美&#xff0c;有些人却随性自在&#xff1f; 心理学研究表明&#xff0c;人格的…...

DOM Node:深入解析与高效使用

DOM Node:深入解析与高效使用 引言 DOM(Document Object Model)是现代网页开发的核心技术之一,它允许开发者以程序化的方式操作HTML文档。DOM Node是DOM的核心概念之一,理解并熟练使用DOM Node对于提高网页开发效率至关重要。本文将深入解析DOM Node的概念、类型、属性和…...

LInux(gcc处理器,库文件,动静态库)

//Dbug版本为可调试版本 生成的可执行的文件在包含调试信息 //Release版本为用户版本 无可调试信息 用gcc生成的就是Release版本 //用gcc生成的就是Release版本 -g 可以变成Dbug版本 //e.g gcc 1.c -o 1 -g // 变成Dbug版本后 输入gdb 文件名 进入调试模式 // 在完成调试…...

Llama.cpp Docker镜像部署指南:快速搭建本地大模型运行环境

1. 项目概述&#xff1a;为什么需要为Llama.cpp准备Docker镜像&#xff1f; 在本地部署和运行大型语言模型&#xff08;LLM&#xff09;这件事上&#xff0c;Llama.cpp 几乎成了开源社区的“标准答案”。它用纯C/C编写&#xff0c;通过高效的量化技术&#xff0c;让我们能在消费…...

电光非线性计算加速Transformer注意力机制

1. 电光非线性计算加速Transformer注意力机制的技术背景Transformer架构已经成为当前自然语言处理和计算机视觉领域的主导性神经网络结构&#xff0c;其核心组件——注意力机制依赖于Softmax等非线性运算。虽然这些非线性操作仅占模型总计算量的不到1%&#xff0c;但由于现代GP…...

收藏!小白程序员必看:详解7种RAG分块策略,轻松提升大模型检索效果

收藏&#xff01;小白程序员必看&#xff1a;详解7种RAG分块策略&#xff0c;轻松提升大模型检索效果 本文深入解析了RAG系统中7种主流分块策略&#xff0c;包括固定大小、语义、递归、文档结构、智能体、句子和段落分块。强调了分块策略对检索增强生成&#xff08;RAG&#xf…...

LLM RAG还值得做吗?今天一下就顿悟了

在企业级AI应用领域&#xff0c;RAG&#xff08;检索增强生成&#xff09;不仅值得深耕&#xff0c;更是当前唯一能站稳脚跟的核心护城河。曾有人断言长上下文窗口&#xff08;Long Context&#xff09;会取代RAG&#xff0c;但这一说法早在2024年就被彻底证伪&#xff0c;进入…...

工程师的调试礼仪:如何避免一次问候毁掉两小时工作成果

1. 项目概述&#xff1a;一次关于“Bug礼仪”的职场博弈在硬件开发的深水区&#xff0c;尤其是在产品临近交付的冲刺阶段&#xff0c;工程师与管理者之间的互动&#xff0c;往往比电路板上的信号完整性更考验“设计”。这不是一个关于具体芯片型号或调试命令的技术教程&#xf…...

Java SE 与 Spring Boot 在电商场景中的应用

面试&#xff1a;Java SE 与 Spring Boot 在电商场景中的应用 今天&#xff0c;我们将围绕一位求职者在一家电商公司的面试场景&#xff0c;与面试官进行一场激烈的技术问答。第一轮提问 面试官&#xff1a; 首先&#xff0c;请你简单介绍一下 JVM 的工作原理。 燕双非&#xf…...