06-gateway

什么是gateway?

官方文档:Spring Cloud Gateway

Gateway是一种常见的网络架构模式,它充当了传递请求和响应的中间层,位于客户端和服务器之间。Gateway的主要作用是提供高性能、低延迟的请求转发和路由功能,并提供一些额外的功能,如安全性、负载均衡、缓存、限流等。

具体来说,Gateway的功能包括:

  1. 请求转发和路由:Gateway接收来自客户端的请求,并将其转发到后端的多个服务实例中。可以根据不同的URL、端口、路径等条件进行路由选择,从而实现请求的分发和负载均衡。

  2. 安全性控制:Gateway可以提供一些安全性控制手段,如身份验证、鉴权、数据加密等,以确保只有经过授权的用户或服务可以访问后端服务。

  3. 缓存和缓存控制:Gateway可以缓存一些静态资源或重复的请求结果,以减轻后端服务的负载并提高请求的响应速度。同时,Gateway还可以提供缓存控制机制,如设置过期时间、缓存失效策略等。

  4. 限流和熔断:Gateway可以对请求进行限流和熔断处理,以防止请求过载导致系统崩溃。可以设置请求的最大并发数、QPS限制等来保护后端服务的稳定性和可用性。

  5. 监控和日志:Gateway通常会记录请求的日志、监控和统计数据,以便进行故障排查、性能优化和资源管理。

总的来说,Gateway提供了一个中心化的入口,使得各个后端服务可以更加简单、高效地提供服务,并能够进行统一的管理和控制。它可以提供更好的性能、安全性和可用性,并具备更好的扩展性和灵活性,适用于大型分布式系统的架构设计。

一、gateway使用

  1. 添加配置

    spring:
      cloud:
        gateway:
          routes:
            - id: route1
              uri: http://example.com  # 目标服务的URI
              predicates:
                - Path=/path1/**
              filters:
                - AddRequestHeader=X-Forwarded-Host, example.com
                - StripPrefix=1   #转发前去掉第一层路径

二、集成Nacos

  1. 添加配置

    spring:
      cloud:
        gateway:
          routes:
            - id: route1
              uri: lb://order-service  # nacos注册服务名
              predicates:
                - Path=/path1/**
              filters:
                - AddRequestHeader=X-Forwarded-Host, example.com
       	nacos:
        	discovery:
          	server-addr: 192.x.x.x
            username: xxx
            password: xxx

三、断言工厂

  1. 内置断言工厂

    1. After:根据请求的时间进行匹配,比如 After=2022-01-01T00:00:00+08:00[Asia/Shanghai] 表示只有在指定时间之后的请求会匹配该断言。

    2. Before:根据请求的时间进行匹配,比如 Before=2022-12-31T23:59:59+08:00[Asia/Shanghai] 表示只有在指定时间之前的请求会匹配该断言。

    3. Between:根据请求的时间范围进行匹配,比如 Between=2022-01-01T00:00:00+08:00[Asia/Shanghai], 2022-12-31T23:59:59+08:00[Asia/Shanghai] 表示只有在指定时间范围内的请求会匹配该断言。

    4. Cookie:根据请求的Cookie进行匹配,比如 Cookie=SESSIONID, ABC123 表示只有包含名为 SESSIONID 的Cookie且其值为 ABC123 的请求会匹配该断言。

    5. Header:根据请求头进行匹配,比如 Header=Content-Type, application/json 表示只有请求头中包含 Content-Type 并且其值为 application/json 的请求会匹配该断言。

    6. Host:根据请求的主机名进行匹配,比如 Host=example.com 表示只有请求的主机是 example.com 才会匹配该断言。

    7. Method:根据请求方法进行匹配,比如 Method=GET 表示只有GET请求会匹配该断言。

    8. Path:根据请求路径进行匹配,比如 Path=/path1/** 表示请求路径以 /path1/ 开头的请求会匹配该断言。

    9. Query:根据请求的查询参数进行匹配,比如 Query=foo=bar 表示只有查询参数中有 foo=bar 的请求会匹配该断言。

    10. RemoteAddr:根据请求的远程地址进行匹配,比如 RemoteAddr=192.168.1.1/24 表示只有来自IP地址为 192.168.1.1 的请求会匹配该断言。

  2. 自定义断言工厂

    1. 创建一个实现GatewayPredicateFactory接口的自定义断言工厂类。例如:

      import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
      import org.springframework.stereotype.Component;
      import org.springframework.web.server.ServerWebExchange;
      
      @Component
      public class CustomPredicateFactory extends AbstractRoutePredicateFactory<CustomPredicateFactory.Config> {
      
          public CustomPredicateFactory() {
              super(Config.class);
          }
      
          @Override
          public GatewayPredicate apply(Config config) {
              return (exchange) -> {
                  // 在这里编写自定义的匹配逻辑
                  // 返回true表示断言匹配成功,返回false表示断言匹配失败
              };
          }
      
          public static class Config {
              // 这里可以定义一些配置参数
          }
      }
      
    2. 在自定义断言工厂类上添加@Component注解,将其作为Spring Bean进行注册。

    3. 在网关的配置文件(如application.yml)中使用自定义的断言工厂,例如:

      spring:
        cloud:
          gateway:
            routes:
              - id: route1
                uri: http://example.com
                predicates:
                  - Custom=foo

      在上述配置中,Custom是自定义断言工厂类的名称,foo是断言工厂的配置参数。

四、过滤器

  1. AddRequestHeader过滤器:添加请求头。

    filters:
      - AddRequestHeader=X-Request-Id, 123
  2. AddResponseHeader过滤器:添加响应头。

    filters:
      - AddResponseHeader=X-Response-Foo, Bar

  3. RewritePath过滤器:重写路径。可以根据正则表达式将请求路径进行重写。

    filters:
      - RewritePath=/foo/(?<segment>.*), /$\\{segment}
  4. SetPath过滤器:设置请求路径。

    filters:
      - SetPath=/new-path
  5. SetRequestHeader过滤器:设置请求头的值。

    filters:
      - SetRequestHeader=X-Foo, Bar
  6. SetResponseHeader过滤器:设置响应头的值。

    filters:
      - SetResponseHeader=X-Response-Foo, Bar
  7. Retry过滤器:实现请求重试机制。

    filters:
      - name: Retry
        args:
          retries: 3
          statuses: BAD_GATEWAY

五、相关配置

  1. 日志配置

  2. 跨域配置

    spring:
      cloud:
        gateway:
          globalcors:
            cors-configurations:
              '[/**]':
                allowedOrigins: "https://docs.spring.io"
                allowedMethods:
                - GET

六、整合sentine

  1. 添加依赖

    <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
            </dependency>
  2. 添加配置

    spring:
      cloud:
        sentinel:
          transport:
            dashboard: localhost:8080

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值