如何做實時監控?—— 參考 Spring Boot 實現


http://blog.csdn.net/xiaoyu411502/article/details/48129057

**********************************************

微服務 的流行,相比較以前一個大型應用程序搞定所有需求,我們現在更傾向於把大型應用程序切分成多個微服務,服務之間通過 RPC 調用。微服務架構的好處非常多,例如穩定的服務變化較少,不會被非穩定服務所影響;不同的服務更方便交給不同的人管理;發布、擴容等操作也更加有針對性。不過這也不是沒有代價的,額外的成本最主要的可能就是運維成本。

測試,那是在測試環境就需要完成的事情,健康檢查基本只是關注環境是否 OK,最核心的一兩個用例是否 OK。由於部署到預發布或者線上的代碼,和線下測試的代碼是一致的,因此就不需要重復驗證各種功能了,關注點應該在環境上,這一點線上和線下是有明顯區別的。至於環境區別,通常就是磁盤、數據庫、其他分布式服務等等。

我曾嘗試定義一個健康檢查協議,讓所有服務都暴露一個HTTP接口http://172.20.10.2/health.json ,返回的內容就包含這個這個服務的基本狀態。

spring Boot ,發現它已經很好地集成了我想要的功能,而且看起來更簡單,因此我就直接扔掉了自己定義的協議,改而使用 Spring Boot 的方式,Spring Boot 有一個稱之為 endpoint 的概念,每個 endpoint 是一個非常簡單的 HTTP 接口,用戶可以通過 endpoint 監控 Spring Boot 應用,甚至與之交互。這其中,最簡單的 endpoint 就是 health,只要加入必要的 Spring Boot 依賴,用戶就能通過 health 查看 Spring Boot 應用的基本狀態。

$ curl http://localhost:8080/health { "status":"UP" }

 

class MyHealth implements HealthIndicator { @Override public Health health() {  return new Health.Builder()   .withDetail("tair", "timeout") // some logic check tair   .withDetail("tfs", "ok") // some logic check tfs   .status("500")   .down()   .build(); } } 

 

只要在每個服務稍微實現一些基本的環境檢查,那我就可以用幾行腳本快速地完成 7 個服務 x (國內環境 + 國外環境)x (預發布環境 + 生產環境)的健康檢查,如果有哪個服務出問題了,定位環境問題也是非常方便的。

 

除了 health endpoint 之外,Spring Boot 還提供了 其它10多個 endpoint ,它們都是針對運維設計的,例如可以用 shutdown endpoint 來關閉服務、用 beans endpoint 來查看所有的 Spring Bean,下面我想詳細講一下 metrics 這個 endpoint。

實現是這樣的:

@Component public class MyMetric { private final CounterService counterService; private final GaugeService gaugeService; @Autowired public MyMetric(CounterService counterService, GaugeService gaugeService) { this.counterService = counterService; this.gaugeService = gaugeService; } public void exampleCounterMethod() { this.counterService.increment("login.count"); // reset each minute } public void exampleGaugeMethod() { this.gaugeService.submit("cache.hit", 80.0); } }

現在訪問 metrics endpoint 的效果是這樣的:

$ curl http://localhost:8080/metrics { "counter.login.count": 42, "counter.status.200.beans": 1, "counter.status.200.metrics": 9, "counter.status.200.root": 4, "gauge.cache.hit": 80.0, "gauge.response.beans": 55, "gauge.response.health": 12, "gauge.response.metrics": 4, ... }

如果所有服務的核心業務數據都通過 metrics 暴露,我們接下來要做的無非就是通過一些數據可視化的 JavaScript 組件訪問這些數據,做成一個 Dashboard,那我們就能通過這樣一個 Dashboard 查看系統的實時狀態。

“you build it, you run it” ,開發不僅要關心如何實現功能,還需要關心服務在線上運行的狀態,如果缺乏實時監控,維護線上服務必然是一場噩夢。如果基於 Spring Boot 開發服務,那只需要稍作擴展,實時監控就足夠用了,就算不使用 Spring Boot,類似的思路自己實現也並不復雜。

參考鏈接 http://docs.spring.io/spring-boot/docs/1.1.x/reference/htmlsingle/#production-ready-endpoints

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM