springCloud(15):使用Zuul构建微服务网关-Header与文件上传和过滤器

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
简介:

一、Header

1.1、敏感header的设置

一般来说,可在同一个系统中的服务之间共享Header,不过应尽量防止让一些敏感的Header外泄。

1
2
3
4
zuul:
   routes:
     provide-user: 
      sensitive-headers: Cookie,Set-Cookie

说明:敏感的header不会传播到下游去,也就是说此处的Cookie,Set-Cookie不会传播的其它的微服务中去

1.2、忽略的Header

可以使用zuul.ignored-headers属性丢弃一些Header,如:

1
2
3
4
5
zuul:
   routes:
     provide-user: 
      sensitive-headers: Cookie,Set-Cookie
   ignored-headers: Authorization

说明:忽略的header不会传播到下游去,也就是说此处的Authorization不会传播的其它的微服务中去,作用与上面敏感的Header差不多事实上sensitive-headers会被添加到ignored-headers中。


注意:

 1、默认情况下zuul.ignored-headers是空的

 2、如果Spring Security在项目的classpath中,那么zuul.ignored-headers的默认值就是Pragma,Cache-Control,X-Frame-Options,X-Content-Type-Options,X-XSS-Protection,Expires,所以,当Spring Security在项目的classpath中,同时又需要使用下游微服务的Spring Security的Header时,可以将zuul.ignoreSecurity-Headers设置为false

二、使用Zuul上传文件

1、对于小文件(1M以内)上传,无须任何处理,即可正常上传。

2、对于大文件(10M以上)上传,需要为上传路径添加/zuul前缀。

注意:这里的上传路径添加/zuul前缀无须配置


zuul的配置:

1
2
3
zuul:
   routes:
     file-upload: /file/**


测试上传:上传文件200多M

  wKioL1mdJ8ODXYe_AACJcUHRmwQ578.png

zuul端抛出超时异常:

1
Caused by: com.netflix.hystrix.exception.HystrixRuntimeException: file-upload timed-out and  no  fallback available.

解决:在zuul的yml配置文件中加入如下配置:

1
2
3
4
hystrix.command. default .execution.isolation.thread.timeoutInMilliseconds: 60000
ribbon:
   ConnectTimeout: 3000
   ReadTimeout: 60000

再次测试上传:上传文件200多M   

 wKiom1mdLLfSebcyAABnqzPW_58519.png

三、过滤器

3.1、过滤器类型与请求生命周期

Zuul大部分功能都是通过过滤器来实现的。Zuul中定义了4种标准过滤器类型,这些过滤器类型对应于请求的典型生命周期。

PRE

 这种过滤器在请求被路由之前调用。可利用这种过滤实现身份验证、在集群中选择请求的微服务、记录调试信息等。

ROUTING

 这种过滤器将请求路由到微服务。这种过滤器用于构建发送给微服务的请求,并使用Apache HttpClient或Netfilx Ribbon请求微服务。

POST

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

ERROR

 在其它阶段发送错误时执行该过滤器。


Zuul请求的生命周期如图:

  wKiom1mdM13i3jJcAACmQj_aSBA350.png

3.2、自定义过滤器

Zuul还允许创建自定义的过滤器类型。继承抽象类ZuulFilter即可。

自定义过滤器需要实现以下方法:

 a、filterType:返回过滤器的类型。有pre、route、post、error等,分别对应着上面的过滤器,详细可以参考com.netflix.zuul.ZuulFilter.filterType() 中的注释。

 b、filterOrder:返回一个int值来指定过滤器执行的顺序,不同的过滤器允许返回相同的顺序。

 c、shouldFilter:返回一个boolean值来判断该过滤器是否要执行,true表示执行。

 d、run:过滤器的具体逻辑。


这里编写一个记录请求日志的过滤器。

1、新建一个类LogFilter继承抽象类ZuulFilter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package  com.liuy.filter;
 
import  javax.servlet.http.HttpServletRequest;
 
import  org.slf4j.Logger;
import  org.slf4j.LoggerFactory;
 
import  com.netflix.zuul.ZuulFilter;
import  com.netflix.zuul.context.RequestContext;
 
/**
  * 打印请求日志
  * 记录请求日志的过滤器
  * @description 记录请求日志的过滤器
  * @author luis
  * @version 1.0
  * @date:2017年8月23日下午3:58:55
  */
