【讀書筆記】SpringBoot讀書筆記



整體目錄結構:
一、入門
二、開發第一個應用程序
三、自定義配置
四、測試
五、Groovy與Spring Boot Cli
六、在Spring Boot中使用Grails
七、深入Actuator
八、部署Spring Boot應用程序
附錄A、Spring Boot開發者工具
附錄B:Spring Boot起步依賴
附錄C:配置屬性
附錄D:Spring Boot依賴


整體來說這本書說明了什么?
通過最簡單的案例和文字系統性的介紹了SpringBoot的幾個核心原理和知識點:起步依賴、自動配置、自定義配置、Springboot Cli、測試、部署、工具支持、監控。並且通過Croovy和Grails等其他語言進行了最簡單的案例演示。
作者細說了什么?怎么說的?
本書是一本工具書,開篇一般是對於原理的講解,又講解了優點,后續是具體案例的實施。
這本書說的有道理嗎?是全部有道理還是部分有道理?
無所謂道理,並沒有太多作者的觀點,有觀點基本上沒有對錯。
本書跟我有什么關系?
我希望能夠通過本書了解Springboot的核心內容和基本概念,了解因果原理,記錄下實踐所需要注意的點,在工作中提供一個解決問題的思路。


第一章:入門
SpringBoot的背景和問題
Spring Boot提供了一種新的編程范式,能在最小的阻力下開發Spring應用程序。有了它, 你可以更加敏捷地開發Spring應用程序,專注於應用程序的功能,不用在Spring的配置上多花功 夫,甚至完全不用配置。
Spring誕生時是Java企業版(Java Enterprise Edition,JEE,也稱J2EE)的輕量級代替品。無需 開發重量級的Enterprise JavaBean(EJB),Spring為企業級Java開發提供了一種相對簡單的方法,通 過依賴注入和面向切面編程,用簡單的Java對象(Plain Old Java Object,POJO)實現了EJB的功能。
雖然Spring的組件代碼是輕量級的,但它的配置卻是重量級的。
所有這些配置都代表了開發時的損耗。
除此之外,項目的依賴管理也是件吃力不討好的事情。
並且,依賴管理也是一種損耗,添加依賴不是寫應用程序代碼。

Spring Boot 精要四個核心
自動配置:針對很多Spring應用程序常見的應用功能,Spring Boot能自動提供相關配置
起步依賴:告訴Spring Boot需要什么功能,它就能引入需要的庫。
命令行界面:這是Spring Boot的可選特性,借此你只需寫代碼就能完成完整的應用程序,
無需傳統項目構建。
Actuator:讓你能夠深入運行中的Spring Boot應用程序,一探究竟。

Spring Boot通過起步依賴為項目的依賴管理提供幫助。起步依賴其實就是特殊的Maven依 賴和Gradle依賴,利用了傳遞依賴解析,把常用庫聚合在一起,組成了幾個為特定功能而定制 的依賴。
Spring Boot CLI讓只寫代碼即可實現應用程序成為可能。Spring Boot CLI是Spring Boot的非必要組成部分。
Actuator 則要提供在運行時檢視應用程序內部情況的能力

Spring Boot 不是什么
首先,Spring Boot不是應用服務器。
Spring Boot也沒有實現諸如JPA或JMS
Spring Boot沒有引入任何形式的代碼生成,而是利用了Spring 4的條件化配置特性, 以及Maven和Gradle提供的傳遞依賴解析,以此實現Spring應用程序上下文里的自動配置。
簡而言之,從本質上來說,Spring Boot就是Spring,它做了那些沒有它你自己也會去做的Spring Bean配置。

安裝 Spring Boot CLI

  1. 手工安裝Spring Boot CLI
  2. 使用Software Development Kit Manager進行安裝
  3. 使用Homebrew進行安裝
  4. 使用MacPorts進行安裝
  5. 開啟命令行補全:一個是針對BASH的,另一個是針對zsh的
    Spring Boot CLI為Spring Boot提供了快速上手和構建簡單原型應用程序的途徑。

使用 Spring Initializr 初始化 Spring Boot 項目

  1. 使用Spring Initializr的Web界面
  2. 在Spring Tool Suite里創建Spring Boot項目
  3. 在IntelliJ IDEA里創建Spring Boot項目
  4. 在Spring Boot CLI里使用Initializr

小結:
Spring Boot為Spring應用程序的開發提供了一種激動人心的新方式,框架本身帶來的阻力很 小。自動配置消除了傳統Spring應用程序里的很多樣板配置;Spring Boot起步依賴讓你能通過庫 所提供的功能而非名稱與版本號來指定構建依賴;Spring Boot CLI將Spring Boot的無阻礙開發模 型提升到了一個嶄新的高度,在命令行里就能簡單快速地用Groovy進行開發;Actuator讓你能深 入運行中的應用程序,了解Spring Boot做了什么,是怎么做的。


第二章:開發第一個應用程序

1. 啟動引導Spring:
配置和啟動引導。雖然Spring Boot的自動配置免除了很多Spring配置,但你還需要進行 少量配置來啟用自動配置。
SpringBootApplication
@SpringBootApplication開啟了Spring的組件掃描和Spring Boot的自動配置功能。實際 上,@SpringBootApplication將三個有用的注解組合在了一起。
Spring的@Configuration:標明該類使用Spring基於Java的配置。
Spring的@ComponentScan:啟用組件掃描.
Spring Boot的@EnableAutoConfiguration:這個不起眼的小注解也可以稱為 @Abracadabra1,就是這一行配置開啟了Spring Boot自動配置的魔力,讓你不用再寫成 篇的配置了。

