2024年最全透彻,在SpringBoot项目中使用Netty实现远程调用,高并发下HashMap的死循环是怎么形成的

笔者福利

以下是小编自己针对马上即将到来的金九银十准备的一套“面试宝典”,不管是技术还是HR的问题都有针对性的回答。

有了这个,面试踩雷?不存在的!

回馈粉丝,诚意满满!!!




本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

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的基础上解决了半包问题。

上图,简单地可以描述为"boss接活,让work干":manReactor用来接收请求(会与客户端进行握手验证),而subReactor用来处理请求(不与客户端直接连接)。另外,欢迎关注公众号Java笔记虾,后台回复“后端面试”,送你一份面试题宝典!

SpringBoot使用Netty实现远程调用


maven依赖

org.projectlombok

lombok

1.18.2

true

io.netty

netty-all

4.1.17.Final

服务端部分

NettyServer.java:服务启动监听器

@Slf4j

public class NettyServer {

public void start() {

InetSocketAddress socketAddress = new InetSocketAddress(“127.0.0.1”, 8082);

//new 一个主线程组

EventLoopGroup bossGroup = new NioEventLoopGroup(1);

//new 一个工作线程组

EventLoopGroup workGroup = new NioEventLoopGroup(200);

ServerBootstrap bootstrap = new ServerBootstrap()

.group(bossGroup, workGroup)

.channel(NioServerSocketChannel.class)

.childHandler(new ServerChannelInitializer())

.localAddress(socketAddress)

//设置队列大小

.option(ChannelOption.SO_BACKLOG, 1024)

// 两小时内没有数据的通信时,TCP会自动发送一个活动探测数据报文

.childOption(ChannelOption.SO_KEEPALIVE, true);

//绑定端口,开始接收进来的连接

try {

ChannelFuture future = bootstrap.bind(socketAddress).sync();

log.info(“服务器启动开始监听端口: {}”, socketAddress.getPort());

future.channel().closeFuture().sync();

} catch (InterruptedException e) {

log.error(“服务器开启失败”, e);

} finally {

//关闭主线程组

bossGroup.shutdownGracefully();

//关闭工作线程组

workGroup.shutdownGracefully();

}

}

}

ServerChannelInitializer.java:netty服务初始化器

/**

* netty服务初始化器

**/

public class ServerChannelInitializer extends ChannelInitializer {

@Override

protected void initChannel(SocketChannel socketChannel) throws Exception {

//添加编解码

socketChannel.pipeline().addLast(“decoder”, new StringDecoder(CharsetUtil.UTF_8));

socketChannel.pipeline().addLast(“encoder”, new StringEncoder(CharsetUtil.UTF_8));

socketChannel.pipeline().addLast(new NettyServerHandler());

}

}

NettyServerHandler.java:netty服务端处理器

/**

* netty服务端处理器

**/

@Slf4j

public class NettyServerHandler extends ChannelInboundHandlerAdapter {

/**

* 客户端连接会触发

*/

@Override

public void channelActive(ChannelHandlerContext ctx) throws Exception {

log.info(“Channel active…”);

}

/**

* 客户端发消息会触发

*/

@Override

public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {

log.info(“服务器收到消息: {}”, msg.toString());

ctx.write(“你也好哦”);

ctx.flush();

}

/**

* 发生异常触发

*/

@Override

public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {

cause.printStackTrace();

ctx.close();

}

}

RpcServerApp.java:SpringBoot启动类

/**

* 启动类

*/

@Slf4j

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})

public class RpcServerApp extends SpringBootServletInitializer {

@Override

protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {

return application.sources(RpcServerApp.class);

}

/**

* 项目的启动方法

* @param args

*/

public static void main(String[] args) {

SpringApplication.run(RpcServerApp.class, args);

//开启Netty服务

NettyServer nettyServer =new  NettyServer ();

nettyServer.start();

log.info(“服务已经启动==”);

}

}

客户端部分

独家面经总结,超级精彩

本人面试腾讯,阿里,百度等企业总结下来的面试经历,都是真实的,分享给大家!

image

image

image

image

Java面试准备

准确的说这里又分为两部分:

  1. Java刷题
  2. 算法刷题

Java刷题:此份文档详细记录了千道面试题与详解;

image

image

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

21855609)]

[外链图片转存中…(img-Zkq8tAy2-1715121855610)]

Java面试准备

准确的说这里又分为两部分:

  1. Java刷题
  2. 算法刷题

Java刷题:此份文档详细记录了千道面试题与详解;

[外链图片转存中…(img-Oc87YqYy-1715121855610)]

[外链图片转存中…(img-S0PDdOso-1715121855610)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值