webflux-如何使用netty处理请求

前言

不知道从哪个版本起,spring推出了webflux框架,内置netty处理http请求,代替原有的tomcat内置服务器。那么webflux的基本概念和原理又是什么呢?

阅读源码的一般方法

准备源码

spring initializr创建样板项目,并添加如下依赖。

implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.cloud:spring-cloud-starter'
implementation 'org.springframework.cloud:spring-cloud-starter-bootstrap'
implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
implementation 'org.springframework.cloud:spring-cloud-starter-loadbalancer'
implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server'
implementation 'org.springframework.security:spring-security-oauth2-jose'
implementation group: 'io.reactivex', name: 'rxjava-reactive-streams', version: '1.2.1'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
implementation 'com.google.code.findbugs:jsr305:3.0.2'

gateway和security是使用webflux的典型场景,所以添加gateway和security依赖一起来看。

继承关系图

WebHandler

在这里插入图片描述
处理web请求,这里的重点是DispatcherHandler,分发处理器。类似webmvc的DispatcherServlet

HttpHandler

在这里插入图片描述
http请求处理器,reactor.netty.http.server.HttpServer的所有请求会转发到这个处理器。重点关注HttpWebHandlerAdapter

WebFilter

在这里插入图片描述
请求过滤器。

WebFilterChainProxy是一种特殊的过滤器,内部维护了一个SecurityWebFilterChain列表。spring-security的所有认证和授权逻辑都维护在这个特殊的WebFilter(WebFilterChainProxy)中。

WebExceptionHandler

在这里插入图片描述
异常处理器。

HandlerMapping

在这里插入图片描述
处理器映射,查找能够处理请求的处理器。普通webflux控制器程序终点关注RequestMappingHandlerMapping,gateway程序重点关注RoutePredicateHandlerMapping,函数式程序终点关注RouterFunctionMapping

HandlerAdapter

在这里插入图片描述
处理器适配器,处理请求并得到统一结果HandlerResult。同样,普通webflux控制器程序终点关注RequestMappingHandlerAdapter,gateway程序重点关注SimpleHandlerAdapter,函数式程序终点关注HandlerFunctionAdapter

HandlerResultHandler

在这里插入图片描述
结果处理器,将结果写到应答中,包含数据转换,编码等逻辑。

RouteDefinitionLocator

在这里插入图片描述
路由定义定位器,在程序中负责发现路由逻辑。主要有DiscoveryClientRouteDefinitionLocator,从注册中心发现路由和PropertiesRouteDefinitionLocator,从配置文件发现路由。

GlobalFilter

在这里插入图片描述
处理gateway请求的过滤器,其中有处理负载均衡逻辑的LoadBalancerClientFilter(10100)和处理转发逻辑的NettyRoutingFilter(Ordered.LOWEST_PRECEDENCE)

组合关系图

ReactiveWebServerApplicationContext

在这里插入图片描述

reactor.netty.http.server.HttpServerorg.springframework.http.server.reactive.HttpHandler通过ReactiveWebServerApplicationContext.ServerManager桥接在一起。

DispatcherHandler

在这里插入图片描述
分发处理器,包含消息的路由,解码处理,编码应答,异常处理等流程。

spring-cloud-gateway的主要逻辑集中在org.springframework.cloud.gateway.handler.FilteringWebHandler,内置多个全局过滤器以及单个路由相关的过滤器,从注册中心找到服务实例,并把请求负载均衡转发到这些实例上。

WebFilterChainProxy

在这里插入图片描述
security过滤器代理,包含认证、授权等逻辑。

spring-security可以针对不同的请求采用不同的认证方式,由ServerWebExchangeMatcher来判定请求使用哪个过滤器列表List<WebFilter>

WebFilter的处理要先于WebHandler,所以security的逻辑要先于gateway。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值