SpringCloudGateWay&Zuul-网关和路由-Gateway网关路由、断言、过滤-《Java笔记》

admin 2025-10-19 05:48:06 编程 来源:ZONE.CI 全球网 0 阅读模式

Java SpringCloud GateWay

1、Gateway 简介

GateWay是什么

Spring Cloud 全家桶中有个很重要的组件:网关。在 1.x 版本中使用的是 Zuul 网关,但是到了 2.x,由于Zuul的升级不断跳票,Spring Cloud 自己研发了一套网关组件:Spring Cloud Gateway。Spring Cloud Gateway基于 Spring Boot 2.x,Spring WebFlux 和 Project Reactor 构建,使用了 Webflux 中的 reactor-netty 响应式编程组件,底层使用了 Netty 通讯框架。

GateWay能做什么

反向代理、鉴权、流量控制、熔断、日志监控……

网关在微服务架构中的位置

2、Gateway%20的三大概念

Route(路由):路由是构建网关的基本模块,它由%20ID、目标%20URI、一系列的断言和过滤器组成,如果断言为%20true%20则匹配该路由Predicate(断言):参考的是%20Java8%20中的%20java.util.function.Predicate。开发人员可以匹配%20HTTP%20请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由Filter(过滤):指的是%20Spring%20框架中%20GatewayFilter%20的实例,使用过滤器,可以在请求被路由之前或之后对请求进行修改

3、工作流程

Clients%20make%20requests%20to%20Spring%20Cloud%20Gateway.%20If%20the%20Gateway%20Handler%20Mapping%20determines%20that%20a%20request%20matches%20a%20route,%20it%20is%20sent%20to%20the%20Gateway%20Web%20Handler.%20This%20handler%20runs%20the%20request%20through%20a%20filter%20chain%20that%20is%20specific%20to%20the%20request.%20The%20reason%20the%20filters%20are%20divided%20by%20the%20dotted%20line%20is%20that%20filters%20can%20run%20logic%20both%20before%20and%20after%20the%20proxy%20request%20is%20sent.%20All%20“pre”%20filter%20logic%20is%20executed.%20Then%20the%20proxy%20request%20is%20made.%20After%20the%20proxy%20request%20is%20made,%20the%20“post”%20filter%20logic%20is%20run.

翻译:客户端向%20Spring%20Cloud%20Gateway%20发出请求。如果网关处理程序映射确定请求与路由匹配,则将其发送到网关%20Web%20处理程序。该处理程序通过特定于请求的过滤器链来运行请求。%20筛选器由虚线分隔的原因是,筛选器可以在发送代理请求之前和之后运行逻辑。所有%20“前置“%20过滤器逻辑均被执行,然后发出代理请求,发出代理请求后,将运行“%20后置%20”过滤器逻辑。总结:路由转发%20+%20执行过滤器链

4、两种配置方式

配置文件方式

以访问「百度新闻网」为例,添加如下配置

server:%20%20port:%209527spring:%20%20application:%20%20%20%20name:%20cloud-gateway9527%20%20cloud:%20%20%20%20gateway:%20%20%20%20%20%20routes:%20%20%20%20%20%20%20%20-%20id:%20news%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20#%20路由id%20%20%20%20%20%20%20%20%20%20uri:%20http://news.baidu.com%20%20%20%20#%20真实调用地址%20%20%20%20%20%20%20%20%20%20predicates:%20%20%20%20%20%20%20%20%20%20%20%20-%20Path=/guonei%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20#%20断言,符合规则进行路由

浏览器虽然输入%20localhost:9527/guonei,却会转发到指定的地址

编码方式

新增配置文件

@Configurationpublic%20class%20GatewayConfig%20{%20%20%20%20@Bean%20%20%20%20public%20RouteLocator%20routes(RouteLocatorBuilder%20builder)%20{%20%20%20%20%20%20%20%20return%20builder.routes()%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.route("news2",%20r%20->%20r.path("/guoji").uri("http://news.baidu.com"))%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.build();%20%20%20%20}}

效果:

5、动态路由

开启后,默认情况下%20Gateway%20会根据注册中心注册的服务列表,以注册中心上微服务名为路径创建动态路由进行转发,从而实现动态路由的功能

