错误回顾
网关的配置
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