9.4 Spring Cloud Gateway 动态路由

  • 默认情况下,Spring Cloud Gateway 会根据服务注册中心(例如 Eureka Server)中维护的服务列表,以服务名(spring.application.name)作为路径创建动态路由进行转发,从而实现动态路由功能。

  • 我们可以在配置文件中,将 Route 的 uri 地址修改为以下形式。

lb://service-name
  • 以上配置说明如下:

    • lb:uri 的协议,表示开启 Spring Cloud Gateway 的负载均衡功能。
    • service-name:服务名,Spring Cloud Gateway 会根据它获取到具体的微服务地址。
  • 测试下 Spring Cloud Gateway 是如何实现动态路由的, 修改microservice-cloud-gateway-8015 中 application.yml 的配置,使用注册中心中的微服务名创建动态路由进行转发,配置如下。

server:port: 8015
spring:application:name: microServiceCloudGateway #微服务名称,对外暴漏的微服务名称,十分重要cloud:gateway:     #网关路由配置discovery:locator:enabled: true  #默认值为 false,即默认不开启从注册中心动态创建路由的功能,利用微服务名进行路由。启用 DiscoveryClient 网关集成routes:- id: provider_deptlist_route #路由 id,没有固定规则,但唯一,建议与服务名对应uri: lb://MICROSERVICECLOUDPROVIDERDEPT #动态路由,使用服务名代替上面的具体带端口predicates:#以下是断言条件,必选全部符合条件- Path=/dept/**   #断言,路径匹配 注意:Path 中 P 为大写- Method=Get   #只能时 GET 请求时,才能访问#将 microservice-cloud-provider-dept-8001 提供的服务隐藏起来,不暴露给客户端,只给客户端暴露 API 网关的地址 9527#eureka配置,Spring cloud 自定义服务名称和 ip 地址
eureka:client:fetch-registry: trueregister-with-eureka: trueservice-url:#defaultZone: http://localhost:7001/eureka/  #这个地址是 7001注册中心在 application.yml 中暴露出来额注册地址 (单机版)defaultZone: http://eurekaserver7001.com:7001/eureka/,http://eurekaserver7002.com:7002/eureka/,http://eurekaserver7003.com:7003/eureka/ #将服务注册到 Eureka Server 集群instance:instance-id: microservice-cloud-gateway-8015 #自定义服务名称描述信息prefer-ip-address: true           #显示访问路径的 ip 地址hostname: microservice-cloud-gateway#zookeeper需要配置那些服务service被扫描,eureka则是将整个服务包注册进去了ribbon:eager-load:enabled: true  #关闭懒加载# 指的是建立连接后从服务器读取到可用资源所用的时间ReadTimeout: 6000# 指的是建立连接所用的时间,适用于网络状态正常的情况下,两端连接所用的时间ConnectTimeout: 6000MaxAutoRetriesNextServer: 1MaxAutoRetries: 1
# spring cloud 使用 Spring Boot actuator 监控完善信息
# Spring Boot 2.50对 actuator 监控屏蔽了大多数的节点,只暴露了 heath 节点,本段配置(*)就是为了开启所有的节点
# zuul中包含actuator依赖
management:endpoints:web:exposure:include: health,info,hystrix.stream  #应包含的端点 ID 或 '' 全部,* 在yaml 文件属于关键字,所以需要加双引号#include的值也可以改成*,但建议还是最小暴露原则,用啥开启啥info:env:enabled: true   #启用配置里的info开头的变量info:             #配置一些服务描述信息,监控信息页面显示,,可以判断服务是否正常app.name: microservice-cloud-zuul-8010company.name: cloud.zk.comauth: zkemail: 123@qq.combuild.aetifactId: @project.artifactId@build.version: @project.version@#网关路径http://cloud.zk.com:8010/microservicecloudproviderdepthystrix/dept/getInfo/Hystrix/200/1
  • 依次启动 Eureka 服务注册中心(集群)、服务提供者集群(microservice-cloud-provider-dept-8001/8002/8003)以及 microservice-cloud-gateway-8015。
  • 在浏览器中访问“http://localhost:8015/dept/list”,结果如下图。发现数据来源于三个提供者服务

9.5 Filter 过滤器

  • 通常情况下,出于安全方面的考虑,服务端提供的服务往往都会有一定的校验逻辑,例如用户登陆状态校验、签名校验等。

  • 在微服务架构中,系统由多个微服务组成,所有这些服务都需要这些校验逻辑,此时我们就可以将这些校验逻辑写到 Spring Cloud Gateway 的 Filter 过滤器中。

  • Filter 的分类:Spring Cloud Gateway 提供了以下两种类型的过滤器,可以对请求和响应进行精细化控制。

过滤器类型 说明
Pre 类型 这种过滤器在请求被转发到微服务之前可以对请求进行拦截和修改,例如参数校验、权限校验、流量监控、日志输出以及协议转换等操作。
Post 类型 这种过滤器在微服务对请求做出响应后可以对响应进行拦截和再处理,例如修改响应内容或响应头、日志输出、流量监控等。
  • 按照作用范围划分,Spring Cloud gateway 的 Filter 可以分为 2 类:

    • GatewayFilter:应用在单个路由或者一组路由上的过滤器。
    • GlobalFilter:应用在所有的路由上的过滤器。
9.5.1 GatewayFilter 网关过滤器
  • GatewayFilter 是 Spring Cloud Gateway 网关中提供的一种应用在单个或一组路由上的过滤器。它可以对单个路由或者一组路由上传入的请求和传出响应进行拦截,并实现一些与业务无关的功能,比如登陆状态校验、签名校验、权限校验、日志输出、流量监控等。

  • GatewayFilter 在配置文件(例如 application.yml)中的写法与 Predicate 类似,格式如下。

spring:cloud:gateway: routes:- id: xxxxuri: xxxxpredicates:- Path=xxxxfilters:- AddRequestParameter=X-Request-Id,1024 #过滤器工厂会在匹配的请求头加上一对请求头,名称为 X-Request-Id 值为 1024- PrefixPath=/dept #在请求路径前面加上 /dept……
  • Spring Cloud Gateway 内置了多达 31 种 GatewayFilter,下表中列举了几种常用的网关过滤器及其使用示例。
路由过滤器 描述 参数 使用示例
AddRequestHeader 拦截传入的请求,并在请求上添加一个指定的请求头参数。 name:需要添加的请求头参数的 key; value:需要添加的请求头参数的 value。 - AddRequestHeader=my-request-header,1024
AddRequestParameter 拦截传入的请求,并在请求上添加一个指定的请求参数。 name:需要添加的请求参数的 key; value:需要添加的请求参数的 value。 - AddRequestParameter=my-request-param,cloud.zk.com
AddResponseHeader 拦截响应,并在响应上添加一个指定的响应头参数。 name:需要添加的响应头的 key; value:需要添加的响应头的 value。 - AddResponseHeader=my-response-header,cloud.zk.com
PrefixPath 拦截传入的请求,并在请求路径增加一个指定的前缀。 prefix:需要增加的路径前缀。 - PrefixPath=/consumer
PreserveHostHeader 转发请求时,保持客户端的 Host 信息不变,然后将它传递到提供具体服务的微服务中。 - PreserveHostHeader
RemoveRequestHeader 移除请求头中指定的参数。 name:需要移除的请求头的 key。 - RemoveRequestHeader=my-request-header
RemoveResponseHeader 移除响应头中指定的参数。 name:需要移除的响应头。 - RemoveResponseHeader=my-response-header
RemoveRequestParameter 移除指定的请求参数。 name:需要移除的请求参数。 - RemoveRequestParameter=my-request-param
RequestSize 配置请求体的大小,当请求体过大时,将会返回 413 Payload Too Large。 maxSize:请求体的大小。 - name: RequestSize args: maxSize: 5000000
  • 来测试 GatewayFilter 的配置,在 microservice-cloud-gateway-8015 的 application.yml 中在修改成一个包含断言和过滤器动态路由,配置内容如下。