public  class  LogFilter  extends  ZuulFilter {
     private  static  final  Logger LOG = LoggerFactory.getLogger(LogFilter. class );
 
     @Override
     public  Object run() {
         RequestContext ctx = RequestContext.getCurrentContext();
         HttpServletRequest request = ctx.getRequest();
         LogFilter.LOG.info(String.format( "打印日志 : send %s request to %s" , request.getMethod(), request.getRequestURL().toString()));
         return  null ;
     }
 
     @Override
     public  boolean  shouldFilter() {
         return  true ;
     }
 
     @Override
     public  int  filterOrder() {
         return  1 ;
     }
 
     @Override
     public  String filterType() {
         return  "pre" ;
     }
}

2、修改启动类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package  com.liuy;
 
import  org.springframework.boot.SpringApplication;
import  org.springframework.boot.autoconfigure.SpringBootApplication;
import  org.springframework.cloud.netflix.zuul.EnableZuulProxy;
import  org.springframework.context.annotation.Bean;
 
import  com.liuy.filter.LogFilter;
 
/**
  * Zuul微服务网关 - 过滤器
  * @description Zuul微服务网关 - 过滤器
  * @author luis
  * @version 1.0
  * @date:2017年8月22日下午2:54:04
  */
@SpringBootApplication
@EnableZuulProxy
public  class  Application {
     public  static  void  main(String[] args) {
         SpringApplication.run(Application. class , args);
     }
     
     /**自定义过滤器*/
     @Bean
     public  LogFilter preRequestLogFilter() {
      return  new  LogFilter();
     }
}

3、测试

 a、依次启动eureka-server(4010)、provide-user(4011)、hystrix-consumer-movie(5012)、microservice-gateway-zuul-filter(5017)

 b、访问http://localhost:5017/hystrix-consumer-movie/user/1 

 效果:

  wKioL1meO4iRTgcsAABhrBNVfco050.jpg

3.3、禁用过滤器

Spring Cloud默认为Zuul编写了一些过滤器,如DebugFilter、FormBodyWrap-perFilter等,这些过滤器都放在spring-cloud-netflix-core这个jar包的org.springframework.cloud.netflix.zuul.filters包中。在某些场景下,我们可能需要禁用某些过滤器。


禁用方法非常简单,只需设置zuul.<SimpleClassName>.<filterType>.disable=true即可禁用SimpleClassName对应的过滤器。


以org.springframework.cloud.netflix.zuul.filters.pre.DebugFilter为例,如:

1
zuul.DebugFilter.post.disable=true

以前面我们自定义的com.liuy.filter.LogFilter为例,如:

1
zuul.LogFilter.pre.disable=true

本文转自我爱大金子博客51CTO博客,原文链接http://blog.51cto.com/1754966750/1958684如需转载请自行联系原作者

我爱大金子
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
1天前
|
人工智能 算法 网络安全
基于PAI+专属网关+私网连接:构建全链路Deepseek云上私有化部署与模型调用架构
本文介绍了阿里云通过PAI+专属网关+私网连接方案,帮助企业实现DeepSeek-R1模型的私有化部署。方案解决了算力成本高、资源紧张、部署复杂和数据安全等问题,支持全链路零公网暴露及全球低延迟算力网络,最终实现技术可控、成本优化与安全可靠的AI部署路径,满足企业全球化业务需求。
|
1月前
|
机器学习/深度学习 设计模式 API
Python 高级编程与实战:构建微服务架构
本文深入探讨了 Python 中的微服务架构,介绍了 Flask、FastAPI 和 Nameko 三个常用框架,并通过实战项目帮助读者掌握这些技术。每个框架都提供了构建微服务的示例代码,包括简单的 API 接口实现。通过学习本文,读者将能够使用 Python 构建高效、独立的微服务。
|
5月前
|
弹性计算 持续交付 API
构建高效后端服务:微服务架构的深度解析与实践
在当今快速发展的软件行业中,构建高效、可扩展且易于维护的后端服务是每个技术团队的追求。本文将深入探讨微服务架构的核心概念、设计原则及其在实际项目中的应用,通过具体案例分析,展示如何利用微服务架构解决传统单体应用面临的挑战,提升系统的灵活性和响应速度。我们将从微服务的拆分策略、通信机制、服务发现、配置管理、以及持续集成/持续部署(CI/CD)等方面进行全面剖析,旨在为读者提供一套实用的微服务实施指南。
|
4月前
|
负载均衡 Java 开发者
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
274 5
|
4月前
|
监控 安全 持续交付
构建高效微服务架构:策略与实践####
在数字化转型的浪潮中,微服务架构凭借其高度解耦、灵活扩展和易于维护的特点,成为现代企业应用开发的首选。本文深入探讨了构建高效微服务架构的关键策略与实战经验,从服务拆分的艺术到通信机制的选择,再到容器化部署与持续集成/持续部署(CI/CD)的实践,旨在为开发者提供一套全面的微服务设计与实现指南。通过具体案例分析,揭示如何避免常见陷阱,优化系统性能,确保系统的高可用性与可扩展性,助力企业在复杂多变的市场环境中保持竞争力。 ####
87 2
|
4月前
|
弹性计算 Kubernetes API
构建高效后端服务:微服务架构的深度剖析与实践####
本文深入探讨了微服务架构的核心理念、设计原则及实现策略,旨在为开发者提供一套系统化的方法论,助力其构建灵活、可扩展且易于维护的后端服务体系。通过案例分析与实战经验分享,揭示了微服务在提升开发效率、优化资源利用及增强系统稳定性方面的关键作用。文章首先概述了微服务架构的基本概念,随后详细阐述了其在后端开发中的应用优势与面临的挑战,最后结合具体实例,展示了如何从零开始规划并实施一个基于微服务的后端项目。 ####
|
5月前
|
消息中间件 监控 安全
构建高效微服务架构:最佳实践与挑战
在现代软件开发中,微服务架构因其高度的可扩展性、灵活性和敏捷性而受到青睐。本文深入探讨了构建高效微服务架构的关键策略,包括服务的划分、通信机制、数据管理、部署与监控等方面的最佳实践。同时,文章也分析了在实施过程中可能遇到的挑战,如服务间的依赖管理、数据一致性问题、安全考量及性能优化等,并提出了相应的解决方案。通过实际案例分析,本文旨在为开发者提供一套实用的指南,帮助他们在构建微服务系统时能够有效规避风险,提升系统的健壮性和用户体验。
|
2月前
|
人工智能 SpringCloudAlibaba 自然语言处理
SpringCloud Alibaba AI整合DeepSeek落地AI项目实战
在现代软件开发领域,微服务架构因其灵活性、可扩展性和模块化特性而受到广泛欢迎。微服务架构通过将大型应用程序拆分为多个小型、独立的服务,每个服务运行在其独立的进程中,服务与服务间通过轻量级通信机制(通常是HTTP API)进行通信。这种架构模式有助于提升系统的可维护性、可扩展性和开发效率。
556 1
|
29天前
|
负载均衡 Dubbo Java
Spring Cloud Alibaba与Spring Cloud区别和联系?
Spring Cloud Alibaba与Spring Cloud区别和联系?
|
7月前
|
SpringCloudAlibaba API 开发者
新版-SpringCloud+SpringCloud Alibaba
新版-SpringCloud+SpringCloud Alibaba