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;
    }
}
相关推荐
qq_318121591 小时前
互联网大厂Java面试故事:在线教育微服务架构、缓存优化与AI智能教学全流程解析
java·spring boot·redis·微服务·kafka·spring security·在线教育
sunddy_x2 小时前
Java反射
java
资生算法程序员_畅想家_剑魔2 小时前
Java常见技术分享-分布式篇-分布式系统基础理论
java·开发语言·分布式
色空大师3 小时前
【Result<T>泛型接收转化失败】
java·泛型
Geoking.3 小时前
【设计模式】中介者模式(Mediator)详解
java·设计模式·中介者模式
大猫和小黄3 小时前
Java异常处理:从基础到SpringBoot实战解析
java·开发语言·spring boot·异常
hero.fei3 小时前
kaptcha 验证码生成工具在springboot中集成
java·spring boot·后端
mikelv013 小时前
实现返回树状结构小记
java·数据结构
Duang007_3 小时前
【LeetCodeHot100 超详细Agent启发版本】两数之和 (Two Sum)
java·人工智能·python