滚雪球学SpringCloud[4.2讲]: Zuul:Netflix API Gateway详解

news/2024/9/20 4:15:33/ 标签: spring cloud, gateway, spring

全文目录:

    • 前言
    • 4.2 Zuul:Netflix API Gateway
      • Zuul的基础配置与使用
        • 引入Zuul依赖
        • 启用Zuul
        • 配置路由规则
      • Zuul的过滤器机制
        • 编写自定义过滤器
      • 与Spring Security的集成
        • 配置Spring Security
        • 结合Zuul过滤器进行认证
      • 实例案例:使用Zuul保护微服务
    • 预告

前言

在上一篇文章中,我们深入探讨了Spring Cloud Gateway作为现代化API网关的配置与使用。我们了解了API Gateway在微服务架构中的重要作用,探讨了如何通过Spring Cloud Gateway进行路由管理和过滤器配置,以实现高性能的服务管理。Spring Cloud Gateway凭借其响应式编程模型和与Spring生态的无缝集成,成为了现代微服务架构中的理想选择。

然而,在Spring Cloud Gateway出现之前,Zuul作为Netflix开源的API Gateway组件,在微服务架构中得到了广泛应用。Zuul为请求路由和过滤提供了强大的功能,使得开发者能够灵活地管理服务流量和安全。在本篇文章中,我们将深入探讨Zuul的基础配置与使用,讲解Zuul的过滤器机制,并展示如何将Zuul与Spring Security集成,以构建一个安全的API网关。

4.2 Zuul:Netflix API Gateway

Zuul的基础配置与使用

Zuul是由Netflix开源的API网关解决方案,设计初衷是为大型分布式系统提供请求路由、负载均衡、安全和过滤等功能。在微服务架构中,Zuul可以作为所有请求的入口,帮助开发者在客户端与微服务之间创建一层抽象,以实现服务治理和安全控制。

引入Zuul依赖

要在Spring Boot项目中使用Zuul,首先需要在项目的pom.xml中引入Zuul的依赖:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
启用Zuul

在Spring Boot应用的主类上添加@EnableZuulProxy注解,以启用Zuul代理功能:

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

通过这个注解,Zuul将自动配置并开启代理功能,使得所有通过Zuul的请求都会被转发到相应的服务。

配置路由规则

Zuul的核心功能是路由,它能够将客户端请求根据配置转发到不同的微服务。我们可以通过application.yml文件配置Zuul的路由规则:

