首先有必要了解一下什么是Zuul,它和Spring Cloud有什么关系。

Zuul在Spring Cloud中承担着网关的职责,可以理解为客户端和服务端交互中的唯一通道。所有的客户端请求都会首先发送到网关,而后路由转发到对应的微服务。同时,Zuul还提供了诸如服务聚合、权限校验等,另外也对客户端与服务端的交互起到了解耦的作用。

我们可以通过一个具体的场景来理解一下。假设需要开发一个校园图书管理系统,在客户端可能发起登录、查看图书列表、进行订阅等请求,如下图所示:

而其中,即使是非本校的学生也可以在客户端查询有哪些图书,但是只有登录成功的本校学生才能发起借阅。这时客户端需要做的事情就多了,既要区分不同的请求发往哪个服务,还要判断当前的权限是否可以调用这个服务。另外,在客户端进行权限的控制也存在安全隐患,前后端的职责划分也不够明确。在引入Zuul网关之后的效果是这样:

服务的路由以及权限的校验统统在网关层面完成即可。这样还有一个好处就是后续即使把图书查询服务进行拆分,变成中文图书查询与英文图书查询,或者进行其他的服务合并,对于客户端也基本是无感知了。

了解了Zuul的功能之后,我们来探究一下Zuul的原理。

Zuul的核心是一组过滤器,而Zuul的绝大部分功能也都是通过这一组过滤器实现的。Zuul提供了对这些过滤器进行动态加载、编译以及运行的框架。这一组过滤器包括pre、routing、post、error等,通过一张图片来了解一下这些过滤器分别在一笔请求的哪些环节生效:

从上图中可以看到对应的几类过滤器分别是如下的作用:

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

ROUTING:这种过滤器用于构建发送给微服务的请求,并使用Apache HttpClient或Netfilx Ribbon请求微服务(题外话:这里也能看出,Ribbon是在客户端实现负载均衡,这一点和Nginx不同)。

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

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

Spring Cloud借助Eureka进行服务注册与发现,微服务的访问通过REST请求。Zuul的访问方式也是REST,其URL地址默认格式为:

http://zuulHostIp:port/要访问的服务名称/服务中的URL

我这里为了方便在一个测试的微服务项目中为Zuul网关添加一个Module(在不在一个项目无所谓,大家通过同一个Eureka服务进行注册发现即可):

pom中需要添加Zuul的相关依赖:

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>

application.yml中指定网关服务名、连接的Eureka服务信息等:

server:
port: 10290
spring:
application:
name: spring-cloud-zuul-gateway
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:9090/eureka
fetch-registry: true
register-with-eureka: true

接下来我们添加路由配置来验证Zuul的路由转发功能:

