问题:k8s 服务重启,发现服务没同步状态?
2026年9月10日 下午9:26:24
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" )
示例:
discovery.agent.waterapi=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("");
}
}
}
}