不知道从哪个版本起,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。
http请求处理器,reactor.netty.http.server.HttpServer的所有请求会转发到这个处理器。重点关注HttpWebHandlerAdapter。
请求过滤器。
WebFilterChainProxy是一种特殊的过滤器,内部维护了一个SecurityWebFilterChain列表。spring-security的所有认证和授权逻辑都维护在这个特殊的WebFilter(WebFilterChainProxy)中。
WebExceptionHandler
异常处理器。
处理器映射,查找能够处理请求的处理器。普通webflux控制器程序终点关注RequestMappingHandlerMapping,gateway程序重点关注RoutePredicateHandlerMapping,函数式程序终点关注RouterFunctionMapping。
处理器适配器,处理请求并得到统一结果HandlerResult。同样,普通webflux控制器程序终点关注RequestMappingHandlerAdapter,gateway程序重点关注SimpleHandlerAdapter,函数式程序终点关注HandlerFunctionAdapter。
结果处理器,将结果写到应答中,包含数据转换,编码等逻辑。
路由定义定位器,在程序中负责发现路由逻辑。主要有DiscoveryClientRouteDefinitionLocator,从注册中心发现路由和PropertiesRouteDefinitionLocator,从配置文件发现路由。
处理gateway请求的过滤器,其中有处理负载均衡逻辑的LoadBalancerClientFilter(10100)和处理转发逻辑的NettyRoutingFilter(Ordered.LOWEST_PRECEDENCE)。
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的处理要先于WebHandler,所以security的逻辑要先于gateway。