Spring - Netty (整合)
文章很长,而且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 语雀版 | 总目录 码云版| 总目录 博客园版 为您奉上珍贵的学习资源 :
-
免费赠送 :《尼恩Java面试宝典》持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备
-
免费赠送 经典图书:《Java高并发核心编程(卷1)》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领
-
免费赠送 经典图书:《Java高并发核心编程(卷2)》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领
-
免费赠送 经典图书:《Netty Zookeeper Redis 高并发实战》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领
-
免费赠送 经典图书:《SpringCloud Nginx高并发核心编程》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领
-
免费赠送 资源宝库: Java 必备 百度网盘资源大合集 价值>10000元 加尼恩领取
推荐:入大厂 、做架构、大力提升Java 内功 的 精彩博文
入大厂 、做架构、大力提升Java 内功 必备的精彩博文 | 秋招涨薪1W + 必备的精彩博文 |
---|---|
1:Redis 分布式锁 (图解-秒懂-史上最全) | 2:Zookeeper 分布式锁 (图解-秒懂-史上最全) |
3: Redis与MySQL双写一致性如何保证? (面试必备) | 4: 面试必备:秒杀超卖 解决方案 (史上最全) |
5:面试必备之:Reactor模式 | 6: 10分钟看懂, Java NIO 底层原理 |
7:TCP/IP(图解+秒懂+史上最全) | 8:Feign原理 (图解) |
9:DNS图解(秒懂 + 史上最全 + 高薪必备) | 10:CDN图解(秒懂 + 史上最全 + 高薪必备) |
11: 分布式事务( 图解 + 史上最全 + 吐血推荐 ) | 12:限流:计数器、漏桶、令牌桶 三大算法的原理与实战(图解+史上最全) |
13:架构必看:12306抢票系统亿级流量架构 (图解+秒懂+史上最全) |
14:seata AT模式实战(图解+秒懂+史上最全) |
15:seata 源码解读(图解+秒懂+史上最全) | 16:seata TCC模式实战(图解+秒懂+史上最全) |
SpringCloud 微服务 精彩博文 | |
---|---|
nacos 实战(史上最全) | sentinel (史上最全+入门教程) |
SpringCloud gateway (史上最全) | 分库分表sharding-jdbc底层原理与实操(史上最全,5W字长文,吐血推荐) |
推荐:尼恩Java面试宝典(持续更新 + 史上最全 + 面试必备)具体详情,请点击此链接
尼恩Java面试宝典,32个最新pdf,含2000多页,不断更新、持续迭代 具体详情,请点击此链接
备注: 文章很长,建议收藏起来,慢慢读! 并且,持续更新中…
推荐:进大厂、升架构、拿高薪 必备 的 经典图书和资料:
- 高薪必备1 : 《Netty Zookeeper Redis 高并发实战》 为你打造NIO、Netty 高性能底层原理知识底座
- 高薪必备2 : 《SpringCloud、Nginx高并发核心编程》 为你打造微服务、分布式 高并发底层原理知识底座
- 网盘资源大集合 :价值 1000元网盘资源大礼包,免费拿 【博客园总入口 】
说明:
本文的内容只是一个初稿、初稿,本文的知识,在《Netty Zookeeper Redis 高并发实战》一书时,进行大篇幅的完善和更新,并且进行的源码的升级。 博客和书不一样,书的内容更加系统化、全面化,更加层层升入、层次分明、更多次的错误排查,请大家以书的内容为准。
本文的最终内容, 具体请参考疯狂创客圈 倾力编著,机械工业出版社出版的 《Netty Zookeeper Redis 高并发实战》一书 。
Spring Netty 整合实战
疯狂创客圈 死磕Netty 系列之11
主要介绍的是SpringBoot整合Netty。在使用Netty之前,建议先了解Netty的基本原理,请参阅疯狂创客圈。
这里仅仅是使用Netty的第一步,这里介绍一个最简单的Demo——EchoServer,也就是回写服务器。就是无论客户端发啥字符串到服务器端,服务器端接收字符串后直接回写到客户端。
源码下载链接:
本篇内容纲要
-
环境要求
-
Spring +netty 服务器端
-
Spring +netty 客户端
-
Spring读取配置文件中的属性值
环境要求
-
JDK::1.8
-
Netty::4.0或以上(不包括5)
<java.version>1.8</java.version>
<springboot>1.5.9.RELEASE</springboot>
<netty.version>4.0.33.Final</netty.version>
Spring +netty 服务器端
回写服务器 Echo Server 程序主要由两部分组成:
-
ServerBootstrap:服务器启动引导器。负责配置服务器端基本信息,并且完成服务器的启动
-
EchoServerHandler:回写的业务逻辑处理器
ServerBootstrap
首先是编写服务端的启动类,代码中相应的注释在写得很详细。主要的步骤如下:
-
创建一个ServerBootstrap实例
-
创建一个EventLoopGroup来处理各种事件,如处理链接请求,发送接收数据等。
-
设置本地监听端口 InetSocketAddress( port)
-
设置 childHandler 来设置通道初始化类。并且在通道初始化时,加入回写的业务逻辑处理器EchoServerHandler到服务器通道的pipeline中 。childHandler 在通道初始化时,会被执行一次。
-
所有准备好之后调用ServerBootstrap.bind() 方法绑定 Server
不过需要注意的是,在不使用Spring的环境中,是通过main方法直接启动服务端,因此是直接new一个处理器echoServerHandler 对象。而在和Spring 整合之后,我们需要将 echoServerHandler 处理器交给springBoot去管理。
ServerBootstrap 代码如下:
业务逻辑ServerHandler:
要想处理接收到的数据,我们必须继承ChannelInboundHandlerAdapter接口,重写里面的channelRead方法,每当有数据到达,此方法就会被调用(一般是Byte类型数组),我们就在这里写我们的业务逻辑:
关于异常处理:
我们在上面程序中也重写了exceptionCaught方法,这里就是对当异常出现时的处理。
Spring +netty 客户端
EchoClient 扮演如下角色:
-
连接到Server
-
向Server写数据,
-
等待Server返回数据
回写客户端程序EchoClient 主要由两部分组成:
-
Bootstrap:客户端启动引导器。负责配置客户端基本信息,并且完成客户端的启动
-
EchoClientHandler :客户端业务逻辑处理器
EchoClient Bootstrap的过程:
和Server端类似,只不过Client端要同时指定连接主机的IP和Port。
-
创建一个Bootstrap实例
-
创建一个EventLoopGroup 来处理各种事件,如处理链接请求,发送接收数据等。
-
定义需要连接到的远程服务器的InetSocketAddress,包含了IP+端口
-
设置 childHandler 来设置通道初始化类。并且在通道初始化时,加入客户端的业务逻辑处理器echoClientHandler 到服务器通道的pipeline中 。当连接完成之后,childHandler 会被执行一次 。
-
所有准备好之后调用 ServerBootstrap.connect() 方法连接Server
EchoClient Bootstrap的代码:
EchoClientHandler 客户端业务逻辑处理器
要想处理接收到的数据,我们必须继承ChannelInboundHandlerAdapter基类,重写里面的channelRead方法,每当有数据到达,此方法就会被调用(一般是Byte类型数组),我们就在这里写我们的业务逻辑:
除了继承ChannelInboundHandlerAdapter基类,我们的业务Handler还可以继承 SimpleChannelInboundHandler 基类。
那么这两个有什么区别呢?
-
SimpleChannelInboundHandler在接收到数据后会自动release掉数据占用的Bytebuffer资源(自动调用Bytebuffer.release())。如果在channelRead方法返回前还没有写完数据,也就是当不能让它自动release时,就不能继承 SimpleChannelInboundHandler 基类。而继承ChannelInboundHandlerAdapter则不会自动释放,需要手动调用ReferenceCountUtil.release()等方法进行释放。
-
SimpleChannelInboundHandler还有一个好处,可以在泛型参数中,可以直接指定好传输的数据格式。所以继承该类,在处理数据时,不需要判断数据格式。而继承ChannelInboundHandlerAdapter则需要进行数据格式的判断和转换。
-
推荐在服务端去继承ChannelInboundHandlerAdapter,建议手动进行释放,防止数据未处理完就自动释放了。
Spring读取配置文件中的属性值
在Netty 的程序中,一般需要用到服务器ip和端口,最好的方式是放在配置文件中,方便修改。
Spring Boot 默认的配置文件名称为 application.properties,SpringApplication将从以下位置加载此文件:
-
当前目录下的/config子目录,
-
当前目录
-
一个classpath下的/config包
-
classpath 根路径(root)
一般情况下,工程在编译之后,application.properties 放在classpath 根路径下。
配置文件 application.properties
注意:文件名字不能错哦,是application.properties
关联配置项到类属性
在类域属性上通过@Value("${配置项}")指定关联属性,Spring Application会自动加载。
启动配置项自动扫描
使用 @Configuration、@EnableAutoConfiguration 启动配置项的自动扫描。
疯狂创客圈 实战计划
-
Netty 亿级流量 高并发 IM后台 开源项目实战
-
Netty 源码、原理、JAVA NIO 原理
-
Java 面试题 一网打尽
-
疯狂创客圈 【 博客园 总入口 】