Springboot: Spring Cloud Gateway 使用的基本概念及配置介绍

news2024/12/23 23:16:40

1. SpringCloud 与 SpringBoot的版本映射关系

在已有的Spring Boot项目中增加Spring Cloud,首先要确定使用的Spring Cloud的版本,这取决于项目使用的Spring Boot的版本
SpringCloud 与 SpringBoot的版本映射关系

如果两者的版本不兼容,再会报: Spring Boot [2.x.x] is not compatible with this Spring Cloud release train

在这里插入图片描述

2. spring-cloud-gateway配置

Spring Cloud Gateway旨在提供一种简单而有效的方式来路由API服务,并为它们提供横切关注点,例如:安全性、监控/指标和弹性。

目前的版本信息:
在这里插入图片描述

2.1. 项目中如何包含spring-cloud-gateway

在项目中引入如下依赖:

		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-gateway</artifactId>
			<version>3.0.8</version>
		</dependency>

注意:

  • 如果引入依赖,但不希望启用网关,请设置spring.cloud.gateway.enabled=false
  • Spring Cloud Gateway构建在Spring Boot 2Spring WebFluxProject Reactor之上,所以许多同步库(例如Spring DataSpring Security)和模式可能不适用
  • Spring Cloud Gateway需要Spring BootSpring Webflux提供的Netty Runtime。它不能在传统的Servlet容器中工作,也不能作为WAR构建。

2.2. 基本术语

  • Route 路由: 网关的基本组成部分。它由一个ID、一个目标URI、一组谓词和一组过滤器定义。如果聚合谓词为真,则匹配路由。
  • Predicate 谓词: 一个Java 8函数谓词。输入类型为Spring Framework ServerWebExchange,在编程时可以匹配HTTP请求中的任何内容,例如 headers 或参数。
  • Filter 过滤器: 使用特定工厂构造的GatewayFilter的实例,可以在发送下游请求之前或之后修改请求和响应。

2.3. 如何工作?

  1. 客户端向Spring Cloud Gateway发出请求。
  2. 如果网关处理程序映射确定请求与路由匹配,则将其发送到网关Web处理程序。
  3. 此处理程序通过特定于请求的过滤器链【filter chain】运行请求。
    • 过滤器用虚线分隔的原因是过滤器可以在发送代理请求之前和之后运行逻辑。
    • 执行所有“预”过滤器逻辑。然后发出代理请求。发出代理请求后,将运行“post”过滤器逻辑。
      在这里插入图片描述

2.4. 如何配置?

  • 路由谓词工厂 Route Predicate Factories 网关匹配路由作为Spring WebFlux HandlerMapping基础架构的一部分。Spring Cloud Gateway包括许多内置的路由谓词工厂。所有这些谓词都匹配HTTP请求的不同属性。可以将多个路由谓词工厂与逻辑和语句组合在一起。
  • Gateway 过滤器工厂 路由过滤器允许以某种方式修改传入的HTTP请求或传出的HTTP响应。路由过滤器的作用域是特定的路由。Spring Cloud Gateway包括许多内置的GatewayFilter工厂。

路由谓词配置示例

即在spring boot的配置文件如application.yml中配置,配置示例如下:

spring:
  cloud:
    gateway:
      routes:
        - id: after_route
          uri: https://example.org
          predicates:
            - After=2017-01-20T17:42:47.789-07:00[America/Denver]
        - id: before_route
            uri: https://example.org
            predicates:
              - Before=2017-01-20T17:42:47.789-07:00[America/Denver]
        - id: between_route
            uri: https://example.org
            predicates:
              - Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver]
        - id: cookie_route
            uri: https://example.org
            predicates:
              - Cookie=chocolate, ch.p
        - id: header_route
            uri: https://example.org
            predicates:
              - Header=X-Request-Id, \d+
        - id: host_route
            uri: https://example.org
            predicates:
              - Host=**.somehost.org,**.anotherhost.org
        - id: method_route
            uri: https://example.org
            predicates:
              - Method=GET,POST
        - id: path_route
            uri: https://example.org
            predicates:
              - Path=/red/{segment},/blue/{segment}
        - id: query_route
            uri: https://example.org
            predicates:
              - Query=red, gree.
        - id: remoteaddr_route
            uri: https://example.org
            predicates:
              - RemoteAddr=192.168.1.1/24
        # The Weight Route Predicate Factory
        - id: weight_high
            uri: https://weighthigh.org
            predicates:
              - Weight=group1, 8
              - id: weight_low
                uri: https://weightlow.org
                predicates:
                  - Weight=group1, 2

