zuul入门
zuul是spring cloud的网关组件,用户在微服务中提供一个统一的对外接口,官方对zuul的说明是
Zuul is an edge service that provides dynamic routing, monitoring, resiliency, security, and more.
ZuulFilter
zuul是的核心就是com.netflix.zuul.ZuulFilter
,对于zuul网关的相关功能都是通过扩展这个ZuulFilter来实现的
ZuulFilter只需要实现几个方法就行
1 | public abstract class ZuulFilter implements IZuulFilter, Comparable<ZuulFilter> { |
编写ZuulFilter
例如实现一个判断请求是否带有accessToken的Filter
1 | public class AuthenticationFilter extends ZuulPreFilter { |
注册ZuulFilter
实现的ZuulFilter
都通过com.netflix.zuul.filters.FilterRegistry#put(String, ZuulFilter)
进行注册
FilterRegistry
是个单例
直接通过com.netflix.zuul.filters.FilterRegistry#instance
就可以获取实例
Zuul里面单例用的比较多
配置Zuul
要使用Zuul 需要配置一个com.netflix.zuul.context.ContextLifecycleFilter
和一个
com.netflix.zuul.filters.ZuulServletFilter
或者 com.netflix.zuul.http.ZuulServlet
ZuulServlertFilter
和ZuulServlet
二选一就行 这两个就是请求的入口
ContextLifecycleFilter
主要是对com.netflix.zuul.context.RequestContext
的生命周期做管理
com.netflix.zuul.context.RequestContext
是一个上下问对象,在ZuulFilter
中可以使用RequestContext#getInstacne()
获取到当前的请求上下文,RequestContext
内部使用ThreadLocal
来实现
配置了ZuulServlertFilter
或者ZuulServlet
之后
ZuulServlet
以ZuulServlet
来说,service
方法就是核心
在service
方法中主要就是初始化RequestContext
以及调用各个类型的ZuulFilter
1 | try { |
在ZuulServlet
内部持有个com.netflix.zuul.ZuulRunner
对象
各个xxRoute()
方法都是委托给ZuulRunner
的方法去调用
ZuulRunner
在委托给FilterProcessor
去调用, FilterProcessor
是一个单例
FilterProcessor
使用FilterLoad
最后调用到FilterRegistry
获取注册的Filter进行调用