spring:application:name: microServiceCloudGateway #微服务名称,对外暴漏的微服务名称,十分重要cloud:gateway:     #网关路由配置discovery:locator:enabled: true  #默认值为 false,即默认不开启从注册中心动态创建路由的功能,利用微服务名进行路由。启用 DiscoveryClient 网关集成routes:- id: provider_deptlist_route #路由 id,没有固定规则,但唯一,建议与服务名对应uri: lb://MICROSERVICECLOUDPROVIDERDEPT #动态路由,使用服务名代替上面的具体带端口predicates:#以下是断言条件,必选全部符合条件- Path=/**   #断言,路径匹配 注意:Path 中 P 为大写- Method=Get   #只能时 GET 请求时,才能访问#将 microservice-cloud-provider-dept-8001 提供的服务隐藏起来,不暴露给客户端,只给客户端暴露 API 网关的地址 9527filters:- PrefixPath=/dept  #在请求路径上增加一个前缀 /dept
  • 重启 microservice-cloud-gateway-8015,使用浏览器访问“http://localhost:8015/get/1”或,结果如下图。

9.5.2 GlobalFilter 全局过滤器
  • GlobalFilter 是一种作用于所有的路由上的全局过滤器,通过它,我们可以实现一些统一化的业务功能,例如权限认证、IP 访问限制等。当某个请求被路由匹配时,那么所有的 GlobalFilter 会和该路由自身配置的 GatewayFilter 组合成一个过滤器链。
  • Spring Cloud Gateway 为我们提供了多种默认的 GlobalFilter,例如与转发、路由、负载均衡等相关的全局过滤器。但在实际的项目开发中,通常我们都会自定义一些自己的 GlobalFilter 全局过滤器以满足我们自身的业务需求,而很少直接使用 Spring Cloud Config 提供这些默认的 GlobalFilter。

关于默认的全局过滤器的详细内容,请参考 Spring Cloud 官网。

  • 测试下,如何自定义 GlobalFilter 全局过滤器。在 com.example.filter 包下,新建一个名为 MyGlobalFilter 全局过滤器配置类,代码如下。
package com.example.filter;import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;/*** @author CNCLUKZK* @create 2022/9/24-1:21*/
@Component
@Slf4j
public class MyGlobalFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {log.info("进入自定义全局过滤器!");String acc = exchange.getRequest().getQueryParams().getFirst("acc");if (acc ==null) {log.info("参数 acc 不能为 null!");exchange.getResponse().setStatusCode(HttpStatus.BAD_REQUEST);return exchange.getResponse().setComplete();}return chain.filter(exchange);}@Overridepublic int getOrder() {//过滤器的顺序,0 表示第一个return 0;}
}
  • 重启 microservice-cloud-gateway-8015,使用浏览器访问“http://localhost:8015/list”或,结果如下图。 直接报400错误

  • 访问“http://localhost:8015/list?acc=2”或,结果如下图。 直接报400错误

下一篇:SpringCloud-26-Zuul:路由网关介绍和使用