路由过滤器配置示例

spring:
  cloud:
    gateway:
      routes:
        - id: add_request_header_route
          uri: https://example.org
          predicates:
            - Path=/red/{segment}
          filters:
            - AddRequestHeader=X-Request-Red, Blue-{segment}
        - id: add_request_parameter_route
          uri: https://example.org
          predicates:
            - Host: {segment}.myhost.org
          filters:
            - AddRequestParameter=foo, bar-{segment}
        - id: add_response_header_route
          uri: https://example.org
          predicates:
            - Host: {segment}.myhost.org
          filters:
            - AddResponseHeader=foo, bar-{segment}
        - id: prefixpath_route
          uri: https://example.org
          filters:
            - PrefixPath=/mypath
        - id: requestratelimiter_route
          uri: https://example.org
          filters:
            - name: RequestRateLimiter
              args:
                redis-rate-limiter.replenishRate: 10
                redis-rate-limiter.burstCapacity: 20
                redis-rate-limiter.requestedTokens: 1
        - id: prefixpath_route
          uri: https://example.org
          filters:
            - RedirectTo=302, https://acme.org

代码配置示例

	@Bean
	public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
		//@formatter:off
		RouteLocator routeLocator = builder.routes()
				.route("path_route", r -> r.path("/get")
						.uri("http://httpbin.org"))
				.route("host_route", r -> r.host("*.myhost.org")
						.uri("http://httpbin.org"))
				.route("rewrite_route", r -> r.host("*.rewrite.org")
						.filters(f -> f.rewritePath("/foo/(?<segment>.*)",
								"/${segment}"))
						.uri("http://httpbin.org"))
				.route("circuitbreaker_route", r -> r.host("*.circuitbreaker.org")
						.filters(f -> f.circuitBreaker(c -> c.setName("slowcmd")))
								.uri("http://httpbin.org"))
				.route("circuitbreaker_fallback_route", r -> r.host("*.circuitbreakerfallback.org")
						.filters(f -> f.circuitBreaker(c -> c.setName("slowcmd").setFallbackUri("forward:/circuitbreakerfallback")))
								.uri("http://httpbin.org"))
				.route("limit_route", r -> r
					.host("*.limited.org").and().path("/anything/**","/bnything/**")
						.filters(f -> f.requestRateLimiter(c -> c.setRateLimiter(redisRateLimiter())))
					.uri("http://httpbin.org"))
				.route("websocket_route", r -> r.path("/echo")
					.uri("ws://localhost:9000"))
				.build();
		return routeLocator;
	}

3. Global Filter

GlobalFilter接口与GatewayFilter接口具有相同的签名。GlobalFilter是有条件地应用于所有路由的特殊过滤器。

当请求匹配路由时,过滤web处理程序将GlobalFilter的所有实例和GatewayFilter的所有路由特定实例添加到过滤器链中。这个组合过滤器链由org.springframework.core.Ordered接口排序,可以通过实现getOrder()方法来设置该接口。

接口示例

@Bean
public GlobalFilter customFilter() {
    return new CustomGlobalFilter();
}

public class CustomGlobalFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        log.info("custom global filter");
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return -1;
    }
}

4. 如何配置跨域CORS

spring:
  cloud:
    gateway:
      globalcors:
        cors-configurations:
          '[/**]':
            allowedOrigins: "https://docs.spring.io"
            allowedMethods:
            - GET

5. http超时配置

  • 全局配置
spring:
  cloud:
    gateway:
      httpclient:
        connect-timeout: 1000
        response-timeout: 5s
  • 特定路由配置
      - id: per_route_timeouts
        uri: https://example.org
        predicates:
          - name: Path
            args:
              pattern: /delay/{timeout}
        metadata:
          response-timeout: 200
          connect-timeout: 200
