笔者福利
以下是小编自己针对马上即将到来的金九银十准备的一套“面试宝典”,不管是技术还是HR的问题都有针对性的回答。
有了这个,面试踩雷?不存在的!
回馈粉丝,诚意满满!!!
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(“服务已经启动==”);
}
}
客户端部分
独家面经总结,超级精彩
本人面试腾讯,阿里,百度等企业总结下来的面试经历,都是真实的,分享给大家!
Java面试准备
准确的说这里又分为两部分:
- Java刷题
- 算法刷题
Java刷题:此份文档详细记录了千道面试题与详解;
21855609)]
[外链图片转存中…(img-Zkq8tAy2-1715121855610)]
Java面试准备
准确的说这里又分为两部分:
- Java刷题
- 算法刷题
Java刷题:此份文档详细记录了千道面试题与详解;
[外链图片转存中…(img-Oc87YqYy-1715121855610)]
[外链图片转存中…(img-S0PDdOso-1715121855610)]