Spring Cloud:Gateway配置

    技术2022-07-11  146

    简介

    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; } }
    Processed: 0.009, SQL: 9