SpringCloud Gateway LB模式动态路由失败解决方案,附赠LB演示Demo

1,490 阅读2分钟

问题背景

SpringCloud Gateway的使用介绍,本文不再赘述,这里仅记录个人使用SpringCloud Gateway过程中所遇到的坑,给各位靓仔提供一个参考

项目背景:
1 向注册中心Nacos注册了名称为providers:com.demo.service.DemoService的服务
2 SpringCloud Gateway配置LB
gateway:
 routes:
  - id: provider-test-one
  uri: lb://providers:com.demo.service.DemoService
  predicates:
    - Path=/provider-test/**   
    
3 浏览器访问 http://localhost:9999/provider-test/discovery/one 一直失败,请求未路由到对应服务器上,如图

wecom-temp-5af75cf6060eb00e70e554f245b3bd99.png

解决方案

将Nacos注册的服务名providers:com.demo.service.DemoService 改成一个 正常的没毛病的名字,如nacos-main 即可

简单来说: gateway lb的配置有一定的约束规范,providers:com.demo.service.DemoService这种是不符合规范的,所以gateway路由失败,将注册名称改成正常的如 nacos-main 即可,如图

wecom-temp-996b0a668835f7c7e0675c1b08dc74b3.png

企业微信截图_a30aac4c-828c-4310-b673-a41eb0571a17.png

解决过程记录

1 为什么向nacos注册服务名是providers:com.demo.service.DemoService 这样的,而不是项目中配置的 spring.application.name=test 这种自定义的名称

   因为历史原因,我这个项目是dubbo+nacos的形式,选用的是dubbo,而不是cloud自带的ribbon (ribbon feign dubbo 通俗来说是用来rpc通讯的)
   
   dubbo注册服务名,是有自己的一套规则的,无论我dubbo.xml怎么配置,这个屌规则命名依旧是这样...
   
   导致gateway那边不符合LB规范

wecom-temp-725da0d294dfa9673e9ec0f60599f665.png

2 nacos-main这个服务名是怎么注册的

   :这个是在下直接用springboot+nacos直接简单搭建的,其中这个服务名直接配置spring.application.name=nacos-main即可 

wecom-temp-a9cb1b2e6c6280bad387cf20b9ffe3c0.png

wecom-temp-b70b3c29362d9a8fe4d5ce3ab282f095.png

LB动态路由演示

 1 启动7000,7001两个实例,向nacos注册 nacos-main的服务
 2 配置springCloud Gateway 
   gateway:
   routes:
    - id: provider-test-one
    uri: lb://nacos-main
    predicates:
    - Path=/provider-test/** 
    
 3 请求测试 http://localhost:9999/provider-test/discovery/one 
   看看这个请求是否负载均衡的打到 7000,7001两个实例上

wecom-temp-85924fa34927d71e04c85364450290ac.png wecom-temp-7fb853914c13738afaaa71ec8f387500.png wecom-temp-f4898266a78ee0ecf09cfb354555bbc3.png

     实验成功
  

写在后面

 本文所演示的SpringCloud Gateway + Nacos功能以及LB负载均衡演示Demo
 各位靓仔可以在此处下载源码作为参考

Gateway LB源码演示