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

来源:10-7 自定义路由谓词工厂

WittChen

2022-09-25

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

写回答

2回答

WittChen

提问者

2022-09-25

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

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

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配置,不自动生成路由,这样就解决了形同虚设的问题,只有我们手动配置的路由才生效

routes:
  - id: custom_route
    uri: lb://cloud-demo2
    predicates:
      - TimeBetween=06:00, 09:00, HH:mm
      - Path=/demo2/**

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

0
0

WittChen

提问者

2022-09-25

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

0
1
mottoyin
有坑如下: 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
4天前
共1条回复

Spring Cloud Alibaba微服务从入门到进阶

面向未来微服务:熟练掌握Spring Cloud Alibaba

3091 学习 · 1324 问题

查看课程