2. 測試Spring Boot應用程序
@RunWith(SpringJUnit4ClassRunner.class)
一個典型的Spring集成測試會用@ContextConfiguration注解標識如何加載Spring的應用
程序上下文。但是為了充分發揮Spring Boot的魔力,這里應該用@SpringApplication- Configuration注解。

3. 配置應用程序屬性
Initializr為你生成的application.properties文件是一個空文件。但大部分的配置都存在於這里

2.1.2 Spring Boot 項目構建過程解析
Spring Boot為Gradle和Maven提供了構建插件,以便輔助構建Spring Boot項目。
構建插件的主要功能是把項目打包成一個可執行的超級JAR(uber-JAR),包括把應用程序的 所有依賴打入JAR文件內,並為JAR添加一個描述文件,其中的內容能讓你用java -jar來運行 應用程序。

2.2.1 指定基於功能的依賴
Spring Boot通過提供眾多起步依賴降低項目依賴的復雜度。起步依賴本質上是一個Maven項 目對象模型(Project Object Model,POM),定義了對其他庫的傳遞依賴,這些東西加在一起即 支持某項功能。

2.2.2 覆蓋起步依賴引入的傳遞依賴
你可以通過構建工具中的 功能,選擇性地覆蓋它們引入的傳遞依賴的版本號,排除傳遞依賴,當然還可以為那些Spring Boot 起步依賴沒有涵蓋的庫指定依賴。

2.3 使用自動配置
程序引入依賴后就能夠自行啟動了,但是某處肯定是有些配置的。配置是Spring Framework的核心元素,必須要有東西告訴Spring 如何運行應用程序。有個名為spring-boot-autoconfigure的JAR文件,其中包含了 很多配置類。它們利用了Spring的條件化配置,條件化配置允許配置存在於應用程序中,但在滿足某些特定條件之前都忽略這個配置。
在Spring里可以很方便地編寫你自己的條件,你所要做的就是實現Condition接口,覆蓋它 的matches()方法。
@Conditional(JdbcTemplateCondition.class)
表2-1 自動配置中使用的條件化注解
@ConditionalOnBean配置了某個特定Bean
@ConditionalOnMissingBean:沒有配置特定的Bean
@ConditionalOnClass:Classpath里有指定的類
@ConditionalOnMissingClass:Classpath里缺少指定的類
@ConditionalOnExpression:給定的Spring Expression Language(SpEL)表達式計算結果為true
@ConditionalOnJava:Java的版本匹配特定值或者一個范圍值
@ConditionalOnJndi:參數中給定的JNDI位置必須存在一個,如果沒有給參數,則要有JNDI InitialContext
@ConditionalOnProperty:指定的配置屬性要有一個明確的值
@ConditionalOnResource:Classpath里有指定的資源
@ConditionalOnWebApplication:這是一個Web應用程序
@ConditionalOnNotWebApplication:這不是一個Web應用程序
Spring Boot自動配置承擔起了配置Spring的重任,因此你能專注於編寫自己的應用程序。

2.4 小結
通過Spring Boot的起步依賴和自動配置,你可以更加快速、便捷地開發Spring應用程序。起 步依賴幫助你專注於應用程序需要的功能類型,而非提供該功能的具體庫和版本。與此同時,自 動配置把你從樣板式的配置中解放了出來。這些配置在沒有Spring Boot的Spring應用程序里非常 常見。


第三章:自定義配置
本章我們將看到兩種影響自動配置的方式——使用顯式配置進行覆蓋和使用屬性進行精細 化配置。我們還會看到如何使用Spring Boot提供的鈎子引入自定義的錯誤頁。

3.1 覆蓋 Spring Boot 自動配置
覆蓋自動配置很簡單,就當自動配置不存在,直接顯式地寫一段配置。

3.2 通過屬性文件外置配置
事實上,Spring Boot自動配置的Bean提供了300多個用於微調的屬性。當你調整設置時,只 要在環境變量、Java系統屬性、JNDI(Java Naming and Directory Interface)、命令行參數或者屬 性文件里進行指定就好了。
Spring Boot應用程序有多種設置途徑。

(1) 命令行參數

(2) java:comp/env里的JNDI屬性

(3) JVM系統屬性

(4) 操作系統環境變量

(5) 隨機生成的帶random.* 前綴的屬性(在設置其他屬性時,可以引用它們,比如${random. long})

(6) 應用程序以外的application.properties或者appliaction.yml文件

(7) 打包在應用程序內的application.properties或者appliaction.yml文件

(8) 通過@PropertySource標注的屬性源

(9) 默認屬性
這個列表按照優先級排序,也就是說,任何在高優先級屬性源里設置的屬性都會覆蓋低優先
級的相同屬性。例如,命令行參數會覆蓋其他屬性源里的屬性。 application.properties和application.yml文件能放在以下四個位置。都按照優先級排序

(1) 外置,在相對於應用程序運行目錄的/config子目錄里。

(2) 外置,在應用程序運行的目錄里。

(3) 內置,在config包內。

(4) 內置,在Classpath根目錄。

