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
相关推荐
JH30732 小时前
SpringBoot 优雅处理金额格式化:拦截器+自定义注解方案
java·spring boot·spring
Coder_Boy_3 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
invicinble3 小时前
对tomcat的提供的功能与底层拓扑结构与实现机制的理解
java·tomcat
较真的菜鸟4 小时前
使用ASM和agent监控属性变化
java
黎雁·泠崖4 小时前
【魔法森林冒险】5/14 Allen类(三):任务进度与状态管理
java·开发语言
qq_12498707535 小时前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计
Coder_Boy_5 小时前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
Mr_sun.5 小时前
Day06——权限认证-项目集成
java
瑶山5 小时前
Spring Cloud微服务搭建四、集成RocketMQ消息队列
java·spring cloud·微服务·rocketmq·dashboard
abluckyboy5 小时前
Java 实现求 n 的 n^n 次方的最后一位数字
java·python·算法