import static org.springframework.cloud.gateway.support.RouteMetadataUtils.CONNECT_TIMEOUT_ATTR;
import static org.springframework.cloud.gateway.support.RouteMetadataUtils.RESPONSE_TIMEOUT_ATTR;

      @Bean
      public RouteLocator customRouteLocator(RouteLocatorBuilder routeBuilder){
         return routeBuilder.routes()
               .route("test1", r -> {
                  return r.host("*.somehost.org").and().path("/somepath")
                        .filters(f -> f.addRequestHeader("header1", "header-value-1"))
                        .uri("http://someuri")
                        .metadata(RESPONSE_TIMEOUT_ATTR, 200)
                        .metadata(CONNECT_TIMEOUT_ATTR, 200);
               })
               .build();
      }

6. Actuator API

开启配置:spring.cloud.gateway.actuator.verbose.enabled=true
下表总结了Spring Cloud Gateway执行器端点(注意每个端点都以/actuator/gateway为基路径):

IDHTTP MethodDescription
globalfiltersGETDisplays the list of global filters applied to the routes.
routefiltersGETDisplays the list of GatewayFilter factories applied to a particular route.
refreshPOSTClears the routes cache.
routesGETDisplays the list of routes defined in the gateway.
routes/{id}GETDisplays information about a particular route.
routes/{id}POSTAdds a new route to the gateway.
routes/{id}DELETERemoves an existing route from the gateway.

附录

spring-cloud-gateway 在使用时,还有很多其它需要关注的,详见官方使用文档spring-cloud-gateway reference

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1040366.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【洛谷 P1644】跳马问题 题解(动态规划)

跳马问题 题目背景 在爱与愁的故事第一弹第三章出来前先练练四道基本的回溯/搜索题吧…… 题目描述 中国象棋半张棋盘如图 1 1 1 所示。马自左下角 ( 0 , 0 ) (0,0) (0,0) 向右上角 ( m , n ) (m,n) (m,n) 跳。规定只能往右跳&#xff0c;不准往左跳。比如图 1 1 1 中所…

【已解决】PDF文件无法编辑怎么办?

打开PDF文件却发现无法编辑&#xff0c;怎么办&#xff1f; 首先&#xff0c;我们要知道&#xff0c;编辑PDF文件需要用到PDF编辑器&#xff0c;用PDF阅读器打开的话是无法编辑的。所以&#xff0c;先要确定是否用PDF编辑器打开PDF文件。 如果使用PDF编辑器打开后还是无法编辑…

2023-9-25 JZ25 合并两个排序的链表

题目链接&#xff1a;合并两个排序的链表 import java.util.*;/** public class ListNode {* int val;* ListNode next null;* public ListNode(int val) {* this.val val;* }* }*/public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c…

8.定义算法中的函数

在 algorithm2e 宏包中&#xff0c;您可以使用 \SetKwFunction 命令来定义算法中的函数。这个命令用于指定函数的名称和参数列表。以下是如何在算法中定义一个函数的示例&#xff1a; \documentclass{article} \usepackage[linesnumbered,boxed]{algorithm2e}\begin{document}…

Tomcat 开启远程调试

Tomcat 部署的 war包工程开启远程调试 Linux服务器下&#xff0c;编辑Tomcat bin 目录下的 startup.sh 文件 vim startup.sh在第一行加入&#xff1a;(不换行&#xff0c;在同一行) declare -x CATALINA_OPTS"-server -Xdebug -Xnoagent -Djava.compilerNONE -Xrunjdwp:…

C#文件目录

