前言
不知道从哪个版本起,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.HttpServer
和org.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。