3.2.1 自動配置微調
1. 禁用模板緩存
2. 配置嵌入式服務器
3. 配置日志
默認情況下,Spring Boot會用Logback(http://logback.qos.ch)來記錄日志,並用INFO級別輸 出到控制台。在運行應用程序和其他例子時,你應該已經看到很多INFO級別的日志了。
一般來說,你不需要切換日志實現;Logback能很好地滿足你的需要。
那么你只需要修改依賴,引入對應該日志實現的起步依賴,同時排除掉 Logback。

4. 配置數據源
如果Classpath里有Tomcat的連接池DataSource,那么就會使用這個連接池; 否則,Spring Boot會在Classpath里查找以下連接池:
 HikariCP
 Commons DBCP
 Commons DBCP 2

3.2.2 應用程序 Bean 的配置外置
@ConfigurationProperties注解,@ConfigurationProperties(prefix="amazon"),prefix屬性說明應該注入帶amazon前綴的屬性
開啟配置屬性 從技術上來說,@ConfigurationProperties注解不會生效,除 非先向Spring配置類添加@EnableConfigurationProperties注解。但通常無需這么 做,因為Spring Boot自動配置后面的全部配置類都已經加上了@EnableConfigura- tionProperties注解。因此,除非你完全不使用自動配置(那怎么可能?),否則就 無需顯式地添加@EnableConfigurationProperties。
還有一點需要注意,Spring Boot的屬性解析器非常智能,它會自動把駝峰規則的屬性和使用
連字符或下划線的同名屬性關聯起來。換句話說,amazon.associateId這個屬性和
amazon.associate_id以及amazon.associate-id都是等價的。用你習慣的命名規則就好。
不過最好在一個類里面收集屬性

3.2.3 使用Profile進行配置
Spring Framework從 Spring 3.1開始支持基於Profile的配置。Profile是一種條件化配置,基於運行時激活的Profile,會 使用或者忽略不同的Bean或配置類。
Spring Boot支持為application.properties和application.yml里的屬性配置Profile。

1. 使用特定於Profile的屬性文件
如果你正在使用application.properties,可以創建額外的屬性文件,遵循application-{profile}. properties這種命名格式,這樣就能提供特定於Profile的屬性了。
與此同時,那些並不特定於哪個Profile或者保持默認值(以防萬一有哪個特定於Profile的配 置不指定這個值)的屬性,可以繼續放在application.properties里。

2. 使用多Profile YAML文件進行配置
但既然用了YAML,你就可以把所有Profile的配置屬性都放在一個application.yml文件里。通過添加層級結構進行區分。

3.3 定制應用程序錯誤頁面
實現了Spring的View接口的Bean,其 ID為error(由Spring的BeanNameViewResolver所解析)。
定義異常解析視圖:error.html、error.ftl、error.vm、error.jsp、
異常描述狀態:timestamp、status、error、exception、message、errors

小結:
Spring Boot消除了Spring應用程序中經常要用到的很多樣板式配置。讓Spring Boot處理全部配置,你可以仰仗它來配置那些適合你的應用程序的組件。當自動配置無法滿足需求時,Spring Boot允許你覆蓋並微調它提供的配置。
覆蓋自動配置其實很簡單,就是顯式地編寫那些沒有Spring Boot時你要做的Spring配置。 Spring Boot的自動配置被設計為優先使用應用程序提供的配置,然后才輪到自己的自動配置。
即使自動配置合適,你仍然需要調整一些細節。Spring Boot會開啟多個屬性解析器,讓你通 過環境變量、屬性文件、YAML文件等多種方式來設置屬性,以此微調配置。這套基於屬性的配 置模型也能用於應用程序自己定義的組件,可以從外部配置源加載屬性並注入到Bean里。
Spring Boot還自動配置了一個簡單的白標錯誤頁,雖然它比異常跟蹤信息友好一點,但在藝 術性方面還有很大的提升空間。幸運的是,Spring Boot提供了好幾種選項來自定義或完全替換這 個白標錯誤頁,以滿足應用程序的特定風格。


第四章:測試
Spring的SpringJUnit4ClassRunner可以在基於JUnit的應用程序測試里加載Spring應用程 序上下文。在測試Spring Boot應用程序時,Spring Boot除了擁有Spring的集成測試支持,還開啟 了自動配置和Web服務器,並提供了不少實用的測試輔助工具。

4.1 集成測試自動配置
Spring Framework的核心工作是將所有組件編織在一起,構成一個應用程序。整個過程就是 讀取配置說明(可以是XML、基於Java的配置、基於Groovy的配置或其他類型的配置)程序上下文里初始化Bean,將Bean注入依賴它們的其他Bean中。
對Spring應用程序進行集成測試時,讓Spring遵照生產環境來組裝測試目標Bean是非常重要的一點。當然,你也可以手動初始化組件,並將它們注入其他組件,但對那些大型應用程序來說,這是項費時費力的工作。
@RunWith和@ContextConfiguration注解
@RunWith的參數是SpringJUnit4ClassRunner.class,開啟了Spring集成測試支持。1與此 同時,@ContextConfiguration指定了如何加載應用程序上下文。此處我們讓它加載Address- BookConfiguration里配置的Spring應用程序上下文。
SpringApplication不僅加載應用程序上下文,還會開啟日志、 加載外部屬性(application.properties或application.yml),以及其他Spring Boot特性。用@Context- Configuration則得不到這些特性。
要在集成測試里獲得這些特性,可以把@ContextConfiguration替換為Spring Boot的@SpringApplicationConfiguration。
@SpringApplicationConfiguration的用法和@ContextConfiguration大致相同,但 也有不同的地方,@SpringApplicationConfiguration加載Spring應用程序上下文的方式同 SpringApplication相同,處理方式和生產應用程序中的情況相同。這包括加載外部屬性和 Spring Boot日志。

4.2 測試Web應用程序
Spring MVC有一個優點:它的編程模型是圍繞POJO展開的,在POJO上添加注解,聲明如何 處理Web請求。你還可以針對這些控制器編寫測試,就像測試POJO一樣。Spring Boot開發者有兩個可選的方案能實現這類測試。
Spring Mock MVC:能在一個近似真實的模擬Servlet容器里測試控制器,而不用實際啟動 應用服務器。
Web集成測試:在嵌入式Servlet容器(比如Tomcat或Jetty)里啟動應用程序,在真正的應 用服務器里執行測試。

模擬SpringMVC
要在測試里設置Mock MVC,可以使用MockMvcBuilders,該類提供了兩個靜態方法。
standaloneSetup():構建一個Mock MVC,提供一個或多個手工創建並配置的控制器。
webAppContextSetup():使用Spring應用程序上下文來構建Mock MVC,該上下文里
可以包含一個或多個配置好的控制器。
兩者的主要區別在於,standaloneSetup()希望你手工初始化並注入你要測試的控制器,而webAppContextSetup()則基於一個WebApplicationContext的實例,通常由Spring加載。
前者同單元測試更加接近,你可能只想讓它專注於單一控制器的測試,而后者讓Spring加載控制
器及其依賴,以便進行完整的集成測試。
我們要用的是webAppContextSetup()。Spring完成了ReadingListController的初始 化,並從Spring Boot自動配置的應用程序上下文里將其注入,我們直接對其進行測試。
webAppContextSetup()接受一個WebApplicationContext參數。因此,我們需要為測 試類加上@WebAppConfiguration注解,使用@Autowired將WebApplicationContext作為實 例變量注入測試類。

4.2.2 測試Web安全
首先要引入安全框架通過起步依賴和自動配置加入,Spring Security提供了兩個注解。
@WithMockUser:加載安全上下文,其中包含一個UserDetails,使用了給定的用戶名、密碼和授權。
@WithUserDetails:根據給定的用戶名查找UserDetails對象,加載安全上下文。
Spring Security的安全上下文都會加載一個UserDetails對象,添加了該 注解的測試方法在運行過程中都會使用該對象。
@WithMockUser注解是兩者里比較基礎的那個, 允許顯式聲明一個UserDetails,並加載到安全上下文,繞過了UserDetails對象的正常查詢,用給定的值創建了一 個UserDetails對象取而代之。在簡單的測試里,這就夠用了。
但我們的測試需要Reader(實 現了UserDetails)而非@WithMockUser創建的通用UserDetails。為此,我們需要 @WithUserDetails。@WithUserDetails注解使用事先配置好的UserDetailsService來加載UserDetails對 象。

4.3 測試運行中的應用程序
Spring Boot的@WebIntegrationTest注解就是這么做的,在測試類上添加@Web- IntegrationTest注解,可以聲明你不僅希望Spring Boot為測試創建應用程序上下文,還要啟 動一個嵌入式的Servlet容器。一旦應用程序運行在嵌入式容器里,你就可以發起真實的HTTP請 求,斷言結果了。

4.3.1 用隨機端口啟動服務器
@WebIntegrationTest 的value屬性接受一個String數組,數組中的每項都是鍵值對,形如name=value,用來設置測 試中使用的屬性
@WebIntegrationTest(value={"server.port=0"})
@WebIntegrationTest("server.port=0")
@WebIntegrationTest(randomPort=true)

4.3.2 使用Selenium測試HTML頁面
添加項目依賴、@BeforeClass靜態方法openBrowser()會通過Selenium創建一個FirefoxDriver的實例,它將打開Firefox瀏覽器(需要在運行測試的服務器上安裝該瀏覽器)來驗證具體瀏覽器中的效果。

4.4 小結
單元測試專注於單一組件或組件中的一個方法,此處並不一定要使用Spring。Spring提供了 一些優勢和技術——松耦合、依賴注入和接口驅動設計。這些都簡化了單元測試的編寫。但Spring 不用直接涉足單元測試。
Spring Framework以JUnit類運行器的方式提供了集成測試支持,JUnit類運行器會加載Spring 應用程序上下文,把上下文里的Bean注入測試。Spring Boot在Spring的集成測試之上又增加了配置 加載器,以Spring Boot的方式加載應用程序上下文,包括了對外置屬性的支持和Spring Boot日志。
Spring Boot還支持容器內測試Web應用程序,讓你能用和生產環境一樣的容器啟動應用程序。 這樣一來,測試在驗證應用程序行為的時候,會更加接近真實的運行環境。


第五章:Groovy與Spring Boot CLI
Groovy與Spring Boot CLI
5.1 開發 Spring Boot CLI 應用程序、5.1.1 設置 CLI 項目、5.1.2 通過 Groovy 消除代碼噪聲、5.1.3 發生了什么
5.2 獲取依賴、5.2.1 覆蓋默認依賴版本、5.2.2 添加依賴倉庫
5.3 用 CLI 運行測試
5.4 創建可部署的產物
5.5 小結
Spring Boot CLI利用了Spring Boot自動配置和起步依賴的便利之處,並將其發揚光大。借由Groovy語言的優雅,CLI能讓我們在最少的代碼噪聲下開發Spring應用程序。
本章中我們徹底重寫了第2章里的閱讀列表應用程序,只是這次我們用Groovy把它寫成了 Spring Boot CLI應用程序。通過自動添加很多常用包和類的import語句,CLI讓Groovy更優雅。
它還可以自動解析很多依賴庫。
對於CLI無法自動解析的庫,基於CLI的應用程序可以利用Grape的@Grab注解,不用構建說
明也能顯式地聲明依賴。Spring Boot的CLI擴展了@Grab注解,針對很多常用庫依賴,只需聲明 Module ID就可以了。
最后,你還了解了如何用Spring Boot CLI來執行測試和構建可部署產物,這些通常都是由構 建系統來負責的。
Spring Boot和Groovy結合得很好,兩者的簡潔性相輔相成。


第六章::在Spring Boot中使用Grails
在Spring Boot剛發布時,經常有人問我在Spring Boot和Grails之間該如何選擇。兩者都構建於 Spring Framework之上,都旨在簡化應用程序的開發。實際上,它們就像花生醬和巧克力。兩個 都很好,具體如何選擇取決於個人愛好。
Grails和Spring Boot之間的聯系。我們會先看到Spring Boot中Grails對 6 象關系映射(Grails Object Relational Mapping,GORM)和Groovy服務器頁面(Groovy Server Page, GSP)這樣的Grails特性,還會看到Grails 3是如何基於Spring Boot重寫的
6.1 使用 GORM 進行數據持久化
6.2 使用 Groovy Server Pages 定義視圖
6.3 結合 Spring Boot 與 Grails 3
6.4 小結
Grails和Spring Boot都旨在讓開發者的生活更簡單,大大簡化基於Spring的開發模型,因此兩 者看起來是互相競爭的框架。但在本章中,我們看到了兩者如何結合在一起,綜合優勢。
我們了解了如何向典型的Spring Boot應用程序中添加GORM和GSP視圖,這兩個都是知名的 Grails特性。GORM是Spring Boot里一個很受歡迎的特性,能讓你直接針對領域模型執行持久化 操作,消除了對模型倉庫的需求。


第七章:深入Actuator
Spring Boot的Actuator。它提供了很多生產級的特性,比如監控和度 量Spring Boot應用程序。Actuator的這些特性可以通過眾多REST端點、遠程shell和JMX獲得。我 們先來看看Actuator的REST端點,這種最為人所熟知的使用方式提供了最完整的功能。
要啟用Actuator的端點,只需在項目中引入Actuator的起步依賴即可。
GET /env 獲取全部環境屬性
GET /env/{name} GET /health 根據名稱獲取特定的環境屬性值
GET /info 報告應用程序的健康指標,這些值由HealthIndicator的實現類提供
GET /mappings 描述全部的URI路徑 ,以及它們和控制器(包含Actuator端點)的映射關系
GET /metrics 報告各種應用程序度量信息,比如內存用量和HTTP請求計數
GET /metrics/{name} 報告指定名稱的應用程序度量值
POST /shutdown 關閉應用程序,要求endpoints.shutdown.enabled設置為true
GET /trace 提供基本的HTTP請求跟蹤信息(時間戳、HTTP頭等)
要啟用Actuator的端點,只需在項目中引入Actuator的起步依賴即可。
compile 'org.springframework.boot:spring-boot-starter-actuator'
三大類:配置端點、度量端點和其他端點。
Actuator有一些端點不僅可以顯示組件映射關系,還可以告訴你自動配置在配置 Spring應用程序上下文時做了哪些決策。
1. 獲得Bean裝配報告:/beans它會返回一個JSON文檔, 描述上下文里每個Bean的情況,包括其Java類型以及注入的其他Bean。
2. 詳解自動配置:/beans端點產生的報告能告訴你Spring應用程序上下文里都有哪些Bean。/autoconfig端點能告 訴你為什么會有這個Bean,或者為什么沒有這個Bean。
3. 查看配置屬性:/env端點會生成應用程序可用的所有環境屬性的列表,無論這些屬性是否用到。這其中包括 環境變量、JVM屬性、命令行參數,以及applicaition.properties或application.yml文件提供的屬性。
4. 生成端點到控制器的映射:如果Web界面的 控制器和請求處理方法數量多,那最好能有一個列表,羅列出應用程序發布的全部端點。/mappings端點就提供了這么一個列表

7.1.2 運行時度量

1. 查看應用程序的度量值:運行中的應用程序有諸多計數器和度量器,/metrics端點提供了這些東西的快照。
表7-2 /metrics端點報告的度量值和計數器 提供表在P131頁
2. 追蹤Web請求:盡管/metrics端點提供了一些針對Web請求的基本計數器和計時器,但那些度量值缺少詳細信 息。知道所處理請求的更多信息是很有幫助的,尤其是在調試時,所以就有了/trace這個端點。
3. 導出線程活動:在確認應用程序運行情況時,除了跟蹤請求,了解線程活動也會很有幫助。/dump端點會生成當前線程活動的快照。
4. 監控應用程序健康情況:如果你想知道自己的應用程序是否在運行,可以直接訪問/health端點。
表7-3 Spring Boot自帶的健康指示器 提供表:P134頁

7.1.3 關閉應用程序
關閉運行中的應用程序,其中某個實例有問題了,你決定關閉該實例並讓雲服務提供商為你重啟這個有問題的 應用程序。在這個場景中,Actuator的/shutdown端點就很有用了。
7.1.4 獲取應用信息
/info端點能展示各種你希望發布的應用信息。

7.2 連接 Actuator 的遠程 shell
Actuator通過REST端點提供了不少非常有用的信息。另一個深入運行中應用程序內部的方式 是使用遠程shell。Spring Boot集成了CRaSH,一種能嵌入任意Java應用程序的shell。Spring Boot 還擴展了CRaSH,添加了不少Spring Boot特有的命令,提供了與Actuator端點類似的功能。
與這個密碼搭配使用的用戶名是user。密碼本身是隨機生成的,每次運行應用程序時都會有 所變化。它監聽的端口號是2000。
遠程shell提供了24個可以在運行應用程序上下文中執行的命令,其中大部分都是CRaSH自帶 的。但Spring Boot也添加了一些。表7-4列出了這些Spring Boot特有的命令。

7.2.1 查看 autoconfig 報告
autoconfig 命 令 生 成 了 一 個 與 Actuatord 的 /autoconfig 端 點 類 似 的 報 告
7.2.2 列出應用程序的 Bean:發現beans命令的輸出和/beans端點的輸出一樣
7.2.3 查看應用程序的度量信息:metricsshell命令會輸出與Actuator的/metrics端點一樣的信息
7.2.4 調用 Actuator 端點:並非所有的Actuator端點都有對應的shell命令。
但endpoint命令可以讓你在shell里調用Actuator的端點。在shell提示符中鍵入endpoint list就能獲得端點 的列表。你可以使用endpoint invoke命令,傳入不帶Endpoint 后綴的Bean名稱。舉例來說,要調用健康檢查端點,可以在shell提示符里鍵入endpoint invoke health
7.3 通過 JMX 監控應用程序
Actuator的端點都發布在org.springframework.boot域下。比如,你想要查看應用程序的請求映 射關系,那么可以看一下圖7-6(通過JConsole查看請求映射端點)。

7.4 定制 Actuator
7.4.1 修改端點 ID
7.4.2 啟用和禁用端點
7.4.3 添加自定義度量信息
實際上,自動配置允許Actuator創建CounterService的實例,並將其注冊為Spring的應用程序上下文中的Bean。CounterService這個接口里定義了三個方法,分別用來增加、減少或重置特定名稱的度量值。
Actuator的自動配置還會配置一個GaugeService類型的Bean。該接口與CounterService類似,能將某個值記錄到特定名稱的度量值里。
你無需實現這些接口。Spring Boot已經提供了兩者的實現。我們所要做的就是把它們的實例 注入所需的Bean,在適當的時候調用其中的方法,更新想要的度量值。使用了自動織入機制,通過控制器的構造方法注入 CounterService和GaugeService,隨后把它們保存在實例變量里。
盡管CounterService和GaugeService用起來很簡單,但還是有一些度量值很難通過增加 計數器或記錄指標值來捕獲。對於那些情況,我們可以實現PublicMetrics接口,提供自己需 要的度量信息。該接口定義了一個metrics()方法,返回一個Metric對象的集合,Actuator會調用metrics()方法,收集ApplicationContextMetrics提供的度量信息。該方法調用了所注入的ApplicationContext上的方法,獲取我們想要報告為度量的數量。每個 度量值都會創建一個Metrics實例,指定度量的名稱和值,將其加入要返回的列表。

7.4.4 創建自定義跟蹤倉庫
默認情況下,/trace端點報告的跟蹤信息都存儲在內存倉庫里,100個條目封頂。一旦倉庫滿 了,就開始移除老的條目,給新的條目騰出空間。在開發階段這沒什么問題,但在生產環境中,大流量會造成跟蹤信息還沒來得及看就被丟棄。為了避免這個問題,你可以聲明自己的InMemoryTraceRepository Bean,將它的容量調整至100以上。如下配置類可以將容量調整至1000個條目。另外可以引入只需實現Spring Boot的TraceRepository接口即可的實現,將數據存儲到另外的數據庫中。TraceRepository只要求我們實現兩個方法:一個方法查找所有存儲的Trace 對象,另一個保存了一個Trace,包含跟蹤信息的Map對象。

7.4.5 插入自定義健康指示器
如前文所述,Actuator自帶了很多健康指示器,能滿足常見需求,比如報告應用程序使用的 數據庫和消息代理的健康情況。但如果你的應用程序需要和一些沒有健康指示器的系統交互,自己實現Healthindicator即可。並且還能夠記錄原因

7.5 保護 Actuator 端點
實際上,Actuator的端點保護可以用和其他URL路徑一樣的方式——使用Spring Security。在 Spring Boot應用程序中,這意味着將Security起步依賴作為構建依賴加入,然后讓安全相關的自 動配置來保護應用程序,其中當然也包括了Actuator端點。
我們已經添加了一些自定義安全配置,僅限帶有READER權限的授權用訪問根URL路徑(/)。 要保護Actuator的端點,我們需要對SecurityConfig.java的configure()方法做些修改。

小結:
。Spring Boot的Actuator為你 打開了一扇大門,深入Spring Boot應用程序的內部細節。它發布的組件、度量和指標能幫你理解 應用程序的運作情況。
在本章,我們先了解了Actuator的Web端點——通過HTTP發布運行時細節信息的REST端點。 這些端點的功能包括查看Spring應用程序上下文里所有的Bean、查看自動配置決策、查看Spring MVC映射、查看線程活動、查看應用程序健康信息,還有多種度量、指標和計數器。
除了Web端點,Actuator還提供了另外兩種獲取它所提供信息的途徑。遠程shell讓你能在shell 里安全地連上應用程序,發起指令,獲得與Actuator端點相同的數據。與此同時,所有的Actuator 端點也都發布成了MBean,可以通過JMX客戶端進行監控和管理。
隨后我們還了解了如何定制Actuator,包括如何通過端點的ID來修改Actuator端點的路徑,如 何啟用和禁用端點,諸如此類。我們還插入了一些定制的度量信息,創建了定制的跟蹤信息倉庫, 替換了默認的內存跟蹤倉庫。
最后,我們學習了如何保護Actuator的端點,只讓經過授權的用戶訪問它們。
接下來,在第8章里,我們將看到如何讓應用程序從編碼階段過渡到生產階段,了解Spring Boot如何協助我們在多種不同的平台上進行部署,包括傳統的應用容器和雲平台。


第八章:部署Spring Boot應用程序
我們的焦點都集中在使用Spring Boot的特性幫助大家開發應用程序。我們遇到了 不少驚喜。但如果不越過終點線,應用程序沒有部署,這一切都是徒勞。

8.1 衡量多種部署方式
在IDE中運行應用程序(涉及Spring ToolSuite或IntelliJ IDEA)。
使用Maven的spring-boot:run或Gradle的bootRun,在命令行里運行。
使用Maven或Gradle生成可運行的JAR文件,隨后在命令行中運行。
使用Spring Boot CLI在命令行中運行Groovy腳本。
使用Spring Boot CLI來生成可運行的JAR文件,隨后在命令行中運行。

表8-1 Spring Boot部署選項
Groovy源碼 手寫 Cloud Foundry及容器部署,比如Docker
可執行JAR Maven、Gradle或Spring Boot CLI 雲環境,包括Cloud Foundry和Heroku,還有容器部署,比如Docker
WAR Maven或Gradle Java應用服務器或雲環境,比如Cloud Foundry

8.2 部署到應用服務器
8.2.1 構建 WAR 文件

<packaging>war</packaging>

它提供的SpringBootServletInitializer是一個支持 Spring Boot的Spring WebApplicationInitializer實現。除了配置Spring的Dispatcher- Servlet,SpringBootServletInitializer還會在Spring應用程序上下文里查找Filter、 Servlet或ServletContextInitializer類型的Bean,把它們綁定到Servlet容器里。
要使用SpringBootServletInitializer,只需創建一個子類,覆蓋configure()方法 來指定Spring配置類。代碼清單8-1是ReadingListServletInitializer,也就是我們為閱讀 列表應用程序寫的SpringBootServletInitializer的子類。
configure()方法傳入了一個SpringApplicationBuilder參數,並將其作為 結果返回。期間它調用sources()方法注冊了一個Spring配置類。@SpringBootApplication注解。這會隱性開啟組件掃描,而組件掃 描則會發現並應用其他配置類。
就算我們在構建的是WAR文件,這個文件仍舊可以脫離應用服務器直 接運行。如果你沒有刪除Application里的main()方法,構建過程生成的WAR文件仍可直接運 行,一如可執行的JAR文件:
這樣一來,同一個部署產物就能有兩種部署方式了!

8.2.2 創建生產 Profile
這個@Bean方法最關鍵的一點是,它還添加了@Profile注解,說明只有在production
但最方便的還是在運行應用服務器的機器上設置一個系統環境變量,我需要像這樣設置SPRING_PROFILES_ACTIVE環境變量

8.2.3 開啟數據庫遷移
一個比較好的選擇是使用數據庫遷移庫(database migration library)。它使用一系列數據庫腳 本,而且會記錄哪些已經用過了,不會多次運用同一個腳本。應用程序的每個部署包里都包含了 這些腳本,數據庫可以和應用程序保持一致。
Spring Boot為兩款流行的數據庫遷移庫提供了自動配置支持。
Flyway(http://flywaydb.org)
Liquibase(http://www.liquibase.org)

1. 用Flyway定義數據庫遷移過程
Flyway是一個非常簡單的開源數據庫遷移庫,使用SQL來定義遷移腳本。它的理念是,每個
腳本都有一個版本號,Flyway會順序執行這些腳本,讓數據庫達到期望的狀態。它也會記錄已執 行的腳本狀態,不會重復執行。
Flyway腳本就是SQL。讓其發揮作用的是其在Classpath里的位置和文件名。Flyway 腳本都遵循一個命名規范,含有版本號
Flyway腳本需要放在相對於應用程序Classpath根路徑的/db/migration路徑下
在應用程序部署並運行起來后,Spring Boot會檢測到Classpath里的Flyway,自動配置所需的 Bean。Flyway會依次查看/db/migration里的腳本,如果沒有執行過就運行這些腳本。每個腳本都 執行過后,向schema_version表里寫一條記錄。應用程序下次啟動時,Flyway會先看schema_version 里的記錄,跳過那些腳本。、

2. 用Liquibase定義數據庫遷移過程
Flyway用起來很簡便,在Spring Boot自動配置的幫助下尤其如此。但是,使用SQL來定義遷 移腳本是一把雙刃劍。SQL用起來便捷順手,卻要冒着只能在一個數據庫平台上使用的風險。
Liquibase並不局限於特定平台的SQL,可以用多種格式書寫遷移腳本,不用關心底層平台(其 中包括XML、YAML和JSON)。如果你有這個期望的話,Liquibase當然也支持SQL腳本。
應用程序啟動時,Liquibase會讀取db.changelog-master.yaml里的變更集指令集,與之前寫入 databaseChangeLog表里的內容做對比,隨后執行未運行過的變更集。
Spring Boot的自動配置讓Liquibase和Flyway的使用變得輕而易舉。

8.3 推上雲端
服務器硬件的購買和維護成本很高。大流量很難通過適當擴展服務器去處理,這種做法在某 些組織中甚至是禁忌。現如今,相比在自己的數據中心運行應用程序,把它們部署到雲上是更引 人注目,而且划算的做法。
目前有多個雲平台可供選擇,而那些提供Platform as a Service(PaaS)能力的平台無疑是最 有吸引力的。PaaS提供了現成的應用程序部署平台,帶有附加服務(比如數據庫和消息代理), 可以綁定到應用程序上。除此之外,當你的應用程序要求提供更大的馬力時,雲平台能輕松實現 應用程序在運行時向上(或向下)伸縮,只需添加或刪除實例即可。
之前我們已經把閱讀列表應用程序部署到了傳統的應用服務器上,現在再試試將其部署到雲 上。我們將把應用程序部署到Cloud Foundry和Heroku這兩個著名的PaaS平台上。
8.3.1 部署到 Cloud Foundry
8.3.2 部署到 Heroku

8.4 小結
Spring Boot應用程序的部署方式有好幾種,包括使用傳統的應用服務器和雲上的PaaS平台。 6 在本章,我們了解了其中的一些部署方式,把閱讀列表應用程序以WAR文件的方式部署到Tomcat 和雲上(Cloud Foundry和Heroku)。
Spring Boot應用程序的構建說明經常會配置為生成可執行的JAR文件。我們也看到了如何對 構建進行微調,如何編寫一個SpringBootServletInitializer實現,生成WAR文件,以便 部署到應用服務器上。 7
隨后,我們進一步了解了如何將應用程序部署到Cloud Foundry上。Cloud Foundry非常靈活, 能夠接受各種形式的Spring Boot應用程序,包括可執行JAR文件、傳統WAR文件,甚至還包括原 始的Spring Boot CLI Groovy腳本。我們還了解了Cloud Foundry如何自動將內嵌式數據源替換為綁 定到應用程序上的數據庫服務。
了如何通過添加Spring Cloud Foundry庫來實現一樣的效果。這里使用綁定的數據庫服務,而非內 嵌式數據庫。
在本章,我們還了解了如何在Spring Boot里使用Flyway和Liquibase這樣的數據庫遷移工具。 在初次部署應用程序時,我們通過數據庫遷移的方式完成了數據庫的初始化,在后續的部署過程 中,我們可以按需修改數據庫。


附錄 A Spring Boot開發者工具
Spring Boot 1.3引入了一組新的開發者工具,可以讓你在開發時更方便地使用Spring Boot, 包括如下功能。
自動重啟:當Classpath里的文件發生變化時,自動重啟運行中的應用程序。
LiveReload支持:對資源的修改自動觸發瀏覽器刷新。
遠程開發:遠程部署時支持自動重啟和LiveReload。
默認的開發時屬性值:為一些屬性提供有意義的默認開發時屬性值。
Spring Boot的開發者工具采取了庫的形式,可以作為依賴加入項目。
compile "org.springframework.boot:spring-boot-devtools"

A.1 自動重啟
有些Classpath里的資源變更后不需要重啟應用程序。像Thymeleaf這樣的視圖模板可以直接 編輯,不用重啟應用程序。在/static或/public里的靜態資源也不用重啟應用程序,所以Spring Boot 開發者工具會在重啟時排除掉如下目錄:/META-INF/resources、/resources、/static、/public和 /templates。

A.2 LiveReload
在Web應用程序開發過程中,最常見的步驟大致如下。

(1) 修改要呈現的內容(比如圖片、樣式表、模板)。

(2) 點擊瀏覽器里的刷新按鈕,查看修改的結果。

(3) 回到第1步。
雖然這並不難,但如果能不點刷新就直接看到修改結果,那豈不是更好?
Spring Boot的開發者工具集成了LiveReload(http://livereload.com),可以消除刷新的步驟。
激活開發者工具后,Spring Boot會啟動一個內嵌的LiveReload服務器,在資源文件變化時會觸發 瀏覽器刷新。你要做的就是在瀏覽器里安裝LiveReload插件。

A.3 遠程開發
在遠程運行應用程序時(比如部署到服務器上或雲上),開發者工具的自動重啟和LiveReload 特性都是可選的。此外,Spring Boot開發者工具還能遠程調試Spring Boot應用程序。

A.4 默認的開發時屬性
實際上,這就是說在開發者工具激活后,如下屬性會設置為false。
這樣一來,就不用在開發時(在一個開發時使用的Profile配置里)禁用它們了。

A.5 全局配置開發者工具


附錄 B Spring Boot起步依賴:1.3.0版本含有的起步依賴清單
附錄 C 配置屬性: 配置文件所對應的配置版本和說明
附錄 D Spring Boot依賴的版本號


獲取上述的內容應該可以在官方文檔,以及官方配置的start中找到對應的配置內容


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com