可以从localhost:8888访问配置服务器,但是当我在SCDF上部署应用程序时,会发生以下错误:
Fetching config from server at : http://localhost:8888
2021-07-30 14:58:53.535 INFO 143 --- [ main] o.s.b.context.config.ConfigDataLoader : Connect Timeout Exception on Url - http://localhost:8888. Will be trying the next url if available
2021-07-30 14:58:53.535 WARN 143 --- [ main] o.s.b.context.config.ConfigDataLoader : Could not locate PropertySource ([ConfigServerConfigDataResource@3de88f64 uris = array<String>['http://localhost:8888'], optional = true, profiles = list['default']]): I/O error on GET request for "http://localhost:8888/backend-service/default": Connection refused (Connection refused); nested exception is java.net.ConnectException: Connection refused (Connection refused)除了配置服务器连接之外,应用程序在SCDF上成功部署。我在SCDF中指定的唯一属性是docker网络。我使用的是spring.config.import,而不是任何引导程序。所有这些在本地部署时都能正常工作,但是当部署在SCDF上时,微服务无法连接到配置服务器。
Spring版本: 2.5.1
应用程序属性
spring.application.name=backend-service
spring.cloud.config.fail-fast=true
spring.cloud.config.retry.max-attempts=6
spring.cloud.config.retry.max-interval=11000
spring.config.import=optional:configserver:http://localhost:8888配置服务器属性
spring.cloud.config.server.git.uri=...
management.endpoints.web.exposure.include=*
spring.cloud.config.fail-fast=true
spring.cloud.config.retry.max-attempts=6
spring.cloud.config.retry.max-interval=11000
spring.cloud.bus.id=my-config-server
spring.cloud.stream.rabbit.bindings.springCloudBus.consumer.declareExchange=false
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.cloud.bus.enabled=true
spring.cloud.bus.refresh.enabled: true
spring.cloud.bus.env.enabled: true
server.port=8888docker-compose.yml
version: '3.1'
services:
h2:
...
rabbitmq-container:
image: rabbitmq:3.7.14-management
hostname: dataflow-rabbitmq
expose:
- '5672'
ports:
- "5672:5672"
- "15672:15672"
networks:
- scdfnet
dataflow-server:
...
networks:
- scdfnet
app-import:
...
networks:
- scdfnet
skipper-server:
...
networks:
- scdfnet
configserver-container:
image: ...
ports:
- "8888:8888"
expose:
- '8888'
environment:
- spring_rabbitmq_host=rabbitmq-container
- spring_rabbitmq_port=5672
- spring_rabbitmq_username=guest
- spring_rabbitmq_password=guest
depends_on:
- rabbitmq-container
networks:
- scdfnet
networks:
scdfnet:
external:
name: scdfnet
volumes:
h2-data:发布于 2021-08-06 16:33:06
对于其他有这个问题的人,我找到了两种解决方法。问题是,一旦Spring应用程序被容器化,属性文件中引用的localhost将导致程序获取应用程序容器虚拟网络的本地主机,而不是本地机器的本地主机。
对于同样的错误,有许多堆栈溢出的答案,但都围绕着引导属性的更正。但是,自Spring 2.4以来,就不再推荐引导上下文初始化。
第一种解决方案是使用IPv4地址而不是本地主机。
spring.config.import=configserver:http://<insert IPv4 address>:8888例如:
spring.config.import=configserver:http://10.6.39.148:8888一个比硬连接地址更好的解决方案是引用在docker组合中运行的配置服务器容器:
spring.config.import=optional:configserver:http://configserver-container:8888确保所有的Docker服务都在同一个网络上运行(在我的例子中是scdf_network),并注意到这个地址只有在docker上运行时才能工作,所以如果要在Eclipse上构建maven文件,您可能需要删除或禁用测试才能成功构建。这可能是不必要的;可能只是有一些属性我未能复制到本地application.properties文件,导致上下文测试失败。根据文档,可选标签应该允许配置客户端运行,即使无法与配置服务器建立联系。
https://stackoverflow.com/questions/68593968
复制相似问题