隨着軟件架構的演進微服務逐漸變成各公司追求的目標,再加上敏捷開發,快速迭代,持續構建簡直是如虎添翼想象未來就是美好的,
但是又有幾個公司能都做到那,尤其這兩年spring boot的迅猛發展,也給各企業的研發團隊帶來對微服務實踐的有力武器!
好了廢話不多說馬上切入正題
我們都知道有了成千上萬的微服務監控就成了重中之重,我們一定要搞定它,既然要監控就需要有數據的采集,那好數據的采集我們是
采用微服務主動推送好那??還是定時掃描好那?接下來我們逐一討論!
我們都知道主動推送就是服務自己采集自己的相關信息然后發送給其他相關的服務上去進行信息匯總spring boot hystrix stream 就是一個
很好的例子。
被動掃描就是數據收集服務直接調用微服務的端口或URL等手段來獲取相關信息然后收集到統一倉庫進行處理,這里面典型的工具是telegraf
telegraf這個工具可以掃描端口或收集系統信息。
重點
我們先說主動推送與被動拉取的優勢與劣勢:
1、首先不是所有的服務都要暴露端口因為很多服務是用來跑數據的(比如統計相關信息),但是基本上多有服務都是要被監控的所以這是
主動推送的方案統一的第一條優勢,否則就要實現兩套方案。
2、上面的第一點有個漏洞服務A暴露端口不行嗎?,當然可以!好那我們就看看所有服務都暴露端口等待被掃描會有什么問題?
如上圖片展示加入我們進行定時掃描監控數據收集的話存在的問題就是網絡策略設置變得復雜重復,假如W和Y兩個網段對訪問是有IP限制的
或防火牆上的策略認證這時每個網段都要對“信息采集服務”進行信息穿透訪問,設置不但重復而且增加了風險。反過來就是主動推送信息!
從上圖我們可以分析出如果是主動推送只要所有被監控的服務可以訪問數據采集服務就可以了,數據采集只接受數據允許大家訪問
策略設置更統一更簡單。
3、上見面的第二點好像還有點問題哦?什么問題那?每個服務都要會有推送信息的線程會不會對服務造成壓力或性能損耗啊?
毫無疑問只要起了額外的線程就會造成服務本身要有少量的內存和CPU消耗,所以問題是有的,但是再想想我們暴露
接口難道沒有消耗嗎,那個消耗更值得那?我們暴露端口我們消耗的是容器(tomcat或jetty等,如果你是IO多路復用另談)
的線程池占用一定的線程資源,如果我們在服務內自己啟動線程推送就不會占用容器的對外線程池資源,只是占用少量的
內存和CPU資源。
4、假如使用掃描不可能針對每個服務都有自己的掃描器,相反的是肯定使用一個掃描器進行一對多進行掃描這就涉及排隊等待
或異常等待的現象發生,導致誤判!
5、如果采用掃描服務方案,本身有對外接口策略授權認證的,就需要對數據采集服務開綠燈(因為不可能針對不同認證策略單獨做認證),
所以可能對數據采集服務非常不友好。
6、使用數據采集的方案可能很容易遺忘被監控的應用。
基於以上六點本人得出的結論是監控信息采集盡量使用服務本身推送數據。
你有更好的答案嗎不妨在評論區聊聊!說說你的想法!
歡迎閱讀以下文章
spring boot +RabbitMQ +InfluxDB+Grafara監控實踐

@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); } }