netty集成springboot
一 前言
springboot 如何集成netty实现mapper调用不为null的问题让好多读者都头疼过,知识追寻者发了一点时间做了个基本入门集成应用给读者们指明条正确的集成方式,我相信,只要你有netty入门应用知识和spring框架基本知识,这篇文章对你将收益终身。随手点赞谢谢,如果是知识追寻者的忠粉记得分享哟。
二 pom.xml
来看看知识追寻者引入了哪些依赖
- netty-all 所有netty相关的包,知识追寻者这边用的非发布版本,读者可以自行更替
- postgresql驱动依赖,用什么数据库都没关系,读者可以换成mysql驱动
- mybatis-spring-boot-starte 集成mybatis需要用到的启动器
- druid-spring-boot-starte 当前主流性能较好的连接池,这篇文章没用到
- spring-boot-starter-test 测试类,这篇文章应该没用到测试
- lombok 开发神器,节省代码开发量
<!-- springboot start 父类 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
</parent>
<!-- web start配置 -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>5.0.0.Alpha1</version>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
<scope>provided</scope>
</dependency>
</dependencies>
三 NettyServer
- 首先我们这边使用的固定监听端口8080
- 配置两个线程组
parentGroup,childGroup - 注入childChannelHandler 具体可以看第四节
- 定义了空参init的方法,标注注解@PostConstruct,这边需要对这个注解进行一个详细介绍;在依赖注入完成初始化后,如果一个方法有该注解就将会被执行;那到底什么时候执行呢?是在类进入service之前,被该注解标注的方法会被执行,并且只会执行一次;在使用这个注解时还有一个注意点就是所有的类都必须支持依赖注入,否则会报错,一般情况下仅支持空参;
- init方法中就是netty的辅助启动,配置处理类,进行同步阻塞操作;
- 最后看下destory()方法,在该方法上面标注了注解@PreDestroy;@PreDestroy表示一种回调的信息通知机制,即当实例在容器中被移除的时候会做出通知;通常我们会用来做一些关闭资源句柄等操作;
/**
* @Author lsc
* <p>netty server 端 </p>
*/
@Component
public class NettyServer {
private Integer port = 8080;
// 配置线程组 实质是 reactor线程组
NioEventLoopGroup parentGroup = new NioEventLoopGroup();
// 配置线程组
NioEventLoopGroup childGroup = new NioEventLoopGroup();
@Autowired
ChildChannelHandler childChannelHandler;
@PostConstruct
public void init() throws Exception{
// 启动 NIO
ServerBootstrap serverBootstrap = new ServerBootstrap();
//
serverBootstrap.group(parentGroup,childGroup)
.channel(NioServerSocketChannel.class)// 相当于 ServerSocketChannel
.option(ChannelOption.SO_BACKLOG,1024)//TCP参数 1024 个队列
.childHandler(childChannelHandler);// 处理事件
// 绑定端口 同步阻塞等待同步成功 channelFuture 异步操作通知回调
ChannelFuture channelFuture = serverBootstrap.bind(port).sync();
// 同步阻塞等待服务监听端口关闭
channelFuture.channel().closeFuture().sync();
}
@PreDestroy
public void destory() throws InterruptedException {
// 关闭资源
parentGroup.shutdownGracefully().sync();
childGroup.shutdownGracefully().sync();
}
}
四 ChildChannelHandler
- ChildChannelHandler 类继承ChannelInitializer
- 注入NettyServerHandler,具体看第五节
- 实现initChannel 方法并且在方法用获得pipeline注入nettyServerHandler;
/**
* @Author lsc
* <p> </p>
*/
@Component
public class ChildChannelHandler extends ChannelInitializer<SocketChannel> {
@Autowired
NettyServerHandler nettyServerHandler;
@Override
protected void initChannel(SocketChannel socketChannel) throws Exception {
ChannelPipeline pipeline = socketChannel.pipeline();
//
pipeline.addLast(nettyServerHandler);
}
}
五 NettyServerHandler
- NettyServerHandler 继承ChannelHandlerAdapter
- 分别实现channelRead,channelReadComplete, exceptionCaught 方法
- 注入 NettyMapper ,自定义的mapper
- 重点在 channelRead 中 读取监听8080客户端发送的数据,然后写入zszxz-66666构建响应
- 如果mapper为空 会打印
can you believe that the mapper is null - 最后执行回调处理;
/**
* @Author lsc
* <p> 处理类 </p>
*/
@Slf4j
@Component
public class NettyServerHandler extends ChannelHandlerAdapter {
@Autowired
NettyMapper mapper;
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
System.out.println("-----handler-------");
// 转为字节缓冲区
ByteBuf buf = (ByteBuf)msg;
// 字节数组
byte[] bytes = new byte[buf.readableBytes()];
// 缓冲区数据读入字节数组
buf.readBytes(bytes);
// 编码转为字符串
String body = (new String(bytes, "UTF-8"));
System.out.println(" get the data from client : " + body);
// 构造响应数据
String responseData = "zszxz-66666";
// 数据写入缓冲区
ByteBuf resp = Unpooled.copiedBuffer(responseData.getBytes());
// 写入数据响应
ChannelFuture channelFuture = ctx.writeAndFlush(resp);
if (mapper==null){
System.out.println("can you believe that the mapper is null");
}
List<Map> user = mapper.getUser();
System.out.println(user);
// 回调处理
channelFuture.addListener(new ChannelFutureListener() {
@Override
public void operationComplete(ChannelFuture channelFuture) throws Exception {
if (channelFuture.isSuccess()){
log.info("success");
}else {
log.error("error");
}
}
});
}
@Override
public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
// 写入 seocketChannel
ctx.flush();
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
// 异常关闭资源句柄
ctx.close();
}
}
六 mapper
6.1 mapper接口
mapper接口中定义了一个查询方法,获得用户;
@Mapper
@Repository
public interface NettyMapper {
List<Map> getUser();
}
6.2 mapper映射器
查询所有学生
<mapper namespace="com.zszxz.netty.mapper.NettyMapper">
<select id="getUser" resultType="map">
select * from "student"
</select>
</mapper>
七 application.yml
spring:
datasource:
druid:
#本地
url: jdbc:postgresql://localhost:5432/springboot
username: postgres
password: 123456
driver-class-name: org.postgresql.Driver
mybatis:
mapper-locations: classpath:mapper/*.xml
configuration:
mapUnderscoreToCamelCase: true
八 启动类
/**
* @Author lsc
* <p> 知识追寻者netty系列</p>
*/
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class,args);
}
}
九 执行结果
- 发送了知识追寻者好棒棒
- 响应 zszxz-66666

