### 1、情况分析

在 k8s 下重新部署服务后（也就是重启服务，或更新服务）。所有的服务节点ip都会变掉，因为某些原因发现服务，可能没有同步好状态：

* 比如健康检测有延时
* 比如服务状态同步广播有不及时

至使 rpc 调用时，发现服务客户端拿到了些无效的ip。每家的发现服务实现都会有区别，但这个问题或严重或轻都会有。

### 2、解决办法

如果客户端调用的不是发现的服务ip，而是用 k8s 里的 sev name 调用就无此问题了。

* water-solon-cloud-plugin

water 自带有解决方案。它有个上游配置，可将服务ip调用直接转成 k8s sev 的调用。

* 其它注册与发现服务的适配插件

solon cloud 在适配时做了特别的处理，可以通过配置实现代理效果：

配置key："discovery.agent.服务名" （例："discovery.agent.waterapi" ）

配置val："http://服务名.域:端口" （例："http://waterapi.water:9371" ）

### 3、附处理代码

```java
public class DiscoveryUtils {
    /**
     * 尝试加载发现代理
     */
    public static void tryLoadAgent(Discovery discovery, String group, String service) {
        if (discovery.agent() != null) {
            return;
        }

        if (CloudClient.config() != null) {
            //前缀在前，方便相同配置在一起
            String agent = CloudClient.config().pull(group, "discovery.agent." + service).value();

            if (Utils.isNotEmpty(agent)) {
                discovery.agent(agent);
            } else {
                //为了后面不再做重复检测
                discovery.agent("");
            }
        }
    }
}
```

 