SpringCloud微服务项目实战 - 网关zuul详解及搭建

上一篇介绍了服务的调用,这篇接着之前的话题,来说说SpringCloud中zuul的使用及搭建网关的那点事。

首先,我们要知道什么是网关

网关,是一个系统中前置的统一入口,介于客户端和服务器端之间的中间层,主要用来处理非业务功能,提供路由请求、鉴权、监控、缓存、限流等功能。客户端发起的请求首先通过网关,进行非业务功能处理,在根据路径的路由,定位到具体的服务节点上。

同时系统使用服务路由的功能,可以在对外提供服务时,只暴露网关中配置的调用地址,而调用方就不需要了解后端具体的微服务主机。可以有效的保护真实的服务地址信息。

Zuul是一个微服务网关,首先是一个微服务。也是会在Eureka注册中心中进行服务的注册和发现。也是一个网关,请求应该通过Zuul来进行路由。Zuul网关不是必要的。是推荐使用的。

SpringCloud zuul的相关介绍

1,为什么要使用微服务网关?

不同的微服务一般会有不同的网络地址,而客户端可能需要调用多个服务接口才能完成一个业务需求,若让客户端直接与各个微服务通信,会有以下问题:

    1)客户端会多次请求不同微服务,增加了客户端复杂性;

    2)存在跨域请求,处理相对复杂;

    3)认证复杂,每个服务都需要独立认证;

    4)难以重构,多个服务可能将会合并成一个或拆分成多个;

2,使用网关的优缺点?

优点:

  1. 所有的外部请求先经过微服务网关进行交互,无需调用特定微服务接口,简化了开发;

  2. 服务网关=路由转发+过滤器

  • 路由转发:接收请求,转发到后端的微服务上;

  • 过滤器:可在服务网关中可以完成一系列的横切功能(权限校验)

缺点:增加了网关,多了一层转发,服务性能会下降;

3,使用zuul 的作用?

Zuul可以通过加载动态过滤机制,从而实现以下各项功能:

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

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

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

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

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

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

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

4,zuul的工作原理?

zuul的核心是一系列的filters, 其作用可以类比Servlet框架的Filter,或者AOP。zuul把Request route到 用户处理逻辑 的过程中,这些filter参与一些过滤处理,比如Authentication,Load Shedding等。 

Zuul提供了一个框架,可以对过滤器进行动态的加载,编译,运行。

Zuul的过滤器之间没有直接的相互通信,他们之间通过一个RequestContext的静态类来进行数据传递的。RequestContext类中有ThreadLocal变量来记录每个Request所需要传递的数据。

Zuul的过滤器是由Groovy写成,这些过滤器文件被放在Zuul Server上的特定目录下面,Zuul会定期轮询这些目录,修改过的过滤器会动态的加载到Zuul Server中以便过滤请求使用。

下面有几种标准的过滤器类型:

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

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

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

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

    4) ERROR:在其他阶段发生错误时执行该过滤器。

内置的特殊过滤器

zuul还提供了一类特殊过滤器,分别为:StaticResponseFilter和SurgicalDebugFilter;

  • StaticResponseFilter:StaticResponseFilter允许从Zuul本身生成响应,而不是将请求转发到源。

  • SurgicalDebugFilter:SurgicalDebugFilter允许将特定请求路由到分隔的调试集群或主机。

自定义的过滤器

除了默认的过滤器类型,Zuul还允许我们创建自定义的过滤器类型。

5,Zuul和Nginx的区别

相同点:Zuul和Nginx都可以实现负载均衡、反向代理(隐藏真实ip地址),过滤请求,实现网关的效果

不同点:

  • Nginx–c语言开发

  • Zuul–java语言开发

  • Zuul负载均衡实现:采用ribbon+eureka实现本地负载均衡

  • Nginx负载均衡实现:采用服务器实现负载均衡

  • Nginx相比zuul功能会更加强大,因为Nginx整合一些脚本语言(Nginx+lua)

  • Nginx适合于服务器端负载均衡

  • Zuul适合微服务中实现网关

Zuul服务搭建

我们先在父级项目里引入zuul的依赖服务

再创建Zuul微服务模块,并添加pom依赖如下:

添加yml配置:

然后添加启动类:

启动所有服务:

测试:

推荐阅读:

SpringCloud微服务项目实战 - 微服务调用详解(附面试题)

SpringCloud微服务项目实战,服务注册与发现(附面试题)

Spring Cloud微服务项目实战--Eureka服务搭建

扫码关注公众号,发送关键词获取相关资料:

  1. 发“Springboot”领取电商项目实战源码;

  2. 发“SpringCloud”领取学习实战资料;