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
相关推荐
大模型玩家七七17 分钟前
梯度累积真的省显存吗?它换走的是什么成本
java·javascript·数据库·人工智能·深度学习
CodeToGym1 小时前
【Java 办公自动化】Apache POI 入门:手把手教你实现 Excel 导入与导出
java·apache·excel
凡人叶枫1 小时前
C++中智能指针详解(Linux实战版)| 彻底解决内存泄漏,新手也能吃透
java·linux·c语言·开发语言·c++·嵌入式开发
JMchen1231 小时前
Android后台服务与网络保活:WorkManager的实战应用
android·java·网络·kotlin·php·android-studio
阔皮大师1 小时前
INote轻量文本编辑器
java·javascript·python·c#
小法师爱分享2 小时前
StickyNotes,简单便签超实用
java·python
qq_297574672 小时前
Linux 服务器 Java 开发环境搭建保姆级教程
java·linux·服务器
金牌归来发现妻女流落街头2 小时前
【从SpringBoot到SpringCloud】
java·spring boot·spring cloud
毅炼2 小时前
Java 基础常见问题总结(4)
java·后端
张3蜂2 小时前
深入理解 Python 的 frozenset:为什么要有“不可变集合”?
前端·python·spring