<springboot.version>2.2.9.RELEASE</springboot.version>
<springcloud.version>Hoxton.SR8</springcloud.version>
<springcloud-alibaba.version>2.2.1.RELEASE</springcloud-alibaba.version>
bootstrap.yml
spring:
application:
name: mall-gateway
cloud:
nacos:
config:
# 配置中心地址
# server-addr: http://***********:8848
# 配置nginx地址
server-addr: http://xxxxxxxxxx:1122
# 指定yaml格式的配置
file-extension: yaml
# config分组
group: dev
# config命名空间
namespace: 8067255f-1a91-4cd3-be6c-c132a4c2d5a6
# 加载config中的其它配置
extension-configs[0]:
data-id: application-gateway.yml
group: dev
refresh: true
extension-configs[1]:
data-id: gateway-router.yml
group: dev
refresh: true
application-gateway.yml
server:
port: 88
spring:
cloud:
nacos:
discovery: # 启动类加 @EnableDiscoveryClient 开启服务的注册与发现
# 配置Nacos地址
# server-addr: http://**********:8848/
# 配置nginx地址
server-addr: http://xxxxxxxxxx:1122/
# 服务分组
group: dev
# 服务命名空间
namespace: 8067255f-1a91-4cd3-be6c-c132a4c2d5a6
# 配置这一项可以监控gateway各个节点的信息
management:
endpoints:
web:
exposure:
include: "*"
gateway-router.yml
spring:
cloud:
gateway:
discovery:
locator:
# 开启从注册中心动态创建路由的功能,利用微服务名进行路由
enabled: true
lowerCaseServiceId: true
# 添加路由配置
routes:
# 使用lb 就有问题
- id: admin_route
uri: lb://mall-admin
predicates:
- Path=/api/**
filters:
- RewritePath=/api/(?<segment>.*), /mall-admin/$\{segment}
# 这样配置是没问题的
- id: admin_test
uri: http://localhost:8080
predicates:
- Path=/test/**
filters:
- RewritePath=/test/(?<segment>.*), /mall-admin/$\{segment}
请问为什么只要使用 uri: lb://服务名 这种就没有用,报503 。使用 ri: http://localhost:8080 这样就可以。
项目github地址:git@github.com:suiweidong/mall.git
麻烦各位大佬了
已经找到问题所在了,问题不是出现在代码上,是出现在nacos的配置上。
原来是给每一个服务配置了一个命名空间,然后对应服务的配置,放在对应的命名空间中,这样看着很简洁干净,这样其实也是没问题的。
问题出现在注册服务的时候,我把每一个服务放在它们对应的命名空间中了,如图:
spring:
cloud:
nacos:
discovery: # 启动类加 @EnableDiscoveryClient 开启服务的注册与发现
# 配置Nacos地址
# server-addr: http://**********:8848/
# 配置nginx地址
server-addr: http://xxxxxxxxxx:1122/
# 服务分组
group: dev
# 服务命名空间
namespace: 8067255f-1a91-4cd3-be6c-c132a4c2d5a6
nacos不支持不同命名空间之间的调用,导致我在gateway服务中,lb://admin 获取不到admin服务,结果报了503。
改进后就没问题了
我使用命名空间做环境隔离,使用group 做应用隔离
对应的服务注册的命名空间都改成 dev对应的命名空间,去掉group ,这样所有的服务注册都会在dev命名空间下,互相调用就是可以调通的
spring:
cloud:
nacos:
discovery: # 启动类加 @EnableDiscoveryClient 开启服务的注册与发现
# 配置Nacos地址
# server-addr: http://**********:8848/
# 配置nginx地址
server-addr: http://xxxxxxxxxx:1122/
# 服务命名空间
namespace: 50b719ee-29c4-41d5-8139-962971609d5b
每个项目中的bootstrap.yml 也要对应改一下
spring:
cloud:
nacos:
config:
# 配置中心地址
# server-addr: http://*********:8848
# 配置nginx地址
server-addr: http://xxxxxxxxxxx:1122
# 指定yaml格式的配置
file-extension: yaml
# config分组
group: gateway
# config命名空间
namespace: 50b719ee-29c4-41d5-8139-962971609d5b
# 加载config中的其它配置
extension-configs[0]:
data-id: application-gateway.yml
group: gateway
refresh: true
extension-configs[1]:
data-id: gateway-router.yml
group: gateway
refresh: true
这个问题纠结了我2天。。。自己水平不足,不过这种学习过程,还是很快乐的。
我也遇到了这个问题,感谢作者的思路,我的是注册中心中的namespace一样,但是group不一样,然后死活调用不了,去了group全部选用默认命名可以了。
感谢作者,纠结了一晚上 终于可以了 睡觉去了 美滋滋