简介
Spring Cloud Gateway是Spring官方基于Spring 5.0,Spring Boot 2.0和Project Reactor等技术开发的网关,Spring Cloud Gateway旨在为微服务架构提供一种简单而有效的统一的API路由管理方式。Spring Cloud Gateway作为Spring Cloud生态系中的网关,目标是替代ZUUL,其不仅提供统一的路由方式,并且基于Filter链的方式提供了网关基本的功能,例如:安全,监控/埋点,和限流等。
Spring Cloud Gateway基于 Spring Boot 2.x,Spring WebFlux 和 Project Reactor 构建,使用了 Webflux 中的 reactor-netty 响应式编程组件,底层使用了 Netty 通讯框架。
功能:
反向代理鉴权流量控制熔断日志监控…
gateway在微服务架构中的位置:
三大概念:
Route(路由):路由是构建网关的基本模块,它由 ID、目标 URI、一系列的断言和过滤器组成,如果断言为 true 则匹配该路由
Predicate(断言):参考的是 Java8 中的 java.util.function.Predicate。开发人员可以匹配 HTTP 请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由
Filter(过滤):指的是 Spring 框架中 GatewayFilter 的实例,使用过滤器,可以在请求被路由之前或之后对请求进行修改
工作流程:
客户端向 Spring Cloud Gateway 发出请求。如果网关处理程序映射确定请求与路由匹配,则将其发送到网关 Web 处理程序。该处理程序通过特定于请求的过滤器链来运行请求。 **筛选器由虚线分隔的原因是,筛选器可以在发送代理请求之前和之后运行逻辑。**所有 “前置“ 过滤器逻辑均被执行,然后发出代理请求,发出代理请求后,将运行“ 后置 ”过滤器逻辑。
POM
<dependency>
<groupId>org.springframework.cloud
</groupId>
<artifactId>spring-cloud-starter-gateway
</artifactId>
</dependency>
两种配置gateway的方式
YML配置
uri两种写法:
指定具体的主机:如http://localhost:8080(动态路由)根据微服务名:如lb://微服务名 predicates:有如下11种,具体示例看官网
AfterBeforeBetweenCookieHeaderHostMethodPathQueryRemotedAddrWeight
server:
port: 9527
spring:
application:
name: cloud
-gateway
cloud:
consul:
port: 8500
host: localhost
discovery:
prefer-ip-address: true
service-name: $
{spring.application.name
}
instance-id: consul
-gateway
gateway:
routes:
- id: payment_1
uri: lb
://cloud
-provider
predicates:
- Path=/payment/getServerPort
编码配置
import org
.springframework
.cloud
.gateway
.route
.RouteLocator
;
import org
.springframework
.cloud
.gateway
.route
.builder
.RouteLocatorBuilder
;
import org
.springframework
.context
.annotation
.Bean
;
import org
.springframework
.context
.annotation
.Configuration
;
@Configuration
public class RoutesGateWayConfig {
@Bean
public RouteLocator
customRoutes(RouteLocatorBuilder builder
) {
return builder
.routes()
.route("payment_02"
,r
-> r
.path("/payment/getAppName")
.uri("http://localhost:8001"))
.route("payment_03"
,r
-> r
.path("/consul/provider/test")
.uri("lb://cloud-provider"))
.build();
}
}
自定全局Filter
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
;
@Component
public class GlobalGatewayFilter implements GlobalFilter, Ordered
{
@Override
public Mono
<Void> filter(ServerWebExchange exchange
, GatewayFilterChain chain
) {
String username
= exchange
.getRequest().getQueryParams().getFirst("username");
if (username
== null
) {
exchange
.getResponse().setStatusCode(HttpStatus
.NOT_ACCEPTABLE
);
return exchange
.getResponse().setComplete();
}
return chain
.filter(exchange
);
}
@Override
public int getOrder() {
return 0;
}
}