文件所在位置 代码 Console.WriteLine("获取程序的基目录" System.AppDomain.CurrentDomain.BaseDirectory); Console.WriteLine("获取模块的完整路径" System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName); Console.WriteLine(&quo…

WebGL 绘制圆形的点

目录 前言 如何实现圆形的点&#xff1f; 片元着色器内置变量&#xff08;gl_FragCoord、gl_PointCoord&#xff09; gl_PointCoord的含义 示例程序&#xff08;RoundedPoint.js&#xff09; 代码详解 前言 本文将讨论示例程序RoundedPoint&#xff0c;该程序绘制了圆…

02-Scala变量与数据类型

注释 ​ Scala注释使用和Java完全一样。注释是一个程序员必须要具有的良好编程习惯。将自己的思想通过注释先整理出来&#xff0c;再用代码去体现。 单行注释多行注释文档注释 变量与常量 常量&#xff1a;在程序执行的过程中&#xff0c;其值不会被改变的变量 Java中变量…

【C++】构造函数和析构函数第一部分(构造函数和析构函数的作用)--- 2023.9.25

目录 前言初始化和清理的概念构造函数和析构函数的作用构造函数的作用析构函数的作用 使用构造函数和析构函数的注意事项默认的构造函数和析构函数结束语 前言 在使用c语言开发的项目场景中&#xff0c;我们往往会遇到申请空间的需求&#xff0c;同时也肯定遇到过程序运行一段…

数字IC基础协议篇(1)——I2C协议

数字IC基础协议篇&#xff08;1&#xff09;——I2C协议 写在前面的话I2C协议应用框图I2C数据格式协议注意点 I2C读写EEPROM例程&#xff08;基于iverilog和gtkwave&#xff09;软件环境要求 项目框图总结 写在前面的话 协议介绍&#xff1a; I2C&#xff08;Inter-Integrated…

【CNN-FPGA开源项目解析】卷积层03--单格乘加运算单元PE 单窗口卷积块CU 模块

03–单格乘加运算单元PE & 单窗口卷积块CU 文章目录 03--单格乘加运算单元PE & 单窗口卷积块CU前言单格乘加运算单元PE代码模块结构时序逻辑分析对其上层模块CU的要求 单窗口卷积块CU代码逻辑分析 前言 ​ 第一和第二篇日志已经详细阐述了"半精度浮点数"的加…

Strtok函数切割字符串(附代码演示)

目录 1.认识Strtok函数 2.Strtok函数使用认识 3.Strtok使用代码示例 1.认识Strtok函数 C语言中的strtok函数是用来将字符串分割成若干个子串的函数。它的原型如上图所示 char *strtok(char *str, const char *delimiters);函数参数str为要被分割的字符串&#xff0c;参数del…

95 # express 二级路由的实现

上一节实现了兼容老的路由写法&#xff0c;这一节来实现二级路由 二级路由实现核心&#xff1a; 进入中间件后&#xff0c;让对应的路由系统去进行匹配操作中间件进去匹配需要删除 path&#xff0c;存起来出去时在加上 示意图&#xff1a; 代码实现如下&#xff1a; rout…

护理不良事件成因分析及预防措施,你知道哪些

不良事件上报管理系统源码 护理不良事件主要成因分析 1&#xff0e;查对制度不严&#xff1a;因不认真执行各种查对制度&#xff0c;而在实际护理工作中出现的不良事件仍占较高比例。具体表现在用药查对不严&#xff0c;只喊床号&#xff0c;不喊姓名&#xff0c;致使给患者输错…

【算法练习Day5】有效的字母异位词 两个数组的交集快乐数两数之和

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 有效的字母异位词两个数…

基于springboot+vue的青年公寓服务平台

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

K8SYaml文件详解及编写示例

文章目录 一.Yaml文件详解1.Yaml文件格式2.YAML 语法格式 二.Yaml文件编写及相关概念1.查看 api 资源版本标签2.yaml编写案例&#xff08;1&#xff09;相关标签介绍&#xff08;2&#xff09;Deployment类型编写nginx服务&#xff08;3&#xff09;k8s集群中的port介绍&#x…

Unity 内存性能分析器 (Memory Profiler)

一、 安装 安装有两种方式一&#xff1a; add package : com.unity.memoryprofiler方式二&#xff1a; From Packages : Unity Registry 搜索 Memory Profiler 二、 使用 打开&#xff1a;Windows - > Analysis - > Memory Profiler 打开MemoryProfiler界面&#xff0…

深入学习JVM(Java虚拟机)

目录 一.JDK、JRE、JVM的关系 1.1JDK(Java SE Development Kit) 1.2JRE( Java Runtime Environment) 1.3JVM(Java Virtual Machine) 1.4JDK、JRE、JVM的区别与联系 二.Class的生命周期 2.1加载 2.1.1 类加载器 2.1.2类加载机制 2.1.3双亲委派 2.2链接 2.2.1验证 2…

antd-vue 级联选择器默认值不生效解决方案

一、业务场景&#xff1a; 最近在使用Vue框架和antd-vue组件库的时候&#xff0c;发现在做编辑回显时** 级联选择器** 组件的默认值不生效。为了大家后面遇到和我一样的问题&#xff0c;给大家分享一下 二、bug信息&#xff1a; 三、问题原因&#xff1a; 确定不了唯一的值&a…