统一服务入口——Spring Cloud Gateway

一、快速上手

1.1 准备工作

API网关也是一个服务

一、创建网关服务


二、添加依赖

XML 复制代码
        <!--⽹关-->
        <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>
        <!--网关服务也需要loadbalancer将服务名转换为对应的IP地址-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>

三、编写启动类

java 复制代码
@SpringBootApplication
public class GatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class,args);
    }
}

四、添加配置

java 复制代码
server:
  port: 10030
spring:
  application:
    name: gateway
  cloud:
    nacos: #将网关服务注册到nacos
      discovery:
        server-addr: 110.41.17.130:8848
    gateway:
      routes: #网关路由设置
        - id: order-service #路由规则id,随便起,不重复即可
          uri: lb://order-service/ #目标服务地址
          predicates: #路由条件
            - Path=/order/**,/feign/**

其中,id可以随便起一个,uri中的lb表示负载均衡,predicates表示路由条件(在当前配置表示所有路径符合Path规则的请求,都会代理到uri参数指定的地址)


1.2 测试

(1)访问订单服务

(2)访问商品服务

可以看到,只有已配置的路由才可以通过gateway服务访问,未配置的路由无法访问


二、Route Predicate Factories

我们可能对于配置中的一些配置存有疑问,现在我们深入了解上述配置的predicates

2.1 Predicate

Predicate是Java8提供的一个函数式编程接口,它接收一个参数并返回一个布尔值,用于条件过滤、请求参数的校验。

使用示例:

java 复制代码
/*
* 判断字符串是否为空
* 空 -true
* 非空 -false
* */
public class StringPredicate implements Predicate<String> {

    @Override
    public boolean test(String s) {
        return s == null || s.isEmpty();
    }
}

接下来,调用方法进行测试:

java 复制代码
    public void test(){
        Predicate<String> predicate = new StringPredicate();
        System.out.println(predicate.test(""));
    }

Predicate的其它方法:


2.2 Route Predicate Factories

Route Predicate Factories(路由断言工厂),由Predicate提供路由规则的匹配机制。

在配置文件中所写得断言规则只是字符串,这些字符串被Route Predicate Factories处理后转变为路由得判断条件,如:下图的Path属性就是匹配url前缀是product/ 或 feign/ 的请求

Spring Cloud Gateway 默认提供了很多Route Predicate Factory,这些Predicate会分别匹配HTTP请求的不同属性,并且多个Predicate通过and逻辑进行组合

在前面的代码中已经测试了Path属性,现在再添加一个Predicate After:

java 复制代码
          predicates: #路由条件
            - Path=/order/**,/feign/**
            - After=2026-01-20T17:42:47.789-07:00[America/Denver]

可以看到After属性配置为2026年后才可访问,现在再次测试:

注释After配置,访问成功:


2.3 Gateway Filter Factories(网关过滤工厂)

Predicate决定了请求由哪个路由处理,如果需要再请求前后加上一些逻辑,就需要使用Filter。

Filter分为两种类型:

1> Pre 类型过滤器:请求处理前执行,可以做鉴权、限流等工作

2> Post 类型过滤器:请求处理后、返回客户端前执行

Spring Cloud Gateway中内置很多Filter,用于拦截和链式处理Web请求(权限校验、访问超时等处理),Spring Cloud Gateway 将Filter分为两类:

GatewayFilte(应用到单个路由或一个分组路由上)

GlobalFilter(应用到所有路由)

2.3.1 GatewayFilter

这里以其中一个Filer(AddRequestParam)为例

一、添加配置

java 复制代码
      routes:
        - id: order-service #路由规则id,随便起,不重复即可
          uri: lb://order-service/ #目标服务地址
          predicates: #路由条件
            - Path=/order/**,/feign/**
          filters:
            - AddRequestParameter=userName, wangwu

与predicates同级,这个Filter给Path中指定请求添加一个参数userName


二、修改feign/o1代码(添加一个参数userName)


三、测试

成功添加参数userName

想了解其它过滤器可以访问Spring官网: GatewayFilter Factories :: Spring Cloud Gateway


2.3.2 GlobalFilter

Spring Cloud Gateway中内置的全局过滤器也有很多,如:

**•**Gateway Metrics Filter:网关指标,提供监控指标

**•**Forward Routing Filter:用于本地forword,请求不转发到下游服务器

LoadBalancer Client Filter:针对下游服务,实现负载均衡

更多全局过滤器可参考官网:Global Filters :: Spring Cloud Gateway

这里我们只练习使用 Gateway Metrics Filter:

一、添加依赖

XML 复制代码
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

二、添加配置

XML 复制代码
spring:
  cloud:
    gateway:
      metrics:
        enabled: true
management:
  endpoints:
    web:
      exposure:
        include: "*"
  endpoint:
    health:
      show-details: always
    shutdown:
      enabled: true

三、测试

访问127.0.0.1:10030/actuator,显示所有监控的信息链接:


2.4 过滤器执行顺序

一个项目中既有GatewayFilter又有GlobalFilter时,执行的先后顺序是什么呢?

请求路由后,网关会将当前的GatewayFilter和GlobalFilter合并到一个过滤器链中,进行排序,依次执行过滤,每一个过滤器都必须指定⼀个int类型的order值,默认值为0,表示该过滤的优先级。order值越小,优先级越高,执行顺序越靠前

• Filter通过实现Order接口或者添加@Order注解来指定order值。

• Spring Cloud Gateway提供的Filter由Spring指定。用户也可以自定义Filter,由用户指定。

• 当过滤器的order值⼀样时,会按照 defaultFilter > GatewayFilter > GlobalFilter的顺序执行。

相关推荐
程序员JerrySUN1 小时前
Linux 内核基础统简全解:Kbuild、内存分配和地址映射
java·linux·运维·服务器·嵌入式硬件·缓存·文件系统
lixzest2 小时前
快速梳理遗留项目
java·c++·python
某个默默无闻奋斗的人2 小时前
【矩阵专题】Leetcode54.螺旋矩阵(Hot100)
java·算法·leetcode
zhysunny2 小时前
04.建造者模式的终极手册:从快餐定制到航天飞船的组装哲学
java·开发语言·建造者模式
Layux3 小时前
使用钉钉开源api发送钉钉工作消息
java·spring boot·钉钉
Reggie_L5 小时前
Stream流-Java
java·开发语言·windows
黑哒哒的盟友5 小时前
JMeter groovy 编译成.jar 文件
java·jmeter·jar
巴伦是只猫5 小时前
Java 高频算法
java·开发语言·算法
超浪的晨6 小时前
Java 实现 B/S 架构详解:从基础到实战,彻底掌握浏览器/服务器编程
java·开发语言·后端·学习·个人开发
Littlewith6 小时前
Java进阶3:Java集合框架、ArrayList、LinkedList、HashSet、HashMap和他们的迭代器
java·开发语言·spring boot·spring·java-ee·eclipse·tomcat