application.name 和 context-path 同名导致的问题

228 天前
 xiaohupro

今天在搭建 spring cloud alibaba 架子,在添加好 gateway 模块后,我尝试使用它调用注册到 nacos 中的服务,这个子服务的 application.name 我设置为了 atlas-data ,context-path 也设置为了 atlas-data ,然后 Gateway 的配置如下:

server:
  port: 8888
  servlet:
    context-path: /
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
    gateway:
      routes:
        - id: atlas-data
          uri: lb://atlas-data
          predicates:
            - Path=/atlas-data/**
      discovery:
        locator:
          enabled: true
          lower-case-service-id: true
  application:
    name: atlas-gateway


然后我通过请求: http://localhost:8888/atlas-data/api/xxx 的一些接口都报 404 ,纳闷了很久,因为我没想到是因为同名导致的问题。

然后我尝试将请求链接改为: http://localhost:8888/atlas-data/atlas-data/api/xxx 后发现可以请求。 我懵逼了……

后来发现是 application.name 和 context-path 同名导致的,有小伙伴知道具体原因吗?为什么同名后写两次 context-path 才可以请求到。

1110 次点击
所在节点    Java
7 条回复
jeesk
228 天前
还敢用 ali 的东西?
xiaohupro
228 天前
@jeesk 哈哈哈,我以前一直用 SpringCloud+Consul 这种配合着来,这次 leader 让用 Spring Cloud Alibaba ,所以注册注册中心就用 nacos 了……
cppc
228 天前
我看这没什么问题呀,你意思是 app name 和 ctx path 不同就有不一样的行为?
xiaohupro
228 天前
@cppc 这样配置启动不会报错,但是当通过 Gateway 访问其他服务时路径如果只用被访问服务的 context-path 会报 404 ,不一样就不会出现这个问题
carpeDiemJll
228 天前
应该是有差异性的。如果有 context-path 的话,//ip:port+context-path 再加上你的接口路径。所以,http://localhost:8888/atlas-data/atlas-data/api/xxx ,会先匹配 context-path ,去掉 contex-path 后,再与 predicates 匹配,找到对应的 route ,然后请求到具体的接口
litchinn
227 天前
carpeDiemJll
227 天前
@litchinn 不用加,直接 route 路由也可以

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1038412

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX