我们知道我们前台要展示数据给用户看,这中间可能涉及到从后端的多个微服务进行获取数据。比如获取用户信息需要用到用户微服务、获取商品信息需要获取商品微服务、创建订单需要调用订单微服务,而各个微服务可能分布在各个机器上,前端要获取到数据就必须要知道各个微服务的地址,这给前端增加开发的复杂性。一段后端的某个微服务地址改变了,前端可能还要修改。而且后端各个微服务权限认证也不好认证,那么有没有一种好的解决办法呢?服务网关就正好可以解决这个问题,在 spring cloud 中使用的就是zuul来实现服务网关。我们来看一下有了服务网关后,前端程序调用后端服务。
由上可知,当存在服务网关,前端程序通过服务网关调用后台服务,同时我们也可以在网关层进行各种操作,比如限流、权限校验等。
实现功能
1、查看 zuul 中配置好的路由和过滤器信息
2、忽略所有微服务或某些微服务
3、忽略所有为服务,只路由指定的微服务
4、通过path和url访问到具体的某台机器上
5、脱离eureka进行访问,并使之具有负载均衡和隔离的机制等
6、转发前是否去掉路由前缀
7、为所有路由都增加一个通过的前缀
8、忽略某些路径不进行路由
9、敏感头的传递(比如Cookie等)全局设置和某个微服务设置
10、忽略头
11、spring security 在classpath 下会忽略的头
12、本地调换和路由的优先级
13、配置网关超时
14、重写 Location 头
15、文件上传处理
代码结构
eureka-server |- 服务注册中心 zuul product-provider-8202 product-provider-8203 |- 服务提供者 product-consumer-8201 |- 服务消费者 product-gateway-8204 |- 网关程序,演示网关路由的各种配置
代码编写
一、服务提供者、服务消费者、注册中心,没有什么需要特别注意的,略。
二、服务网关的编写
1、创建网关工程
2、引入 zuul 的依赖
3、启动类上增加 @EnableZuulProxy 注解
4、yml 文件上注册到 eureka 上
三、eureka服务启动界面
功能实现
1、查看 zuul 中配置好的路由和过滤器信息
当我们启动了zuul 的网关之后,想知道当前zuul代理了那些路由,访问的路径又是那些或者我们自己写了一个zuul的filter,想知道它当前位于zuul的filter的那个位置时,该如何查询。
访问路径: http://网关地址:端口/routes 访问路由的简单信息
http://网关地址:端口/routes?format=details 访问路由的详细信息
http://网关地址:端口/filters 访问zuul中使用了那些过滤器。
yml文件配置:
management: security: enabled: false # 默认值是 true, 为true的话那么页面上可能会报没有权限访问
不进行配置,访问上面的2个端点会报没有权限访问。
2、忽略所有微服务或某些微服务
默认情况下,只要引入了zuul后,就会自动一个默认的路由配置,但有些时候我们可能不想要默认的路由配置规则,想自己进行定义
忽略所有微服务:(后面写 * )
zuul: ignored-services: "*"
忽略某些微服务:(直接写微服务的名字=>可以理解为spring.application.name的值,多个以都好分隔)
zuul: ignored-services: product-provider,product-consumer-8201
3、忽略所有为服务,只路由指定的微服务
访问: http://gatewayhost:port/product/selectOne ===> 转发到 product-provider上的selectOne
四、通过path和url访问到具体的某台机器上
有时候我们测试的时候需要访问到具体的某台机器上,而不希望负载均衡到别的机器上或者需要访问到第三方的某台机器上。
zuul: routes: product-provider: path: /product/** url: http://localhost:8202/
注意:
1、product-provider 这个值可以随便写,即使是一个不存在的值
2、这种方式访问不会作为 HystrixCommand 来进行访问。
3、url 里面也不可以写多个url
五、脱离eureka进行访问,并使之具有负载均衡和隔离的机制等
运行结果:
六、转发前是否去掉路由前缀
七、为所有路由都增加一个通过的前缀
有些时候我们系统所有的路由都有一个统一的前缀进行访问,此时就可以使用 zuul.prefix 进行统一添加。
八、忽略某些路径不进行路由
有些时候,我们某些微服务的某些地址不希望被第三方客户调用到,需要被隐藏起来,此时就可以使用网关路由这些url不进行路由。
zuul: ignored-patterns: /**/selectOne/** routes: product-provider: /product/**
注意: 这个忽略是全局忽略,即对所有的微服务都进行忽略
九、敏感头的传递(比如Cookie等)全局设置和某个微服务设置
有些时候我们微服务上游可能想传递一些请求头到下游的服务,比如Token、Cookie等值,默认情况下,zuul 不会将 Cookie,Set-Cookie,Authorization 这三个头传递到下游服务,如果需要传递,就需要忽略这些敏感头。
全局和局部设置敏感头:
运行结果:
注意:
1、可以看到访问 product 路由时,是可以获取到 敏感头中 cookie 的信息的,访问 consumer 路由无法获取到。
2、如果下游服务启用了hystrix,那么 RequestInterceptor 要想从 ThreadLocal 中获取request的值,需要将隔离策略修改成信号量。
十、忽略头 (链接)
有些时候,我们不想将某个头传递到其它所有的微服务中,就可以使用忽略头,忽略头是全局配置的,如果想在某个服务中忽略某个头,可以使用敏感头忽略。
zuul: routes: product-provider: path: /product/** serviceId : product-provider ignored-headers: token # 全局忽略头,忽略 token 这个请求头,不向下游服务传递这个token请求头
zuul.ignored-headers: token 表示被zuul路由的服务都不会传递 token 这个请求头。
十一、spring security 在classpath 下会忽略的头
当我们的 spring security 在classpath中,zuul 会为我们增加一个默认的 spring security 相关的忽略头,如果我们不想要忽略,将 zuul. ignore-security-headers: false 就可以了。
# spring security 在classpath 下会忽略的头 zuul: routes: product-provider: path: /product/** serviceId : product-provider ignore-security-headers: false # 为true会忽略spring security安全头,如果下游需要用到需要设置成false
十二、本地调换和路由的优先级
有些时候,我们页面上访问到的某些路径,想让网关直接进行处理,而不是直接转发到后端的服务上,此时就可以使用到路由的跳转。 有些时候 /product/ext/** 想路由到 product-provider-ext 服务上,
/product/** 想路由到 product-provider 服务上,此时在 yml 文件中顺序配置即可。
十三、配置网关超时
如果是通过 url 进行配置的,那么需要设置下面这个超时时间
十四、重写 Location 头
如果Zuul面向Web应用程序,那么当Web应用程序通过http状态代码3XX重定向时,可能需要重写Location头,否则浏览器将最终重定向到Web应用程序的url而不是Zuul url。
十五、文件上传处理
在微服务中,有时候我们经常需要用到文件的上传,当使用了服务网关 zuul 后,对于小的文件是可以上传成功的,那么对于大的文件就会报错,此处应该如何处理呢?
对于大文件的上传,我们需要绕过 Spring 的 DispatcherServlet。在 spring cloud zuul 中我们只需要在路由的前面加上 /zuul( zuul.servletPath) 前缀即可。
从上图中可以看到,对于大文件的上传,是加上了 /zuul 的前缀的。
完整代码
服务网关配置代码: https://gitee.com/huan1993/spring-cloud-parent/tree/master/zuul
相关推荐
下面将详细介绍在 Spring Boot 中集成 Zuul 的过程以及相关的配置知识。 首先,我们需要在 `pom.xml` 文件中引入 Spring Cloud Netflix 的 Zuul 相关依赖: ```xml <groupId>org.springframework.cloud ...
在"OAuth2.0认证及Zuul网关配置"中,我们将探讨如何将OAuth2的认证机制整合到Zuul网关中,以实现安全的API访问。 首先,OAuth2.0的核心概念包括资源所有者(Resource Owner)、客户端(Client)、授权服务器...
3. 创建Zuul配置:在Apollo的管理后台,创建一个或多个配置项,例如定义路由规则的JSON格式数据,或者过滤器的配置。 4. 监听配置变更:在Zuul的启动类或配置类中,通过Apollo的API监听配置变更事件,当配置变化时,...
4. **Zuul配置** 在"ZuulDemo"中,首先需要在`application.yml`或`bootstrap.yml`中配置Zuul的相关设置,如路由规则、过滤器等。例如: ```yaml spring: cloud: zuul: routes: serviceA: path: /serviceA/**...
通过Zuul的过滤器机制可以灵活地处理各种请求,并在遇到异常情况时,通过适当的扩展和配置确保系统的健壮性和用户体验。开发者在使用Zuul时,应深入了解其过滤器、路由、异常处理等机制,以便更好地解决实际开发中...
3. 动态路由:可以根据配置动态调整路由规则,实现灵活的服务调用策略。 4. 服务聚合:在一个请求中,可能需要调用多个服务,Zuul可以简化这一过程,提高效率。 总结,Spring Cloud Zuul结合Eureka,构建了一个高效...
- **动态路由**:当服务实例增加或减少时,无需修改Zuul配置,因为Zuul会自动感知Consul中的服务变化。 4. **实际应用** - **负载均衡**:Zuul可以根据Consul提供的服务信息,配合Ribbon或Hystrix实现客户端负载...
2. **配置Zuul**:在`application.yml`或`application.properties`文件中,配置Zuul的路由规则,指定哪些请求应该被路由到哪个微服务。例如,如果你有一个名为`userservice`的微服务,你可以这样配置: ```yaml ...
本文详细介绍了 Spring Cloud Zuul 的重试机制探秘,包括 Zuul 的功能、 Zuul 的重试机制的配置、 Zuul 的重试机制的实现细节等内容。 Zuul 的重试机制可以确保请求的可靠性和高可用性,是 Spring Cloud Zuul 的一个...
4. 启动Zuul:将Zuul配置为一个独立的服务实例,或者将其与其他Spring Cloud服务(如Eureka)结合部署。 在提供的"zuulTest"文件名中,可能包含的是一个测试用例或样例代码,用于演示如何在实际项目中使用和测试...
本教程将深入探讨如何在Spring Cloud集群环境中集成并利用Zuul实现动态路由,以及Zuul的各种配置选项。 首先,让我们了解一下Eureka,它是Spring Cloud中的服务发现组件。Euraka-server项目是部署Eureka服务器的...
压缩包中的 "spring cloud zuul" 可能包含了一个完整的 Spring Cloud Zuul 示例应用,它展示了如何配置和运行 Zuul 服务,包括如何定义路由、编写过滤器、集成安全组件等。这样的示例对于初学者理解和实践 Spring ...
Spring Cloud Zuul 路由配置详解 Spring Cloud Zuul 是一个基于 Netflix Zuul 的路由器和服务器端负载均衡器,能够实现服务发现、路由和过滤等功能。 Zuul 中的路由配置是指 Zuul 如何将请求路由到目标服务上,...
1. **配置动态路由**:在 Zuul 配置中,我们可以使用 Groovy 或 YAML 文件定义路由规则。这些规则可以包含变量,例如,根据请求路径中的某个部分动态决定目标服务。 2. **运行时更新**:通过使用 Spring Cloud ...
在给定的压缩包文件中,`EureKaserver` 可能是关于Eureka服务发现的配置或示例,`SpringCloud-Service` 可能包含了一个或多个微服务实例,而`SpringCloud-Zuul` 很可能包含了Zuul 网关的配置和服务。通过这些组件的...
9. **Zuul配置**:在Spring Cloud环境中,Zuul的配置通常通过YAML或properties文件完成,包括路由规则、过滤器配置等。开发者可以根据实际需求动态调整这些配置。 10. **监控和日志**:Zuul的日志可以帮助开发者...
然而,在实际开发过程中,我们可能会遇到Zuul跨域配置异常的问题,导致前端与后端通信受阻。本文将详细介绍如何解决Spring Cloud Zuul在配置跨域时出现的异常。 首先,我们需要理解跨域(CORS)的基本概念。跨域是...
然后,在各个微服务应用中,配置Zuul作为API网关,对所有请求进行预处理,检查请求头中的OAuth2令牌。一旦用户在授权服务器成功登录,系统将生成一个令牌并发送给客户端,之后客户端在访问其他服务时只需携带该令牌...
在这个例子中,Bootstrap 的 `main` 方法是运行 Zuul 服务器的关键,它会设置环境、加载配置、初始化过滤器,并启动服务器监听网络请求。 Zuul 的核心组件之一是过滤器(Filters),它们定义了对请求的处理逻辑。...
最后,eureka-zuul是我们关注的重点,它应该是配置了Zuul的项目,包含了Zuul相关的配置、路由规则以及可能的自定义过滤器。 通过对这些组件的实践和配置,我们可以深入了解Zuul如何与Eureka协作,如何通过过滤器...