点击上方“JavaEdge”,关注公众号
设为“星标”,好文章不错过!BIO | NIO | AIO |
---|---|---|
Thread-Per-Connection | Reactor | Proactor |
![b46c563d8086f4a775442006f23ded5b.png](https://i-blog.csdnimg.cn/blog_migrate/87085f14e1b5cb382e38e033c96ac97c.png)
什么是Reactor
![fc800c99d28057ca59191961b460ce84.png](https://i-blog.csdnimg.cn/blog_migrate/24ce839d3dd464f4365d7ad19b38cee8.png)
Reactor是一种开发模式,模式的核心流程:
注册感兴趣的事件->扫描是否有感兴趣的事件发生->事件发生后做出相应的处理。
![b46c563d8086f4a775442006f23ded5b.png](https://i-blog.csdnimg.cn/blog_migrate/87085f14e1b5cb382e38e033c96ac97c.png)
三种版本
![fc800c99d28057ca59191961b460ce84.png](https://i-blog.csdnimg.cn/blog_migrate/24ce839d3dd464f4365d7ad19b38cee8.png)
Thread-Per-Connection模式![110893a1e0e6e77d50ea3f13b2925815.png](https://i-blog.csdnimg.cn/blog_migrate/c6f4a32651a641eb5d5d0be20dd69e27.png)
注意到每个 handler 里的 read 和 send都是阻塞操作,那用线程池不就行了?但那只是避免了线程数量无限增长而已,依旧无法避免等待线程的阻塞。
Reactor 模式 V1:单线程,一个线程太累啦,而且他一旦挂了,整个系统挂了。相当于创业初期,老板就是个全干工程师。
Reactor 模式 V2:多线程,老板开始招合伙人了,大家一起干!
Reactor 模式 V3:主从多线程。对于服务器来说,最重要的莫过于接收连接,使用主线程做这些事。老板真的成为资本家了,开始招聘打工人啦!老板只负责最关键的事情即可。
在 netty 中使用 reactor 模式
# Reactor单线程模式EventLoopGroup eventGroup = new NioEventLoopGroup(1);ServerBootstrap serverBootstrap = new ServerBootstrap();serverBootstrap.group(eventGroup);# 非主从Reactor多线程模式EventLoopGroup eventGroup = new NioEventLoopGroup();ServerBootstrap serverBootstrap = new ServerBootstrap();I serverBootstrap.group eventGroup);# 主从Reactor多线程模式EventLoopGroup bossGroup = new NioEventLoopGroup();EventLoopGroup workerGroup = new NioEventLoopGroup();ServerBootstrap serverBootstrap = new ServerBootstrap();serverBootstrap.group( bossGroup, workerGroup);
![b46c563d8086f4a775442006f23ded5b.png](https://i-blog.csdnimg.cn/blog_migrate/87085f14e1b5cb382e38e033c96ac97c.png)
源码解析
![fc800c99d28057ca59191961b460ce84.png](https://i-blog.csdnimg.cn/blog_migrate/24ce839d3dd464f4365d7ad19b38cee8.png)
跨平台实现的根本
public static SelectorProvider provider() {synchronized (lock) {if (provider != null)return provider;return AccessController.doPrivileged(new PrivilegedAction<SelectorProvider>() {public SelectorProvider run() {if (loadProviderFromProperty())return provider;if (loadProviderAsService())return provider;
provider = sun.nio.ch.DefaultSelectorProvider.create();return provider;}});}}
往期推荐
大厂如何解决数值精度/舍入/溢出问题
大厂数据库事务实践-事务生效就能保证正确回滚?
线上问题事迹(一)数据库事务居然都没生效?
硬核干货:HTTP超时、重复请求必见坑点及解决方案
给大忙人们看的Java NIO教程之Channel
![93b630ae9dc5c8c48c67e03fbd466f74.gif](https://i-blog.csdnimg.cn/blog_migrate/a2108e76a550cc341bf2dd67adc8b0c2.gif)
目前交流群已有 800+人,旨在促进技术交流,可关注公众号添加笔者微信邀请进群
喜欢文章,点个“在看、点赞、分享”素质三连支持一下~