zuul:routes:product-service:path: /api/v1/products/**serviceId: product-serviceorder-service:path: /api/v1/orders/**serviceId: order-serviceuser-service:path: /api/v1/users/**serviceId: user-service
  • path:匹配客户端请求路径的规则。
  • serviceId:目标服务的名称,Zuul会根据这个名称在服务发现组件(如Eureka)中查找服务实例,并将请求转发过去。

配置完成后,Zuul会根据请求路径,将请求路由到相应的微服务。例如,当客户端请求/api/v1/products/时,Zuul会将其转发到product-service服务。

Zuul的过滤器机制

Zuul不仅可以进行请求路由,还提供了强大的过滤器机制,允许开发者在请求的各个生命周期阶段执行特定的逻辑。Zuul的过滤器分为以下几种类型:

  1. Pre Filters:在请求被路由之前执行,用于请求验证、鉴权、记录日志等。
  2. Route Filters:在请求被路由时执行,用于自定义路由逻辑或动态选择目标服务。
  3. Post Filters:在请求路由之后执行,用于处理响应数据、添加响应头、记录响应日志等。
  4. Error Filters:在请求处理过程中发生错误时执行,用于捕获和处理异常。
编写自定义过滤器

开发者可以通过继承ZuulFilter类来编写自定义过滤器,并指定过滤器的类型和执行逻辑。以下是一个简单的Pre Filter示例,用于在请求被路由之前添加一个自定义的请求头:

@Component
public class CustomPreFilter extends ZuulFilter {@Overridepublic String filterType() {return "pre";}@Overridepublic int filterOrder() {return 1;}@Overridepublic boolean shouldFilter() {return true;}@Overridepublic Object run() throws ZuulException {RequestContext ctx = RequestContext.getCurrentContext();HttpServletRequest request = ctx.getRequest();ctx.addZuulRequestHeader("X-Request-Source", "ZuulFilter");return null;}
}

在这个示例中,我们创建了一个Pre Filter,它会在请求被路由之前执行,并为请求添加一个X-Request-Source头。开发者可以根据业务需求编写不同类型的过滤器,实现请求验证、限流、日志记录等功能。

与Spring Security的集成

在实际的生产环境中,API网关通常需要集成身份验证和授权机制,以确保只有合法的请求能够通过网关访问内部服务。Zuul可以通过与Spring Security集成,提供强大的安全控制功能。

配置Spring Security

首先,在Spring Boot项目中引入Spring Security依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency>

然后,编写一个简单的Spring Security配置类,启用基本的HTTP Basic认证:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.csrf().disable().authorizeRequests().antMatchers("/api/v1/users/**").authenticated().anyRequest().permitAll().and().httpBasic();}
}

在这个配置中,我们启用了HTTP Basic认证,并对/api/v1/users/**路径下的所有请求进行身份验证。未通过认证的请求将被拒绝。

结合Zuul过滤器进行认证

我们还可以通过Zuul的过滤器机制,将Spring Security与Zuul的请求处理流程进行更深度的集成。例如,我们可以编写一个Pre Filter,在请求被路由之前检查用户的身份:

@Component
public class AuthFilter extends ZuulFilter {@Overridepublic String filterType() {return "pre";}@Overridepublic int filterOrder() {return 2;}@Overridepublic boolean shouldFilter() {return true;}@Overridepublic Object run() throws ZuulException {RequestContext ctx = RequestContext.getCurrentContext();HttpServletRequest request = ctx.getRequest();Authentication authentication = SecurityContextHolder.getContext().getAuthentication();if (authentication == null || !authentication.isAuthenticated()) {ctx.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());ctx.setResponseBody("Unauthorized");ctx.setSendZuulResponse(false);}return null;}
}

在这个过滤器中,我们检查了Spring Security上下文中的认证信息,如果用户未认证,我们将请求拒绝并返回401 Unauthorized状态码。通过这种方式,我们可以在Zuul中实现更细粒度的安全控制。

实例案例:使用Zuul保护微服务

假设我们有一个包含多个微服务的在线教育平台,其中包括课程服务(course-service)、用户服务(user-service)和订单服务(order-service)。我们希望通过Zuul来统一管理这些服务的请求路由,并为用户服务启用安全认证。

  1. 配置路由:在Zuul中配置各个服务的路由规则:

    zuul:routes:course-service:path: /api/v1/courses/**serviceId: course-serviceuser-service:path: /api/v1/users/**serviceId: user-serviceorder-service:path: /api/v1/orders/**serviceId: order-service
    
  2. 启用安全认证:通过Spring Security配置为用户服务启用HTTP Basic认证,并确保未认证用户无法访问用户服务的API。

  3. 自定义过滤器:编写自定义过滤器,在请求被路由之前检查用户身份,确保只有合法用户能够访问用户服务。

通过这些配置,Zuul不仅可以有效地管理请求路由,还能为关键服务提供安全保护,确保系统的稳定性和安全性。

预告

在本期内容中,我们详细介绍了Zuul的基础配置与使用,讲解了Zuul的过滤器机制,并展示了如何将Zuul与Spring Security集成,以实现API网关的安全控制。通过实例案例,我们理解了如何在实际项目中应用Zuul来保护和管理微服务。

然而,随着微服务架构的不断发展,性能优化和监控成为了API网关的重要任务。下一期内容中,我们将深入探讨**服务网关的性能优化与监控,介绍如何通过配置和工具提升网关的性能,并实时监控其运行状态。敬请期待!


http://www.ppmy.cn/news/1527885.html

相关文章

【软考】数据字典(DD)

目录 1. 说明2. 数据字典的内容2.1 说明2.2 数据流条目2.3 数据存储条目2.4 数据项条目2.5 基本加工条目 3. 数据词典管理4. 加工逻辑的描述4.1 说明4.2 结构化语言4.3 判定表4.3 判定树 5. 例题5.1 例题1 1. 说明 1.数据流图描述了系统的分解&#xff0c;但没有对图中各成分进…

七种d3dcompiler_47.dll缺失怎么修复的方法,教你轻松解决d3dcompiler_47.dll缺失!

d3dcompiler_47.dll是 DirectX 的一部分&#xff0c;用于编译 Direct3D 着色器。如果这个文件缺失或损坏&#xff0c;可能会导致某些游戏或应用程序无法正常运行。以下是七种修复d3dcompiler_47.dll缺失问题的方法&#xff0c;教你轻松解决d3dcompiler_47.dll缺失&#xff01; …

BARTBERT

BART和BERT都是基于Transformer架构的预训练语言模型。 模型架构&#xff1a; BERT (Bidirectional Encoder Representations from Transformers) 主要是一个编码器&#xff08;Encoder&#xff09;模型&#xff0c;它使用了Transformer的编码器部分来处理输入的文本&#xff0…

Kotlin cancel CoroutineScope.launch的任务后仍运行

Kotlin cancel CoroutineScope.launch的任务后仍运行 import kotlinx.coroutines.*fun main() {runBlocking {val coroutineScope CoroutineScope(Dispatchers.IO)val job coroutineScope.launch {var i 0while (i < Int.MAX_VALUE) {iprintln(i)}}// 2ms 取消协程delay(…

利士策分享,赚钱与体重:一场关于生活平衡的微妙探索

利士策分享&#xff0c;赚钱与体重&#xff1a;一场关于生活平衡的微妙探索 在当今社会&#xff0c;赚钱与体重&#xff0c;这两个看似风马牛不相及的概念&#xff0c; 却在无形中交织着人们的生活轨迹。 它们不仅仅是数字上的增减&#xff0c;更是个人选择、生活方式乃至心理…

docker容器中的内存占用高的问题分析

文章目录 问题描述原因分析分析1分析2验证猜想 结论和经验 问题描述 运维新增对某服务的监控后发现&#xff1a;内存不断上涨的现象。进一步确认&#xff0c;是因为有多个导出日志操作导致的内存上涨问题。 进一步的测试得出的结果是&#xff1a;容器刚启动是占用内存约为50M…

智能负载均衡:分布式缓存的高效能解决方案

在当今快速发展的互联网时代&#xff0c;分布式缓存成为了提升网站性能和用户体验的关键技术。本文将深入探讨负载均衡算法在分布式缓存中的应用&#xff0c;分析各种算法的优缺点&#xff0c;并提供选择最佳算法的指导。通过实际案例&#xff0c;我们将展示如何通过智能的负载…

用Kimi输出流程图

1.输入 我希望设计一个ERP系统&#xff0c;请帮我简单列一个流程图&#xff0c;用mermaid输出2.输出

MySQL高级功能-窗口函数

背景 最近遇到需求&#xff0c;需要对数据进行分组排序并获取每组数据的前三名。 一般涉及到分组&#xff0c;第一时间就是想到使用group by对数据进行分组&#xff0c;但这样分组&#xff0c;到最后其实只能获取到每组数据中的一条记录。 在需要获取每组里面的多条记录的时候…

【笔记】枚举

文章目录 枚举的概念枚举步骤例题&#xff1a;百鸡百钱方案1方案二方案三 例题 枚举的概念 枚举&#xff1a;逐个尝试所有可能的方案。 先把问题划分成一系列离散的状态&#xff0c;然后遍历这些状态来求解问题。 比如求3x5y10的正整数解有多少&#xff0c;把x∈[0&#xff…

傅里叶变换的基本性质和有关定理

一、傅里叶变换的基本性质 1.1 线性性质 若 则 其中:a,b是常数 函数线性组合的傅里叶变换等于歌函数傅里叶变换的相应组合。 1.2 对称性 若 则 关于傅里叶变换的对称性还有 虚、实、奇、偶函数的傅里叶变换性质: 1.3 迭次傅里叶变换 对f(x,y)连续两次做二维傅里叶变换…

【笔记篇】Davinci Configurator TcpIp模块

目录 1 简介1.1 架构概览2 功能描述2.1 特性2.2 TCP/IP协议栈2.2.1 IPv62.2.2 IPv42.3 初始化2.3 状态机2.4 主函数2.5 故障处理3 集成3.1 静态文件3.2 动态文件4 API描述5 配置5.1 Socket 拥有者配置5.1.1 `<Up>_CopyTxData` callback5.2 单播地址分配方法5.2.1 IPv4 单…

【GeekBand】C++设计模式笔记1_介绍

1. 课程目标 理解松耦合设计思想掌握面向对象设计原则掌握重构技法改善设计掌握GOF核心设计模式 2. 什么是设计模式 目标&#xff1a;复用&#xff0c;以不变应万变 3. GOF设计模式 4. 从面向对象谈起 5. 深入理解面向对象 向下&#xff1a;深入理解三大面向对象机制 封装&…

Gitlab学习(009 gitlab冲突提交)

尚硅谷2024最新Git企业实战教程&#xff0c;全方位学习git与gitlab 总时长 5:42:00 共40P 此文章包含第30p-第p34的内容 文章目录 冲突提交不同人修改不同文件不同人修改同文件的不同区域不同人修改同文件的相同区域 同时变更文件名和文件内容gitLab功能拓展code review代码复…

Vue3: setup语法糖

一. setup语法糖 在 Vue 3 中&#xff0c;setup 语法糖是一种简化组件内部状态和方法管理的特性。它允许你将组件的逻辑直接编写在组件的定义中&#xff0c;而不是像 Vue 2 那样需要在 methods 和 data 属性中管理。setup 语法糖基于 ES6 的类的静态方法&#xff0c;允许你更灵…

HttpMediaTypeNotAcceptableException: No acceptable representation问题解决方法

Background org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation HttpMediaTypeNotAcceptableException: No acceptable representation 异常通常发生在Web应用程序中&#xff0c;客户端请求了一个资源&#xff0c;但是…

【Elasticsearch系列七】索引 crud

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Redisson 分布式锁的使用详解

一、分布式锁的概述 1.1 分布式锁的背景 在单机系统中&#xff0c;Java 提供了 synchronized 和 Lock 等锁机制来确保并发情况下的线程安全。然而&#xff0c;在分布式系统中&#xff0c;多个服务实例运行在不同的物理或虚拟机上&#xff0c;无法直接使用这些本地的锁机制来控…

Activiti7《第二式:破剑式》——工作流中的以柔克刚

冲冲冲&#xff01;开干 这篇文章将分为九个篇章&#xff0c;带你逐步掌握工作流的核心知识。这篇文章将带你深入探讨工作流中的 “破剑式”&#xff0c;揭示如何通过 柔与刚 的结合来破解工作流的复杂性。本篇包含了 Activiti7 环境的进一步优化和表结构的深入分析&#xff0…

【读书笔记-《30天自制操作系统》-22】Day23

本篇内容比较简单&#xff0c;集中于显示问题。首先编写了应用程序使用的api_malloc&#xff0c;然后实现了在窗口中画点与画线的API与应用程序。有了窗口显示&#xff0c;还要实现关闭窗口的功能&#xff0c;于是在键盘输入API的基础上实现了按下按键关闭窗口。最后发现用上文…