javascript
SpringBoot - Spring Boot 应用剖析
文章目錄
- Spring MVC VS Spring Boot
- 【HTTP 請求響應過程】
- 【基于 Spring MVC 的 Web 應用程序開發流程】
- 【基于 Spring Boot 的 Web 應用程序開發流程】
- 剖析應用
- pom依賴
- 啟動類
- 控制器類
- 配置文件
- 案例
- 整體架構
Spring MVC VS Spring Boot
在介紹基于 Spring Boot 的開發模式之前,讓我們先將它與傳統的 Spring MVC 進行簡單對比.
在典型的 Web 應用程序中,前后端通常采用基于 HTTP 協議完成請求和響應,開發過程中需要完成 URL 地址的映射、HTTP 請求的構建、數據的序列化和反序列化以及實現各個服務自身內部的業務邏輯,如下圖所示:
【HTTP 請求響應過程】
我們先來看基于 Spring MVC 完成上述開發流程所需要的開發步驟,如下圖所示:
【基于 Spring MVC 的 Web 應用程序開發流程】
上圖中包括使用 web.xml 定義 Spring 的 DispatcherServlet、完成啟動 Spring MVC 的配置文件、編寫響應 HTTP 請求的 Controller 以及將服務部署到 Tomcat Web 服務器等步驟。
基于傳統的 Spring MVC 框架開發 Web 應用逐漸暴露出一些問題,比較典型的就是配置工作過于復雜和繁重,以及缺少必要的應用程序管理和監控機制。
【基于 Spring Boot 的 Web 應用程序開發流程】
可以看到,它與基于 Spring MVC 的開發流程在配置信息的管理、服務部署和監控等方面有明顯不同。Spring Boot 提供了很多新特性,確保了開發過程的簡單性,具體體現在編碼、配置、部署、監控等多個方面。
-
首先 Spring Boot 使編碼更簡單。
只需要在 Maven 中添加一項依賴并實現一個方法就可以提供微服務架構中所推崇的 RESTful 風格接口
-
其次 Spring Boot 使配置更簡單。
它把 Spring 中基于 XML 的功能配置方式轉換為 Java Config,同時提供了 .yml 文件來優化原有基于 .properties 和 .xml 文件的配置方案,.yml 文件對配置信息的組織更為直觀方便,語義也更為強大。
同時,基于 Spring Boot 的自動配置特性,對常見的各種工具和框架均提供了默認的 starter 組件來簡化配置。
-
接著 ,Spring Boot 使部署更簡單。
在Spring Boot 使配置更簡單部署方案上,Spring Boot 也創造了一鍵啟動的新模式。
相較于傳統模式下的 war 包,Spring Boot 部署包既包含了業務代碼和各種第三方類庫,同時也內嵌了 HTTP 容器。這種包結構支持 java –jar application.jar 方式的一鍵啟動,不需要部署獨立的應用服務器,通過默認內嵌 Tomcat 就可以運行整個應用程序。
- Spring Boot 使監控更簡單。
基于 Spring Boot 新提供的 Actuator 組件,開發和運維人員可以通過 RESTful 接口獲取應用程序的當前運行時狀態并對這些狀態背后的度量指標進行監控和報警
例如可以
通過“/env/{name}”端點獲取系統環境變量、
通過“/mapping”端點獲取所有 RESTful 服務、
通過“/dump”端點獲取線程工作狀態
通過“/metrics/{name}”端點獲取 JVM 性能指標等。
剖析應用
有幾個地方需要特別注意,我也在圖中做了專門的標注,分別是包依賴、啟動類、控制器類以及配置, 接下來分別做一些展開
pom依賴
Spring Boot 提供了一系列 starter 工程來簡化各種組件之間的依賴關系。以開發 Web 服務為例,我們需要引入 spring-boot-starter-web 這個工程,而這個工程中并沒有具體的代碼,只是包含了一些 pom 依賴,如下所示:
-
org.springframework.boot:spring-boot-starter
-
org.springframework.boot:spring-boot-starter-tomcat
-
org.springframework.boot:spring-boot-starter-validation
-
org.springframework.boot:spring-boot-starter-json
-
org.springframework:spring-web
-
org.springframework:spring-webmvc
可以看到,這里包括了傳統 Spring MVC 應用程序中會使用到的 spring-web 和 spring-webmvc 組件,因此 Spring Boot 在底層實現上還是基于這兩個組件完成對 Web 請求響應流程的構建。
使用 Spring Boot 2.2.4 版本, 它所依賴的 Spring 組件都升級到了 5.X 版本。
在應用程序中引入 spring-boot-starter-web 組件就像引入一個普通的 Maven 依賴一樣,如下所示
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>一旦 spring-boot-starter-web 組件引入完畢,我們就可以充分利用 Spring Boot 提供的自動配置機制開發 Web 應用程序。
啟動類
使用 Spring Boot 的最重要的一個步驟是創建一個 Bootstrap 啟動類。Bootstrap 類結構簡單且比較固化,如下所示:
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication public class OrderApplication { public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);} }這里引入了一個全新的注解 @SpringBootApplication。
在 Spring Boot 中,添加了該注解的類就是整個應用程序的入口,一方面會啟動整個 Spring 容器,另一方面也會自動掃描代碼包結構下的 @Component、@Service、@Repository、@Controller 等注解并把這些注解對應的類轉化為 Bean 對象全部加載到 Spring 容器中。
控制器類
Bootstrap 類為我們提供了 Spring Boot 應用程序的入口,相當于應用程序已經有了最基本的骨架。接下來我們就可以添加 HTTP 請求的訪問入口,表現在 Spring Boot 中也就是一系列的 Controller 類。這里的 Controller 與 Spring MVC 中的 Controller 在概念上是一致的,一個典型的 Controller 類如下所示:
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;import com.springcss.order.domain.Order; import com.springcss.order.service.OrderService;@RestController @RequestMapping(value="orders") public class OrderController {@AutowiredOrderService orderService;@GetMapping(value = "/{orderId}")public Order getOrderById(@PathVariable Long orderId) { Order order = orderService.getOrderById(orderId);return order;}}以上代碼中包含了 @RestController、@RequestMapping 和 @GetMapping 這三個注解。其中,
-
@RequestMapping 用于指定請求地址的映射關系
-
@GetMapping 的作用等同于指定了 GET 請求的 @RequestMapping 注解
-
@RestController 注解是傳統 Spring MVC 中所提供的 @Controller 注解的升級版,相當于就是 @Controller 和 @ResponseBody注解的結合體,會自動使用 JSON 實現序列化/反序列化操作。
配置文件
在 src/main/resources 目錄下存在一個 application.yml 文件,這就是 Spring Boot 中的主配置文件。例如,我們可以將如下所示的端口、服務名稱以及數據庫訪問等配置信息添加到這個配置文件中:
server:port: 8081spring:application:name: orderservice datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/appointmentusername: rootpassword: root事實上,Spring Boot 提供了強大的自動配置機制,如果沒有特殊的配置需求,開發人員完全可以基于 Spring Boot 內置的配置體系完成諸如數據庫訪問相關配置信息的自動集成。
案例
介紹完了基于 Spring Boot 創建一個 Web 應用的基本流程之后,我們將構建一個系統 Customer Service System , 客戶服務系統 來展示 Spring Boot 相關設計理念和各項技術組件。
目的在于演示技術實現過程,不在于介紹具體業務邏輯。所以,我們對案例的業務流程做了高度的簡化,但涉及的各項技術都可以直接應用到日常開發過程中。
在 SpringCSS 中,存在一個 customer-service,這是一個 Spring Boot 應用程序,也是主體服務。在該服務中,我們可以將采用經典的分層架構,即將服務分成 Web 層、Service 層和 Repository 層。
整體架構
在客服系統中,我們知道其核心業務是生成客戶工單。
為此,customer-service 一般會與用戶服務 account-service 進行交互,但因為用戶賬戶信息的更新屬于低頻事件,所以我們設計的實現方式是 account-service 通過消息中間件的方式將用戶賬戶變更信息主動推送給 customer–service,從而完成用戶信息的獲取操作。
而針對 order-service,其定位是訂單系統,customer-service 也需要從該服務中查詢訂單信息。SpringCSS 的整個系統交互過程如下圖所示
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的SpringBoot - Spring Boot 应用剖析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Elasticsearch - clus
- 下一篇: Spring Boot - 自动配置实现