GateWay使用

首先创建一个网关服务,添加对应的依赖

XML 复制代码
<dependencies>
  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
  </dependency>
  <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>
</dependencies>

然后修改网关的application.yml

XML 复制代码
spring:
    cloud:
       gateway:
          routes:
             -id: item                #路由id,必须唯一
              uri: lb:://item-service       #lb表示负载均衡,后面的是转发的目标服务
              predicates:              #路由断言,判断请求是否符合以下规则,符合就转发
                  -Path: /items/**,/search/**
              order: 0   #优先级,数字越小优先级越高
              filters:  #拦截器     

路由断言有很多种类型,不多赘述,这里就写一个最常用的path路径匹配,其他查阅资料即可

主要是拦截器部分

①全局过滤器

不需要在yml文件里配置,定义之后直接生效,对全局起作用

java 复制代码
@Component
public class AuthGlobalFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String token = exchange.getRequest().getHeaders().getFirst("Authorization");

        if (token == null || !"admin-token".equals(token)) {
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().setComplete();
        }

        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return -1; // 越小越先执行
    }
}

②自定义局部过滤器 (需要自定义过滤器工厂)

java 复制代码
@Component
public class LogGatewayFilterFactory extends AbstractGatewayFilterFactory<LogGatewayFilterConfig> {

    public LogGatewayFilterFactory() {
        super(LogGatewayFilterConfig.class);
    }

    @Override
    public GatewayFilter apply(LogGatewayFilterConfig config) {
        return (exchange, chain) -> {
            System.out.println("日志过滤器触发: " + config.getMessage());
            if (config.isShowParams()) {
                System.out.println("请求参数:" + exchange.getRequest().getQueryParams());
            }
            return chain.filter(exchange);
        };
    }
}

application.yml使用

XML 复制代码
spring:
  cloud:
    gateway:
      routes:
        - id: test_route
          uri: http://localhost:8080
          predicates:
            - Path=/test/**
          filters:
            - name: LogGatewayFilter
              args:
                message: "正在访问 test 接口"
                showParams: true
相关推荐
xcLeigh14 分钟前
Go入门:变量声明的五种方式详解
java·开发语言·golang
AI大模型-小华35 分钟前
Codex 三方充值快速入门指南
java·前端·数据库·chatgpt·ai编程·codex·chatgpt pro
Mark_ZP1 小时前
【锁1】Synchronized vs ReentrantLock区别
java
立心者02 小时前
SpringBoot中使用TOTP实现MFA(多因素认证)
java·spring boot·后端
枕星而眠2 小时前
C++ STL Map容器完全指南:从有序红黑树到无序哈希表
java·开发语言
逃逸线LOF2 小时前
Spring配置数据源{连接池}(Druid、c3p0)
java·数据库·spring
bbq粉刷匠3 小时前
HashMap 底层原理深度拆解(二):putVal 完整链路解析(懒加载 · 链表遍历 · 尾插法)
java·开发语言·哈希算法
Sam_Deep_Thinking3 小时前
一个靠谱的C端网关服务应该包含什么内容
java·程序员·系统架构
杨运交3 小时前
[055][调度模块]Spring动态任务调度框架的设计与实现
java·后端·spring
白狐_7984 小时前
408 数据结构算法题 01:线性表暴力求解保分指南
java·数据结构·算法