springboot gateway

一、部署

1、创建springboot项目

2、添加maven依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
    <version>4.3.0</version>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>2023.0.3.3</version>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    <version>2023.0.3.3</version>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
    <version>4.1.0</version>
</dependency>
  • spring-cloud-starter-loadbalancer依赖必须要有,否则可能出问题。
  • 问题:“ NotFoundException: 503 SERVICE_UNAVAILABLE "Unable to find instance for ***"
  • 问题及解决:https://blog.csdn.net/Hello_World_QWP/article/details/141029160
  • nacos-discovery 将gateway注册到注册中心,配置路由时可以配置项目名称
  • nacos-config 可以将gateway的配置配置在nacos配置中心
  • 3、yml配置

    spring:
      config:
        import:
          - nacos:test_yaml
          - nacos:test_gateway
          - nacos:test_group?group=group1
      application:
        name: ms-gateway-service
      cloud:
        nacos:
          discovery:
            server-addr: 192.168.244.131:8848
          config:
            server-addr: 192.168.244.131:8848
            file-extension: yaml

    gateway配置,路由

    spring:
      cloud:
        gateway:
          server:
            webflux:
              routes:
                - id: mstickservice #路由规则id,自定义,唯一
                  uri: lb://mstickservice  #路由目标的微服务,lb代表负载均衡
                  predicates:  #路由断言,判断请求是否符合规则,符合则路由到目标
                    - Path= /testaa/** #以请求路径做判断,以/user开头的符合
              discovery:
                locator:
                  enabled: true

  • gateway项目端口9090,mstickservice 项目 9902
  • 以上配置:访问路径 http://localhost:9090/testaa/pcValue  可以直接路由到mstickservice 项目的 /testaa/pcValue  接口
  • 二、gateway配置

    1.路由配置 (spring.cloud.gateway.routes)

    spring:
      cloud:
        gateway:
          routes:
            - id: users-route
              uri: lb://user-service # 使用服务发现
              predicates:
                - Path=/users/**
              filters:
                - AddRequestHeader=X-Request-Frontend-Id, Gateway

    路由是网关的基础,定义了HTTP请求如何从网关转发到后端服务。基本结构包含:

  • id:路由的唯一标识。
  • uri:请求转发的目标地址,可以是实际URL或服务名称(配合服务发现使用)。
  • predicates:谓词集合,用于决定请求是否应该由该路由处理。常见的谓词有Path、Host、Method等。
  • filters:过滤器集合,可以在请求转发前后对请求或响应进行修改。
  • 2. 负载均衡配置

  • spring.cloud.loadbalancer.ribbon.enabled=false:禁用Ribbon,使用Spring Cloud LoadBalancer。
  • spring.cloud.gateway.discovery.locator.enabled=true:启用服务发现定位器,自动为每个服务创建路由。
  • spring.cloud.gateway.discovery.locator.lower-case-service-id=true:将服务ID转换为小写。
  • 3. 全局过滤器配置

    可以在全局级别定义过滤器,应用于所有路由:

    spring:
      cloud:
        gateway:
          default-filters:
            - AddResponseHeader=X-Response-Default, Default-Value

    3.1、例子:

    1.gateway  yml配置

    spring:
      cloud:
        gateway:
          server:
            webflux:
              default-filters:
                - AddRequestHeader=name,zhangsan
              routes:
                - id: mstickservice #路由规则id,自定义,唯一
                  uri: lb://mstickservice  #路由目标的微服务,lb代表负载均衡
                  predicates:  #路由断言,判断请求是否符合规则,符合则路由到目标
                    - Path= /testaa/** #以请求路径做判断,以/user开头的符合
                - id: mstickservice2
                  uri: lb://mstickservice
                  predicates:
                    - Path= /testbb/**
              discovery:
                locator:
                  enabled: true

    2.mstickservice服务接口

    @RestController
    @RequestMapping("testbb")
    public class TestBBController {
    
        @RequestMapping("tfilter")
        @ResponseBody
        public String tfilter(@RequestHeader(value = "name", required = false) String name) {
            System.out.println("name====>" +name);
            return name;
        }
    }
    

    3. 访问:http://localhost:9090/testbb/tfilter

    image

    3.2、自定义全局过滤器

    实现GlobalFilter接口的filter方法

    @Component
    public class MyGlobalFilter implements GlobalFilter,Ordered {
        @Override
        public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
            ServerHttpRequest request = exchange.getRequest();
    
            URI uri = request.getURI();
            System.out.println("请求的uri=========>"+uri);
            //过滤器的业务处理
            System.out.println("执行了业务处理");
            //放行
            return chain.filter(exchange);
        }
    
    
        //过滤器执行顺序,数值越小,优先级越高
        @Override
        public int getOrder() {
            return 0;
        }
    }
    

    访问:http://localhost:9090/testbb/tfilter   可以看到自定义的全局过滤器已经被执行了。

    image

    4. 跨域配置 (spring.cloud.gateway.globalcors.cors-configurations)

    定义跨域资源共享(CORS)策略:

    spring:
      cloud:
        gateway:
          globalcors:
            cors-configurations:
              '[/**]':
                allowedOrigins: "*"
                allowedMethods: "*"

    5. 认证与鉴权

    虽然不是直接的配置项,但可以通过配置过滤器(如JWT、OAuth2等)实现认证和授权逻辑。

    6. 日志与跟踪

    配置日志级别和追踪信息,例如使用logging.level.org.springframework.cloud.gateway=DEBUG来查看更详细的调试信息。

    7. 性能与限制

    可以配置请求速率限制、连接池大小等来优化性能和保护后端服务:

    spring:
      cloud:
        gateway:
          request-predicates:
            - name: RequestRateLimiter
              args:
                redis-rate-limiter.replenishRate: 10
                redis-rate-limiter.burstCapacity: 20

    8. SSL/TLS配置

    配置SSL证书以支持HTTPS通信,这通常涉及到服务器的SSL/TLS设置而非直接在网关配置中设置,但可以通过环境变量或应用属性间接影响。

    9.局部过滤器

    9.1、简单的在yml配置文件种进行实现

    spring:
      cloud:
        gateway:
          server:
            webflux:
              default-filters:
                - AddRequestHeader=name,zhangsan
              routes:
                - id: mstickservice3
                  uri: lb://mstickservice
                  predicates:
                    - Path= /testcc/**
                  filters:
                    - AddRequestHeader=name2,lisi

    9.2、继承AbstractGatewayFilterFactory类,并重写GatewayFilter方法:

    局部过滤器:局部过滤器仅应用于特定的路由规则。你可以使用GatewayFilterFactory接口和它的子类来实现局部过滤器

    //固定的GatewayFilterFactory类名后缀,方便配置使用
    //局部的过滤器配置完不能立即生效,还要再yml配置文件种添加filters过滤参数
    //这个参数为TicketGatewayFilterFactory类名的前一部分:Ticket
    @Component
    public class TicketGatewayFilterFactory extends AbstractGatewayFilterFactory<Object> {
        @Override
        public GatewayFilter apply(Object config) {
            return new OrderedGatewayFilter((exchange, chain) -> {
                ServerHttpRequest request = exchange.getRequest();
                URI uri = request.getURI();
                System.out.println(" 路径为" + uri);
                System.out.println(" ticket模块的局部过滤器");
                return chain.filter(exchange);
            }, 2);
        }
    }
    
    spring:
      cloud:
        gateway:
          server:
            webflux:
              default-filters:
                - AddRequestHeader=name,zhangsan
              routes:
                - id: mstickservice3
                  uri: lb://mstickservice
                  predicates:
                    - Path= /testcc/**
                  filters:
                    - Ticket


    整理自:https://developer.aliyun.com/article/1505723

    https://blog.csdn.net/2301_78646673/article/details/134477364

    posted @ 2025-09-03 17:55  pk.com.cn  阅读(22)  评论(0)    收藏  举报