zuul网关

如何判断当前使用的是zuul的版本号?

zuul-core的版本号1.3.1,所以我们使用的是zuul1.0的版本。

 

静态响应处理-在边缘直接生成一些响应而不访问内部集群。

甩负荷-为每种请求分配容量,拒绝超限的请求。

洞察和监控-跟踪有意义的数据,在边缘做统计,以便准确了解产品的运行情况。

 

微服务架构:Zuul 1.0 和 2.0的技术选择 

Zuul2云网关集群,如何对zuul建立集群? nginx可以实现。

Zuul1设计比较简单,代码不多也比较容易读懂,它本质上就是一个同步Servlet,采用多线程阻塞模型。

 

什么是同步Servlet?(分配线程,阻塞,线程释放,Servlet容器线程池的大小)

1,每来一个请求,Servlet容器要为该请求分配一个线程专门负责处理这个请求,直到响应返回客户端这个线程才会被释放返回容器线程池。如果后台服务调用比较耗时,那么这个线程就会被阻塞,阻塞期间线程资源被占用,不能干其它事情。

2,我们知道Servlet容器线程池的大小是有限制的,当前端请求量大,而后台慢服务比较多时,很容易耗尽容器线程池内的线程,造成容器无法接受新的请求,Netflix为此还专门研发了Hystri熔断组件来解决慢服务耗尽资源问题。(慢服务耗尽资源的问题)

3,劣势:线程上下文切换开销,前端请求连接数限制,延迟阻塞耗尽连接资源。

所谓的上下文切换Context Switch开销。线程越多,这种上下文切换的开销就越大,同步阻塞模式一般会启动很多的线程,必然引入线程切换开销。

同步阻塞模式比较适用于计算密集型(CPU bound)应用场景。对于IO密集型场景(IO bound),同步阻塞模式会白白消耗很多线程资源,它们都在等待IO的阻塞状态,没有做实质性工作。

 

Zuul2的设计:采用了Netty实现异步非阻塞编程模型。

事件环线程(Event Loop Thread) 它同时监听前后两个队列上的事件,有事件就触发回调函数处理事件。

非阻塞模式可以接受的连接数大大增加,可以简单理解为请求来了只需要进队列,这个队列的容量可以设得很大,只要不超时,队列中的请求都会被依次处理。

 

Zuul1和Zuul2的性能比对

大致Zuul2的性能比Zuul1好20%左右,这里的性能主要指每节点每秒处理的请求数。

Zuul2在连接数方面表现要好于Zuul1,也就是说Zuul2能接受更多的连接数。

 

zuul核心原理

ZuulServlet extends HttpServlet 过滤器调度过程。

ZuulServlet - 处理请求(调度不同阶段的filters,处理异常等) 

三个核心的方法preRoute(),route(), postRoute(),zuul对request处理逻辑都在这三个方法里。

ZuulServlet交给ZuulRunner去执行。

由于ZuulServlet是单例,因此ZuulRunner也仅有一个实例。

ZuulRunner直接将执行逻辑交由FilterProcessor处理,FilterProcessor也是单例,其功能就是依据filterType执行filter的处理逻辑。

FilterProcessor对filter的处理逻辑:

1)首先根据Type获取所有输入该Type的filter,List<ZuulFilter> list。

2)遍历该list,执行每个filter的处理逻辑,processZuulFilter(ZuulFilter filter)

3)RequestContext对每个filter的执行状况进行记录,应该留意,此处的执行状态主要包括其执行时间、以及执行成功或者失败,如果执行失败则对异常封装后抛出。 

4)到目前为止,zuul框架对每个filter的执行结果都没有太多的处理,它没有把上一filter的执行结果交由下一个将要执行的filter,仅仅是记录执行状态,如果执行失败抛出异常并终止执行。

 

敏感信息传递,跨域问题,路由规则,负载均衡,静态资源处理。

springcloud中zuul向下传递请求头丢失的情况?  允许敏感信息向下传递。

Springboot+SpringCloud zuul网关跨域问题

 

/fliters 端点会返回 Zuul 中所有过滤器的信息,可以清楚地了解 Zuul 中目前有哪些过滤器,哪些过滤器被禁用了等详细信息.

查看路由配置信息 http://localhost:8000/actuator/routes

查看路由详情 http://localhost:8000/actuator/routes/details

显示当前所有过滤器的信息: http://localhost:8000/actuator/filters 

 

