
內容來源:2017年5月6日,鏈家網架構師程天亮在“Spring Cloud中國社區(qū)技術沙龍-北京站”進行《Spring Boot在鏈家網實踐》演講分享。IT大咖說(WeChat_ID:itdakashuo)作為獨家視頻合作方,經主辦方和講者審閱授權發(fā)布。
閱讀字數:2133?| 5分鐘閱讀
嘉賓演講視頻回顧及PPT,請點擊:http://t.cn/RgFdvoD
摘要
SpringBoot是由Pivotal團隊提供的全新框架,其設計目的是用來簡化新Spring應用的初始搭建以及開發(fā)過程。該框架使用了特定的方式來進行配置,從而使開發(fā)人員不再需要定義樣板化的配置。通過這種方式,Boot致力于在蓬勃發(fā)展的快速應用開發(fā)領域成為領導者。
Spring Boot實踐
Spring Boot是什么?
SpringBoot是基于spring4以上生態(tài)的一個框架,是一個優(yōu)化并簡化Spring開發(fā)的框架,也是一個微服務的入門級框架。
SpringBoot主要是簡化開發(fā),也改變了傳統Web的部署方式,將一些容器內置,使得我們的部署和運行都比較方便,通過一個jar包就可以運行。它還提供了自動配置的功能,讓開發(fā)更簡單。Spring Boot自帶進程內部的監(jiān)控,以及JMX的封裝,這樣我們就可以把進程內部的信息接到監(jiān)控平臺上去,能夠掌握更多程序進程內部的情況。因為Spring Boot已經內置了Web容器,就不再需要打WAR包了。
鏈家網的平臺策略技術主要是與平臺數據驅動和數據挖掘等方向相關,所以基本都是一些服務。
如圖可見,在最上層有API網關,用來連接下面的服務,提供非java系列的API轉換以及API的路由分發(fā)等等。對于java相關的我們提供了服務的SDK。
中間一層主要是業(yè)務上的一些基礎服務平臺。有RDC作為服務的提供者,主要是以dubbo形式。在這過程中我們做了配置和注冊中心。在整個過程中我們有進程內部的監(jiān)控和服務監(jiān)控。由于我們做的是基礎平臺,還要做一些灰度發(fā)布、流量實驗,所以我們會有一個流量實驗平臺。這些平臺最初是基于Spring,現在我們把它改成在Spring Boot的基礎上重做這些服務。
最下面是數據實施流和實時計算流。
鏈家網平臺策略部發(fā)展遇到的問題
服務配置復雜?;A服務多,服務的資源配置復雜。傳統方式管理服務復雜。
服務之間調用復雜。檢索服務、用戶中心服務等,其之間的調用復雜,依賴多,需要微服務化。
服務監(jiān)控難度大。服務比較多,機器部署復雜,服務存活監(jiān)控、業(yè)務是否正常監(jiān)控尤為重要。
服務化測試問題。服務依賴性比較大,測試一個小的功能,周邊服務也需要啟動。
SpringBoot把凌亂的配置集中化。傳統Spring是采用XML的方式進行配置,容器和業(yè)務上的配置很難分離。使用Spring Boot之后,就能把這兩塊分開,把容器的注入通過Spring4的Java Config方式進行配置。
和業(yè)務相關的業(yè)務配置可以通過yml、properties等方式進行管理。
做到這里還只是第一步,把容器相關的管理和業(yè)務的配置分離。但是這遠遠不夠,我們仍然很難維護數據庫的資源,以及數據庫的用戶名密碼和它的鏈接等都是暴露出來的。這對于安全性來說是一個很大的隱患。所以我們接下來就要把這些通用的、異變的、保密性的資源集中到服務器的Config Center。其余一些基本不變的業(yè)務相關的配置放在本地。
于是就形成了上圖中的方式。我們有一個資源配置或注冊中心,檢索平臺、數據挖掘平臺和用戶中心都是依賴于注冊中心和一些少量的本地配置文件。
通過這種方式簡化了配置,在ID編碼上也有比較整潔簡單的接入,以及對一些重點資源的安全進行統一管理,從而大大提升了安全性。
解決單進程多應用低吞吐量
單應用單處理,使用Spring Boot fat jar模式,將tomcat等容器內嵌。
每個tomcat只管理一個應用,提高應用的吞吐量。
服務的管理更加清晰化,打包工程更加流程化。
服務內嵌tomcat,測試更加容易控制進程,更容易實現自動化測試。
傳統方法是通過xml、Spring各種依賴、SDK依賴等等非常繁雜,版本控制、版本依賴都容易出現問題,導致SSO或權限管理很復雜。我們通過擴展Spring把它的配置信息放到配置中心,只需要一個配置中心的地址就可以。再加上一些本地不太變化的配置,最后再做一個SSO/User-starter。使我們的集成用戶中心和權限系統變得非常容易,為我們鏈家網所有系統需要的用戶相關的接入減少很多成本,以及它的調試成本都會很低。
我們所有的服務之前都是用dubbo或者native自己寫的一些RPC,在這過程中我們通過Spring Boot對dubbo也進行了一次改造。
關于dubbo的配置解析,在原有的SpringXML的配置解析基礎上,添加了Spring Config Parser以及Spring Boot Start。在傳輸協議上加了restful和Restful兩個協議。改造后在寫服務的時候只需要一個注冊中心配置+注解就可以了。
微服務治理
SpringBoot也是一個輕量級的微服務入口,我們進行了一些微服務治理,當然現在還不是很健全。
我們主要做的是一些API的服務網關、dubbo的原生admin,在模塊上增加了調用鏈追蹤、查詢和診斷,以及在Spring Boot Actutor的基礎上增加了服務內部的監(jiān)控。還整合了jolokia,豐富JMX監(jiān)控和控制。
困難與挑戰(zhàn)
線上運維問題
以前單Tomcat很容易維護,因為它是一個很標準的容器。Op可以通過它進行一些控制、配置和管理。
現在經過Spring Boot改造后變成每個應用自己就帶有Tomcat,這樣必然將Tomcat的配置下發(fā)到應用程序。如果沒有一個編程規(guī)范和配置規(guī)范的話,會導致每個應用程序的配置不一定合格,還會產生一些安全風險。
在這種情況下就需要做一些編碼規(guī)范以及配置規(guī)范,把Tomcat相關的信息再次剝離,到配置中心交給Op去運行。
之前有標準的啟停腳本,通過Spring Boot改造后的啟動腳本會隨意化,導致啟停腳本五花八門難以維護。所以我們對腳本進行了規(guī)范化,自動生成腳本從而達到統一。
編碼上的問題
代碼閱讀難度加大:代碼的入口更加隱蔽,不如web.xml和spring xml邏輯清晰。要求更高的編程規(guī)范。
學習成本加大:新的技術都有學習成本。Spring Boot入門簡單,用好或擴展需要更深的學習或源碼學習。
入門級微服務框架:Spring Boot主要還是對Spring的再封裝,解決Spring易用。Spring Boot做微服務,還需要對周邊進行豐富。
今天的分享到此結束,謝謝大家!