【從單體架構到分布式架構】本系列文章希望用淺顯直白的語言介紹架構發展程序中遇到的各種問題,以及對應的解決方案和優缺點,
在正式學習之前,開發環境需要做好哪些準備呢?
我們為什么要選擇使用 Spring Boot 呢?
Spring Boot 和 Spring 是兩個截然不同的框架么?
1. 環境準備
本課程在學習程序中,會有大量的代碼配合講解,所以在正式學習之前,你需要做好以下準備,
1.1 JDK
必備;本課程所有代碼基于 JDK 1.8 撰寫,
C:\>java -version
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)
1.2 Maven
必備;本課程所有代碼基于 Maven 構建;如果你在電腦上安裝好了 Maevn,建議把 Maven 倉庫的地址修改成一個國內的網站地址,
C:\>mvn -v
C:\
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:4
7+08:00)
Maven home: D:\Program Files\apache-maven-3.3.9\bin\..
Java version: 1.8.0_171, vendor: Oracle Corporation
Java home: D:\Program Files\Java\jdk1.8.0_171\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 8.1", version: "6.3", arch: "amd64", family: "dos"
1.3 IDE
必備;選擇一個你熟悉的 IDE,我使用的是 Eclipse,這里要注意,有些 IDE 需要進行一些 Maven 環境變數的配置,
1.4 資料庫
必備;建議在本機上安裝一個 MySQL 資料庫;為了方便操作,最好安裝一個自己熟悉的資料庫可視化工具,也可以使用 MySQL 自帶的 MySQL Workbench,
1.5 Git
非必備;本課程所有代碼都上傳到了 github ,可以通過 git clone 下載所有代碼,如果你未安裝相關軟體,也可以直接下載壓縮包,
1.6 SoapUI 或 PostMan 或其他
非必備;在講解的程序中,會經常進行介面測驗,包括介面壓力測驗,建議安裝 SoapUI 或 PostMan 或其他類似的軟體,
2. Spring Boot的歷史
在有 Spring Boot 之前,Spring 框架是當時很火的一個框架(現在也很火),不過隨著使用 Spring 框架的人越來越多,Spring 從一個簡潔的框架,慢慢地變成大而全;Spring 能夠支持的組件越來越多,需要引入的組態檔也越來越多,這也就是我們經常聽到的"組態檔爆炸"、"配置煉獄";
Spring 也意識到這個問題,而且隨著微服務概念的興起,也需要有一個可以支持快速開發微小獨立應用的框架;在 2012年10月,Spring JIRA 中創建了一個功能請求,要求在 Spring 框架中支持無容器 Web 應用程式體系結構;這個功能要求促使了 2013年 Spring Boot 專案的研發,繼而在 2014年4月,Spring Boot 1.0.0 發布,
3. 基于 Spring Boot 的應用搭建
3.1 在線生成 Spring Boot 專案
本章節專案的代碼:chapter1
Step 1. start.spring.io
如果你能連接互聯網,可以打卡 start.spring
這個網址,Spring 提供了一個在線生成 Spring Boot 專案的功能,
圖中的 GroupID 和 ArtifactID 組合起來被稱作“坐標”,是為了保證專案的唯一性所提出來的,如果你的專案要被上傳到 Mavan 倉庫中,可以根據 GroupID + ArtifactID 找到你的專案,
-
GroupID: 可以分成兩組欄位,第一組是域,我們可以看做是“分類”,第二組是域名,可以是公司名、組織名或者你給自己起的任何名字;比如 Apache 的專案的 GroupID 都是 [org.apache],org 表示非盈利組織,另外一個常見的 com 表示商業組織;apache 是公司名稱,
-
ArtifactID: 專案名稱或者模塊名稱,
Step 2. 新建一個專案
這里我們這樣填寫,點擊 Genarate 按鈕生成專案 :
GroupID = com.archevolution
ArtifactID = chapter1 //表示是第一章節的專案,后面的章節如果有代碼,都會建立單獨的專案,GroupID 保持不變,ArtifactID 對應相應的章節
Search dependencies to add = Web
Step 3. 匯入專案
將下載好的專案解壓,然后通過 [Import Existing ] 匯入到 Eclipse 中,到了這一步,我們就有了第一個基于 Spring Boot 的專案了,
Step 4. 修改專案埠
如果跳過這一步也是可以的,這樣專案默認的埠是 8080,
修改 application.properties 檔案為 application.yml 檔案,配置專案訪問埠:
server:
port: 8082
Step 5. 創建第一個介面
在 src/main/java/com/archevolution/chapter1 下新建 package Controller 作為專案的控制層,并新建 UserController 類,代碼如下:
package com.archevolution.chapter1.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@RequestMapping(value = "https://www.cnblogs.com/queryAdmin")
public String queryUser(){
return "User : Admin";
}
}
Step 6. 啟動專案并測驗介面
在 Chapter1Application 類中的空白處,選擇 [Run As - Java Application] 運行專案;
待專案啟動后,通過介面測驗軟體或直接打開瀏覽器輸入:
http://127.0.0.1:8088/queryAdmin
輸出結果:
User : Admin
4. Spring Boot 的優勢
我們為什么要學習,這就要看看 Spring Boot 可以給軟體開發帶來什么樣的好處,
- 讓開發變快: 構建專案很快;支持主流的關系資料庫和非關系資料庫;內嵌容器;自帶監控;簡潔的安全策略集成...;總結來說,Spring Boot支持大部分主流框架的集成,并且只需要非常少量的配置代碼,開發者能夠更加專注于業務邏輯,
- 支持多種測驗框架: 比如 JUnit、Spring Test、Mockito 等等,開發人員只需要引入 spring-boot-start-test,就可以對資料庫、Mock 等進行測驗;
- 配置變的簡單: 【約定優于配置】,這個意思是,已經制定好一套規則了,如果你遵守的話,就不用再寫配置了,如果你不打算遵守的話,再寫配置告訴程式你想怎么樣;
- 部署變的簡單: 首先Spring Boot是內置容器的,這讓我們不需要關心容器環境的問題;另外Spring Boot和主流的持續集成軟體比如Jenkins,集成的很好,只需要做簡單的配置,就可以完成代碼的拉取、打包、自動化測驗、部署等作業,簡化了運維的作業;
5. Spring Boot 常見知識點
5.1 Spring Boot 核心功能
- 內嵌容器:內嵌了 Tomcat、Jetty、Undertow,我們選擇其中一個直接運行我們的專案;
- 獨立運行:因為內嵌了容器,所以 Spring Boot 可以以 jar 包的方式獨立運行;
- 提供了大量的 starter:通過在 pom.xml 中添加依賴,簡化了和其他框架的集成;
- 用注解替代組態檔:Spring Boot 使用了大量的注解,避免過多使用 XML 組態檔;
- 約定優于配置:制定好一套規則,如果完全按照這個規則的話,可以簡化我們的代碼;
5.2 什么是 Spring Boot Starter?
Spring Boot 已經完成了與很多框架的集成,當我們想在自己的專案中集成某一種框架的時候,只需要配置 Starter ,Spring Boot 會自動幫我們完成相關的配置和相關的依賴(引入什么 jar 包、jar 包的版本、是否需要引入其他的 jar 包等等),開發人員不需要關心框架整合的問題,
5.3 什么叫做約定優于配置?
已經制定好一套規則了,如果你遵守的話,就不用再寫配置了,如果你不打算遵守的話,再寫配置告訴程式你想怎么樣;
比如你的專案要使用內置的 Tomcat,埠默認是 8080,你可以不做任何配置,但是當你想修改埠為 8088(不遵守規則),那么你就需要增加配置,設定 server.port = 8088 ,
5.4 Spring Boot 配置的加載順序
Spring Boot 可以通過很多方式進行配置,而配置是有優先級的,優先級高的會覆寫優先級低的配置,
最常用的配置中:
命令列引數 > 系統環境變數 > YAML 組態檔 > 默認引數
比如我們在啟動的時候設定: java -jar springboot.jar --server.port = 9090
在組態檔中設定:server.port = 8888
那么啟動后的應用埠將是 9090,
5.5 如何在不同的環境中使用不同的配置?
在很多實際專案中,都會分成開發環境、測驗環境、(準生產環境)、生產環境等等,不同的測驗環境組態檔多多少少會有一些不同,傳統的專案中,我們都是有多個代碼基線,不同的代碼極限中,組態檔的內容是不相同的,
那么 Spring Boot 專案中會通過什么方式實作在不同的環境中使用不同的配置呢?
通常我們會在一個程式包中設定多個組態檔,然后通過組態檔、啟動命令、設定服務器環境變數等方式,指定生效的組態檔,
有些同學看到這里可能會有疑問,感覺沒有什么差別啊,兩個環境中,總會有一個組態檔是不相同的;但實際上 Spring Boot 可以有好多中配置的方式;
比如我們可以在啟動命令中設定哪個組態檔生效:
當然,如果你害怕啟動命令敲錯了,可以直接將啟動命令寫成 sh 腳本,通過腳本啟動;或者直接將其作為環境變數,配置到服務器上,
5.6 Spring Boot 只能通過內置的容器運行么?
因為 Spring Boot 內置了 web 容器,所以可以讓應用像本地程式一樣啟動運行,但并不是說 Spring Boot 只能通過內置的 Tomcat 或 Jetty 運行,
Spring 應用的運行方式有兩種:
-
以 jar 包方式運行;
-
打包成 war 包,部署到 web 容器,比如 Tomcat、Weblogic 等等;
使用 jar 的方式無序在部署 web 容器,似的除錯和部署更加的簡單,適合大規模的快速部署;但同時也會導致應用包體積過大,而且內置 web 容器的相關配置修改起來比較困難,
使用 war 包部署,一般 web 容器都有功能比較強大的可視化界面,管理起來更為簡單,資料源也可以交給 web 容器進行管理,應用體積比較小;但同時需要開發或運維人員搭建和維護 web 容器,應用和容器也可能會存在兼容性的問題,
5.6 Spring Boot 常用注解
有些注解不一定是 Spring Boot 才有或者獨有的,可能是 Spring 、Spring MVC 或其他框架的,但根據常見程度我也列出來了,
5.6.1 SpringBootApplication
用在 Spring Boot 的主類上,標識著這個應用是一個 Spring Boot 應用,@SpringBootApplication 又是三個注解的組合,包含了:
@SpringBootConfiguration:源于@Configuration,作用就是將當前類標注為配置類;@EnableAutoConfiguration:自動配置,讓 Spring Boot 應用將所有@Configuration配置都加載到 IoC 容器中;@ComponentScan:將一些標注了特定注解的 bean 注冊到 IoC 容器中,比如:@Controller、@Component、@Entity等等,
5.6.2 @ImportResource
用于將加載 xxxx.xml 檔案中的配置;比如老的 Spring 專案遷移到 Spring Boot 上,可以使用這個標簽加載制定的組態檔,
@SpringBootApplication
@ImportResource("classpath:beans.xml")
public class Chapter1Application {
public static void main(String[] args) {
SpringApplication.run(Chapter1Application.class, args);
}
}
5.6.3 @Autowired
自動裝配,會在 IoC 容器中查詢對應型別的 Bean,如果查詢到了,就裝配上,如果查詢不到,那么會拋出例外;@Autowired 可以消除 set、get 方法,對應著 XML 組態檔中的:
<property name="屬性名" value="https://www.cnblogs.com/CodeDaShu/p/屬性值"/>
5.6.4 Controller 相關
@Controller:標記在一個類上,表示這是一個 Controller 物件,是一個控制器類;@RestController:等于@Controller和@ResponseBody的組合,方法回傳的物件可以直接轉化成 JSON 格式;@RequestParam:接收請求頭 Request Head 中的內容,比如Content-Type標識了具體請求中的資源型別,常用的application/xml、application/json等等,@PathVariable:獲取 url 中的引數;@RequestBody:讀取請求體 Request Body ,并將其反序列化成 Java 物件;@RequestMapping:將 http 請求映射到控制器上,也就是將請求路徑和其處理類和方法進行系結,
@RestController
public class UserController {
@RequestMapping(value = "https://www.cnblogs.com/queryUser2")
@ResponseBody
public JsonResponse queryUser2ById(@RequestBody UserDto userDto){
...
}
}
5.6.5 Bean相關
@Service:用于標注服務層組件,表示這是一個 Bean,Bean 的名稱默認為當前類的名字,也可以傳遞引數,指定 Bean 的名稱;@Repository:資料庫訪問組件,也就是 DAO 層;@Scope:用于配置作用域,比如設定 singleton 表示單例,prototype 每次都會創建一個新的物件等等;@Entity:物體類,可以使用@Table注解和資料庫中的表系結,主鍵使用@Id標注,其余欄位使用@Column進行標注(如果保持屬性名和欄位名一致,可以省略 @Column);@Component:當組件不好歸類的時候,可以使用@Component進行標注;@Autowired:當我們需要使用組件的時候,可以使用@Autowired實作的 Bean 的自動注入,
6. 總結
在本節課中,我們學習了 Spring Boot 的概念、歷史、優點、常見知識點,以及搭建了一個最簡單的 Spring Boot 應用;現在我們專案的架構是這樣的,不要笑,就是這么“簡陋”,
單體架構就是把所有的功能都放在一個工程專案中,但是當訪問量不斷增加,我們只部署一套環境就有些吃不消了,這時候有什么解決方案么?有興趣的伙伴可以關注我,下期文章介紹,
會點代碼的大叔 | 原創
【從單體架構到分布式架構】本系列文章希望用淺顯直白的語言介紹架構發展程序中遇到的各種問題,以及對應的解決方案和優缺點,
適合人群:
想從事 JavaWeb 開發的學生,建議要有一定的 Java 語言基礎;
新手程式員,想要了解現在 JavaWeb 開發比較流行的中間件和框架;
技術堆疊長期為 SSH、SSM ,但是想尋求改變的程式員,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/170783.html
標籤:Java
