微服務(wù)架構(gòu)(一):Spring Boot入門

Spring Boot是微服務(wù)架構(gòu)的基礎(chǔ)。相比以前的Spring,它主要是省去了大量的樣板式配置,取而代之的是根據(jù)條件的自動化配置,也提升了開發(fā)體驗和增加一些新的特性,使開發(fā)人員把更多的精力放到業(yè)務(wù)代碼上。所以,對于Spring Boot的學(xué)習(xí)主要是了解Spring Boot的開發(fā)方式,深入一點,就是了解其內(nèi)部的自動配置等特性。

起步

Spring Boot的初始項目可以通過三種方式來創(chuàng)建。

  • 通過start.spring.io 來可視化創(chuàng)建項目,填寫項目構(gòu)建方式(Maven/Gradle)以及項目相關(guān)信息和項目包含的模塊,下載到本地后直接用IDE打開即可。
  • 下載專用IDESpring Tool Suite ,點擊File->new->Spring Start Project即可進(jìn)入新建Spring Boot項目流程。
  • 通過Spring Boot CLI 命令行工具來構(gòu)建項目,此種方式需要用到Groovy語言。此方式本文暫不討論。
    ?除了Spring Boot CLI通過寫少量Groovy腳本即可通過CLI來自動推斷需要哪些包并自動引入和配置外,其它兩種方式都需要手動來選擇或配置項目所需模塊。以如圖:
部分可選依賴列表.png

??在上面的列表中,可以根據(jù)我們所需來自由選擇依賴項,例如,如果是web開發(fā),需要勾選web就可以;如果需要數(shù)據(jù)持久化,可以勾選JPA或MyBatis等。在嘗試用Spring Boot做web開發(fā)的初始階段,建議選擇web(SpringMvc),JPA/Mybatis(持久化),H2(嵌入式數(shù)據(jù)庫),thymeleaf(模板引擎)。創(chuàng)建完成項目后若是Maven構(gòu)建方式,打開Pom.xml文件就會發(fā)現(xiàn),這一整套能夠開發(fā)出簡單應(yīng)用的項目所需的依賴非常少,只有我們所選擇的依賴項,并且沒有了那么多的配置文件,只有一個application.properties配置文件。

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

這就體現(xiàn)出Spring Boot的兩個好處:自動配置,起步依賴。

  • 自動配置:所有的配置都不是在配置文件中顯示聲明,而是根據(jù)項目中是否有某個包的依賴在代碼中自動完成配置,如果沒有則忽略。Spring Boot所支持的自動配置依賴列表在spring-boot-autoconfiger.jar包中查看,在項目中如果遇到Spring Boot沒有實現(xiàn)的第三方依賴自動配置,可以參照其中的代碼來自定義實現(xiàn)。也可以擴(kuò)展其已有的配置類,重寫其中的configure方法來覆蓋默認(rèn)的自動配置。
  • 起步依賴:Spring Boot通過提供起步依賴降低項目依賴的復(fù)雜度。起步依賴本質(zhì)上是一個Maven項目對象模型(Project Object Model,POM),定義了對其它庫的傳遞依賴,使這些庫加在一起支持某項功能。起步依賴一般都會以spring-boot-start-開頭。例如web的起步依賴是spring-boot-start-web其傳遞依賴有org.springframework:spring-web,org.springframework:spring-webmvc,com.fasterxml.jackson.core:jackson-databind等依賴項。其中各個依賴項的版本都是經(jīng)過Spring Boot測試的沒有兼容問題的版本。然而在實際開發(fā)中會有某些情況需要自己來控制某個傳遞依賴的版本,比如上面com.fasterxml.jackson.core:jackson-databind修復(fù)了某個bug的版本,這種情況在Pom.xml中可以通過添加指定版本號的該依賴項的形式來覆蓋默認(rèn)的傳遞依賴引用:
       <dependency>
           <groupId>com.fasterxml.jackson.core</groupId>
           <artifactId>jackson-databind</artifactId>
           <version>3.2.1</version>
       </dependency>

至此,一個簡單Spring Boot項目已經(jīng)完成,我們可以像以往一樣直接開始寫業(yè)務(wù)代碼,如創(chuàng)建實體類,寫Controller,添加視圖等等。在寫完代碼后,Spring Boot的運(yùn)行方式有兩種:

  • 直接在IDE中debug(本人用的是Spring Tool Suite,運(yùn)行方式是項目->DebugAs->Spring Boot App)。也可以在Pom.xml中把jar改成war,在tomcat中運(yùn)行。
  • 執(zhí)行maven install操作,會在項目根目錄的target文件夾內(nèi)生成demo.jar可執(zhí)行程序,通過java -jar demo.jar 運(yùn)行即可
    ?以上兩種方式運(yùn)行后可以在瀏覽器中輸入localhost:8080來訪問你的web程序。

通過屬性文件(application.properties)外置配置

Spring Boot自動配置的Bean提供了300多個用于微調(diào)的屬性。當(dāng)調(diào)整設(shè)置時,只需要在環(huán)境變量、java系統(tǒng)屬性、命令行參數(shù)或?qū)傩晕募镞M(jìn)行指定就可以了。其中,屬性文件有兩種文件格式,一種就是我們看見的默認(rèn)的application.properties,一種是application.yml
?以配置服務(wù)啟動的端口為例,兩種配置文件的格式分別為(server.port設(shè)置為0的作用是在啟動時會選擇一個可用的隨機(jī)端口,這樣能避免端口沖突):

