正常我們起一個微服務注冊到eureka他的實例id是默認這樣的主機名稱:服務名稱:服務端口號,
如果配置eureka.instance.prefer-ip-address=true則實例id為主機Ip:服務名稱:服務端口號
當然我們也可以通過eureka.instance.instance-id自定義實例ID格式。
但是當我們以docker化微服務的時候發現注冊到eureka中的實例ID變為containerId:服務名稱:服務端口號
而且docker 容器每重啟一次(這里指刪除容器重啟,containerId變化),就多一個該服務的實例如d1deb75f7aed:rms:8080,並且被刪除的容器實例d2b59f32b427:rms:8080不下線
問題1:怎么讓容器啟的微服務也注冊為{主機名稱:服務名稱:服務端口號}或{主機Ip:服務名稱:服務端口號}?
指定容器網絡模式為host,如:
docker run -d --name rms --net host cm/rms:latest
為什么要指定網絡模式host:
- –net=bridge— 默認選項,用網橋的方式來連接docker容器。
- –net=host— docker跳過配置容器的獨立網絡棧。
- –net=container:NAME_or_ID— 告訴docker讓這個新建的容器使用已有容器的網絡配置。
- –net=none— 告訴docker為新建的容器建立一個網絡棧,但不對這個網絡棧進行任何配置,所以只能訪問本地網絡,沒有外網。
詳細請點鏈接:https://blog.csdn.net/weixin_38319645/article/details/81349541
問題2:怎么讓停掉的容器服務下線?
通過api強制下線
DELETE http://{ip}:{port}/eureka/apps/{appName}/{inatanceId}
如:http://ip:port/eureka/apps/rms/10d4a6d7e8a6:rms:8080
通過自定義實例id,讓后起的實例擠掉先起的失效實例
配置文件中指定instance-id:
spring.application.name=rms
server.port=8080
eureka.instance.instance-id=${spring.application.name}:${server.port}
eureka.instance.prefer-ip-address=true
這樣不管怎么啟服務,他的Id都是一樣的,后起的會把之前的擠掉。至少不會因為containerId變化導致的實例id不同,讓實例一直增加。
我們從頁面上繼續看這個ID后面是啥?
目前還沒找到辦法讓container停止服務自動下線方法
已解決: https://www.cnblogs.com/dreamfly2016/p/11698759.html