Spring-Cloud 之网关Zuul

Spring-Cloud 之网关Zuul

1.什么是网关服务?

微服务场景下,每一个微服务对外暴露了一组细粒度的服务。客户端的请求可能会涉及到一串的服务调用,如果将这些微服务都暴露给客户端,那么会增加客户端代码的复杂度。

参考GOF设计模式中的Facade模式,将细粒度的服务组合起来提供一个粗粒度的服务,所有请求都导入一个统一的入口,那么整个服务只需要暴露一个api,对外屏蔽了服务端的实现细节,也减少了客户端与服务器的网络调用次数。这就是api gateway。

有了api gateway之后,一些与业务关系并不大的通用处理逻辑可以从api gateway中剥离出来,api gateway仅仅负责服务的编排与结果的组装。

Spring Cloud Netflix的Zuul组件可以做反向代理的功能,通过路由寻址将请求转发到后端的粗粒度服务上,并做一些通用的逻辑处理。

Spring-Cloud 之网关Zuul_第1张图片

2.网关的作用

a.  验证与安全保障: 识别面向各类资源的验证要求并拒绝那些与要求不符的请求。

b . 审查与监控: 在边缘位置追踪有意义数据及统计结果,从而为我们带来准确的生产状态结论。

c . 动态路由: 以动态方式根据需要将请求路由至不同后端集群处。

d . 压力测试: 逐渐增加指向集群的负载流量,从而计算性能水平。

e . 负载分配: 为每一种负载类型分配对应容量,并弃用超出限定值的请求。

f . 静态响应处理: 在边缘位置直接建立部分响应,从而避免其流入内部集群。

g . 多区域弹性: 跨越AWS区域进行请求路由,旨在实现ELB使用多样化并保证边缘位置与使用者尽可能接近。

3.简单网关项目的示例:

3.1 创建项目

Spring-Cloud 之网关Zuul_第2张图片

3.2 添加坐标

Spring-Cloud 之网关Zuul_第3张图片

3.3 创建全局配置文件

3.4 创建启动类

Spring-Cloud 之网关Zuul_第4张图片

3.5 访问服务

4  路由器的 4 种路由规则方法

Spring-Cloud 之网关Zuul_第5张图片

5. 网关过滤器

5.1 什么是网关过滤器?

我们已经能够实现请求的路由功能,所以我们的微服务应用提供的接口就可以通过统一的 API 网关入口被客户端访问到了。

但是,每个客户端用户请求微服务应用提供的接口时,它们的访问权限往往都需要有一定的限制,系统并不会将所有的微服务接口都对它们开放。然而,目前的服务路由并没有限制权限这样的功能,所有请求都会被毫无保留地转发到具体的应用并返回结果。

为了实现对客户端请求的安全校验和权限控制,最简单和粗暴的方法就是为每个微服务应用都实现一套用于校验签名和鉴别权限的过滤器或拦截器。不过,这样的做法并不可取,它会增加日后的系统维护难度,因为同一个系统中的各种校验逻辑很多情况下都是大致相同或类似的,这样的实现方式会使得相似的校验逻辑代码被分散到了各个微服务中去,冗余代码的出现是我们不希望看到的。所以,比较好的做法是将这些校验逻辑剥离出去,构建出一个独立的鉴权服务。在完成了剥离之后,有不少开发者会直接在微服务应用中通过调用鉴权服务来实现校验,但是这样的做法仅仅只是解决了鉴权逻辑的分离,并没有在本质上将这部分不属于业余的逻辑拆分出原有的微服务应用,冗余的拦截器或过滤器依然会存在。

对于这样的问题,更好的做法是通过前置的网关服务来完成这些非业务性质的校验。由于网关服务的加入,外部客户端访问我们的系统已经有了统一入口,既然这些校验与具体业务无关,那何不在请求到达的时候就完成校验和过滤,而不是转发后再过滤而导致更长的请求延迟。同时,通过在网关中完成校验和过滤,微服务应用端就可以去除各种复杂的过滤器和拦截器了,这使得微服务应用的接口开发和测试复杂度也得到了相应的降低。

5.2 网关Filter 的生命周期

Spring-Cloud 之网关Zuul_第6张图片

PRE: 这种过滤器在请求被路由之前调用。我们可利用这种过滤器实现身份验证、在集群中选择请求的微服务、记录调试信息等。

ROUTING:这种过滤器将请求路由到微服务。这种过滤器用于构建发送给微服务的请求,并使用Apache HttpClient或Netfilx Ribbon请求微服务。

POST:这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的HTTP Header、收集统计信息和指标、将响应从微服务发送给客户端等。

ERROR:在其他阶段发生错误时执行该过滤器。 除了默认的过滤器类型,Zuul还允许我们创建自定义的过滤器类型。例如,我们可以定制一种STATIC类型的过滤器,直接在Zuul中生成响应,而不将请求转发到后端的微服务。

5.3 采用网关过滤器 实现权限验证

5.3.1 创建项目

Spring-Cloud 之网关Zuul_第7张图片

5.3.2添加坐标

Spring-Cloud 之网关Zuul_第8张图片

5.3.3 创建全局配置文件

5.3.4 创建过滤器

LoginFilter1

Spring-Cloud 之网关Zuul_第9张图片

LoginFilter2

Spring-Cloud 之网关Zuul_第10张图片

RoutingFilter

Spring-Cloud 之网关Zuul_第11张图片

PostFilter

Spring-Cloud 之网关Zuul_第12张图片


ExceptionHandle:系统异常同一处理,实现ErrorController接口,对响应异常的url做拦截,响应自定义的内容

Spring-Cloud 之网关Zuul_第13张图片

5.3.5 访问服务

访问成功控制台显示结果

访问失败页面显示结果(异常的统一处理页面)

Spring-Cloud 之网关Zuul_第14张图片


6. 网关容错


6.1 zuul 和 和 hystrix 无缝结合

在 zuul 的 jar 包中包含了 hystrix 的 jar 包。所以我们不需要在项目中添加 Hystrix 的坐

6.2 在网关服务访问数据监控流

格式:Http://网关ip:网关端口/hystrix.stream

Spring-Cloud 之网关Zuul_第15张图片

6.3 在dashboard视图控制面板中查看数据监控流

Spring-Cloud 之网关Zuul_第16张图片

7.  网关 中的 服务降级

7.1 只需在网关项目中创建网关降级的处理类(实现ZuulFallbackProvider,重写方法)


Spring-Cloud 之网关Zuul_第17张图片

7.2    ErrorController  与  ZuulFallbackProvider的区别?

Spring-Cloud 之网关Zuul_第18张图片


8. 网关实现限流达到自我保护

8.1 只需在网关项目中修改全局配置文件

全局限流

Spring-Cloud 之网关Zuul_第19张图片

局部限流

Spring-Cloud 之网关Zuul_第20张图片

8.2 网关限流的参数介绍

Spring-Cloud 之网关Zuul_第21张图片


9. zuul 性能调优:网关的 2 层超时调优

9.1超时调优图解

Spring-Cloud 之网关Zuul_第22张图片

9.2 配置超时调优

Spring-Cloud 之网关Zuul_第23张图片

你可能感兴趣的:(Spring-Cloud 之网关Zuul)