cloud-网关

本文深入解析Spring Cloud Gateway的特性与配置,涵盖路由、谓词、过滤器等核心概念,展示如何构建高性能网关,实现请求路由、限速、断路器等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

分布式系统中,网关是非常重要的角色。一个优秀的网关需要提供以下的特性:

  • 构建于Spring Framework 5、Project Reactor和Spring Boot 2.0之上。
  • 能够匹配任何请求属性上的路由。
  • 谓词和过滤器是特定于路由的。
  • Hystrix断路器集成。
  • Spring Cloud发现客户端集成。
  • 易于编写谓词和过滤器。
  • 请求速率限制。
  • 路径重写。

spring cloud gateway

spring cloud gateway就是这样一个满足上诉所有特性的网关。下面是基本的配置:

@SpringBootApplication
public class DemogatewayApplication {
	@Bean
	public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
		return 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("hystrix_route", r -> r.host("*.hystrix.org")	//断路器匹配
				.filters(f -> f.hystrix(c -> c.setName("slowcmd")))
				.uri("http://httpbin.org"))
			.route("hystrix_fallback_route", r -> r.host("*.hystrixfallback.org")	//断路器
				.filters(f -> f.hystrix(c -> c.setName("slowcmd").setFallbackUri("forward:/hystrixfallback")))	//断路备选路径
				.uri("http://httpbin.org"))
			.route("limit_route", r -> r	//限制请求速率
				.host("*.limited.org").and().path("/anything/**")
				.filters(f -> f.requestRateLimiter(c -> c.setRateLimiter(redisRateLimiter())))
				.uri("http://httpbin.org"))
			.build();
	}
}

当然也可以用properties或yml文件配置:

简单版:

spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: https://example.org
        predicates:
        - Cookie=mycookie,mycookievalue

完全版:

spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: https://example.org
        predicates:
        - name: Cookie
          args:
            name: mycookie
            regexp: mycookievalue

使用上面的基本配置之后,就可以搭建一个简单的网关了。

术语

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

总览

下图提供了Spring Cloud Gateway如何工作的高层概述:
在这里插入图片描述
客户端向Spring Cloud Gateway发出请求。如果Gateway Handler Mapping确定了一个请求与一个路由匹配,那么它将被发送到Gateway Web Handler。此处理程序通过特定于该请求的筛选器链运行该请求。过滤器被虚线分割的原因是过滤器可以在发送代理请求之前和之后运行逻辑。所有的“pre”过滤器逻辑被执行。然后发出代理请求。发出代理请求后,将运行“post”过滤器逻辑。

在没有端口的路由中定义的uri对于HTTP和HTTPS uri分别获得默认端口值80和443。

Route谓词工厂

Spring Cloud Gateway将路由匹配为Spring WebFlux HandlerMapping基础设施的一部分。Spring Cloud Gateway包括许多内置的路由谓词工厂。所有这些谓词都匹配HTTP请求的不同属性。您可以使用逻辑和语句组合多个路由谓词工厂。

GatewayFilter工厂

路由过滤器允许以某种方式修改传入HTTP请求或传出HTTP响应。路由筛选器的作用域是特定的路由。Spring Cloud Gateway包括许多内置的网关过滤器工厂。

全局过滤器

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

HttpHeadersFilters

HttpHeadersFilters在向下游发送请求之前应用于请求,例如在NettyRoutingFilter中。

TLS and SSL

配置网关为https:

server:
  ssl:
    enabled: true
    key-alias: scg
    key-store-password: scg1234
    key-store: classpath:scg-keystore.p12
    key-store-type: PKCS12

配置网关代理:

信任所有证书:

spring:
  cloud:
    gateway:
      httpclient:
        ssl:
          useInsecureTrustManager: true

信任指定证书:

spring:
  cloud:
    gateway:
      httpclient:
        ssl:
          trustedX509Certificates:
          - cert1.pem
          - cert2.pem

配置TLS握手

spring:
  cloud:
    gateway:
      httpclient:
        ssl:
          handshake-timeout-millis: 10000
          close-notify-flush-timeout-millis: 3000
          close-notify-read-timeout-millis: 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值