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;
    }
}
相关推荐
lee_curry6 小时前
第四章 jvm中的垃圾回收器
java·jvm·垃圾收集器
九转成圣7 小时前
Java 性能优化实战:如何将海量扁平数据高效转化为类目字典树?
java·开发语言·json
直奔標竿7 小时前
Java开发者AI转型第二十七课!Spring AI 个人知识库实战(六)——全栈闭环收官,解锁前端流式渲染终极技巧
java·开发语言·前端·人工智能·后端·spring
金銀銅鐵8 小时前
[java] 编译之后的记录类(Record Classes)长什么样子(上)
java·jvm·后端
野生技术架构师10 小时前
金三银四面试总结篇,汇总 Java 面试突击班后的面试小册
java·面试·职场和发展
小袁拒绝摆烂10 小时前
多表关联大平层转JSON树形结构
java·json
ja哇11 小时前
大厂面试高频八股
java·面试·职场和发展
yoyo_zzm11 小时前
Laravel6.x新特性全解析
java·spring boot·后端
Nick_zcy11 小时前
小说在线阅读网站和小说管理系统 · 功能全解析
java·后端·python·springboot·ruoyi