十 结语
最后祝贺读者们新年快乐,预防流感病毒,出门带口罩,不去人流量大的地方,吃熟肉,勤洗手;理性对待网上关于新型流感病毒,一起为中国加油,为武汉加油;过年也不要忘记学习哟,知识追寻者要贯彻每天都学习的方针,坚定不移的追随读者的步伐;
netty集成springboot的更多相关文章
- Spring Maven项目集成Springboot
Maven管理的Spring项目,准备集成Springboot做接口 1.Springboot对Spring有版本要求 我用的Springboot版本:1.4.5.RELEASE,对应Spring的版 ...
- netty 集成 wss 安全链接
netty集成ssl完整参考指南(含完整源码) 虽然我们在内部rpc通信中使用的是基于认证和报文头加密的方式实现安全性,但是有些时候仍然需要使用SSL加密,可能是因为对接的三方系统需要,也可能是由于o ...
- 基于Netty和SpringBoot实现一个轻量级RPC框架-协议篇
基于Netty和SpringBoot实现一个轻量级RPC框架-协议篇 前提 最近对网络编程方面比较有兴趣,在微服务实践上也用到了相对主流的RPC框架如Spring Cloud Gateway底层也切换 ...
- 基于Netty和SpringBoot实现一个轻量级RPC框架-Server篇
前提 前置文章: Github Page:<基于Netty和SpringBoot实现一个轻量级RPC框架-协议篇> Coding Page:<基于Netty和SpringBoot实现 ...
- 基于Netty和SpringBoot实现一个轻量级RPC框架-Client篇
前提 前置文章: <基于Netty和SpringBoot实现一个轻量级RPC框架-协议篇> <基于Netty和SpringBoot实现一个轻量级RPC框架-Server篇> 前 ...
- 基于Netty和SpringBoot实现一个轻量级RPC框架-Client端请求响应同步化处理
前提 前置文章: <基于Netty和SpringBoot实现一个轻量级RPC框架-协议篇> <基于Netty和SpringBoot实现一个轻量级RPC框架-Server篇> & ...
- 实战:docker搭建FastDFS文件系统并集成SpringBoot
实战:docker搭建FastDFS文件系统并集成SpringBoot 前言 15年的时候,那时候云存储还远远没有现在使用的这么广泛,归根结底就是成本和安全问题,记得那时候我待的公司是做建站开发的,前 ...
- Netty(一) SpringBoot 整合长连接心跳机制
前言 Netty 是一个高性能的 NIO 网络框架,本文基于 SpringBoot 以常见的心跳机制来认识 Netty. 最终能达到的效果: 客户端每隔 N 秒检测是否需要发送心跳. 服务端也每隔 N ...
- netty集成ssl完整参考指南(含完整源码)
虽然我们在内部rpc通信中使用的是基于认证和报文头加密的方式实现安全性,但是有些时候仍然需要使用SSL加密,可能是因为对接的三方系统需要,也可能是由于open的考虑.中午特地测了下netty下集成ss ...
随机推荐
- Python基础知识详解 从入门到精通(七)类与对象
本篇主要是介绍python,内容可先看目录其他基础知识详解,欢迎查看本人的其他文章Python基础知识详解 从入门到精通(一)介绍Python基础知识详解 从入门到精通(二)基础Python基础知识详 ...
- 【外文阅读】Web Development in 2020: What Coding Tools You Should Learn---Quincy Larson
原文链接:https://mail.qq.com/cgi-bin/readtemplate?t=safety&check=false&gourl=https%3A%2F%2Fwww.f ...
- Mysql sql语句技巧与优化
一.常见sql技巧 1.正则表达式的使用 2.巧用RAND()提取随机行 mysql数据库中有一个随机函数rand()是获取一个0-1之间的数,利用这个函数和order by一起能够吧数据随机排序, ...
- bootstrap的网格控制
<div class="container-fluid row m-0 p-0"> <div class="col-2 border"> ...
- wampserver 配置的几个坑(雾
1. 从安装版本说起 自从我进入大学之后,便继承了学长那里的wampserver2.5版本 直到有一天自己下载wamp的时候才注意到已经有 3.0.6版本了 (现在有更高的了 但是3.0.6够用了) ...
- 移动APP漏洞自动化检测平台建设
移动APP漏洞自动化检测平台建设 前言:本文是<移动APP客户端安全笔记>系列原创文章中的第一篇,主要讲的是企业移动APP自动化漏洞检测平台建设,移动APP漏洞检测发展史与前沿技术,A ...
- word写文档体会
1.找一个文档规范要求. 2.根据文档的规范要求调整正文的格式,标题1的格式,标题2的格式,标题3的格式,图表的格式,把没用的那些格式都删除掉. 3.图注表注后空格一行. 4.设置页眉页脚. 5.生成 ...
- Bugku-CTF加密篇之一段Base64
一段Base64 flag格式:flag{xxxxxxxxxxxxx}
- C do...while 循环
不像 for 和 while 循环,它们是在循环头部测试循环条件.在 C 语言中,do...while 循环是在循环的尾部检查它的条件. do...while 循环与 while 循环类似,但是 do ...
- 深入浅出Oracle:DBA入门、进阶与诊断案例 PDF 下载
网盘地址: 链接:https://pan.baidu.com/s/1tMFoNSUW7ICKOtmSQ5ZazA 提取码:dbnc