错误回顾

网关的配置

server:
  port: 80

spring:
  application:
    name: api-gateway
#springCloudgateway配置项对相应 GatewayPropweties
  cloud:
    # 网关配置
    gateway:
      # 路由配置:对应RouteDefinition数组
      routes: 
        - id: desk-route  #路由的编号,保证是唯一的
          # 路由地址
          uri: lb://api-desk-me   #这个和http://localhost:8001/ 一样的意思 lb代表从注册中        #心取地址,如果有多个就负载均衡,转发到对应的服务实例
          predicates:  #断言作为路由的匹配条件,对应RouteDefinition数组
            - Path=/api-desk/**
          
        - id: example-route
          uri: http://www.example.com     #lb://gateway-consumer   #uri指目标服务地址,lb代表从注册中心获取服务
          predicates:
            - Path=/test
          
      # 微服务名称配置
      discovery:
        locator:
          enabled: true # 设置为true 请求路径前可以添加微服务名称 表明gateway开启服务注册和发现的功能,并且spring cloud gateway自动根据服务发现为每一个服务创建了一个router,# 这个router将以服务名开头的请求路径转发到对应的服务
          lower-case-service-id: true # 允许为小写

一个服务 api-desk-me配置

#服务器端口
server:
  port: 8105

spring:
  cloud:
    nacos:
      config:
        server-addr: localhost:8848
      discovery:
        server-addr: localhost:8848
  application:
    name: api-desk-me

可以访问的一个接口:http://localhost/api-desk-me/dashboard/activities

然后用网关访问:http://localhost/api-desk/dashboard/activities 死活访问不出来,一直404,最后发现原因,是自己理解的问题

这里的网关配置要加上过滤的filters :

filters:
  - StripPrefix=1

修改后的网关配置:

server:
  port: 80

spring:
  application:
    name: api-gateway

  cloud:
    # 网关配置
    gateway:
      # 路由配置:
      routes: 
        - id: desk-route
          uri: lb://api-desk-me   #这个和http://localhost:8001/ 一样的意思
          predicates:
            - Path=/api-desk/**
          filters:
            - StripPrefix=1
        - id: example-route
          uri: http://www.example.com     #lb://gateway-consumer   #uri指目标服务地址,lb代表从注册中心获取服务
          predicates:
            - Path=/test
          filters:
            - StripPrefix=1
      # 微服务名称配置
      discovery:
        locator:
          enabled: true # 设置为true 请求路径前可以添加微服务名称 表明gateway开启服务注册和发现的功能,并且spring cloud gateway自动根据服务发现为每一个服务创建了一个router,# 这个router将以服务名开头的请求路径转发到对应的服务
          lower-case-service-id: true # 允许为小写

 这里配置的 StripPrefix 会将请求的 Path 去除掉前缀。

  # 例如:我们以第一个 Route 举例子,假设我们请求 http://localhost/api-desk/dashboard/activities 时:

    # 如果有配置 StripPrefix 过滤器,则转发到的最终 URI 为 http://localhost:8105/dashboard/activities,正确返回

# 如果未配置 StripPrefix 过滤器,转发到的最终 URI 为 http://localhost:8105/api-desk/dashboard/activities,错误返回 404

相当于路径多了一条/api-desk  导致路径错误

此时此刻我的理解:网关这个时候做的事情就是把uri截取出来给符合转发条件的微服务,地址已经注册到nacos里了,然后拼接一下url,进行访问对应的接口即可。这个时候管好uri即可,看看需不需要进行StripPrefix跳过一些匹配的路径,有的需要跳过,有的则不需要跳过。做这个的时候考虑一下路径即可。

再复盘一下:

springcloudgateway配置,主要的几个点 id(保证唯一不重复就行),predicates(断言,可以做Path的路径匹配),uri(路由转发到哪里去,lb://api-desk-me    这个可就是真实的微服务名字了这里是api-desk-me,lb代表将请求负载均衡到对应的实例),filter(局部过滤:做一些条件的过滤,我是刚入门,就用到一个StripPrefix,跳过不需要的uri段)

补充: filters:  RewritePath

spring:

  cloud:

    gateway:

      routes:

      - id: rewritepath_route

        uri: https://blog.csdn.net

        predicates:

        - Path=/foo/**

        filters:

        - RewritePath=/foo/(?<segment>.*), /$\{segment}

上面的配置中,所有的/foo/*开始的路径都会命中配置的router,并执行过滤器的逻辑,在本案例中配置了RewritePath过滤器工厂,此工厂将/foo/(?<segment>.)重写为{segment},然后转发到https://blog.csdn.net。比如在网页上请求localhost:8081/foo/forezp,此时会将请求转发到方志朋的专栏_方志朋_CSDN博客-springcloud,史上最简单的 Spring Cloud 教程,SpringBoot 非官方教程领域博主的页面,比如在网页上请求localhost:8081/foo/forezp/1,页面显示404,就是因为不存在https://blog.csdn.net/forezp/1这个页面      segment段,片,部分。

<segment>可以代表多个也可以代表单个匹配的路径,相当于满足“逗号”前边的路径的话,就执行后边路径的转发。

整理于2021.12.27 16:11

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