application.properties

server.port=0

application.yml

server:
    port:0

同時,也可以像以前一樣將應(yīng)用程序所需的自定義配置寫到屬性配置文件中,而且更方便。例如,我們要把項目名稱等相關(guān)信息寫到配置文件中可以這樣寫

project.Name='新項目'
project.Company='***公司'

然后,在項目中寫一個對應(yīng)的Bean,Bean加上@ConfigurationProperties("project")注解,就可以實現(xiàn)將帶有project前綴的配置加載到對應(yīng)屬性中,代碼如下:

@Component
@ConfigurationProperties("project")
public class ProjectProperties{
      private String name;
      public void setName(String name){
          this.name=name;
      }
      public String getName(){
          return this.name;
      }
    ………………………………
}

這樣,在所需要的地方可以直接注入這個Bean來方便使用配置中的屬性了。
?Spring Boot的屬性配置文件也可以通過Spring.profiles.active屬性來激活指定的配置文件,以實現(xiàn)在不同環(huán)境使用不同配置文件,如果使用application.properties屬性文件,則額外配置文件的命名規(guī)則為application-{profile}.properties。例如,設(shè)置Spring.profiles.active=product,則額外配置文件名字為application-product.properties,這樣在程序運(yùn)行時會自動讀取application-product.properties文件的配置屬性。Profile在Spring3.1版本就已經(jīng)有,但是在Spring Boot中使用更為方便。

Actuator

Actuator提供很多生產(chǎn)級特性,比如監(jiān)控和度量Spring Boot應(yīng)用。使用方法就是直接添加起步依賴 spring-boot-starter-actuator或在創(chuàng)建項目時勾選Actuator。Actuator暴露的接口可以提供很多Spring Boot各種信息以及運(yùn)行狀態(tài)、所使用資源以及空閑資源等,也可以用來控制Spring Boot應(yīng)用關(guān)閉等操作。也可以通過它來查看Spring Boot所做的自動配置信息。
?比如,在Spring Boot運(yùn)行時,通過瀏覽器訪問localhost:8080/health就會得到應(yīng)用是否運(yùn)行的狀態(tài):

{"status":"UP"}

輸入localhost:8080/metrics就會得到各種應(yīng)用程序度量信息,比如內(nèi)存用量和HTTP請求次數(shù)等:

{
    "mem": 330481,
    "mem.free": 103166,
    "processors": 8,
    "instance.uptime": 4087,
    "uptime": 7873,
    "systemload.average": -1.0,
    "heap.committed": 268800,
    "heap.init": 131072,
    "heap.used": 165633,
    "heap": 1849856,
    "nonheap.committed": 62720,
    "nonheap.init": 2496,
    "nonheap.used": 61683,
    "nonheap": 0,
    "threads.peak": 28,
    "threads.daemon": 26,
    "threads.totalStarted": 32,
    "threads": 28,
    "classes": 8913,
    "classes.loaded": 8913,
    "classes.unloaded": 0,
    "gc.ps_scavenge.count": 9,
    "gc.ps_scavenge.time": 61,
    "gc.ps_marksweep.count": 2,
    "gc.ps_marksweep.time": 96,
    "httpsessions.max": -1,
    "httpsessions.active": 0,
    "datasource.primary.active": 0,
    "datasource.primary.usage": 0.0
}

所有的結(jié)果都是以json形式返回。下面時暴露的接口列表:

HTTP方法 路徑 描述
GET /autoconfig 提供了一份自動配置報告,記錄哪些自動配置條件通過了,哪些沒通過
GET /configprops 描述配置屬性(包含默認(rèn)值)如何注入Bean
GET /beans 描述應(yīng)用程序上下文里全部Bean,以及它們的關(guān)系型
GET /dump 獲取線程活動的快照
GET /env 獲取全部環(huán)境屬性
GET /env/{name} 根據(jù)名稱獲取特定的環(huán)境屬性
GET /health 報告應(yīng)用程序的健康指標(biāo)
GET /info 獲取應(yīng)用程序的定制信息,這些信息由info打頭的屬性提供
GET /mappings 描述全部的URI路徑,以及它們和控制器(包含Actuator端點)的映射關(guān)系
GET /metrics 報告各種應(yīng)用程序度量信息 ,比如內(nèi)存用量和HTTP請求次數(shù)等
GET /metrics/{name} 報告指定名稱應(yīng)用程序度量值
GET /shutdown 關(guān)閉應(yīng)用程序,要求endpoints.shutdown.enable設(shè)置為true
GET /trace 提供基本的HTTP請求跟蹤信息(時間戳、HTTP頭等),只保存前100條請求信息,也可以通過配置來實現(xiàn)持久化到數(shù)據(jù)庫
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,908評論 6 541
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,324評論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,018評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,675評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,417評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,783評論 1 329
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,779評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,960評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,522評論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,267評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,471評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,009評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,698評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,099評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,386評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,204評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,436評論 2 378

推薦閱讀更多精彩內(nèi)容