Spring Boot 構建微服務實踐
前言
在本文中將分享關于 Spring Boot 構建微服務程序的 "黃金法則" ,歡迎大家補充。
系統(tǒng)運行在白盒之上
監(jiān)控可視化系統(tǒng)的作用效果絕對是出乎你的預料,無論是簡單的
Spring Boot Admin還是復雜的Grafana,能夠識別出應用運行中的大部分問題,及時反饋給開發(fā)團隊。監(jiān)控系統(tǒng)提供了大量的圖表和報警監(jiān)控,使得對于故障有更快的響應速度。在微服務架構下,運行指標監(jiān)控和收集,則比單體應用更為重要。對于 Spring Boot 應用內(nèi)置
Spring Boot Actuator來暴露一些運行的指標。若使用它,僅需要增加以下依賴即可:
<dependency>
????<groupId>org.springframework.bootgroupId>
????<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
對我們來說 http.server.requests是最重要的指標之一,它提供了統(tǒng)計信息以及傳入請求的數(shù)量和響應時間。

關于 actuator 存儲,業(yè)界比較成熟的是 InfluxDB 和 Prometheus。它們代表著不同的收集模型,Prometheus 會定期從應用公開的端點檢索數(shù)據(jù),而 InfluxDB 提供了必須由應用程序調(diào)用的 REST API。(當然如果你的應用規(guī)模比較小、或者團隊能力有限可以使用 Spring Boot Admin 這種基于內(nèi)存形式展示的中間件)
當然注意生產(chǎn)環(huán)境務必屏蔽對外暴露,筆者在使用某些 APP 的后臺竟然可以直接獲取部分信息(某些操作可使服務宕機)。
日志記錄
對于日志記錄在開發(fā)過程中往往被忽視,但在后期運維過程中變得尤為重要。建議項目經(jīng)理在 review code 、測試團隊在業(yè)務測試過程中將日志輸出作為一項重要的依據(jù)。
對于微服務架構應用使用相同的日志記錄標準,通過 MDC 記錄應用傳遞過程,區(qū)分不同的實例,并且能夠計算和存儲每個請求的執(zhí)行時間。

對于日志存儲我們建議統(tǒng)一集中存儲,那么業(yè)界比較推薦的就是 Elastic Stack(ELK) 技術棧。
<dependency>
????<groupId>net.logstash.logbackgroupId>
????<artifactId>logstash-logback-encoderartifactId>
????<version>5.3version>
dependency>
當然如果項目規(guī)模比較小或者團隊經(jīng)驗有限,可直接使用云廠商提供的日志處理工具 (七牛 logkit、日志易等價格挺便宜)
確保接口文檔清晰可用
對于微服務架構服務之間調(diào)用或者對外提供的 REST API 調(diào)用非常繁多,因此要特別注意提供清晰而正確的(及時)文檔。
提起 swagger 大家肯定很熟悉強大的 API 文檔工具,業(yè)界必備的開發(fā)工具。通過簡單依賴和配置,即可完成在線接口文檔的維護。

但 swagger 的功能相對較弱,對于實際開發(fā)過程中需要打通整套 DevOps 體系遠遠不夠。YApi 是高效、易用、功能強大的 api 管理平臺,旨在為開發(fā)、產(chǎn)品、測試人員提供更優(yōu)雅的接口管理服務。可以幫助開發(fā)者輕松創(chuàng)建、發(fā)布、維護 API,YApi 還為用戶提供了優(yōu)秀的交互體驗,開發(fā)人員只需利用平臺提供的接口數(shù)據(jù)寫入工具以及簡單的點擊操作就可以實現(xiàn)接口的管理。當然支持 swagger 接口一鍵導入 yapi 實時自動維護,減少重復勞動。

如果是 dubbo 可以嘗試使用一下 smart-doc,是一款同時支持 java restful api 和 apache dubbo rpc 接口文檔生成的工具。完全基于注釋生成文檔,做到零侵入。
應用信息透明
我們遷移到微服務架構最重要的原因之一是對于持續(xù)交付的需求,快速交付的能力已經(jīng)能夠為市場人員帶來強大的競爭優(yōu)勢。甚至于一天可以發(fā)布多個版本,因此務必在版本中聲明當前的版本信息和變更信息等。
Spring Boot 提供了強大的 maven 插件,通過簡單的配置即可完成
<plugins>
???<plugin>
??????<groupId>org.springframework.bootgroupId>
??????<artifactId>spring-boot-maven-pluginartifactId>
??????<executions>
?????????<execution>
????????????<goals>
???????????????<goal>build-infogoal>
????????????goals>
?????????execution>
??????executions>
???plugin>
plugins>
訪問 /actuator/info端點即可發(fā)現(xiàn)部分有趣的信息
curl?http://localhost:8080/actuator/info???????????????????????????15:35:44
{"build":{"artifact":"demo","name":"demo","time":"2020-12-31T07:33:54.017Z","version":"0.0.1-SNAPSHOT","group":"com.example"}}?
當然若通過 SpringBootAdmin我們可以輕松瀏覽已注冊的應用程序列表,并檢出每個應用程序的版本或提交信息(需要額外引入 git-commit-id-plugin 插件)。

及時更新依賴
目前 Spring Boot 、Spring Cloud 團隊保持每月發(fā)布新的版本,每個版本或多或少的引入新的功能或者 BUG 修復。此外在最新穩(wěn)定版本中 Spring Boot 改善了應用程序的啟動時間和內(nèi)存占用,更好的和容器化結合。正因如此,所以值得去使用新的版本
最新穩(wěn)定版本
<parent>
???<groupId>org.springframework.bootgroupId>
???<artifactId>spring-boot-starter-parentartifactId>
???<version>2.4.1version>
parent>
<dependencyManagement>
???<dependencies>
??????<dependency>
?????????<groupId>org.springframework.cloudgroupId>
?????????<artifactId>spring-cloud-dependenciesartifactId>
?????????<version>2020.0.0version>
?????????<type>pomtype>
?????????<scope>importscope>
??????dependency>
???dependencies>
dependencyManagement>
Spring Cloud 版本說明

往期推薦