spring:%20%20cloud:%20%20%20%20gateway:%20%20%20%20%20%20discovery:%20%20%20%20%20%20%20%20locator:%20%20%20%20%20%20%20%20%20%20enabled:%20true%20#开启从注册中心动态创建路由的功能,利用微服务名进行路由%20%20%20%20%20%20routes:%20%20%20%20%20%20%20%20-%20id:%20payment_routh1%20%20%20%20%20%20%20%20%20%20#uri:%20http://localhost:8001%20%20%20%20%20#静态,写死了地址,只能调用一个服务%20%20%20%20%20%20%20%20%20%20uri:%20lb://CLOUD-PAYMENT-SERVICE%20#动态,lb://微服务名%20%20%20%20%20%20%20%20%20%20predicates:%20%20%20%20%20%20%20%20%20%20%20%20-%20Path=/payment/get/**%20%20%20%20%20%20%20%20-%20id:%20payment_routh2%20%20%20%20%20%20%20%20%20%20#uri:%20http://localhost:8001%20%20%20%20%20%20%20%20%20%20uri:%20lb://CLOUD-PAYMENT-SERVICE%20%20%20%20%20%20%20%20%20%20predicates:%20%20%20%20%20%20%20%20%20%20%20%20-%20Path=/payment/lb/**

6、Predicate%20的使用

时间相关配置

After:在指定时间之后进行路由Before:在指定时间之前进行路由Between:在指定时间之间进行路由

predicates:%20%20%20%20-%20Path=/payment/lb/**%20%20%20%20#-%20After=2020-04-25T16:30:58.215+08:00[Asia/Shanghai]%20%20%20%20#-%20Before=2020-04-25T16:40:58.215+08:00[Asia/Shanghai]%20%20%20%20-%20Between=2020-04-25T16:35:58.215+08:00[Asia/Shanghai],2020-04-25T16:40:58.215+08:00[Asia/Shanghai]

上述配置的时间格式可以通过以下代码得到

@Testpublic%20void%20test(){%20%20%20%20ZonedDateTime%20now%20=%20ZonedDateTime.now();%20%20%20%20System.out.println(now);}

请求相关配置

Cookie

配置说明:【Cookie=cookie名,%20cookie值的正则表达式规则】

predicates:%20%20-%20Path=/payment/lb/**%20%20-%20Cookie=id,%20[0-9

使用%20curl%20工具模拟携带%20cookie%20发送请求

Header

配置说明:【Header=header名,%20header值的正则表达式规则】

predicates:%20%20-%20Path=/payment/lb/**%20%20-%20Header=h,%20[a-h]

Host

配置说明:【Host=主机名(可配置多个,也可以使用通配符)】

predicates:%20%20-%20Path=/payment/lb/**%20%20-%20Host=**.a.com,**.b.cn

Method

配置说明:【Method=请求类型】

predicates:%20%20-%20Path=/payment/lb/**%20%20-%20Method=GET

Path

配置说明:【Path=请求路径】

  1. predicates:
  2. - Path=/payment/lb/**

Gateway 网关路由、断言、过滤 - 图10

Query

配置说明:【Query=参数名,参数值】

  1. predicates:
  2. - Path=/payment/lb/**
  3. - Query=name, zhangsan

Gateway 网关路由、断言、过滤 - 图11详见:官网

7、Filter 的使用

  • 生命周期:pre、post
  • 种类:GatewayFilterGlobalFilter

GatewayFilter 在官方文档有几十种!详细配置可参考 官网,这里主要介绍自定义全局过滤器。

  1. @Component
  2. @Slf4j
  3. public class MyGlobalFilter implements GlobalFilter, Ordered {
  4. @Override
  5. public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
  6. String username = exchange.getRequest().getQueryParams().getFirst("username");
  7. //用户名为空时,给出错误响应
  8. if (username == null) {
  9. log.info("用户名为空,非法登录");
  10. exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
  11. return exchange.getResponse().setComplete();
  12. }
  13. return chain.filter(exchange);
  14. }
  15. @Override
  16. public int getOrder() {
  17. return 0;
  18. }
  19. }

Gateway 网关路由、断言、过滤 - 图12Gateway 网关路由、断言、过滤 - 图13

以太坊cppgolang区别 编程

以太坊cppgolang区别

以太坊是一种去中心化的开源平台,它采用智能合约技术,旨在构建和运行不受干扰的分布式应用程序。作为目前最受欢迎的区块链平台之一,以太坊提供了多种编程语言的支持,其
progolang 编程

progolang

Go语言(Golang)是由Google开发的一门静态类型编程语言。作为一名专业的Golang开发者,我深知这门语言的优势和特点。在本文中,我将介绍Golang
golangn个发送者 编程

golangn个发送者

Golang是一种开源的编程语言,由Google团队开发,旨在提高程序的并发性和简化软件开发过程。在Go语言中,有时需要向多个接收者发送信息。本文将介绍如何在G
golang技能图谱 编程

golang技能图谱

从互联网行业的快速发展到人工智能技术的日益成熟,各种编程语言也应运而生。而在这众多的编程语言中,Golang(即Go)作为一门强大且高效的开发语言备受关注。Go
评论:0   参与:  5