zuul:
routes:
spring-cloud-service-provider:
path: /provider/**
url: http://127.0.0.1:10090

spring-cloud-service-provider为路由规则的条目名称。path为向Zuul网关进行请求时紧跟在端口后的服务名称,**表示具体服务下的url。而url项则需要填写目的服务的真实地址端口信息。

创建应用时需要添加自动发现以及Zuul的注解:

@SpringCloudApplication
@EnableZuulProxy
@EnableDiscoveryClient
public class ZuulGatewayApplication { public static void main(String[] args) {
SpringApplication.run(ZuulGatewayApplication.class, args);
}
}

启动Eureka服务、目的服务以及Zuul网关服务验证一下,没问题:

接下来我们玩一下Zuul的核心,过滤器。可以试着创建一个PRE过滤器,来打印请求的详细信息。

可以看到在继承ZuulFilter类时需要实现如下四个方法:

filterType:表示过滤器类型,值域分别对应不同的生命周期也就是pre、error、post以及route。

filterOrder:同种类(生命周期)过滤器的执行优先级,按照返回值升序进行优先级的确定。

shouldFilter:表示当前过滤器是否生效。

run:过滤器的具体执行逻辑。

补充之后的过滤器代码如下所示:

@Component
public class PreLogFilter extends ZuulFilter { public String filterType() {
return "pre";
} public int filterOrder() {
return 0;
} public boolean shouldFilter() {
return true;
} public Object run() throws ZuulException { RequestContext rc = RequestContext.getCurrentContext();
HttpServletRequest request = rc.getRequest(); System.out.println("PreLogFilter enters with [url=" + request.getRequestURL() + "]...");
return null;
}
}

重新启动Zuul网关服务之后再次进行请求,可以看到控制台打印如下输出:

参考资料:

https://www.cnblogs.com/jing99/p/11696192.html

https://zhuanlan.zhihu.com/p/138943446

https://blog.csdn.net/luckystar_99/article/details/105114198

Spring Cloud Zuul 学习+实践的更多相关文章

  1. Spring Cloud Gateway 学习+实践

    官网上给出的Spring Cloud Gateway特性如下图所示: 翻译过来就是: 基于 Spring Framework 5 ,Project Reactor 以及 Spring Boot 2.0 ...

  2. spring cloud深入学习(十一)-----服务网关zuul

    前面的文章我们介绍了,Eureka用于服务的注册于发现,Feign支持服务的调用以及均衡负载,Hystrix处理服务的熔断防止故障扩散,Spring Cloud Config服务集群配置中心,似乎一个 ...

  3. 服务网关Spring Cloud Zuul

    Spring Cloud Zuul 开发环境 idea 2019.1.2 jdk1.8.0_201 Spring Boot 2.1.9.RELEASE Spring Cloud Greenwich S ...

  4. Spring Cloud Zuul记录接口响应数据

    系统在生产环境出现问题时,排查问题最好的方式就是查看日志了,日志的记录尽量详细,这样你才能快速定位问题. 如果需要在Zuul中进行详细的日志记录,这两种日志必不可少. API请求信息 API响应信息 ...

  5. API网关服务:Spring Cloud Zuul

    最近在学习Spring Cloud的知识,现将API网关服务:Spring Cloud Zuul 的相关知识笔记整理如下.[采用 oneNote格式排版]

  6. Spring Cloud Zuul 添加 ZuulFilter

    紧接着上篇随笔Spring Cloud Zuul写,添加过滤器,进行权限验证 1.添加过滤器 package com.dzpykj.filter; import java.io.IOException ...

  7. Spring Cloud Zuul网关 Filter、熔断、重试、高可用的使用方式。

    时间过的很快,写springcloud(十):服务网关zuul初级篇还在半年前,现在已经是2018年了,我们继续探讨Zuul更高级的使用方式. 上篇文章主要介绍了Zuul网关使用模式,以及自动转发机制 ...

  8. 笔记:Spring Cloud Zuul 快速入门

    Spring Cloud Zuul 实现了路由规则与实例的维护问题,通过 Spring Cloud Eureka 进行整合,将自身注册为 Eureka 服务治理下的应用,同时从 Eureka 中获取了 ...

  9. Spring Cloud Zuul 限流详解(附源码)(转)

    在高并发的应用中,限流往往是一个绕不开的话题.本文详细探讨在Spring Cloud中如何实现限流. 在 Zuul 上实现限流是个不错的选择,只需要编写一个过滤器就可以了,关键在于如何实现限流的算法. ...

随机推荐

  1. java类与对象基础篇

    java面向对象基础篇 面向对象程序设计(Object Oriented Proframming ,OOP) 面向对象的本质是:以类的方式组织代码,以对象的方式组织(封装)数据. 面向对象的核心思想是 ...

  2. Aria2 任意文件写入

    访问aria2,发现服务已启动并且返回404页面 打开http://binux.github.io/yaaw/demo/#打开yaaw,点击配置按钮,填入运行aria2的目标域名:http://you ...

  3. "virtualbox for mac安装器遇到了一个错误, 导致安装失败. 请联系软件制造商以获得帮助"的解决办法

    virtualbox下载地址: https://www.virtualbox.org/wiki/Downloads 原因:"Mac OS 10.13.4 会阻止外部内核扩展的安装" ...

  4. 测试开发【提测平台】分享3-正式开发产品需求&项目初始化

    上两个分享主要是介绍和演示基本前后端所要使用的框架,接下来我们将正式进入到[提测平台的开发] 提要先给出依赖和内容点: 提测平台定义和产品原型需求说明 使用github创建代码仓库进行项目管理 Fla ...

  5. Distance Queries 距离咨询 (LCA倍增模板)

    农夫约翰有N(2<=N<=40000)个农场,标号1到N.M(2<=M<=40000)条的不同的垂直或水平的道路连结着农场,道路的长度不超过1000.这些农场的分布就像下面的地 ...

  6. 数据结构算法学习之队列(数组模拟java实现)

    数组模拟队列 数组模拟队列 今天学习数组模拟队列.队列常用于生活中的方方面面.比如银行叫号排队.实际上就是队列.所有人抽号排队.先去的先抽号.所以靠前的号最后会先被叫到然后出队.后边的会随之往前移位. ...

  7. 利用MySQL原数据信息批量转换指定库数据表生成Hive建表语句

    1.写出文件工具类 package ccc.utile; import java.io.*; /** * @author ccc * @version 1.0.0 * @ClassName Write ...

  8. VScode安装配置

    一.安装VScode 进入VScode官网Visual Studio Code下载 安装 二.设置中文 打开vscode 重启vscode 三.美化 四.安装拓展插件 Auto Close Tag ( ...

  9. 授予mysql的其他用户数据库的使用权限

    场景:不同的开发人员有不同的数据库的权限:也可适用于外包公司不同的开发权限. root用户登录数据库,命令行执行下面语句即可. grant select,delete,update,create,dr ...

  10. 【原创】冰蝎v3.0操作使用手册

    写在前面 近期冰蝎更新了内网穿透模块中的一些功能,有不少朋友不知道参数怎么填,希望能出一个使用指导手册,就借这个机会写一个"说明书"(文中有大量演示动图,请耐心等待加载). 基本信 ...