Spring Boot 2.0 都更新了什麼java
2018 年 3 月 1 號 Spring Boot 2.0.0.RELEASE 正式發佈,這是 Spring Boot 1.0 發佈 4 年以後第一次重大修訂,所以有多新功能和特性值得關注!在 Spring Boot 官方博客中咱們瞭解到:Spring Boot 2.0 版本經歷了 17 個月的開發,有 215 個不一樣的使用者提供了超過 6800 次的提交。web
咱們將 Spring Boot 2.0 更新的技術分爲三類進行解讀:spring
最低 JDK 8,支持 JDK 9,再也不支持 Java 6 和 7數據庫
Spring Boot 2.0 要求 Java 8 做爲最低版本,許多現有的 API 已更新,以利用 Java 8 的特性。例如,接口上的默認方法,函數回調以及新的 API,如 javax.time。若是你正在使用 Java 7 或更早版本,則在開發 Spring Boot 2.0 應用程序以前,須要升級你的 JDK。編程
Spring Boot 2.0 經過測試能夠在 JDK 9 下正常運行,同時 Spring Boot 2.0 宣佈再也不支持 Java 6 和 7,據我瞭解國內絕大部分互聯網公司的基本環境還在 JDK 7 或者 6 環境下運行,考慮升級 Spring Boot 2.0 的團隊須要考慮這個因素。數組
依賴組件升級緩存
Spring Boot 2.0 基於 Spring Framework 5 構建,本次 Spring Boot 的升級,同時也升級了部分其依賴的第三方組件,主要有如下幾個:tomcat
HikariCP安全
默認鏈接池已從 Tomcat 切換到 HikariCP,HikariCP 是一個高性能的 JDBC 鏈接池,Hikari 是日語「光」的意思。服務器
HikariCP 號稱是 Java 業界最快的數據庫鏈接池,官網提供了 c3p0、dbcp二、tomcat、vibur 和 Hikari 等數據鏈接池的性能對比。
關於 Hikari 性能爲何如此突出,官網給出的說明以下:
Security
Spring Security 是 Spring 社區的一個頂級項目,也是 Spring Boot 官方推薦使用的 Security 框架。除了常規的 Authentication 和 Authorization 以外,Spring Security 還提供了諸如 ACLs、LDAP、JAAS、CAS 等高級特性以知足複雜場景下的安全需求。
沒有使用 Spring Boot 以前集成起來相對比較麻煩,而 Spring Boot 中基於 Java 配置實現 Spring Security 功能。Spring Boot 2.0 極大地簡化了默認的安全配置,並使添加定製安全變得簡單。
Spring Boot 2.0 很是容易使用 Spring Security 5.0 保護響應式應用,當檢測到 Spring Security 存在的時候會自動進行默認配置。
OAuth 2.0
OAuth 2.0 是 OAuth 協議的延續版本,但不向後兼容 OAuth 1.0,即徹底廢止了 OAuth1.0。OAuth 2.0 關注客戶端開發者的簡易性。要麼經過組織在資源擁有者和 HTTP 服務商之間的被批准的交互動做表明用戶,要麼容許第三方應用表明用戶得到訪問的權限。
OAuth 2.0 是一個受權框架,或稱受權標準,它可使第三方應用程序或客戶端得到對 HTTP 服務上(如 Google、GitHub )用戶賬戶信息的有限訪問權限。OAuth 2.0 經過將用戶身份驗證委派給託管用戶賬戶的服務以及受權客戶端訪問用戶賬戶進行工做。
Spring Boot 2.0 將 Spring Security OAuth 項目遷移到 Spring Security。再也不提供單獨的依賴包,Spring Boot 2.0 經過 Spring Security 5 提供 OAuth 2.0 客戶端支持。
Micrometer
Micrometer 是一款監控指標的度量類庫,可讓你在沒有供應商鎖定的狀況下對 JVM 的應用程序代碼進行調整。
Spring Boot 2.0 加強了對 Micrometer 的集成,再也不提供本身的指標 API。依靠 micrometer.io 來知足全部應用程序監視需求。
Micrometer 包括尺寸指標的支持,當與尺寸監測系統配對時,尺寸指標能夠有效訪問特定的指定度量標準,而且能夠在其尺寸範圍內向下鑽取。
指標能夠輸出到各類系統和開箱即用的 Spring Boot 2.0,爲 Atlas、Datadog、Ganglia、Graphite、Influx、JMX、New Relic、Prometheus、SignalFx、StatsD 和 Wavefront 提供支持,另外還可使用簡單的內存中度量標準。
集成後提供 JVM 指標(包括 CPU、內存、線程和 GC)、Logback、Tomcat、Spring MVC & 提供 RestTemplate。
Redis 默認使用 Lettuce
Redis 方面默認引入了 Lettuce,替代了以前的 Jedis 做爲底層的 Redis 鏈接方式。
Lettuce 是一個可伸縮的線程安全的 Redis 客戶端,用於同步、異步和反應使用。多個線程能夠共享同一個 RedisConnection,它利用優秀 Netty NIO 框架來高效地管理多個鏈接,支持先進的 Redis 功能,如 Sentinel、集羣、流水線、自動從新鏈接和 Redis 數據模型。
國內使用 Jedis 的居多,看來之後要多研究 Lettuce 了。
配置屬性綁定
在 Spring Boot 2.0 中,使用 @ConfigurationProperties 的綁定機制被從新設計,限制了綁定規則,並修復了 Spring Boot 1.x 中的許多不一致的地方。
新的 Binder API 也能夠直接使用 @ConfigurationProperties 在代碼中。例如,下面綁定 List 中的 PersonName 對象:
List<PersonName> people = Binder.get(environment) .bind("my.property", Bindable.listOf(PersonName.class)) .orElseThrow(IllegalStateException::new);
配置源能夠像這樣在 YAML 中表示:
my: property: - first-name: Jane last-name: Doe - first-name: John last-name: Doe
轉換器支持
Binding 使用了一個新的 ApplicationConversionService 類,它提供了一些額外有用的轉化。最引人注目的是轉換器的 Duration 類型和分隔字符串。
該 Duration 轉換器容許在任一 ISO-8601 格式的持續時間,或是一個簡單的字符串(如 10m,10 分鐘)。現有的屬性已更改成默認使用 Duration,該 @DurationUnit 註釋經過設置若是沒有指定所使用的單元確保向後兼容性。例如,Spring Boot 1.5 中須要秒數的屬性如今必須 @DurationUnit(ChronoUnit.SECONDS) 確保一個簡單的值,例如 10 實際使用的值爲 10s。
分隔字符串轉換容許你將簡單綁定 String 到 Collection 或 Array 沒必要分割逗號。例如,LDAP base-dn 屬性用 @Delimiter(Delimiter.NONE),所以 LDAP DN(一般包含逗號)不會被錯誤解釋。
Actuator 改進
在 Spring Boot 2.0 中 Actuator endpoints 有很大的改進,全部 HTTP Actuator endpoints 如今都在該 /actuator 路徑下公開,而且生成的 JSON 有效負載獲得了改進。
如今默認狀況下不會暴露不少端點。若是你要從 Spring Boot 1.5 升級現有的應用,請務必查看遷移指南並特別注意該 management.endpoints.web.exposure.include 屬性。
Spring Boot 2.0 改進了從許多端點返回的 JSON 有效負載。
如今許多端點都具備更精確地反映底層數據的 JSON。例如,/actuator/conditions 終端(/autoconfig 在 Spring Boot 1.5 中)如今有一個頂級 contexts 密鑰來將結果分組 ApplicationContext。
測試
對 Spring Boot 2.0 中測試進行了一些補充和調整:
其餘
還有一些小的調整和改進:
支持 HTTP/2
HTTP/2 是第二代的 HTTP 協議,Spring Boot 的 Web 容器選擇中 Tomcat,Undertow 和 Jetty 均已支持 HTTP/2。
相比 HTTP/1.x,HTTP/2 在底層傳輸作了很大的改動和優化:
嵌入式 Netty 服務器
因爲 WebFlux 不依賴於 Servlet API,咱們如今能夠首次爲 Netty 做爲嵌入式服務器提供支持,該 spring-boot-starter-webflux 啓動 POM 將拉取 Netty 4.1 和 Ractor Netty。
注意:你只能將 Netty 用做反應式服務器,不提供阻止 Servlet API 支持。
Kotlin 的支持
Spring Boot 2.0 如今包含對 Kotlin 1.2.x 的支持,並提供了 runApplication,一個使用 Kotlin 運行 Spring Boot 應用程序的方法。咱們還公開和利用了 Kotlin 對其餘 Spring 項目(如 Spring Framework,Spring Data 和 Reactor)已添加到其最近版本中的支持。
JOOQ 的支持
JOOQ 是基於 Java 訪問關係型數據庫的工具包。JOOQ 既吸收了傳統 ORM 操做數據的簡單性和安全性,又保留了原生 SQL 的靈活性,它更像是介於 ORMS 和 JDBC 的中間層。對於喜歡寫 SQL 的碼農來講,JOOQ 能夠徹底知足你控制慾,能夠是用 Java 代碼寫出 SQL 的感受來。
支持 Quartz
Spring Boot 1.0 並無提供對 Quartz 的支持,以前出現了各類集成方案,Spring Boot 2.0 給出了最簡單的集成方式。
響應式編程
WebFlux 模塊的名稱是 spring-webflux,名稱中的 Flux 來源於 Reactor 中的類 Flux。Spring WebFlux 有一個全新的非堵塞的函數式 Reactive Web 框架,能夠用來構建異步的、非堵塞的、事件驅動的服務,在伸縮性方面表現很是好。
非阻塞的關鍵預期好處是可以以小的固定數量的線程和較少的內存進行擴展。在服務器端 WebFlux 支持兩種不一樣的編程模型:
默認狀況下,Spring Boot 2.0 使用 Netty WebFlux,由於 Netty 在異步非阻塞空間中被普遍使用,異步非阻塞鏈接能夠節省更多的資源,提供更高的響應度。經過比較 Servlet 3.1 非阻塞 I/O 沒有太多的使用,由於使用它的成本比較高,Spring WebFlux 打開了一條實用的通路。
使用 Spring WebFlux/WebFlux.fn 提供響應式 Web 編程支持,WebFlux 是一個全新的非堵塞的函數式 Reactive Web 框架,能夠用來構建異步的、非堵塞的、事件驅動的服務,在伸縮性方面表現很是好,此功能來源於 Spring 5.0。
Spring Boot 2.0 也提供了對響應式編程的自動化配置,如 Reactive Spring Data、Reactive Spring Security 等。