Solon

问题:k8s 服务重启,发现服务没同步状态?

</> markdown

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、附处理代码

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("");
            }
        }
    }
}