说明:
1 前面加星号,需要重点掌握
2 zuul2命名规则:
带sync的就是同步,同样的名称不带sync的就是异步
BaseServerStartup只为我们提供了基础的server,这是个抽象类,需要使用者自己来实现。
同理2种InboundFilter、2种OutboundFilter、1种Endpoint也都是抽象类,需要使用者自己来实现。
io.netty
|
bootstrap
|
ZuulBootstrap 这个继承了Bootstrap而不是ServerBootstrap,zuul2实现的netty客户端,用于管理origin
|
handler.codec.http2
|
Http2FrameCodec inbound+outbound,zuul2解决http2中二进制转码的问题
DefaultHttp2PushPromiseFrame Http2HeadersFrame的默认实现
Http2PushPromiseFrame 接口,封装了下netty的Http2HeadersFrame,增加了一个streamId
com.netflix
|
config
|
DynamicIntegerSetProperty 自定义数字类型动态变量
PatternListStringProperty 自定义正则表达List类型的动态变量
|
netty.common
|
accesslog
|
AccessLogChannelHandler inbound+outbound,对报文出入的统计,维护到channel的RequestState对象
AccessLogPublisher 拼接StringBuilder记录日志,这里有些配置可以自定义报文格式,也可以直接重写整个Publisher
|
channel.config
|
ChannelConfig 维护了一个HashMap
ChannelConfigKey 带默认默认value的key,ChannelConfig中set方法是为ChannelConfigKey准备的
ChannelConfigValue 带ChannelConfigKey关系的value,ChannelConfig中add方法是为ChannelConfigValue准备的
CommonChannelConfigKeys zuul2源码中用到的所有的key都在这里面,例如maxConnections、withProxyProtocol、httpRequestReadTimeout、maxConnections,详见BaseServerStartup
http2
|
DynamicHttp2FrameLogger 本质是个ChannelHandler,记录http的日志
metrics
|
EventLoopGroupMetrics 存放Group下EventLoop的指标信息
EventLoopMetrics 利用AtomicInteger维护EventLoop的请求数和链接数
Http2MetricsChannelHandlers inbound+outbound,进行异常统计和错误码统计,构造Http2SslChannelInitializer时会使用
HttpBodySizeRecordingChannelHandler 在inbound和outbound中向ChannelHandlerContext中维护bodySize
HttpMetricsChannelHandler 也是个http统计,但是只做了inbound,处理HttpServerLifecycleChannelHandler相关事件
PerEventLoopMetricsChannelHandler 为EventLoopGroupMetrics的request请求数和链接数提供数据的Inbound
ServerChannelMetrics 服务器级别统计totalConnections、connectionErrors、connectionClosed、connectionIdleTimeout、connectionThrottled的inbound。该handler也会放置在BaseZuulChannelInitializer的pipeline中,但是没看到如何去利用这些统计数据,如果自己不实现利用起来,感觉是在浪费资源。
proxyprotocol
|
ElbProxyProtocolChannelHandler 提供了一个Inbound,把一些报文信息维护到ChannelHandlerContext中
OptionalHAProxyMessageDecoder 提供了一个Inbound处理新链接是代理的场景,用代理在pipeline中替换掉自己
StripUntrustedProxyHeadersHandler 提供了一个inbound删除不信任站点中的头信息
ssl
|
ServerSslConfig 一个配置类,zuul2启动的时候会设置这个配置类
SslHandshakeInfo ssl握手鉴权相关的配置
status
|
ServerStatusHeaderHandler 空的Outbound,作者还没实现(2020/03/23)
ServerStatusManager eureka-client的封装,向注册中心上报状态,获取其它服务的状态
throttle
|
MaxInboundConnectionsHandler channel共享的Inbound,限制最大连接数,maxConnections<=0时不限制,放开后超过阈值会触发CONNECTION_THROTTLED_EVENT事件
AbstrHttpConnectionExpiryHandler 子通道outbound逾期处理,超过逾期将被打标
CategorizedThreadFactory FastThreadLocalThread的线程工厂,空间换时间,Server中workerThreadFactory的实现
CloseOnIdleStateHandler Inbound,监听IdleStateEvent事件,channel空闲之后,关闭连接。我们可以跟到IdleStateEvent中,看到netty定义了很多种关闭连接的事件。
ConnectionCloseType enum,定义链接关闭类型:IMMEDIATE, GRACEFUL, DELAYED_GRACEFUL
Http1ConnectionCloseHandler,Http2ConnectionCloseHandler 两种http关闭链接的Outbound,都分为DELAYED_GRACEFUL、GRACEFUL、IMMEDIATE三种方式,2代与1代的不不同是多了parent层级关系
Http1ConnectionExpiryHandler,Http2ConnectionExpiryHandler 两种http链接过期的Outbound,1代采用GRACEFUL方式,2代采用DELAYED_GRACEFUL方式
HttpChannelFlags 一个辅助类,可以给channel立flag,然后可以通过flag回头来找channel,在Http*Connection*Handler中被使用
HttpClientLifecycleChannelHandler HttpLifecycleChannelHandler的实现类,内置一个outbound和inbound,走父类的框架
HttpLifecycleChannelHandler Out+Inbund抽象类,目前只定义了2个事件start和complete,设置了一个框架维护channel的attribute和pipeline
HttpRequestReadTimeoutEvent http请求超时事件
HttpRequestReadTimeoutHandler Inbound,触发超时事件后,更新了channel的passport。
HttpServerLifecycleChannelHandler HttpLifecycleChannelHandler的实现类,内置一个outbound和inbound,走父类的框架
LeastConnsEventLoopChooserFactory EventLoop选择器的工厂类,配合EventLoopGroupMetrics选择最小链接数的executor,该工厂最终将用于server的EventLoopGroup
RequestResponseCompleteEvent 目前是个空类 (2020/3/24)
SourceAddressChannelHandler Inbound,channel中维护sourceIp、localIp等信息,可以解决链路追踪、ip透传等问题
|
zuul
|
constants
|
ZuulConstants zuul2中的常量,一般都会对应着一个配置项,目前并不是所有的常量都被引用到,可以看得出zuul2的发展方向
ZuulHeaders 头信息的常量,为了代码统一和性能考虑
|
context
|
CommonContextKeys zuul2中关于内容的常量Key
Debug SessionContext的封装,用于debug打印输出
SessionCleaner 空接口,未实现 (2020/3/24)
SessionContext 深度克隆的会话信息,非线程安全,SessionContext是HttpRequestMessage和HttpResponseMessage里的重要属性
SessionContextDecorator SessionContext的封装器接口
SessionContextFactory 空接口,未实现 (2020/3/24)
ZuulSessionContextDecorator SessionContextDecorator的实现类,封装器干的事情也就是给channel维护attribute信息
|
event
|
ZuulEvent 应该是个废弃类,com.netflix.zuul.stats下也有ZuulEvent
|
exception
|
ErrorType 定义了outbound错误类型对应的返回500+的返回码,可以通过配置修改
OutboundErrorType 将outbound的错误拆分为三维:返回码、状态分类、客户端错误类型。
OutboundException 继承ZuulException,专门封装outbound中的异常
ZuulFilterConcurrencyExceededException 继承ZuulException,专门封装filter中的异常
|
filters
|
common
|
GZipResponseFilter 支持gzip的HttpOutboundSyncFilter,开箱即用
SurgicalDebugFilter PASS,与Eureka调试用的一个HttpInboundSyncFilter
|
endpoint
|
MissingEndpointHandlingFilter 当endpoint找不到时直接抛500
*ProxyEndpoint 核心代码,zuul2中内置的endpoint的实现,zuul2如何通过netty来管理origin
|
*http
|
HttpInboundFilter 官宣的异步InboundFilter基类,使用者自己实现
HttpInboundSyncFilter 官宣的同步InboundFilter基类,使用者自己实现
HttpOutboundFilter 官宣的异步OutboundFilter基类,使用者自己实现
HttpOutboundSyncFilter 官宣的同步OutboundFilter基类,使用者自己实现
HttpSyncEndpoint 官宣Endpint的基类,使用者自己实现。
|
passport
|
InboundPassportStampingFilter PassportStampingFilter的实现类,BaseZuulChannelInitializer会装载
OutboundPassportStampingFilter PassportStampingFilter的实现类,BaseZuulChannelInitializer会装载
PassportStampingFilter 通过passport跟踪状态,打时间戳
|
BaseFilter 异步类型ZuulFilter的抽象类,看名称就知道是zuul过滤器的基类
BaseFilterTest PASS mock测试类
BaseSyncFilter 同步类型ZuulFilter的基类
Endpoint BaseFilter的实现类,重点代码是order=0
FilterError 定义了filter错误的封装对象
FilterRegistry 单例,维护了一个ConcurrentHashMap
FilterSyncType 过滤器分两种:SYNC, ASYNC
FilterType filter的类型:INBOUND、ENDPOINT、OUTBOUND
ShouldFilter 接口,filter是否应该被执行
SyncZuulFilter 接口,继承ZuulFilter,定义了同步filter需要执行的apply方法
SyncZuulFilterAdapter SyncZuulFilter的抽象类,接口zuulFilter里有12个方法,这个类默认实现了11个,就留下apply等子类实现。这个类与BaseSyncFilter功能有重复,后面会有详细的说明
TestSyncFilter PASS 测试类
*ZuulFilter 接口,继承ShouldFilter,添加了name、order、type、同步还是异步等一些列抽象方法
|
groovy
|
GroovyCompatability PASS 测试类
*GroovyCompiler 重要,这个就是zuul2的特性动态filter的心脏,本质就是通过GroovyClassLoader来加载code或file生成java.lang.Class
GroovyFileFilter 只有.groovy后缀的文件才可以被加载
|
guice
|
GuiceFilterFactory FilterFactory的实现类,利用google的Guice框架来管理zuulFilter,从ZuulFiltersModule可以看到被依赖注入
|
init
|
ZuulFiltersModule 给zuul2关于filter方面的依赖注入,从sample的ZuulSampleModule中看到进行了初始化
|
logging
|
FilteredPatternLayout zuul2的日志格式,设置为日志配置log4j.appender.stdout.layout的value
Http2FrameLoggingPerClientIpHandler inbound,提供了可以为具体ip做日志跟踪的功能
|
message
|
http
|
Cookies 定义Cookies对象
HttpHeaderNames 罗列了常用的http头,做成了static final
HttpHeaderNamesCache 本质是个ConcurrentHashMap,设置了maxSize,默认header中能放30个KV
HttpQueryParams 专门处理http的请求参数
HttpRequestInfo 接口,继承ZuulMessage,补充了get协议、方法、端口等方法
HttpRequestMessage 接口,继承HttpRequestInfo,补充了set协议、方法、端口等方法
HttpRequestMessageImpl HttpRequestMessage的实现,很像一个代理,其实大部分功能都是内置的ZuulMessageImpl完成的
HttpResponseInfo 不介绍了,跟request一个套路
HttpResponseMessage 不介绍了,跟request一个套路
HttpResponseMessageImpl 不介绍了,跟request一个套路
Header 创建一个对象专门管理http中hader,name用HeaderName类型,value用string
HeaderName 创建一个对象专门管理http中hader的key,里面有个配置是否大小写敏感,默认为true
Headers Header的集合,一次http交互中所有的头信息
ZuulMessage 接口,zuul2中维护http信息的主入口,getContext、getHeaders、setBody等等等等
*ZuulMessageImpl ZuulMessage的实现类
|
metrics
|
OriginStats PASS 空类 (2020/3/24)
OriginStatsFactory PASS 空类 (2020/3/24)
|
monitoring
|
CounterFactory 一个抽象的计数器工厂
MonitoringHelper PASS 目前无实际意义 (2020/3/24)
Tracer 接口,追踪
TracerFactory 一个抽象的追踪工程
|
netty
|
connectionpool
|
BasicRequestStat RequestStat的实现类,ProxyEndpoint会用它维护请求状态
ClientChannelManager 接口,origin中channel管理器,包括初始化、关闭、获取EventLoop等,会被BasicNettyOrigin内置
ClientTimeoutHandler origin客户端超时的handler,是一个复合bound,修改channel的pipeline
ConnectionPoolConfig 接口,连接池的配置类,提供了获取连接池配置相关的方法
ConnectionPoolConfigImpl ConnectionPoolConfig的实现类,读取配置文件实现相应接口,也会被BasicNettyOrigin内置,也提供大量默认值,对origin这块参数调优可以考虑进来好好review下
ConnectionPoolHandler inbound+outbound都有处理连接池的事件,捕获EndPoint的对应自定义事件
DefaultClientChannelManager ClientChannelManager的实现类,对PooledConnection的操作就是对客户端channel的操作
*DefaultOriginChannelInitializer 比较重要的类,里面实现了对channel pipeline的初始化
IConnectionPool 对connectionPool操作的接口,从方法上看与PooledConnection存在大量重复的地方。
NettyClientConnectionFactory netty管理EndPoint时对ZuulBootstrap的工厂类
OriginChannelInitializer ChannelInitializer抽象类,只是增加了metric,应该是为了初始化metric相关的内容
OriginConnectException 自定义异常
PerServerConnectionPool IConnectionPool的实现,很多工作都是转交给PooledConnection来完成的
PooledConnection 对已经链接到EndPoint的channel做了一层封装,配合管理channel的状态和链接数统计,对connection的操作最终还是通过channelManager
PooledConnectionFactory PooledConnection的工厂接口,一个PooledConnection管理一个channel
RequestStat 接口,请求状态相关方法
ZuulNettyExceptionMapper PASS 空类
|
filter
|
*BaseZuulFilterRunner FilterRunner的抽象实现,需要好好掌握filter这个方法,这里面对应着HttpOutboundFiter和HttpInboundFilter的方法是如何被调度的,最终真正干事的还是filter的applay或asyncApplay本身
FilterRunner filter调度的接口
*ZuulEndPointRunner BaseZuulFilterRunner的子类,endpoint的调度器,维护了一个FilterLoader,本质是通过filterLoader获取endPointFilter然后调用父类的filter方法
*ZuulFilterChainHandler BaseZuulFilterRunner的子类,zuul2中最重要的代码,没有之一,如何把zuul2的filter体系与Netty的channel体系相结合
*ZuulFilterChainRunner BaseZuulFilterRunner的子类,filter链的执行器,维护了一个zuulFilter的数组,本质是循环调用父类的filter方法
|
insights
|
PassportLoggingHandler inbound完成事件debug passport信息,还设计了一个慢查询之类的功能
PassportStateHttpClientHandler in+out,更新passport的state,被BasicNettyOrigin初始化,内置处理client事件
PassportStateHttpServerHandler in+out,更新passport的state,被BaseZuulChannelInitializer加载,用于作为网关入口
PassportStateListener passportState监听器,只负责等待任务结束后标记下passportState执行成功还是失败
PassportStateOriginHandler 与PassportStateHttpClientHandler功能类似,打的是ORIGIN_开头的标签,被BasicNettyOrigin加载,zuul内部捕获origin事件
PassportStateServerHandler 与PassportStateHttpServerHandler功能类似,打的是SERVER_开头的标签,被ZuulServerChannelInitializer加载,用于作为网关入口
|
ratelimiting
|
NullChannelHandlerProvider 目前是个空实现,去看了下BaseServerStartup的代码,应该是给限速之类还没写完的代码占个坑 (2020/3/24)
|
server
|
http2
|
DummyChannelHandler ChannelHandler的空实现,没看出有什么作用
Http2Configuration http2相关的配置,默认只支持http1
Http2OrHttpHandler 当http2场景时维护channel的相关attribute
Http2ResetFrameHandler http2重置的Inbound
Http2SslChannelInitializer BaseZuulChannelInitializer的子类,channel的pipeline初始化时增加了http2和ssl相关的handler
Http2StreamErrorHandler 异常处理
Http2StreamHeaderCleaner inbound,清理掉“x-http2-”头信息,
Http2StreamInitializer Inbound,把Http2StreamErrorHandler、Http2StreamHeaderCleaner织入pipeline,在Http2SslChannelInitializer中被构造
|
push 这个包是为了解决websocket、SSE等主流服务器推送技术
|
PushAuthHandler 安全相关的inbound,例如可以从cookie中获取数据
PushChannelInitializer BaseZuulChannelInitializer的子类,把推送相关逻辑织入pipeline,但仍旧是个抽象类,需要玩家自己实现addPushHandlers方法
PushClientProtocolHandler 推送时给客户端进行协议相关的设置
PushConnection 推送链接,维护了token,用令牌桶限流
PushConnectionRegistry 利用一个ConcurrentMap,维护客户端到web套接字或SSE通道的映射,说白了就是一个注册中心
PushMessageFactory PASS,抽象工厂,没见实现过
PushMessageSender Inbound,真正发送推送的Handler
PushMessageSenderInitializer 推送消息初始化,修改下pipeline
PushProtocol 推送协议,目前有SSE和WEB_SOCKET
PushRegistrationHandler 推送注册的Inbound,
PushUserAuth 用于定义一种鉴权,最重要的是getClientIdentity方法,返回用户唯一标识
|
ssl
|
SslHandshakeInfoHandler Inbound,处理ssl握手事件
*BaseServerStartup 敲黑板:重要的代码,zuul2作为server端的入口抽象方法,涉及到默认的启动配置,需要自己读懂代码并自己实现抽象方法choosePortsAndChannels后才可以部署自己的zuul2网关,配合着SampleServerStartup一起学习下
*BaseZuulChannelInitializer ChannelInitializer实现类,zuul2Channel的基础初始化抽象类,初始化配置和pipeline,构造时主要构造两个ChannelConfig对象:channelConfig里放配置,channelDependencies里放依赖对象。需要掌握addZuulHandlers方法,可以看到zuul加载了哪些filter,也可以看得出如何初始化了一条request、endpoint、response的链路。
ClientConnectionsShutdown 处理EurekaClient状态变更事件,当状态变为OUT_OF_SERVICE或DOWN时关闭所有客户端channel。该功能默认关闭
ClientRequestReceiver zuul2核心实现类,接收并处理http报文的inbound+outbound,被BaseZuulChannelInitializer内置加载
ClientResponseWriter zuul2核心实现类,outbound,作为客户端向北向服务回写response,被BaseZuulChannelInitializer内置加载
DefaultEventLoopConfig EventLoopConfig接口的实现,默认eventLoop配置,决定服务网关EventLoopGroup的数量,默认一个Boss+N个workder,其中worker数取决于核数
DirectMemoryMonitor 内存监控,通过schedule每10s获取一次数据
EventLoopConfig EventLoopGroup配置接口,详见DefaultEventLoopConfig
Http1MutualSslChannelInitializer BaseZuulChannelInitializer子类,增加了ssl初始化逻辑,在sample看到用于HTTP_MUTUAL_TLS场景的网关
MethodBinding 绑定thread和context的上下文
OriginResponseReceiver endpoint中用于接收路由服务的返回结果
Server 敲黑板:重要代码,ServerStartup会对它进行初始化,核心方法是setupServerBootstrap,如何启动netty
ServerTimeout 整个inbound的超时限制
ZuulDependencyKeys zuul2开放出的代码级用于配置的key
ZuulServerChannelInitializer BaseZuulChannelInitializer的子类,zuul作为http网关时的初始化逻辑,给pileine模板配置了一些列的Handler
|
ssl
|
BaseSslContextFactory SslContextFactory的实现类,让zuul2作为server端可以提供ssl解析的能力
ClientSslContextFactory BaseSslContextFactory的子类,让zuul2作为client端可以发送ssl请求
SslContextFactory 接口,定义了获取ssl环境信息的方法
ChannelUtils channel文本相关的辅助类
NettyRequestAttemptFactory RequestAttempt异常封装的辅助类
RequestCancelledEvent 请求取消的空事件
SpectatorUtils 处理时间戳、计数的辅助类
|
niws
|
RequestAttempt 内部请求类的封装,会维护在channel的context中
RequestAttempts RequestAttempt的集合类
|
origins
|
*BasicNettyOrigin 核心代码,NettyOrigin的实现类,构造DefaultClientChannelManager并初始化,将zuul内的origin转发
BasicNettyOriginManager OriginManager的实现类,管理origin,负责注册和存储ConcurrentHashMap
InstrumentedOrigin origin的子接口,origin第一层扩展
LoadBalancer 内置一个负载均衡接口,目前还没有实现类 (2020/3/24)
LoadBalancerFactory 负载均衡工程接口,目前是个空接口 (2020/3/24)
NettyOrigin InstrumentedOrigin的子接口,origin第二层扩展
Origin Origin最外层接口,zuul2中一个具体的南向服务端口被定义成一个origin
OriginConcurrencyExceededException OriginThrottledException的子类
OriginManager 管理Origin的接口
OriginThrottledException ZuulException的子类
ServerInfo 服务信息辅助类,就俩属性:host、port
|
passport
|
CurrentPassport 默认配置下唯一干的事情就是给channel设置“_current_passport”这个属性,配置不建议打开,review下来除开调试意义不大
PassportItem PassportState+时间戳
PassportState 定义了passport的状态
StartAndEnd 启止时间戳
|
plugins
|
Counter 计数器,看实现是给monitor用的
MetricPoller 没看到调用的代码和案例,还不清楚用途
ServoMonitor 没看到调用的代码和案例,还不清楚用途
Tracer 没看到调用的代码和案例,还不清楚用途
|
scriptManager
|
FilterInfo 个filter做了包装
FilterVerifier 这是filter合法性的检测器,特别时对groovy这种动态filter
|
stats
|
monitoring
|
Monitor 接口,只有注册NamedCount的抽象方法
MonitorRegistry 真正做事情的还是Monitor,先setMonitor再注册,这只是一个代理
NamedCount 接口,counter的封装,给它们起个名字
|
status
|
StatusCategory 接口,name、id、组
StatusCategoryGroup 接口 状态类别组
StatusCategoryUtils 在SessionContext中维护ZuulStatusCategory
ZuulStatusCategory StatusCategory的zuul的实现,定义了十几种状态码
ZuulStatusCategoryGroup StatusCategoryGroup的zuul实现,2个状态组 1成功 2失败
AmazonInfoHolder 应该是与aws中的eureka对接
BasicRequestMetricsPublisher RequestMetricsPublisher的实现,请求的监控推送
ErrorStatsData 错误状态数据对象
ErrorStatsManager 对ErrorStatsData的管理,功能像是做错误统计之类的使用
NamedCountingMonitor 做统计
RequestMetricsPublisher 接口,收集并推送request
RouteStatusCodeMonitor 路由状态监控
StatsManager 高纬度的统计监测工具
Timing 纳秒级别的表
Timings 维护一组时间数据
ZuulEvent zuul事件,没看到这个事件怎么被利用起来
|
util
|
一群辅助类,不说了
BasicFilterUsageNotifier FilterUsageNotifier的实现类,给filter不同的状态做统计
BasicRequestCompleteHandler RequestCompleteHandler的实现类,逻辑比较简单
DefaultFilterFactory 调用clasee的newInstance方法,但是从ZuulFiltersModule中看到真正生效的是它的兄弟GuiceFilterFactory
DynamicCodeCompiler 动态代码加载接口,GroovyCompiler是它的实现,理论上可以通过此接口支持其它动态语言
ExecutionStatus 定义了zuul的执行状态
FilterFactory 过滤器工厂类
*FilterFileManager 核心,zuul2对filter的加载策略,启动加载包内的静态filter,然后守护进程夹在配置位置的groovy的filter
FilterLoader filter的加载器的具体实现
FilterUsageNotifier 接口,被FilterRunner调度,看下来是zuul2设计的另一个回调处理逻辑链条,但是目前没实现什么东西,只做了统计。
RequestCompleteHandler 接口,请求完成的回调
ZuulApplicationInfo 应用元数据
遗留问题:
Q:SyncZuulFilterAdapter和BaseSyncFilter功能上有重复
A:按SyncZuulFilterAdapter作者的说法,每个BaseSyncFilter都要开启一个CachedDynamicBooleanProperty性能不佳而且有内存泄漏,所以在高并发场景用SyncZuulFilterAdapter
我看endpoint继承SyncZuulFilterAdapter,HttpInboundSyncFilter和HttpOutboundSyncFilter继承BaseSyncFilter