SpringCloud-25-Gateway:动态路由、过滤器使用相关推荐

  1. Spring Cloud Gateway 动态路由管理,一点都不吹,应该没有比这更好的管理系统了吧

      本文介绍的 Spring Cloud Gateway 动态路由.不比其他博客通篇 copy 的 Gateway 动态路由,直接上干货!!!为你们提供了一套完整的动态路由管理系统.文末附本文全套代码 ...

  2. SpringCloud 微服务网关Gateway 动态路由配置

    概述:在上一章节<SpringCloud 微服务网关Gateway介绍及简单路由配置>中我们讲述了Gateway的最简单的路由配置方式.但是其中比较明显的问题就是我们在配置路由服务的地址时 ...

  3. gateway动态路由_无语!SpringCloud Gateway动态路由之Nacos,我已经讲得很清楚了

    前言 当我们的网关Gateway程序开发完成之后,需要部署到生产环境,这个时候你的程序不能是单点运行的,肯定是多节点启动(独立部署或者docker等容器部署),防止单节点故障导致整个服务不能访问,网关 ...

  4. SpringCloud系列——Zuul 动态路由

    前言 Zuul 是在Spring Cloud Netflix平台上提供动态路由,监控,弹性,安全等边缘服务的框架,是Netflix基于jvm的路由器和服务器端负载均衡器,相当于是设备和 Netflix ...

  5. gateway动态路由_spring-cloud-gateway简介

    概述 API网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求.如果让客户端直接与各个微服务通信,会有以下的问题: 客户端 ...

  6. gateway动态路由_微服务与网关技术(SIA-GateWay)

    一.背景 软件架构,总是在不断的演进中... 把时间退回到二十年之前,当时企业级领域研发主要推崇的还是C/S模式,PB.Delphi这样的开发软件是企业应用开发的主流.随着时间的推移,基于浏览器的B/ ...

  7. gateway动态路由_微服务中的网关技术:Gateway

    技术/杨33 一.Gateway是什么 为微服务提供一种简单有效的统一的API路由管理方式. Gateway是基于WebFlux框架实现的,而WebFlux框架底层使用了高性能的Reactor模式通讯 ...

  8. Nacos + Spring Cloud Gateway动态路由配置

    前言 Nacos最近项目一直在使用,其简单灵活,支持更细粒度的命令空间,分组等为麻烦复杂的环境切换提供了方便:同时也很好支持动态路由的配置,只需要简单的几步即可.在国产的注册中心.配置中心中比较突出, ...

  9. Spring Cloud Gateway动态路由实现

    Gateway上线部署分析 当你的网关程序开发完成之后,需要部署到生产环境,这个时候你的程序不能是单点运行的,肯定是多节点启动(独立部署或者docker等容器部署),防止单节点故障导致整个服务不能访问 ...

  10. GateWay 网关路由过滤器配置

    GatewayFilter 是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理. Spring提供了31种不同的路由过滤器工厂. 官方文档:Spring Cloud Gateway ...

最新文章

  1. linux下清理信号量,Linux下kill的信号量列表
  2. ElasticSearch,Sphinx,Lucene,Solr,Xapian。哪种适合哪种用途? [关闭]
  3. 字符串中斜杠换行注意事项之-多余空格
  4. 终端terminal的颜色配置
  5. 如何使用 TStringGrid 呈现大量的颜色信息 - 回复 冷公子 的问题
  6. CentOS 6.5下安装Docker
  7. Linux创翼拨号上网,创翼客户端下载(网络拨号工具) v4.11.4.731 最新版_数码资源网...
  8. Echarts地图的基本使用方法
  9. 基于微信小程序的电影院购票系统丨毕业设计源码
  10. Docker 学习笔记
  11. 八爪鱼爬虫采集天猫商品数据教程
  12. java计算机毕业设计绿洲小区快递配送系统源代码+数据库+系统+lw文档
  13. 7-3 求分数序列前N项和 (15分)
  14. Ultimate Colour Control for mac(fcpx终极色彩控制插件)
  15. probuilder_使用ProBuilder自定义快照原型资产
  16. 别再骂百度难用了,问题是你根本就不会用搜索引擎!
  17. 浏览器打开exe程序
  18. 平面解析几何----余弦定理求焦点三角形的面积
  19. 机器学习实战:Python基于支持向量机SVM-RFE进行分类预测(三)
  20. 卖家被骗上万元,已报警立案-跨境知道

热门文章

  1. iOS开发系列--音频播放、录音、视频播放、拍照、视频录制
  2. 解决冲突后,git merge --continue 时 lint不通过
  3. 华为平板电池损耗用什么软件测试,平板怎么看电池损耗
  4. 云班课python测试答案_智慧职教云课堂APPPython程序设计题目答案
  5. static变量与普通变量的区别
  6. 彩色照片转化为黑白照片
  7. 模态逻辑(2)—— 模态逻辑基本概念
  8. word在图片上添加文字且不改变原图教程
  9. 三顾茅庐,七面阿里,25k*16offer,还原我的大厂面经
  10. 键盘输入一个高精度的正整数N,去掉其中任意S个数字后剩下的数字按原左右次序将组成一个新的正整数。编程对给定的N和S,寻找一种方案使得剩下的数字组成的新数最小。(C++)(贪心法)