首先有必要了解一下什么是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. 租了一台华为云耀云服务器,却直接被封公网ip,而且是官方的bug导致!

    小弟在博客园也有十多个年头了,因为离开了.net圈子,所以很少发文,今天可算是被华为云气疯了.写下这篇文章,大家也要注意自查一下,避免无端端被封公网ip. 因为小弟创业公司业务发展,需要一个公网做宣传 ...

  2. 等Excel工作簿关闭后自动加密压缩备份

    ;; 等Excel工作簿关闭后自动加密压缩备份.ahk;; 腾讯QQ号 595076941; 作者:boai; 写作日期:2019年5月15日; 版本号:第1版; 手机号(中国移动) 138##### ...

  3. Java 反射(一)反射简介、原理和应用场景

    目录 一.动态语言和动态语言的比较 动态语言 静态语言 二.反射 简介 反射的常见使用 1. 代码编辑器 2. Spring等框架的IoC容器 3. 和注解的配合使用 原理 反射优缺点 调试查看 Cl ...

  4. python自动化之(自动化测试报告)

    前言: 给予你们最关心的3步骤 什么是自动化测试报告?  答:在自动化测试过程中自动生成的测试报告 为什么要做自动生成测试报告? 答:真正的解放双手; 可以形成直观的测试结果; 给自己一个装X的机会; ...

  5. 【LeetCode】169. 多数元素

    169. 多数元素 知识点:数组:排序:消消乐:分治: 题目描述 给定一个大小为 n 的数组,找到其中的多数元素.多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素. 你可以假设数组是非空的, ...

  6. 003 PCI Express体系结构(三)

    一.PCI总线的存储器读写总线事务 总线的基本任务是实现数据传送,将一组数据从一个设备传送到另一个设备,当然总线也可以将一个设备的数据广播到多个设备.在处理器系统中,这些数据传送都要依赖一定的规则,P ...

  7. OSI网络参考模型学习

    文章目录 一.计算机与网络的发展 1.1 批处理系统 1.2 分时系统 1.3 计算机之间的通信 1.4 基于分组交换技术的计算机网络 1.5 互联网时代的计算机网络 1.6 计算机网络中协议的规定 ...

  8. 题解 Lost My Music

    传送门 多明显的斜率式然而我没有看出来 然而不管是我乱搞的思路还是正解的凸包思路都需要一个可持久化栈 考场上想到可持久化单调栈,但不会实现-- 其实单调栈不管是否可持久化都能倍增弹栈 但普通单调栈本来 ...

  9. @Profile-根据不同环境注入bean

    介绍 @Profile元注解是在不同的生产环境中,@Bean创建的SpringBean根据spring.profiles.active指定的环境不同创建不同环境的bean对象 一.@Profile元注 ...

  10. pytorch之对预训练的bert进行剪枝

    大体过程 对层数进行剪枝 1.加载预训练的模型: 2.提取所需要层的权重,并对其进行重命名.比如我们想要第0层和第11层的权重,那么需要将第11层的权重保留下来并且重命名为第1层的名字: 3.更改模型 ...