最近在学习将spring cloud服务部署到docker,遇到了将微服务部署到docker,然后就不能调用,本地是可以正常调用的。这里我说一下我的环境,一个生产者服务(service-hi-user),一个配置中心服务(configsever),一个Eureka注册中心服务。本机宿主机IP:192.168.31.193,Eureka注册中心容器IP:172.17.0.2,配置中心服务容器IP:172.17.0.3,生产者服务:172.17.0.4
配置中心配置连接注册中心:
eureka:
client:
#表示是否将自己注册到Eureka Server,默认=true
fetch-registry: true
#表示是否从Eureka Server获取注册的服务信息,默认=true
register-with-eureka: true
#注册中心地址
serviceUrl:
defaultZone: http://192.168.31.193:35000/eureka/
#这里192.168.31.193的可以改成注册中心容器的IP,我测试过三个容器之前是可以相互连接的。
生产者服务配置:
spring:
cloud:
config:
enabled: true #启配置中心
# uri: http://192.168.31.193:35100
discovery:
enabled: true
service-id: CONFIG-SERVER
eureka:
client:
#表示是否将自己注册到Eureka Server,默认=true
fetch-registry: true
#表示是否从Eureka Server获取注册的服务信息,默认=true
register-with-eureka: true
#注册中心地址
serviceUrl:
defaultZone: http://192.168.31.193:35000/eureka/
在容器中启动配置中心,发现配置中心的服务实例ID居然是容器ID,点击实例ID也是不能正常访问springboot actuator组件的info信息。
然后启动生产者服务service-hi-user,发现连接的配置中心也是不通的
到这里问题出来了,我在网上查了一下发现,是服务注册到注册中心服务的问题。
修改了配置中心注册服务的配置,指定服务注册到注册中心的IP地址。
eureka:
client:
#表示是否将自己注册到Eureka Server,默认=true
fetch-registry: true
#表示是否从Eureka Server获取注册的服务信息,默认=true
register-with-eureka: true
#注册中心地址
serviceUrl:
defaultZone: http://192.168.31.193:35000/eureka/
instance:
instance-id: ${spring.application.name}-test1 #服务实例Id
hostname: 192.168.31.193 #或者使用容器IP172.17.0.3或者使用容器网络的别名
# 或者使用方法二
# prefer-ip-address: true #本质就是为了获取本机的真实IP
# ip-address: 192.168.31.193
重启配置中心服务服务,服务实例Id和配置中心服务都能正常访问:
重启生产者服务,全部正常解决。
参考:
解决docker中启动Spring Boot微服务注册在Eureka后无法访问的问题
Spring Cloud Eureka 之常用配置解析