前言
分布式系统中,网关是非常重要的角色。一个优秀的网关需要提供以下的特性:
- 构建于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