本篇文章主要讲解zuul路由的几种基本配置的总结。
配置文件
2.创建zuul-server服务
配置文件
3.接口测试
启动两个服务,用postman分别测试接口。
1.单实例serviceId映射
上例中的配置,是一个/client/** 到client-a服务的映射规则,我们可以把它简化为一个较简单的配置
另外还有一种更加简单的映射规则,映射规则与serivceId都不用写
在这种情况下,Zuul会给client-a添加一个默认的映射规则/client-a/**,相当于:
这时候通过 http://localhost:8888/client-a/user/add?id=1 来调用。
2.单实例url映射
除了路由到服务外,还能路由到物理地址,将serviceId替换成url即可
3.多实例路由
在默认情况下,zuul会使用Eureka中集成的基本负载均衡功能,如果想使用Ribbon的负载均衡功能,就需要指定一个serviceId,此 *** 作需要禁止Ribbon使用Eureka,在E版之后新增了负载均衡的配置。
4.forward本地跳转
有时候我们在zuul中会做一些逻辑处理,在网关(zuul server)中写好一个接口,如下所示
配置以下信息
调用 http://localhost:8888/test?a=1 接口返回如下
先介绍这么多,下次再介绍剩下的。
1.Servletzuul.servletPath默认配置为/zuul,故请求为/zuul开头的会跳过dispatcherServlet直接进入ZuulServlet,该配置可以自定义配置,例如用于大文件上传
2.ZuulServlet中service方法
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
try {
this.init((HttpServletRequest)servletRequest, (HttpServletResponse)servletResponse)
RequestContext context = RequestContext.getCurrentContext()
context.setZuulEngineRan()
try {
//运行pre过滤器
this.preRoute()
} catch (ZuulException var12) {
//有异常,执行errorFilter
this.error(var12)
//再执行postFilter
this.postRoute()
return
}
try {
//运行rote过滤器
this.route()
} catch (ZuulException var13) {
//有异常,执行errorFilter
this.error(var13)
//再执行postFilter
this.postRoute()
return
}
try {
//运行post过滤器
this.postRoute()
} catch (ZuulException var11) {
//有异常,执行errorFilter
this.error(var11)
}
} catch (Throwable var14) {
this.error(new ZuulException(var14, 500, "UNHANDLED_EXCEPTION_" + var14.getClass().getName()))
} finally {
RequestContext.getCurrentContext().unset()
}
}
3.FilterProcessor
其运行交由FilterProcessor中的方法runFilters,根据service中的顺序,取不同的filter类型,执行其中的run方法
public Object runFilters(String sType) throws Throwable {
if (RequestContext.getCurrentContext().debugRouting()) {
Debug.addRoutingDebug("Invoking {" + sType + "} type filters")
}
boolean bResult = false
List<ZuulFilter>list = FilterLoader.getInstance().getFiltersByType(sType)
if (list != null) {
for(int i = 0i <list.size()++i) {
ZuulFilter zuulFilter = (ZuulFilter)list.get(i)
Object result = this.processZuulFilter(zuulFilter)//见下面zuulFilter的runFilter()
if (result != null &&result instanceof Boolean) {
bResult |= ((Boolean)result).booleanValue()
}
}
}
return bResult
}
zuulFilter的runFilter方法,当filter的shouldFilter()返回true时才执行run()方法
public ZuulFilterResult runFilter() {
ZuulFilterResult zr = new ZuulFilterResult()
if (!this.isFilterDisabled()) {
if (this.shouldFilter()) {
Tracer t = TracerFactory.instance().startMicroTracer("ZUUL::" + this.getClass().getSimpleName())
try {
Object res = this.run()
zr = new ZuulFilterResult(res, ExecutionStatus.SUCCESS)
} catch (Throwable var7) {
t.setName("ZUUL::" + this.getClass().getSimpleName() + " failed")
zr = new ZuulFilterResult(ExecutionStatus.FAILED)
zr.setException(var7)
} finally {
t.stopAndLog()
}
} else {
zr = new ZuulFilterResult(ExecutionStatus.SKIPPED)
}
}
return zr
}
4.获取过滤器FilterRegistry
其中的属性private final ConcurrentHashMap<String, ZuulFilter>filters = new ConcurrentHashMap()
保存所有的过滤器
例子中有12个(其中有两个为自定义的):
[org.springframework.cloud.netflix.zuul.filters.route.SimpleHostRoutingFilter@3dc68586,
org.springframework.cloud.netflix.zuul.filters.pre.Servlet30WrapperFilter@4001d8c1,
org.springframework.cl
为了解决以上的问题,API网关应运而生,加入网关后应用架构变为下图所示。
当引入API网关后,在用户端与微服务之间建立了一道屏障,通过API网关对微服务提供了统一的访问入口,所有用户端的请求被API网关拦截,并在此基础上可以实现额外的功能:
OpenResty是一个强大的Web应用服务器,web开发人员可以使用Lua脚本语言调用Nginx支持的各种以C以及Lua模块。
在性能方面,OpenResty可以快速构造出足以胜任10K以上并发连接响应的超高性能Web应用系统。
在国内,360、阿里云、腾讯网、去哪儿、酷狗音乐、新浪等都是OpenResty的深度用户。
但OpenResty是一款独立的产品,与主流的注册中心,存在一定的兼容问题,需要架构师独立实现其服务注册、发现功能。
Zuul是Netflix开源的微服务网关,主要职责是对用户请求进行路由转发与过滤。早期Spring Cloud与Netflix合作,使用Zuul作为微服务架构网关首选产品。
Zuul是基于J2EE Servlet实现路由转发,网络通信采用同步方式。
zuul 是netflix开源的一个API Gateway 服务器,本质上是一个web servlet应用。
Zuul可以通过加载动态过滤机制,从而实现以下各项功能:
Zuul的核心是一系列的filters,其作用可以类比Servlet框架的Filter,或者AOP。工作原理如下图所示:
Zuul可以对Groovy过滤器进行动态的加载,编译,运行。
Zuul2.x设计更为先进,基于Netty 非阻塞和支持长连接, 但是 SpringCloud 目前没有整合。 Zuul2.x 的性能较 Zuul1.x 有较大的提升。
Zuul2.x引入了Netty和RxJava,正如之前的 ZuulFilter 分为了 Pre、Post、Route、Error,Zuul2的Filter分为三种类型:
Spring 自己开发的新一代API网关产品,基于NIO异步处理,摒弃了Zuul基于Servlet同步通信的设计。
Spring Cloud Gateway 作为 Spring Cloud 生态系统中的网关,目标是替代 Netflix Zuul,其不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流。
关键特征:
在性能方面,根据官方提供的基准测试, Spring Cloud Gateway 的 RPS(每秒请求数)是Zuul 的 1.6 倍。
Spring Cloud Gateway十分优秀,Spring Cloud Alibaba也默认选用该组件作为网关产品。
客户端向 Spring Cloud Gateway 发出请求。如果 Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到 Gateway Web Handler。Handler 再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。 过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(“pre”)或之后(“post”)执行业务逻辑。
Spring Cloud Gateway 的特征:
参考:
http://www.ityouknow.com/springcloud/2018/12/12/spring-cloud-gateway-start.html
http://www.likecs.com/show-50293.html
https://zhuanlan.zhihu.com/p/299608850?utm_source=wechat_session
https://juejin.cn/post/6844903965352525838
https://blog.csdn.net/weixin_38361347/article/details/114108368
http://www.zyiz.net/tech/detail-98256.html
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)