Spring Cloud入门-Zuul服务网关(Hoxton版本)
春雪云Zuul是春雪云Netflix一个重要的组成部分,在微服务架构中被采用作为API网关,在具备动态路由和过滤功能的基础上本文将对其应用方式进行详细阐述。
春雪云Zuul是春雪云Netflix一个重要的组成部分,在微服务架构中被采用作为API网关,在具备动态路由和过滤功能的基础上本文将对其应用方式进行详细阐述。
作为微服务架构中的关键组件,在提供统一入口方面发挥着重要作用。API网关不仅整合了各子系统间的接口交互流程,并且在实际应用中被广泛采用作为一种集中管理的方式。其功能定位与设计模式中的门面模式相仿,在实际应用中往往将API网关视为整个系统的核心枢纽。在这种架构下,默认情况下所有客户端的所有请求都会经过该网关进行路径规划和权限控制。该系统实现了多重功能集成:包括按需路由分配资源、实现负载均衡以提高系统稳定性、执行权限验证以防止非法操作以及提供容错机制和功能聚合以增强整体可靠性。
这里我们创建一个zuul-proxy模块来演示zuul的常用功能。
在pom.xml中添加相关依赖
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
org.springframework.cloud
spring-cloud-starter-netflix-zuul
在application.yml中进行配置
server:
port: 8801
spring:
application:
name: zuul-proxy
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://localhost:8001/eureka/
在启动类上添加@EnableZuulProxy注解来启用Zuul的API网关功能
@EnableZuulProxy
@EnableDiscoveryClient
@SpringBootApplication
public class ZuulProxyApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulProxyApplication.class, args);
}
}
启动相关服务
在本例中我们采用启动Eureka服务器以及两台User-Service实例、feign\text{-}service服务和Zuul代理来演示Zuul的一般操作流程。运行之后注册中心将显示如下内容:

