yanghao605 opened a new issue, #4264: URL: https://github.com/apache/servicecomb-java-chassis/issues/4264
现象: 1. 首先微服务初次启动时已经成功注册了,且契约正常; 2. 微服务提供了一个接口,可以检查自身的调用链状态,大致逻辑为自己调用自己的health接口 3. 将心跳的间隔时间调至1s(为了加大异常出现的概率),先调用一次2中的接口,此时会将自身微服务的契约缓存到schemaCache中,然后通过调用注册中心接口或者是页面上删除微服务信息; 4. 微服务重新注册之后(未重启),在页面上发现微服务的契约丢失,其它服务无法正常调用该服务 原因分析: 1. chassis中提供来了一个schemaCache由于缓存微服务契约,依据serviceId和schemaId进行存储,缓存的有效期为60s,也就说在60s内,获取契约时,会优先获取schemaCache中的契约,只有当缓存为空或者契约已过期才会重新从注册中心获取契约; 2. 而当存在微服务调用自身接口的场景时,schemaCache中也就缓存下来了微服务本身的契约信息 3. 而若是恰巧在此时,注册中心的微服务信息被删除,导致微服务重新注册时,且一般情况下生成的微服务serivceId是不变的,也就导致在进行微服务契约注册,进行summary比较时,即使从注册中心获取的summary为空,而在从注册中心获取详细契约生成summary时,优先获取的是schemaCache中的契约,也就导致实际注册中心没有相关的契约信息,但是微服务在注册时的感知却是注册中心已经存在该契约信息,从而导致微服务不再注册该契约信息。 4. 最终导致的结果即为注册中心的微服务契约信息部分丢失甚至全部丢失。 -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected]