1、Zuul过滤器生命周期

Zuul大部分功能都是通过过滤器来实现的,Zuul定义了4种标准的过滤器类型,这些过滤器类型对应于请求的典型生命周期。

帮助我们理解Zuul对外部请求处理的过程,以及帮助我们如何在此基础上扩展过滤器去完成自身系统需要的功能。

 

要想实现Filter,通过继承ZuulFilter然后重写上面的4个方法,就可以实现一个简单的过滤器,下面就相关注意点进行说明

1,filterType:返回一个字符串代表过滤器的类型,在zuul中定义了四种不同生命周期的过滤器类型,具体如下:

pre:可以在请求被路由之前调用,可利用这种过滤器实现身份验证;当前过滤器在哪个时机被调用?

route:在路由请求时候被调用

post:在route和error过滤器之后被调用

error:处理请求时发生错误时被调用

 

2,filterOrder:通过int值来定义过滤器的执行顺序

3,shouldFilter:返回一个boolean类型来判断该过滤器是否要执行,所以通过此函数可实现过滤器的开关。在上例中,我们直接返回true,所以该过滤器总是生效

4,run:过滤器的具体逻辑。在该函数中,我们可以实现自定义的过滤逻辑,来确定是否要拦截当前的请求,不对其进行后续的路由,或是在请求路由返回结果之后,对处理结果做一些加工等。 // 过滤通过后要执行的方法

 

springcloud zuul路由配置规则

1)域名访问. 2)服务名访问.

 

通过zuul网关代理解决跨域问题

使用zuul代理服务来避免必须的跨域资源共享(Cross-Origin Resource Sharing)和所有的后端需要分别认证的问题。统一认证。

开启zuul反向代理功能:@EnableZuulProxy。启用Zuul的API网关功能

是否剥离前缀(前缀会被剥离) zuul.routes.xxx.stripPrefix=false 

同一个微服务中有些接口需要健权,有些不需要怎么处理?写两个接口进行测试

原访问路径:http://localhost:9000/test

http://localhost:8000/nongfu/test 不带token访问报权限异常

http://localhost:8000/nongfu/ignore 忽略请求,不能进行访问。zuul.ignoredPatterns=/**/ignore/*

 

1,配置路由规则

2,配置访问前缀 zuul.prefix=/proxy #给网关路由添加前缀

3,Header过滤及重定向添加Host

Zuul在请求路由时,默认会过滤掉一些敏感的头信息,以下配置可以防止路由时的Cookie及Authorization的丢失.

zuul.sensitive-header=Cookie,Set-Cookie,Authorization

#配置过滤敏感的请求头信息,设置为空就不会过滤.如果这样设置,下游服务就获取不到请求头了。

4,查看路由信息:可以通过SpringBoot Actuator来查看Zuul中的路由信息。

 

获取请求上下文,获取到request

RequestContext currentContext = RequestContext.getCurrentContext();

HttpServletRequest request = currentContext.getRequest();

context.setSendZuulResponse(false);

context.setResponseStatusCode(HttpStatus.SC_UNAUTHORIZED);

在网关中做token校验处理。token中是否包含用户信息,比如用户id。有些token是包含用户信息的。

网关:必须把配置放在Nacos上才行, 这样配置路由就不用重新发布服务。

如何添加拦截器?

返回json格式的数据:401,未授权。直接就返回这个结果即可。

网关层如何做静态资源处理?加快响应

ignoredPatterns: /**/user/* #忽略所有包含/user/的地址请求

 

添加各种predicates和filters,predicates断言的意思,顾名思义就是根据具体的请求的规则,由具体的route去处理,filters是各种过滤器,用来对请求做各种判断和修改。

断言:请求规则

过滤器:过滤条件。

(1)Filter(过滤器):

和Zuul的过滤器在概念上类似,可以使用它拦截和修改请求,并且对上游的响应,进行二次处理。过滤器为org.springframework.cloud.gateway.filter.GatewayFilter类的实例。

(2)Route(路由):

网关配置的基本组成模块,和Zuul的路由配置模块类似。一个Route模块由一个 ID,一个目标 URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配,目标URI会被访问。

(3)Predicate(断言):

这是一个 Java 8 的 Predicate,可以使用它来匹配来自 HTTP 请求的任何内容,例如 headers 或参数。断言的输入类型是一个 ServerWebExchange。

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值