Spring Cloud:Gateway配置

简介

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在微服务架构中的位置:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X9hBqhGg-1593577845519)(G:\微云同步\同步文件\Microsoft同步\文档\images\gateway.png)]

三大概念:

  • Route(路由):路由是构建网关的基本模块,它由 ID、目标 URI、一系列的断言和过滤器组成,如果断言为 true 则匹配该路由

  • Predicate(断言)参考的是 Java8 中的 java.util.function.Predicate。开发人员可以匹配 HTTP 请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由

  • Filter(过滤):指的是 Spring 框架中 GatewayFilter 的实例,使用过滤器,可以在请求被路由之前或之后对请求进行修改

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V4nq4Tgx-1593577845522)(G:\微云同步\同步文件\Microsoft同步\文档\images\gateway-three-concept.png)]

工作流程:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d1oKHmGM-1593577845523)(G:\微云同步\同步文件\Microsoft同步\文档\images\work-process.png)]

客户端向 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种,具体示例看官网
    • After
    • Before
    • Between
    • Cookie
    • Header
    • Host
    • Method
    • Path
    • Query
    • RemotedAddr
    • Weight
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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DeathAndLife

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值