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.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。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)