配置路由规则
经过对application.yml中的相关配置进行调整和设置, 我们可以实现对不同路径下的网络流量进行精确的业务分发. 具体来说, 在此场景下, 所有经过(/userService/**)请求流量将被分配至对应的user-service服务. 同样地, 在此情况下, 所有经过(/feignService/**)请求流量将被分配至对应的feign-service服务.
zuul:
routes:
给服务配置路由
user-service:
path: /userService/**
feign-service:
path: /feignService/**
访问该链接[http://localhost:8801/userService/user/1]可知,请求路径被路由至user-service处;
通过网络浏览器访问[http://localhost:81/feignService/user/1]可以看到请求被路由到了feign-service上。
默认路由规则
通过结合应用Zuul与Eureka技术方案,在实现对网络中路由的自动化配置时,在某种程度上等同于按照服务名称设置相关参数。
默认路由规则
zuul:
routes:
给服务配置路由
user-service:
path: /user-service/**
feign-service:
path: /feign-service/**
可以通过输入该链接地址进入该服务
通过访问[http://localhost:8801/feign-service/user/1]同样会被路由至feign-service上
如果不想使用默认的路由规则,可以添加以下配置来忽略默认路由配置:
zuul:
#关闭默认路由配置
ignored-services: user-service,feign-service
负载均衡功能
为了验证该HTTP请求的行为模式, 我们采用反复发送http://localhost:8801/user-service/user/1的方式作为测试手段, 并经观察得知, 在这两个服务同时运行时(即8201和8202服务器端), 它们会交替输出显示特定的数据记录.
2019-12-27 21:31:33.240 INFO 13164 — [nio-8202-exec-1] c.j.s.controller.UserController:通过用户ID获取相关信息,并确定用户名为:jourwon
日期 信息记录器版本号:日志级别为c类j子类s父类 controller UserController的进程id为13164条目记录了通过指定id查询用户资料的过程,并显示用户名为:jourwon
配置访问前缀
按照配置说明对网关路径进行前缀设置操作后,在实际应用中发现系统已成功新增了/proxy前缀配置项;因此,在目标接口地址中需将原有地址中的端口号参数替换为新的值即可实现相应的功能连接需求。
zuul:
#给网关路由添加前缀
prefix: /proxy
Header过滤及重定向添加Host
Zuul在请求路由时,默认会去除一些敏感的头信息;以下配置可防止路由时Cookie及Authorization丢失
zuul:
#配置过滤敏感的请求头信息,设置为空就不会过滤
sensitive-headers: Cookie,Set-Cookie,Authorization
Zuul在请求路由时,不会设置最初的host头信息,以下配置可以解决:
zuul:
#设置为true重定向是会添加host请求头
add-host-header: true
查看路由信息
我们可以通过SpringBoot Actuator来查看Zuul中的路由信息。
在pom.xml中添加相关依赖:
org.springframework.boot
spring-boot-starter-actuator
修改application.yaml配置文件,开启查看路由的端点:
management:
endpoints:
web:
exposure:
include: ‘routes’
通过访问http://localhost:8801/actuator/routes查看简单路由信息:

通过访问http://localhost:8801/actuator/routes/details查看详细路由信息:

路由转发与过滤校验构成了Zuul系统的核心两大功能
其中路由转发机制负责将外部网络中的 request 定向至内部服务实例
构成了统一入口节点的基础作用
而过滤处理模块则承担着对所有 incoming request 进行额外处理的任务
为其提供了基础性的 request 校验和聚合能力
过滤器类型
Zuul中有以下几种典型的过滤器类型。
pre:在请求被路由到目标服务前执行,比如权限校验、打印日志等功能;
当请求被路由至目标服务时执行的任务位于使用Apache HttpClient或Netflix Ribbon构建并提交原始HTTP请求的地方
当请求被转发至目标服务时完成相应的操作。例如,在目标服务的响应中设置特定的头信息以及对服务器访问数据进行统计。
error:请求在其他阶段发生错误时执行。
过滤器的生命周期
下图详细展示了HTTP请求如何抵达API网关之后,并在其各类不同类型的过滤器中传递的过程

自定义过滤器
接下来我们自定义一个过滤器来演示下过滤器的作用。
添加PreLogFilter类继承ZuulFilter
这是一个前置过滤器,用于在请求路由到目标服务前打印请求日志。
@Component
public class PreLogFilter extends ZuulFilter {
在预处理器过滤器类中定义了一个静态最终化的 LogManager实例变量LOGGER,并将其初始化为由预处理器过滤器类的日志管理器获取日志。
/**
- 过滤器类型,有pre、routing、post、error四种。
*/
@Override
public String filterType() {
return “pre”;
}
/**
- 过滤器执行顺序,数值越小优先级越高。
*/
@Override
public int filterOrder() {
return 0;
}
/**
- 是否进行过滤,返回true会执行过滤。
*/
@Override
public boolean shouldFilter() {
return true;
}
/**
- 自定义的过滤器逻辑,当shouldFilter()返回true时会执行。
*/
@Override
public Object run() throws ZuulException {
RequestContext currentContext = RequestContext.getCurrentContext();
HttpServletRequest request = currentContext.getRequest();
String remoteHost = request.getRemoteHost();
String method = request.getMethod();
String requestURI = request.getRequestURI();
LOGGER.info(“Remote host:{},method:{},uri:{}”, remoteHost, method, requestURI);
return null;
}
}
过滤器功能演示
在部署过滤器后, 我们登录[http://localhost:8801/user-service/user/1]并运行该功能进行测试操作时, 则会输出如下日志记录
记录时间为2019年12月27日21时45分43秒;I型;日志条目由类名c.j.springcloud.filter.PreLogFilter生成;该条目记录了以下详细信息:远程主机IP地址为[...];请求方法为GET;目标路径为/proxy/user-service/user/1
记录时间为2019年12月27日21时45分43秒;I型;该条目由类名c.j.springcloud.filter.PreLogFilter生成;详细信息包括以下内容:远程主机IP地址为[...];请求方法为GET;目标路径为/proxy/user-service/user/1
核心过滤器
|过滤器名称|过滤类型|优先级|过滤器的作用|
|:--|:--|:--|:--|
|ServletContextFilter|pre|-3|识别当前请求是由DispatcherServlet负责处理还是ZuulServlet来处理。
|Servlet30WrapperFilter|pre|-2|对原始的HttpServletRequest进行包装。|
该类负责将所有Content-Type为application/x-www-form-urlencoded以及multipart/form-data格式的请求封装为FormBodyRequestWrapper对象。
基于zuul.debug.request的设置来配置是否输出调试日志。
|PreDecorationFilter|route|5|对当前请求进行预处理以便执行后续操作。|
RibbonRoutingFilter|route|10|利用Ribbon和Hystrix向服务实例发送路由请求,并将请求结果返回给调用方。
SimpleHostRoutingFilter|route|100|
该过滤器配置项设置为100时会自动启用此功能。
仅当请求上下文中包含(route) routeHost参数时会触发此操作。
流量将被发送至与(route) routeHost对应的实际服务器
SendForwardFilter|route|500仅当请求上下文中包含forward.to参数时会执行本地跳转。
当其他过滤器内部出现异常时, 由它来处理, 产生错误响应行为.
ResponseContextMiddleware|POST request type|threshold value 1000|基于当前请求背景收集响应数据,并通过分析成功响应数据构建组织结构以实现高效的业务流程管理。
禁用过滤器
我们可以对过滤器进行禁用的配置,配置格式如下:
zuul:
自我介绍一下,个人13年毕业于上海交通大学。此前曾在初创公司工作过一段时间,并曾访问过华为、OPPO等知名科技公司。自2018年起便加入阿里巴巴集团,并持续至今。
许多Java工程师普遍发现,在追求技能提升的过程中,默认选择自主学习或者参加培训课程。然而高昂的价格往往让人感到压力重重。个人缺乏系统性学习导致效率低下且耗时漫长,并且容易陷入技术瓶颈难以突破!
经过精心整理, 我收集并整理了一份《2024年Java开发全套学习资料》, 其初衷也很单纯, 就是为了帮助那些想通过自学提升技能却感到迷茫的朋友, 同时也希望能减轻大家学习上的负担



针对初学者提供的入门级学习材料与系统性地构建了一个全面的知识体系
因为文件较大,仅对部分目录进行了截图展示。每个节点内部均包含了大厂面经,学习笔记等资料。此外,这些资源也会持续进行更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

总结:绘上一张Kakfa架构思维大纲脑图(xmind)

实际上关于Kafka的问题实在太多了。花了一段时间仔细研究后筛选出了共44个关键问题,在分类上分为三个层次:基础类问题涉及核心概念和基本操作共17个;进阶类问题聚焦于数据处理的常见场景共有15个;而高级类问题则深入探讨了系统优化与性能调优的难点区域共有12个。这些问题几乎每个都直击数据处理的核心痛点。那么你知道吗?如果你不急于寻求答案的话,在这些经典案例中你能找到多少启发性的解决方案呢?
如果对Kafka的知识遗忘较多,不妨先查看我的手绘知识总结思维导图(Xmind无法直接上传至文章中,而是采用图片版的形式)来辅助理解其核心框架。
温习了相关知识后完成面试复习,在此基础上如果还想进一步深入学习并解析Kafka的核心原理以及熟悉其源代码结构,则这份《手把手教学Kafka》的课程是一个值得推荐的选择。
Kafka入门
为什么选择Kafka
Kafka的安装、管理和配置
Kafka的集群
第一个Kafka程序
Kafka的生产者
Kafka的消费者
深入理解Kafka
可靠的数据传递
Spring和Kafka的整合
SpringBoot和Kafka的整合
Kafka实战之削峰填谷
数据管道和流式处理(了解即可)


《互联网大厂面试真题解析与进阶开发核心学习笔记》《全套讲解视频》《实战项目源码讲义》点击传送门即可获取!
如果对Kafka的知识还有所遗忘,则建议先参考我手绘的知识总结脑图(目前无法上传至文章中;采用图片格式展示)完成知识体系的整体构建。
梳理并巩固了相关知识;完成面试复习工作;如有兴趣继续深入研究解读kafka和其源代码,则这份《手写Kafka:从原理到实现》将是深入学习的理想选择。
Kafka入门
为什么选择Kafka
Kafka的安装、管理和配置
Kafka的集群
第一个Kafka程序
Kafka的生产者
Kafka的消费者
深入理解Kafka
可靠的数据传递
Spring和Kafka的整合
SpringBoot和Kafka的整合
Kafka实战之削峰填谷
数据管道和流式处理(了解即可)
[外链图片转存中…(img-o4m8xcre-1713394388152)]
[外链图片转存中…(img-y6std7Qw-1713394388152)]
《IT巨头公司核心面试题解析、系统化进阶开发知识体系、完整讲解视频课程、实际项目配套教学材料》点击下方传送门即可访问
《IT巨头公司核心面试题解析、系统化进阶开发知识体系、完整讲解视频课程、实际项目配套教学材料》点击下方传送门即可访问
