Zuul 是什么
微服务场景下, 每一个微服务对外暴露了一组细粒度的服务. 客户端的请求可能会涉及到一串的服务调用, 如果将这些微服务都暴露给客户端, 那么会增加客户端代码的复杂度. 愿意了解源码的朋友直接求求交流分享技术: 二一四七七七五六三三
参考 GOF 设计模式中的 Facade 模式, 将细粒度的服务组合起来提供一个粗粒度的服务, 所有请求都导入一个统一的入口, 那么整个服务只需要暴露一个 API, 对外屏蔽了服务端的实现细节, 也减少了客户端与服务器的网络调用次数. 这就是 API gateway.
有了 API gateway 之后, 一些与业务关系并不大的通用处理逻辑可以从 API gateway 中剥离出来, API gateway 仅仅负责服务的编排与结果的组装.
Spring Cloud Netflix 的 Zuul 组件可以做反向代理的功能, 通过路由寻址将请求转发到后端的粗粒度服务上, 并做一些通用的逻辑处理.
2.Zuul 能做什么
Zuul 可以通过加载动态过滤机制, 从而实现以下各项功能:
验证与安全保障: 识别面向各类资源的验证要求并拒绝那些与要求不符的请求.
审查与监控: 在边缘位置追踪有意义数据及统计结果, 从而为我们带来准确的生产状态结论.
动态路由: 以动态方式根据需要将请求路由至不同后端集群处.
压力测试: 逐渐增加指向集群的负载流量, 从而计算性能水平.
负载分配: 为每一种负载类型分配对应容量, 并弃用超出限定值的请求.
静态响应处理: 在边缘位置直接建立部分响应, 从而避免其流入内部集群.
多区域弹性: 跨越 AWS 区域进行请求路由, 旨在实现 ELB 使用多样化并保证边缘位置与使用者尽可能接近.
3.Zuul 的核心
Filter 是 Zuul 的核心, 用来实现对外服务的控制. Filter 的生命周期有 4 个, 分别是 "PRE","ROUTING","POST","ERROR", 整个生命周期可以用下图来表示.
Zuul 大部分功能都是通过过滤器来实现的, 这些过滤器类型对应于请求的典型生命周期.
PRE:? 这种过滤器在请求被路由之前调用. 我们可利用这种过滤器实现身份验证, 在集群中选择请求的微服务, 记录调试信息等.
ROUTING: 这种过滤器将请求路由到微服务. 这种过滤器用于构建发送给微服务的请求, 并使用 Apache HttpClient 或 Netfilx Ribbon 请求微服务.
POST: 这种过滤器在路由到微服务以后执行. 这种过滤器可用来为响应添加标准的 HTTP Header, 收集统计信息和指标, 将响应从微服务发送给客户端等.
ERROR: 在其他阶段发生错误时执行该过滤器. 除了默认的过滤器类型, Zuul 还允许我们创建自定义的过滤器类型. 例如, 我们可以定制一种 STATIC 类型的过滤器, 直接在 Zuul 中生成响应, 而不将请求转发到后端的微服务.
Zuul 中默认实现的 Filter
4. 怎么使用 Zuul
Spring Cloud Zuul 路由是微服务架构的不可或缺的一部分, 提供动态路由, 监控, 弹性, 安全等的边缘服务. Zuul 是 Netflix 出品的一个基于 JVM 路由和服务端的负载均衡器.
下面我们通过代码来了解 Zuul 是如何工作的
1. 简单使用
1, 添加依赖
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-zuul</artifactId>
- </dependency>
引入 spring-cloud-starter-zuul 包
2, 配置文件
- spring.application.name=gateway-service-zuul
- server.port=8888
- # 这里的配置表示, 访问 / it/** 直接重定向到 http://www.ityouknow.com/**
- zuul.routes.baidu.path=/it/**
- zuul.routes.baidu.url=http://www.ityouknow.com/
- ?
3, 启动类
- @SpringBootApplication
- @EnableZuulProxy
- public class GatewayServiceZuulApplication {
- ?
- ?? ?public static void main(String[] args) {
- ?? ??? ?SpringApplication.run(GatewayServiceZuulApplication.class, args);
- ?? ?
- }
- }
启动类添加 @EnableZuulProxy, 支持网关路由.
史上最简单的 zuul 案例就配置完了.
整体代码结构如下:
来源: http://www.bubuko.com/infodetail-2871489.html