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
相关推荐
caihuayuan57 分钟前
全文索引数据库Elasticsearch底层Lucene
java·大数据·vue.js·spring boot·课程设计
冼紫菜18 分钟前
Spring 项目无法连接 MySQL:Nacos 配置误区排查与解决
java·spring boot·后端·mysql·docker·springcloud
诸葛小猿44 分钟前
Pdf转Word案例(java)
java·pdf·word·格式转换
yuren_xia1 小时前
Spring MVC中跨域问题处理
java·spring·mvc
计算机毕设定制辅导-无忧学长1 小时前
ActiveMQ 源码剖析:消息存储与通信协议实现(二)
java·activemq·java-activemq
一个憨憨coder1 小时前
Spring 如何解决循环依赖问题?
java·后端·spring
钢铁男儿1 小时前
深入解析C#参数传递:值参数 vs 引用参数
java·开发语言·c#
学渣676562 小时前
.idea和__pycache__文件夹分别是什么意思
java·ide·intellij-idea
purrrew2 小时前
【Java ee 初阶】多线程(9)上
java·java-ee
深色風信子2 小时前
Eclipse 插件开发 5 编辑器
java·eclipse·编辑器