在SpringBoot项目中使用Netty实现远程调用
【摘要】 前言众所周知在进行网络连接的时候,建立套接字连接是一个非常消耗性能的事情,特别是在分布式的情况下,用线程池去保持多个客户端连接,是一种非常消耗线程的行为。那么该通过什么技术去解决上述的问题呢,那么就不得不提一个网络连接的利器——Netty。 正文NettyNetty是一个NIO客户端服务器框架:它可快速轻松地开发网络应用程序,例如协议服务器和客户端。它极大地简化和简化了网络编程,例如TC...
前言
众所周知在进行网络连接的时候,建立套接字连接是一个非常消耗性能的事情,特别是在分布式的情况下,用线程池去保持多个客户端连接,是一种非常消耗线程的行为。
那么该通过什么技术去解决上述的问题呢,那么就不得不提一个网络连接的利器——Netty。
正文
Netty
Netty是一个NIO客户端服务器框架:
- 它可快速轻松地开发网络应用程序,例如协议服务器和客户端。
- 它极大地简化和简化了网络编程,例如TCP和UDP套接字服务器。
NIO是一种非阻塞IO ,它具有以下的特点
- 单线程可以连接多个客户端。
- 选择器可以实现但线程管理多个
Channel
,新建的通道都要向选择器注册。 - 一个
SelectionKey
键表示了一个特定的通道对象和一个特定的选择器对象之间的注册关系。 -
selector
进行select()
操作可能会产生阻塞,但是可以设置阻塞时间,并且可以用wakeup()
唤醒selector
,所以NIO是非阻塞IO。Netty模型selector模式
它相对普通NIO的在性能上有了提升,采用了:
-
NIO采用多线程的方式可以同时使用多个
selector
- 通过绑定多个端口的方式,使得一个
selector
可以同时注册多个ServerSocketServer
- 单个线程下只能有一个
selector
,用来实现Channel
的匹配及复用
半包问题
TCP/IP在发送消息的时候,可能会拆包,这就导致接收端无法知道什么时候收到的数据是一个完整的数据。在传统的BIO中在读取不到数据时会发生阻塞,但是NIO不会。
为了解决NIO的半包问题,Netty在Selector
模型的基础上,提出了reactor
模式,从而解决客户端请求在服务端不完整的问题。
Netty模型reactor模式
在selector的基础上解决了半包问题。
manReactor
用来接收请求(会与客户端进行握手验证),而subReactor
用来处理请求(不与客户端直接连接)。
SpringBoot使用Netty实现远程调用
依赖
服务端部分
NettyServer.java:服务启动监听器
ServerChannelInitializer.java:netty服务初始化器
NettyServerHandler.java:netty服务端处理器
RpcServerApp.java:SpringBoot启动类
客户端部分
NettyClientUtil.java:NettyClient工具类
NettyClientHandler.java:客户端处理器
验证
测试接口
访问测试接口
服务端打印信息
客户端打印信息
如果小假的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)