问题:k8s 服务重启,发现服务没同步状态?
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("");
}
}
}
}