Sentinel之前在本地搭的测试环境里是没有问题的,但是微服务应用部署到k8s集群中,并注册到Sentinel中后,限流功能没有问题,但是每个微服务的实时监控画面一直是空白。
百度后发现没有任何结果。。只能自己慢慢找原因了。后来看Sentinel的日志后发现有报错
2019-11-28 08:33:37.067 ERROR 8 --- [pool-3-thread-1] c.a.c.s.dashboard.metric.MetricFetcher : Failed to fetch metric from <http://192.168.1.226:8719/metric?startTime=1574901081000&endTime=1574901087000&refetch=false> (ConnectionException: Connection timed out)
很明显,这个192.168.1.226的ip是本地的ip,而Sentinel的服务是放在K8s里,所以肯定访问不了。为什么会访问这个ip呢?原因是因为本地调试时也启动了一些微服务,然后也注册到了这个Sentinel里,所以有的微服务有两个实例,所以Sentinel从本地这个实例里获取信息就失败报错了。
但是有一个问题是,现在有10几个微服务,只有3-4个微服务在本地启动了,也就是说还是10多个微服务是没有问题的,但是这些微服务的实时监控画面依旧是空白!!!所以我怀疑只要有一个本地微服务启动并注册到Sentinel里导致后台报错的话,会导致所有的微服务的实时监控为空!接下来,就是验证我的猜想了。于是我把所有本地微服务全部down掉,然后在Sentinel里把失联的都移除,保证Sentinel后台没有报错后,再访问几个接口,实时监控画面终于出来了!
这样就证实了我的猜想,只要有一个本地微服务注册到Sentinel导致Sentinel取不到信息时,就会导致所有微服务的实时监控不可用!!!没有深入到源码里研究,但是我个人感觉可能Sentinel的不同微服务的dashboard是公用的同一个服务,所以只要有报错,会导致这个dashboard服务不可用,个人理解而已,不知道对不对,如有不正,欢迎指正。