欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

服务监控信息到底是“主动推送”还是“被动扫描”???

程序员文章站 2022-03-04 12:15:39
随着软件架构的演进微服务逐渐变成各公司追求的目标,再加上敏捷开发,快速迭代,持续构建简直是如虎添翼想象未来就是美好的, 但是又有几个公司能都做到那,尤其这两年spring boot的迅猛发展,也给各企业的研发团队带来对微服务实践的有力武器! 好了废话不多说马上切入正题 我们都知道有了成千上万的微服务 ......

    随着软件架构的演进微服务逐渐变成各公司追求的目标,再加上敏捷开发,快速迭代,持续构建简直是如虎添翼想象未来就是美好的,

  但是又有几个公司能都做到那,尤其这两年spring boot的迅猛发展,也给各企业的研发团队带来对微服务实践的有力武器!

    好了废话不多说马上切入正题

    我们都知道有了成千上万的微服务监控就成了重中之重,我们一定要搞定它,既然要监控就需要有数据的采集,那好数据的采集我们是

  采用微服务主动推送好那??还是定时扫描好那?接下来我们逐一讨论!

    我们都知道主动推送就是服务自己采集自己的相关信息然后发送给其他相关的服务上去进行信息汇总spring boot hystrix stream 就是一个

    很好的例子。

    被动扫描就是数据收集服务直接调用微服务的端口或URL等手段来获取相关信息然后收集到统一仓库进行处理,这里面典型的工具是telegraf

    telegraf这个工具可以扫描端口或收集系统信息。

  重点

    我们先说主动推送与被动拉取的优势与劣势:

    1、首先不是所有的服务都要暴露端口因为很多服务是用来跑数据的(比如统计相关信息),但是基本上多有服务都是要被监控的所以这是

      主动推送的方案统一的第一条优势,否则就要实现两套方案。

      服务监控信息到底是“主动推送”还是“被动扫描”???

    2、上面的第一点有个漏洞服务A暴露端口不行吗?,当然可以!好那我们就看看所有服务都暴露端口等待被扫描会有什么问题?

      服务监控信息到底是“主动推送”还是“被动扫描”???

      如上图片展示加入我们进行定时扫描监控数据收集的话存在的问题就是网络策略设置变得复杂重复,假如W和Y两个网段对访问是有IP限制的

    或防火墙上的策略认证这时每个网段都要对“信息采集服务”进行信息穿透访问,设置不但重复而且增加了风险。反过来就是主动推送信息!

      服务监控信息到底是“主动推送”还是“被动扫描”???

    从上图我们可以分析出如果是主动推送只要所有被监控的服务可以访问数据采集服务就可以了,数据采集只接受数据允许大家访问

    策略设置更统一更简单。

    3、上见面的第二点好像还有点问题哦?什么问题那?每个服务都要会有推送信息的线程会不会对服务造成压力或性能损耗啊?

        毫无疑问只要起了额外的线程就会造成服务本身要有少量的内存和CPU消耗,所以问题是有的,但是再想想我们暴露

      接口难道没有消耗吗,那个消耗更值得那?我们暴露端口我们消耗的是容器(tomcat或jetty等,如果你是IO多路复用另谈)

      的线程池占用一定的线程资源,如果我们在服务内自己启动线程推送就不会占用容器的对外线程池资源,只是占用少量的

      内存和CPU资源。

    4、假如使用扫描不可能针对每个服务都有自己的扫描器,相反的是肯定使用一个扫描器进行一对多进行扫描这就涉及排队等待

      或异常等待的现象发生,导致误判!

    5、如果采用扫描服务方案,本身有对外接口策略授权认证的,就需要对数据采集服务开绿灯(因为不可能针对不同认证策略单独做认证),

       所以可能对数据采集服务非常不友好。

    6、使用数据采集的方案可能很容易遗忘被监控的应用。

    

  基于以上六点本人得出的结论是监控信息采集尽量使用服务本身推送数据。

  你有更好的答案吗不妨在评论区聊聊!说说你的想法!

 

  欢迎阅读以下文章

  

  

 

  

服务监控信息到底是“主动推送”还是“被动扫描”???
@EnableHystrix
@RestController
@SpringBootApplication
public class DemoApplication {
    protected final static Logger logger = LoggerFactory.getLogger(DemoApplication.class);

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}
View Code