spring cloud之docker微服务客户端注册eureka问题


正常我们起一个微服务注册到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