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;
    }
}
相关推荐
2601_9637491012 分钟前
越华环保集团数字化污水治理:端边云采集架构与平台对接实现
java·大数据·架构
xcLeigh35 分钟前
Go入门:整数类型的溢出与安全边界
java·安全·golang
源码宝1 小时前
SpringBoot+Vue2 诊所门诊管理系统,完整前后端源码,可直接部署上线
java·源码·his系统·门诊系统·程序代码·诊所系统·门诊his
yychen_java1 小时前
九:Text-to-SQL 智能数据查询与 Human-in-the-Loop 人机协作
java·人工智能·架构
lhldsg2 小时前
智慧场馆解决方案小程序开发实战:从架构设计到部署指南
java·小程序·uni-app
Freak嵌入式3 小时前
Pico UART 数据收发实战:硬件配置、MicroPython 编程
java·开发语言·单片机·嵌入式硬件·生活
devilnumber3 小时前
Oracle 与 MySQL substr 函数差异总结
java·数据库·mysql·oracle
cfm_29144 小时前
线程池阻塞队列
java·开发语言
YOU OU4 小时前
优雅实现远程调用-OpenFeign
spring cloud
坐吃山猪4 小时前
【多线程】ThreadPool线程池参数说明
java·网络