nacos是源自阿里的一款不错的服务治理框架,在不配置ip的情况下,nacos客户都安会通过自身发现的方式来查询到本地的网络ip,然后把这个ip注册到nacos server端。
但问题出在如果有多个网卡的情况下,就不一定能获取到我们想要的ip地址,这样就可能出现注册到nacos server的ip地址有问题导致其他服务无法访问他,一般有多个网卡的机器多半会部署不同的网段,nacos自身提供了spring.cloud.nacos.discovery.ip来手动配置ip,但是这种方式有一个很大的问题就是多实例部署的情况,因为在容器启动前我们并不知道容器内部的ip,所以这种方式使用的多半是docker宿主的ip地址,这样产生的问题是容器必须对外暴露端口才能通过宿主机访问到docker容器部署的服务,这就给多实例部署带来问题,因为宿主机端口只能被一个docker容器实例占用。
所以更好的解决方案是不让对应服务暴露端口,这样就可以很方便进行服务的多实例部署,因为服务间是通过服务名访问,ribbon组件可以在多服务实例间进行负载均衡,具体实现方式是通过spring.cloud.inetutils.preferred-networks这个配置来选择对应的网段,但是有个前提:你需要提前知道docker容器内部网络的网段,关于这个笔者部署使用的portainer进行集群部署,创建overlay的网络并配置网段即可,如下图 所示: