簡介:
- Spring Boot來簡化Spring應用開發,約定大於配置,去繁從簡,just run就能創建一個獨立的,產品級別的應用。
- 簡化Spring應用開發的一個框架
- 整個Spring技術棧的一個大整合
- J2EE開發的一站式解決方案
特性:
Create stand-alone Spring applications
【創建獨立的Spring應用程序】
Embed Tomcat, Jetty or Undertow directly (no need to deploy WAR files)
【直接嵌入Tomcat、Jetty或Undertow(不需要部署WAR文件)】
Provide opinionated 'starter' dependencies to simplify your build configuration
【提供固執己見的“starter”依賴項來簡化構建配置】
Automatically configure Spring and 3rd party libraries whenever possible
【儘可能自動配置Spring和第三方庫】
Provide production-ready features such as metrics, health checks and externalized configuration
【提供可用於生產的特性,如度量標準、健康狀況檢查和外部化配置】
Absolutely no code generation and no requirement for XML configuration
【完全不需要代碼生成,也不需要XML配置】
微服務:
- 簡而言之,微服務體系結構風格是一種將單個應用程序作爲一組小服務來開發的方法,每個小服務都在自己的進程中運行,並與輕量級機制(通常是HTTP資源API)進行通信。這些服務是圍繞業務功能構建的,可以通過完全自動化的部署機制獨立部署。這些服務的集中管理很少,可能使用不同的編程語言編寫並使用不同的數據存儲技術。
- 總結:
- 現在 微服務是一種:架構風格(服務微化)
- 一個應用應該是一組小型服務,可以通過HTTP的方式進行互通
- 微服務:每一個功能元素最終都是一個可獨立替換和獨立升級的軟件單元
- 早期 單體應用:ALL IN ONE
- 優點:
- 開發測試簡單(只有一個應用不牽扯到多個應用之間的互連)
- 部署簡單(將整個應用打成war包部署在TomCat中)
- 水平擴展簡單(當應用的負載能力不行的時候,我們把相同的應用複製很多,放在很多服務器,提高併發能力)
微服務與SOA架構對比:
SOA架構特點:
系統集成:
站在系統的角度,解決企業系統間的通信問 題,把原先散亂、無規劃的系統間的網狀結構,梳理成 規整、可治理的系統間星形結構,這一步往往需要引入 一些產品,比如 ESB、以及技術規範、服務管理規範; 這一步解決的核心問題是【有序】
系統的服務化:
站在功能的角度,把業務邏輯抽象成 可複用、可組裝的服務,通過服務的編排實現業務的 快速再生,目的:把原先固有的業務功能轉變爲通用 的業務服務,實現業務邏輯的快速複用;這一步解決 的核心問題是【複用】
業務的服務化:
站在企業的角度,把企業職能抽象成 可複用、可組裝的服務;把原先職能化的企業架構轉變爲服務化的企業架構,進一步提升企業的對外服務能力;“前面兩步都是從技術層面來解決系統調用、系統功能複用的問題”。第三步,則是以業務驅動把一個業務單元封裝成一項服務。這一步解決的核心問題是【高效】
微服務架構特點:
通過服務實現組件化:
開發者不再需要協調其它服務部署對本服務的影響。
按業務能力來劃分服務和開發團隊:
開發者可以自由選擇開發技術,提供 API 服務
去中心化:
- 每個微服務有自己私有的數據庫持久化業務數據
- 每個微服務只能訪問自己的數據庫,而不能訪問其它服務的數據庫
- 某些業務場景下,需要在一個事務中更新多個數據庫。這種情況也不能直接訪問其它微服務的數據庫,而是通過對於微服務進行操作。
數據的去中心化,進一步降低了微服務之間的耦合度,不同服務可以採用不同的數據庫技術(SQL、NoSQL等)。在複雜的業務場景下,如果包含多個微服務,通常在客戶端或者中間層(網關)處理。- 基礎設施自動化(devops、自動化部署):
- Java EE部署架構,通過展現層打包WARs,業務層劃分到JARs最後部署爲EAR一個大包,而微服務則打開了這個黑盒子,把應用拆分成爲一個一個的單個服務,應用Docker技術,不依賴任何服務器和數據模型,是一個全棧應用,可以通過自動化方式獨立部署,每個服務運行在自己的進程中,通過輕量的通訊機制聯繫,經常是基於HTTP資源API,這些服務基於業務能力構建,能實現集中化管理(因爲服務太多啦,不集中管理就無法DevOps啦)。
- 主要區別:
功能
SOA
微服務
組件大小
大塊業務邏輯
單獨任務或小塊業務邏輯
耦合
通常鬆耦合
總是鬆耦合
公司架構
任何類型
小型、專注於功能交叉團隊
管理
着重中央管理
着重分散管理
目標
確保應用能夠交互操作
執行新功能、快速拓展開發團隊
- [詳細參照微服務文檔]:https://martinfowler.com/articles/microservices.html#MicroservicesAndSoa
SpringBoot的簡單應用:
- 一個功能:瀏覽器發送hello請求,服務器接受請求並處理,響應Hello World字符串
- 步驟:
- 創建一個maven工程;(jar)
- 導入SpringBoot相關的依賴
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.0.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
編寫一個主程序:啓動SpringBoot應用
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * @author Mr.Li * @version 1.0 * @Description: * @Modified By: * @date 2019/10/20 20:02 */ // @SpringBootApplication: 告訴SpringBoot來標註一個主程序類,說明這是一個SpringBoot應用 @SpringBootApplication public class HelloWorldMainApplication { public static void main(String[] args) { // Spring應用啓動起來 SpringApplication.run(HelloWorldMainApplication.class , args); } }
編寫相關的Controller、Service
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; /** * @author Mr.Li * @version 1.0 * @Description: * @Modified By: * @date 2019/10/20 20:44 */ @Controller public class HelloController { //接收瀏覽器的hello請求 @RequestMapping("/hello") //把該方法的返回值寫給瀏覽器 @ResponseBody public String hello(){ return "Hello World"; } }
啓動測試:運行main方法【得到TomCat的端口號爲8080】
直接輸入 localhost:8080
輸入 localhost:8080/hello
簡化部署工作
導入插件
<!--這個插件,可以將應用打包成可執行的 jar包--> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <!-- 創建一個自動可執行的jar或war文件。它可以替換常規的artifact, 或者用一個單獨的classifier附屬在maven構建的生命週期中。 --> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
將得到的jar包複製粘貼到桌面,並查看屬性得到包的路徑
打開cmd窗口,並運行jar包
再次進行測試
分析jar包:
使用360壓縮打開得到
進入BOOT-INF
進入lib
全是jar包
並且拉倒最下邊會發現有TomCat的jar包
所以SpringBoot中不需要配置TomCat
進入META-INF
進入MANIFEST.MF
Hello World 探究:
- pom文件
- SpringBoot的版本仲裁中心,以後導入依賴默認是不需要寫版本
- 得到父項目【Ctrl+鼠標】,用來管理SpringBoot應用裏的所有版本依賴
- 沒有在dependencies裏面管理的依賴自然需要聲明版本號
- spring-boot-starter:SpringBoot場景啓動器
- 幫我們導入了web模塊正常運行所依賴的組件,依賴的版本號有父項目仲裁。
- Spring Boot將所有的功能場景都抽取出來,做成一個個的starters(啓動器),只需要在項目裏面引入這些starter相關場景的所有依賴都會導入進來。要用什麼功能就導入什麼場景的啓動器
- 主程序類,主入口類
- @SpringBootApplication:SpringBoot應用標註在某個類上,說明這個類是SpringBoot的主配置類,SpringBoot就應該運行這個類的main方法來啓動SpringBoot應用
- 進入@SpringBootApplication得到組合註解
- @SpringBootConfiguration:SpringBoot的配置類
- 標註在某個類上,表示這是一個SpringBoot配置類
- 進入@SpringBootConfiguration註解:
- @Configuration:配置類上來標註這個註解
- 配置類 ----- 配置文件,配置類也是容器中的一個組件,@Component
- @EnableAutoConfiguration:開啓自動配置功能
- 以前我們需要配置的東西,Spring Boot幫我們自動配置,由@EnableAutoConfiguration告訴SpringBoot開啓自動配置功能,這樣自動配置才能生效
- 進入@EnableAutoConfiguration註解:
- @AutoConfigurationPackage:自動配置包
- 進入@AutoConfigurationPackage註解
- @Import(AutoConfigurationPackages.Registrar.class): Spring的底層註解@Import,給容器中導入一個組件 ,導入的組件由AutoConfigurationPackages.Registrar.class
- 將主配置類(@SpringBootApplication標註的類)的所在包及下面所有子包裏面的所有組件掃描到Spring容器
- @Import(EnableAutoConfigurationImportSelector.class) :給容器中導入組件
- EnableAutoConfigurationImportSelector:導入哪些組件的選擇器
- 將所有需要導入的組件以全類名的方式返回,這些組件就會被添加到容器中
- 會給容器中導入非常多的自動配置類(xxxAutoConfiguration),就是給容器中導入這個場景需要的所有組件,並配置好這些組件
- 有了自動配置類,免去了我們手動編寫配置注入功能組件等的工作
- J2EE的整體整合解決方案和自動配置都在spring-boot-autoconfigure-1.5.9.RELEASE.jar
使用Spring Initializer快速創建Spring Boot項目
IDEA:使用 Spring Initializer快速創建項目
選擇模塊,根據自己需要的選擇
之後會有選擇文件名以及路徑這個直接默認就行,之後點擊完成即可
運行主程序
得到結果
默認生成的SpringBoot項目
主程序已經生成好了,我們只需要我們自己的邏輯
resources文件夾中目錄結構
static:保存所有的靜態資源, js css images
templates:保存所有的模板頁面,(Spring Boot默認jar包使用嵌入式的Tomcat,默認不支持JSP頁面),可以使用模板引擎(freemarker、thymeleaf)
application.properties:Spring Boot應用的配置文件,可以修改一些默認設置
例如:修改默認的端口號