如何解决docker中启动Spring Boot微服务注册在Eureka后无法访问的问题【附代码】

今天爱分享给大家带来如何解决docker中启动Spring Boot微服务注册在Eureka后无法访问的问题的方法【附代码】
现象
在docker中启动的Spring Boot实例在Eureka上查看实例时,主机名和ip为docker的容器名称和容器环境内的ip。导致从Eureka上点击服务后,无法打开对应服务;同时导致未在docker环境内的服务也无法使用服务名的方式进行服务间调用

基本法
Spring Boot 注册在Eureka上时,默认是以主机名方式进行注册的:
查看实例列表时,可见Status列是按照”{微服务启动的服务器的hostname}:{微服务名称}:{微服务所占的端口}”来显示的;鼠标指向某一个服务,可见其跳转url是按照”http://{微服务启动的服务器的hostname}:{微服务所占的端口}/****”来组织的。

探索
搜索后先尝试了在springcloud+docker 开发 中,遇到的那些坑—-之微服务器的跨服务器跨容器访问 @屹邺林梵在启动时指定了

eureka.instance.ip-address=true
eureka.instance.instance-id=http://192.168.31.86:${server.port}
但是在Eureka中查看发现显示的名字变了,但是跳转url中还是容器的ip。
然后发现eureka.instance.instance-id就是Status列中用来显示服务名的Patten。
然后通过查看”org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean”发现还有一个属性是hostname,后来确认eureka.instance.hostname是用来修改跳转url中的hostname

解决
由于服务注册到Eureka的端口就是服务启动的端口,则docker 运行镜像时,需要映射与容器内的应用相同的端口号
容器内的服务在启动时指定eureka.instance.instance-id和eureka.instance.hostname

docker run -dit -p 应用端口:应用端口 镜像名 java -jar /jar/包/的路径/jar包文件名.jar  --server.port=应用端口 --eureka.instance.instance-id=宿主机的hostname:\${spring.application.name}:\${server.port} --eureka.instance.hostname=宿主机的hostname或ip

人已赞赏
JavaPython

java 怎样调用python并传参【附代码】

2020-11-16 16:21:44

Java

如何把Java中String转换为int【附代码】

2020-11-16 17:31:49

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
'); })();