请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于谓词工厂的路由,访问地址的问题

前置条件: 课程上朝九晚五的接口已经实现,达到预期结果
问题一:在实践的过程中,同个接口有两种访问形式,一种是带微服务前缀的访问方法,另一种是不带前缀,两个接口均能打到微服务上并且能访问成功,这是为什么?如果两个微服务的前缀不同子路径相同,那么会不会造成冲突?程序怎么知道我要打的是哪个微服务上面?
问题二:带前缀访问的方式不会走谓词工厂的判断一直是访问成功的状态,而不带前缀的访问方式它会去走为此工厂的判断条件,那这又出现一个问题,谓词工厂形同虚设?

正在回答 回答被采纳积分+3

插入代码

2回答

提问者 WittChen 2022-09-25 10:07:11

通过实践解决上面问出的绝大多数问题

问题一:两个路由地址均能访问的原因是因为,这两段配置,注意locator.enable为true会自动生成,这也是为什么 微服务名/path能访问到微服务的原因,下面这段是我们自己配置的路由规则,因此可以不加前缀打到微服务上面

1
2
3
4
5
6
7
8
9
10
11
gateway:
  discovery:
    locator:
      # 让gateway通过服务发现组件找到其他的微服务
      # 并且自动生成路由地址
      enabled: true
  routes:
    - id: custom_route
      uri: lb://cloud-demo2
      predicates:
        - TimeBetween=06:00, 09:00, HH:mm

问题二:加一个小配置,这里需要跟微服务约定好让他在地址上加一个统一的前缀,我这里用的是demo2,另个微服务配置server.servlet.context-path=/demo2 即可,这样就间接解决了冲突的问题,不同微服务有不同的前缀,这里我删掉了locator.enable配置,不自动生成路由,这样就解决了形同虚设的问题,只有我们手动配置的路由才生效

1
2
3
4
5
6
routes:
  - id: custom_route
    uri: lb://cloud-demo2
    predicates:
      - TimeBetween=06:00, 09:00, HH:mm
      - Path=/demo2/**

还剩一个我没实践,就是如果两个微服务Path相同,那么他会打到哪个服务上,留个悬念^ ^

0 回复 有任何疑惑可以回复我~
提问者 WittChen 2022-09-25 09:15:09

个人感觉老是需要补录一个这个谓词工厂的章节,不管是您手记中,还是问题区,都有大多数同学问相同的问题,就实际运用来讲老师这个章节对谓词工厂是十分欠缺的,运用中会碰到好多问题,这个坑老师并没有带着我们去踩,当然只是个人建议

0 回复 有任何疑惑可以回复我~
  • 有坑如下:
    1. 坑1
    当配置中包含locator.enable,会自动从Nacos处获取已注册的服务,这里还需注意如果Nacos上设置了自定义的命名空间namespace,那么Gateway也需要设置namespace,否则默认从public空间获取,我踩过这个坑
    2. 坑2
    既有locator.false(不能配置为enable,否则Predicate.between不生效),又配置了routes,通常显式定义路由会覆盖默认路由,那么在routes就请一定要定义filters,
      filters:
      - StripPrefix=1 , 去除掉我们在浏览器或者Postman中输入的路径中的/user-center, 否则gateway会转发至 http://localhost:8099/user-center/users/1 (我的用户中心的server port是8099)
    完整配置如下:
    server:
      port: 8040
    spring:
      application:
        name: gateway
      cloud:
        nacos:
          discovery:
            server-addr: localhost:8848
            namespace: 2cc45034-8942-454a-a486-e63e071123e5
            cluster-name: NJ
        gateway:
          discovery:
            locator:
              #让gateway通过服务发现组件找到其他服务
              enabled: false //不通过服务发现组件
          routes:
            - id: after_route
              uri: lb://user-center
              predicates:
                - TimeBetween=上午9:00,下午8:00
              filters:
              - StripPrefix=1 //去掉访问路径中的/user-center
    management:
      endpoints:
        web:
          exposure:
            include: '*' #暴露所有actuator端点
      endpoint:
        health:
          show-details: always  #健康检查
    logging:
      level:
        org.springframework.cloud.gateway: trace
    回复 有任何疑惑可以回复我~ 6天前
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号