基于从前的项目:https://www.cnblogs.com/xsj1989/p/18338930
参考文章:https://blog.csdn.net/hong161688/article/details/140812734
https://blog.csdn.net/qq_34417433/article/details/135144279
Gateway断言介绍:https://blog.csdn.net/qq_36551991/article/details/135285220
官网文档:https://cloud.spring.io/spring-cloud-gateway/reference/html/

SpringCloud Gateway说明:API网关作为微服务架构中的关键组件,主要负责请求的路由、过滤、安全认证、限流熔断等功能,实现了服务间的解耦和请求的统一管理。
Spring Cloud Gateway的核心组件主要包括路由(Route)、断言(Predicate)、过滤器(Filter)和负载均衡器(LoadBalancer)。
路由(Route):路由是网关的基本构建块,它定义了请求如何被转发到微服务。一个路由包含一个ID、一个目标URI(通常指向微服务)、一系列的断言和过滤器。当请求满足某个路由的断言条件时,该请求将被转发到对应的目标URI,并经过配置的过滤器链进行处理。
断言(Predicate):断言用于判断请求是否满足某个条件,如请求路径是否匹配某个正则表达式、请求头是否包含特定值等。断言是路由决策的重要依据,只有满足断言条件的请求才会被转发到目标服务。
过滤器(Filter):过滤器用于在请求被转发之前或之后对请求进行处理,如添加、修改请求头、响应头等。过滤器分为局部过滤器和全局过滤器,局部过滤器只作用于特定的路由,而全局过滤器则作用于所有路由。
负载均衡器(LoadBalancer):Spring Cloud Gateway集成了Spring Cloud LoadBalancer,可以在多个服务实例之间分配请求,以实现高可用和高性能。负载均衡器支持多种负载均衡策略,如轮询、随机、最少活跃调用等。

新建一个Module,cloud-gateway-center
pom引入包 版本号4.1.5 在父级pom管理,子Module可不写。
        <!--SpringCloud服务网关-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

main改一下

@SpringBootApplication
public class CloudGatewayCenterMain {
    public static void main(String[] args) {
        SpringApplication.run(CloudGatewayCenterMain.class, args);
    }
}

bootstrap.yaml配置文件

server:
  port: 8004
spring:
  application:
    # Nacos添加配置,格式:${prefix}-${spring.profiles.active}.${file-extension}
    name: cloud-gateway-center
  profiles:
    active: dev # 配置环境变量,Nacos配置DataId的一部分。自定义例如:dev test pro
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # Nacos作为服务中心地址
      config:
        server-addr: localhost:8848 # Nacos作为配置中心地址
        file-extension: yaml # Nacos配置后缀
        group: DEFAULT_GROUP # Nacos配置分组
        namespace: 8e23ce60-9f28-4fa7-875a-5e0d61b533d5 # Nacos配置命名空间的id,默认public
      username: nacos # Nacos登录账户
      password: 123456 # Nacos登录密码
    gateway:
      enabled: true # 启用gateway
      routes:
        - id: cloud-order-service
          uri: http://localhost:8001
          predicates:
            - Path=/api/**
          filters:
            - StripPrefix=1

启动后,发送请求 http://localhost:8004/api/test/getHobbies?userId=1 被转发为 http://localhost:8001/test/getHobbies?userId=1
路由说明:
id:编号,路由的唯一标识。
uri:路由指向的目标 URI,即请求最终被转发的目的地。
predicate:谓语,断言,作为路由的匹配条件。Gateway 内置了多种 Predicate 的实现,提供了多种请求的匹配条件,比如说基于请求的 Path、Method 等等。
filters:过滤器,对请求进行拦截,实现自定义的功能。Gateway 内置了多种 Filter 的实现,提供了多种请求的处理逻辑,比如说限流、熔断等等。

断言说明
1.请求参数匹配 Query Route Predicate 支持传入两个参数,一个是属性名一个为属性值,属性值可以是正则表达式。
1.1只要请求中包含 myparameter属性的参数即可匹配路由。

spring:
  cloud:
    gateway:
      routes:
      - id: my_route
        uri: https://example.org
        predicates:
        - Query=myparameter

1.2对参数值也进行配置 - Query=myparameter,parametervalue 这样配置, myparameter属性的值为parametervalue才会匹配
1.3还可以使用正则表达式来表示 - Query=myparameter,my. 这样只要当请求中包含 myparameter属性并且参数值是以 my 开头的长度为三位的字符串才会进行匹配和路由。
2.请求路径匹配Path Route Predicate 接收一个匹配路径的参数来判断是否走路由。- Path=/user/**
这样设置,则/user开头的任一路径都会匹配路由。
在路径配置中,我们可以使用{segment}来进行占位,表示一个请求路径中的特定段。具体来说,{segment}可以用于匹配请求路径中的任意段。例如,如果有一个路由路径定义为/api/{segment}/users,那么当请求路径为/api/profile/users时,{segment}将会被替换为profile,从而匹配该路由路径。但是{segment}不支持匹配子路径,如果想匹配子路径需要使用/**
3.Header 属性匹配 Header Route Predicate 接受两个参数:一个 header 中属性名称和一个正则表达式,这个属性值和正则表达式匹配则执行。
- Header=X-Request-Id, \d+ 这样配置,则只有header请求头中有X-Request-Id属性,并且属性值为数值的时候才匹配路由。
4.Cookie 匹配 Cookie Route Predicate 可以接收两个参数,一个是 Cookie name ,一个是正则表达式,路由规则会通过获取对应的 Cookie name 值和正则表达式去匹配,如果匹配上就会执行路由,如果没有匹配上则不执行。- Cookie=chocolate, ch.p
5.请求方式匹配 可以通过是 POST、GET、PUT、DELETE 等不同的请求方式来进行路由,支持一个或多个参数。- Method=GET,POST
6.请求 ip 地址匹配,在 CIDR 表示法中,IP 地址后面跟着斜杠和一个数字,斜杠后的数字表示子网掩码位数。
192.168.1.1/24 表示一个 CIDR 格式的 IP 地址范围,其中 /24 表示子网掩码。这个范围包括从 192.168.1.1 到 192.168.1.254 的所有 IP 地址。例如,如果请求的远端地址为192.168.1.10,则此路由匹配。如果你只想匹配单个ip地址,那么可以使用ip/32来表示,ip/32表示只有该 IP 地址本身才会匹配,其他任何 IP 地址都不会与之匹配。
7.时间匹配,我们可以指定某个时间前后的请求匹配路由。After :匹配在指定日期时间之后发生的请求。某个日期之前,使用Before。
- After=2017-01-20T17:42:47.789-07:00[America/Denver]
8.组合匹配 多个 Predicates 可以同时存在于同一个路由,请求必须同时满足所有的条件才被这个路由匹配。

posted on 2024-08-09 09:53  邢帅杰  阅读(9)  评论(0编辑  收藏  举报