WebFlux

相关名词

Netty Reactor:Reactor 模式本质是一种事件驱动流程。它支持三种线程模型:单线程模型、多线程模型、主从线程模型。

反应器设计模式(Reactor pattern)是一种为处理并发服务请求,并将请求提交到一个或者多个服务处理程序的事件设计模式。当客户端请求抵达后,服务处理程序使用多路分配策略,由一个非阻塞的线程来接收所有的请求,然后派发这些请求至相关的工作线程进行处理。

  1. 初始事件分发器(Initialization Dispatcher) :用于管理 Event Handler,定义注册、移除 EventHandler 等。它还作为 Reactor 模式的入口调用 Synchronous Event Demultiplexer 的 select 方法以阻塞等待事件返回,当阻塞等待返回时,根据事件发生的 Handle 将其分发给对应的 Event Handler 处理,即回调 EventHandler 中的 handle_event() 方法
  2. 同步(多路)事件分离器(Synchronous Event Demultiplexer) :无限循环等待新事件的到来,一旦发现有新的事件到来,就会通知初始事件分发器去调取特定的事件处理器。
  3. 系统处理程序(Handles) :操作系统中的句柄,是对资源在操作系统层面上的一种抽象,它可以是打开的文件、一个连接(Socket)、Timer 等。由于 Reactor 模式一般使用在网络编程中,因而这里一般指 Socket Handle,即一个网络连接(Connection,在 Java NIO 中的 Channel)。这个 Channel 注册到 Synchronous Event Demultiplexer 中,以监听 Handle 中发生的事件,对 ServerSocketChannnel 可以是 CONNECT 事件,对 SocketChannel 可以是 READ、WRITE、CLOSE 事件等。
  4. 事件处理器(Event Handler) : 定义事件处理方法,以供 Initialization Dispatcher 回调使用。
    Reactor详解

响应流规范是响应式编程的基石,他具有以下特点:

  • 响应流必须是无阻塞的。
  • 响应流必须是一个数据流。
  • 它必须可以异步执行。
  • 并且它也应该能够处理背压。

背压是反应流中的一个重要概念,可以理解为,生产者可以感受到消费者反馈的消费压力,并根据压力进行动态调整生产速率。
Java反应式框架Reactor中的Mono和Flux

Mono和Flux:是Publisher

Publisher:发布者

Subscriber:订阅者

Subscription:订阅,调度发布者和订阅者

WebFlux中Publisher,Subscriber,Subscription

Publisher:事件发布者,提供添加订阅者的subscribe(Subscriber)接口。其他逻辑、发布事件逻辑都由开发者实现(坑)。

Subscriber:订阅者,Publisher在自己的业务处理完后,且Subscription的request()被调用后,Publisher会调用Subscriber的onNext()

Subscription:订阅,维护调度以上两者,主要处理两者处理业务速度不一致

流程

  1. 客户端请求用户数据:request(user)
  2. WebFlux的控制层收到请求,创建一个user类型的publisher
  3. WebFlux的处理层收到publisher,创建一个subscriber且实现onNext()用于返回结果
  4. 5秒后publisher 的user 从数据库取出完成,publisher 调用subscriber 的onNext()
    gateway详解
    gateway过滤器

http 0.9只支持短链接
http 1.0支持长链接
http 2.0支持tcp多路复用

io多路复用
io多路复用

多路复用处理线程设计(猜想)代码

List<Request(RequestId,RequestData)> requests;
List<Respone(RequestId,ResponeData)> respones;
public void start(){
	while(true){
		int processTime = 10;
		for(int i=0;i<processTime;i++){
			if(requests.size()==0)break;
			processRequest(requests.get(i))
		}
		for(int i=0;i<processTime;i++){
			if(requests.size()==0)break;
			processRespone(respones.get(i))
		}
	}
}
public void processRequest(Request r);
public void processRespone(Request r);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值