Spring Boot 2.0 都更新了什麼

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

  • Jetty 9.4,Jetty 是一個開源的 Servlet 容器,它爲基於 Java 的 Web 內容,例如 JSP 和 Servlet 提供運行環境。Jetty 是使用 Java 語言編寫的,它的 API 以一組 JAR 包的形式發佈。
  • Tomcat 8.5,Apache Tomcat 8.5.x 旨在取代 8.0.x,徹底支持 Java 9。
  • Flyway 5,Flyway 是獨立於數據庫的應用、管理並跟蹤數據庫變動的數據庫版本管理工具。用通俗的話講,Flyway 能夠像 SVN 管理不一樣人的代碼那樣,管理不一樣人的 SQL 腳本,從而作到數據庫同步。
  • Hibernate 5.2,Hibernate 是一款很是流行的 ORM 框架。
  • Gradle 3.4,Spring Boot 的 Gradle 插件在很大程度上已被重寫,有了重大的改進。
  • Thymeleaf 3.0,Thymeleaf 3 相對於 Thymeleaf 2 有很是大的性能提高。

默認軟件替換和優化

HikariCP安全

默認鏈接池已從 Tomcat 切換到 HikariCP,HikariCP 是一個高性能的 JDBC 鏈接池,Hikari 是日語「光」的意思。服務器

HikariCP 號稱是 Java 業界最快的數據庫鏈接池,官網提供了 c3p0、dbcp二、tomcat、vibur 和 Hikari 等數據鏈接池的性能對比。

關於 Hikari 性能爲何如此突出,官網給出的說明以下:

  • 字節碼精簡:優化代碼,直到編譯後的字節碼最少,這樣 CPU 緩存能夠加載更多的程序代碼;
  • 優化代理和攔截器:減小代碼,例如 HikariCP 的 Statement proxy 只有 100 行代碼;
  • 自定義數組類型(FastStatementList)代替 ArrayList:避免每次 get() 調用都要進行 range check,避免調用 remove() 時從頭至尾的掃描;
  • 自定義集合類型(ConcurrentBag):提升併發讀寫的效率;
  • 其餘針對 BoneCP 缺陷的優化,好比對於耗時超過一個 CPU 時間片的方法調用的研究。

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 中測試進行了一些補充和調整:

  • @WebFluxTest 已添加新註釋以支持 WebFlux 應用程序的「slice」測試。
  • Converter 和 GenericConverter beans 如今自動掃描 @WebMvcTest 和 @WebFluxTest。
  • @AutoConfigureWebTestClient 已經添加到 WebTestClient 供測試使用,這個註釋會自動應用於 @WebFluxTest 測試。
  • 增長了一個新的 ApplicationContextRunner 測試實用程序,能夠很容易地測試你的自動配置,咱們已將大部份內部測試套件移至此新模型。

其餘

還有一些小的調整和改進:

  • @ConditionalOnBean 如今在肯定是否知足條件時使用邏輯 AND 而不是邏輯 OR。
  • 無條件類如今包含在自動配置中。
  • 該 spring CLI 應用程序如今包括 encodepassword 可用於建立 Spring Security 的兼容散列密碼命令。
  • 計劃任務(即 @EnableScheduling)可使用 scheduledtasks 執行器端點進行審查。
  • 該 loggers 驅動器終端如今容許你從新設置一個日誌的默認級別。
  • Spring Session 用戶如今能夠經過 sessions 執行器端點查找和刪除會話。
  • 使用 spring-boot-starter-parent 如今基於 Maven 的應用程序 -parameters 默認使用標誌。
  • 新技術的引入

    支持 HTTP/2

    HTTP/2 是第二代的 HTTP 協議,Spring Boot 的 Web 容器選擇中 Tomcat,Undertow 和 Jetty 均已支持 HTTP/2。

    相比 HTTP/1.x,HTTP/2 在底層傳輸作了很大的改動和優化:

  • HTTP/2 採用二進制格式傳輸數據,而非 HTTP/1.x 的文本格式。二進制格式在協議的解析和優化擴展上帶來更多的優點和可能。
  • HTTP/2 對消息頭採用 HPACK 進行壓縮傳輸,可以節省消息頭佔用的網絡的流量;而 HTTP/1.x 每次請求,都會攜帶大量冗餘頭信息,浪費了不少帶寬資源;頭壓縮可以很好的解決該問題。
  • 多路複用,直白的說就是全部的請求都是經過一個 TCP 鏈接併發完成。HTTP/1.x 雖然經過 pipeline 也能併發請求,可是多個請求之間的響應會被阻塞的,因此 pipeline 至今也沒有被普及應用,而 HTTP/2 作到了真正的併發請求。同時,流還支持優先級和流量控制。
  • Server Push:服務端可以更快的把資源推送給客戶端。例如,服務端能夠主動把 JS 和 CSS 文件推送給客戶端,而不須要客戶端解析 HTML 再發送這些請求,當客戶端須要的時候,它已經在客戶端了。
  • 嵌入式 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 支持兩種不一樣的編程模型:

  • 基於註解的 @Controller 和其餘註解也支持 Spring MVC;
  • Functional 、Java 8 Lambda 風格的路由和處理。
  • 默認狀況下,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 等。

相關文章
相關標籤/搜索