Spring Cloud Gateway

目录

一、Gateway初始化

  1. 添加依赖
xml 复制代码
<!--gateway 依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- nacos依赖 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 负载均衡器 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
  1. 开启默认路由规则(使得localhost/order会自动去Nacos找order服务)
yml 复制代码
server:
  port: 80
spring:
  application:
    name: gateway
  cloud:
    gateway:
      discovery:
        locator:
          # 开启默认的路由规则,会根据注册中心中的服务名作为路径实现理由规则
          enabled: true
  1. 启动类
java 复制代码
@SpringBootApplication
@EnableDiscoveryClient
public class GatewayStaterApp {
    public static void main(String[] args) {
        SpringApplication.run(GatewayStaterApp.class, args);
    }
}

二、自定义路由配置

yml方式

yml 复制代码
spring:
  cloud:
    gateway:
      routes:
        - predicates:
            - Path=/order/**
          uri: http://localhost:8082/order

Java类方式

java 复制代码
package com.hxd.config;

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 GatewayRoutesConfig {

    @Bean
    public RouteLocator routeLocator(RouteLocatorBuilder routeLocatorBuilder) {
        return routeLocatorBuilder.routes()
                .route(route ->
                        route.path("/order/**")
                                .uri("lb://order")).build();
    }
}

三、断言

官网提供的断言类型

  1. After:在给定的时间之后
  2. Before:在给定的时间之前
  3. Between:在给定的时间之间,使用逗号隔开
  4. Cookie:cookie中含有该name并且值匹配表达式
  5. Header:Header中包含该key,并且值匹配表达式
  6. Host:匹配host name
  7. Method:匹配请求方法
  8. Paht:匹配给定的请求路径
  9. Query:请求中包含该请求参数
  10. RemoteAddr: 请求的远程地址匹配
  11. Weight:设置权重
  12. XForwardedRemoteAddr: 如果 X-Forwarded-For 头包含,则此路由匹配

四、Filter

Filter是在网关通过断言判断需要转发后,将请求转发给服务前服务返回结果后,增加一些逻辑

Spring Could Gateway自带的Filter

官网Filter

常用Filter

  1. AddRequestHeader
  2. AddRequestParameter
  3. AddResponseHeader
  4. StripPrefix
  5. DefaultFilter 全局过滤器

自定义Filter

自定义filter需要实现两个接口:

  • GlobalFilter
  • Ordered
java 复制代码
package com.hxd.filter;

import com.alibaba.nacos.common.utils.StringUtils;
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.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

@Component
public class ParameterGlobalFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        String value = request.getQueryParams().getFirst("key");
        if (StringUtils.isEmpty(value)) {
            System.out.println("不符合条件!!");
            // 不符合条件,返回400
            ServerHttpResponse response = exchange.getResponse();
            response.setStatusCode(HttpStatus.BAD_REQUEST);
            return response.setComplete();
        }
        // 符合条件继续放行
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        // 值越小,优先级越高
        return 0;
    }
}
相关推荐
实在智能RPA4 分钟前
航空Agent落地效果评估指标:2026年企业级智能自动化价值度量体系拆解
java·网络·人工智能·ai·自动化
程序员二叉10 分钟前
【JUC】AQS底层深度拆解|独占/共享模式|队列原理全详解
java·开发语言·面试·juc
地铁潜行者15 分钟前
消息堆积后,为什么一扩容消费者,MySQL 先被打崩了?
java·后端
地铁潜行者19 分钟前
订单状态更新成功了,分账消息却没发出去:聊聊本地消息表的一致性坑
java·后端
亦暖筑序19 分钟前
Java 8老系统SQL Agent实战:AI生成候选SQL,安全引擎拦截后再执行
java·人工智能·sql
CodeStats21 分钟前
《源纹天书》卷一:归元初醒(第1-5章)
java
大囚长24 分钟前
大模型服务端如何命中缓存
java·人工智能·缓存·dubbo
摇滚侠25 分钟前
SpringMVC 入门到实战 拦截器 78-82
java·后端·spring·maven·intellij-idea
椰椰椰耶27 分钟前
[SpringCloud][13]OpenFeign快速上手
后端·spring·spring cloud
磊 子31 分钟前
C++移动语义和智能指针
java·开发语言·c++