參考:
https://www.cnblogs.com/ityouknow/p/5662753.html
http://c.biancheng.net/view/4630.html
https://www.cnblogs.com/echola/p/10996214.html
構建微服務:Spring boot 入門篇
什么是Spring Boot
Spring Boot 是由 Pivotal 團隊提供的全新框架,其設計目的是用來簡化新 Spring 應用的初始搭建以及開發過程。該框架使用了特定的方式來進行配置,從而使開發人員不再需要定義樣板化的配置。用我的話來理解,就是 Spring Boot 其實不是什么新的框架,它默認配置了很多框架的使用方式,就像 Maven 整合了所有的 Jar 包,Spring Boot 整合了所有的框架。
使用 Spring Boot有什么好處
其實就是簡單、快速、方便!平時如果我們需要搭建一個 Spring Web 項目的時候需要怎么做呢?
- 1)配置 web.xml,加載 Spring 和 Spring mvc
- 2)配置數據庫連接、配置 Spring 事務
- 3)配置加載配置文件的讀取,開啟注解
- 4)配置日志文件
- ...
- 配置完成之后部署 Tomcat 調試
- ...
現在非常流行微服務,如果我這個項目僅僅只是需要發送一個郵件,如果我的項目僅僅是生產一個積分;我都需要這樣折騰一遍!
但是如果使用 Spring Boot 呢?
很簡單,我僅僅只需要非常少的幾個配置就可以迅速方便的搭建起來一套 Web 項目或者是構建一個微服務!
使用 Spring Boot 到底有多爽,用下面這幅圖來表達
快速入門
說了那么多,手癢癢的很,馬上來一發試試!
Maven 構建項目
- 1、訪問 http://start.spring.io/
- 2、選擇構建工具 Maven Project、Java、Spring Boot 版本 2.1.3 以及一些工程基本信息,可參考下圖所示:
- 3、點擊 Generate Project 下載項目壓縮包
- 4、解壓后,使用 Idea 導入項目,File -> New -> Model from Existing Source.. -> 選擇解壓后的文件夾 -> OK,選擇 Maven 一路 Next,OK done!
- 5、如果使用的是 Eclipse,Import -> Existing Maven Projects -> Next -> 選擇解壓后的文件夾 -> Finsh,OK done!
Idea 構建項目
- 1、選擇 File -> New —> Project... 彈出新建項目的框
- 2、選擇 Spring Initializr,Next 也會出現上述類似的配置界面,Idea 幫我們做了集成
- 3、填寫相關內容后,點擊 Next 選擇依賴的包再點擊 Next,最后確定信息無誤點擊 Finish。
項目結構介紹
如上圖所示,Spring Boot的基礎結構共三個文件:
l src/main/java 程序開發以及主程序入口
l src/main/resources 配置文件
l src/test/java 測試程序
另外,spingboot建議的目錄結果如下:
root package結構:com.example.myproject
com +- example +- myproject +- Application.java | +- domain | +- Customer.java | +- CustomerRepository.java | +- service | +- CustomerService.java | +- controller | +- CustomerController.java |
1、Application.java 建議放到跟目錄下面,主要用於做一些框架配置
2、domain目錄主要用於實體(Entity)與數據訪問層(Repository)
3、service 層主要是業務類代碼
4、controller 負責頁面訪問控制
采用默認配置可以省去很多配置,當然也可以根據自己的喜歡來進行更改
最后,啟動Application main方法,至此一個java項目搭建好了!
引入 Web 模塊
1、pom.xml中添加支持web的模塊:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
pom.xml文件中默認有兩個模塊:
spring-boot-starter:核心模塊,包括自動配置支持、日志和YAML;
spring-boot-starter-test:測試模塊,包括JUnit、Hamcrest、Mockito。
2、編寫controller內容
@RestController public class HelloWorldController { @RequestMapping("/hello") public String index() { return "Hello World"; } }
@RestController的意思就是controller里面的方法都以json格式輸出,不用再寫什么jackjson配置的了!
3、啟動主程序,打開瀏覽器訪問http://localhost:8080/hello,就可以看到效果了,有木有很簡單!
如何做單元測試
打開的src/test/下的測試入口,編寫簡單的http請求來測試;使用mockmvc進行,利用MockMvcResultHandlers.print()打印出執行結果。
@RunWith(SpringRunner.class)
@SpringBootTest
public class HelloWorldControlerTests { private MockMvc mvc; @Before public void setUp() throws Exception { mvc = MockMvcBuilders.standaloneSetup(new HelloWorldController()).build(); } @Test public void getHello() throws Exception { mvc.perform(MockMvcRequestBuilders.get("/hello").accept(MediaType.APPLICATION_JSON)) .andExpect(MockMvcResultMatchers.status().isOk()) .andDo(MockMvcResultHandlers.print()) .andReturn(); } }
開發環境的調試
熱啟動在正常開發項目中已經很常見了吧,雖然平時開發 web 項目過程中,改動項目啟重啟總是報錯;但 Spring Boot 對調試支持很好,修改之后可以實時生效,需要添加以下的配置:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
</configuration>
</plugin>
</plugins>
</build>
該模塊在完整的打包環境下運行的時候會被禁用。如果你使用java -jar啟動應用或者用一個特定的classloader啟動,它會認為這是一個“生產環境”。
總結
使用 Spring Boot 可以非常方便、快速搭建項目,使我們不用關心框架之間的兼容性,適用版本等各種問題,我們想使用任何東西,僅僅添加一個配置就可以,所以使用 Spring Boot 非常適合構建微服務。
SpringBoot是什么?SpringBoot的優缺點有哪些?
在上述環境下, Spring Boot 應運而生。它使用“習慣優於配置”(項目中存在大量的配置,此外還內置一個習慣性的配置,讓你無須手動進行配置)的理念讓你的項目快速運行起來。
使用 Spring Boot 很容易創建一個獨立運行(運行 jar,內嵌 Servlet 容器)、准生產級別的基於 Spring 框架的項目,使用 Spring Boot 你可以不用或者只需要很少的 Spring 配置。
Spring Boot 核心功能
1)獨立運行的 Spring 項目
Spring Boot 可以以 jar 包的形式獨立運行,運行一個 Spring Boot 項目只需通過 java–jar xx.jar 來運行。2)內嵌 Servlet 容器
Spring Boot 可選擇內嵌 Tomcat、Jetty 或者 Undertow,這樣我們無須以 war 包形式部署項目。3)提供 starter 簡化 Maven 配置
Spring 提供了一系列的 starter pom 來簡化 Maven 的依賴加載,例如,當你使用了spring-boot-starter-web 時,會自動加入如圖 1 所示的依賴包。4)自動配置 Spring
Spring Boot 會根據在類路徑中的 jar 包、類,為 jar 包里的類自動配置 Bean,這樣會極大地減少我們要使用的配置。當然,Spring Boot 只是考慮了大多數的開發場景,並不是所有的場景,若在實際開發中我們需要自動配置 Bean,而 Spring Boot 沒有提供支持,則可以自定義自動配置。5)准生產的應用監控
Spring Boot 提供基於 http、ssh、telnet 對運行時的項目進行監控。6)無代碼生成和 xml 配置
Spring Boot 的神奇的不是借助於代碼生成來實現的,而是通過條件注解來實現的,這是 Spring 4.x 提供的新特性。Spring 4.x 提倡使用 Java 配置和注解配置組合,而 Spring Boot 不需要任何 xml 配置即可實現 Spring 的所有配置。Spring Boot的優缺點
1)優點
- 快速構建項目。
- 對主流開發框架的無配置集成;與其Spring生態系統(如Spring JDBC,Spring ORM,Spring Data,Spring Security等)集成非常容易
- 項目可獨立運行,無須外部依賴Servlet容器。
- 提供運行時的應用監控。
- 極大地提高了開發、部署效率。
- 與雲計算的天然集成。
- 去除了大量的xml配置文件
- 簡化復雜的依賴管理
2)缺點
- 版本迭代速度很快,一些模塊改動很大。
- 由於不用自己做配置,報錯時很難定位。
- 網上現成的解決方案比較少。
SpringBoot的優缺點
首先學習一門語言,需要知道其優點,說道springboot,很多人只知道能簡化配置,其他的概不清楚。
優點
創建獨立的Spring應用程序
SpringBoot可以jar包的形式進行獨立的運行,使用:java -jar xx.jar就可以成功運行項目,或者在項目的主程序中運行main函數
嵌入的Tomcat,Jetty或者Undertow,無序部署WAR文件
Spring 項目部署時需要我們在服務器上部署 tomcat,然后把項目打成 war 包扔到 tomcat里
springboot項目不需要單獨下載Tomcat等傳統服務器,內嵌容器,使得我們可以執行運行項目的主程序main函數,並讓項目的快速運行,另外,也降低對運行環境的基本要求,環境變量中有JDK即可。
允許通過maven來根據需要獲取starter
Spring Boot提供了一系列的starter pom用來簡化我們的Maven依賴,通過這些starter項目就能以Java Application的形式運行Spring Boot項目,而無需其他服務器配置
starter pom:https://docs.spring.io/spring-boot/docs/1.4.1.RELEASE/reference/htmlsingle/#using-boot-starter
盡可能自動配置Spring
Spring Boot提供Spring框架的最大自動化配置,大量使用自動配置,使得開發者對Spring的配置盡量減少
Spring Boot更多的是采用 Java Config 的方式,對 Spring 進行配置。
新建一個類,但是我不用 @Service注解,也就是說,它是個普通的類,那么我們如何使它也成為一個 Bean 讓 Spring 去管理呢?只需要@Configuration 和@Bean兩個注解即可
public class TestService { public String sayHello () { return "Hello Spring Boot!"; } } import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class JavaConfig { @Bean public TestService getTestService() { return new TestService(); } }
@Configuration表示該類是個配置類,@Bean表示該方法返回一個 Bean。這樣就把TestService作為 Bean 讓 Spring 去管理了,在其他地方,我們如果需要使用該 Bean,和原來一樣,直接使用@Resource注解注入進來即可使用,非常方便。
提供生產就緒型功能,如指標、健康檢查和外部配置
Spring Boot提供了基於http、ssh、telnet對運行時的項目進行監控;我們可以引入 spring-boot-start-actuator 依賴,直接使用 REST 方式來獲取進程的運行期性能參數,從而達到監控的目的,比較方便。但是 Spring Boot 只是個微框架,沒有提供相應的服務發現與注冊的配套功能,沒有外圍監控集成方案,沒有外圍安全管理方案,所以在微服務架構中,還需要 Spring Cloud 來配合一起使用。
絕對沒有代碼生成,對XML沒有要求配置
缺點
依賴太多,一個spring boot項目就有很多M
缺少服務的注冊和發現等解決方案
缺少監控集成方案,安全管理方案
本文借鑒:SpringBoot的優點《深入淺出SpringBoot 2.x》
SpringBoot 熱啟動與熱部署
熱部署就是正在運行狀態的應用,修改了他的源碼之后,在不重新啟動的情況下能夠自動把增量內容編譯並部署到服務器上,使得修改立即生效。熱部署為了解決的問題有兩個, 一是在開發的時候,修改代碼后不需要重啟應用就能看到效果,大大提升開發效率;二是生產上運行的程序,可以在不停止運行的情況下進行升級,不影響用戶使用。
前言:最近面試幾家公司,面試一般都會問到Spring Boot 熱啟動及熱部署相關的問題。做一個總結
代碼熱部署
當我們已經啟動了一個服務,然后修改代碼之后,會自動重新部署。Spring項目通常有新內容修改后需要重新編譯然后運行。通過配置Spring boot的熱啟動配置,可以實現自動編譯重啟項目,通常要比手動停止,啟動項目快。
1、引入spring-boot-devtools
pom中添加響應的jar包及插件
<!-- 熱啟動,熱部署依賴包 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency>
2、引入對應的插件
<!-- 熱啟動,熱部署依賴插件 --> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <fork>true</fork> </configuration> </plugin>
通過上面的2步,就可以實現代碼的熱部署了。
IDEA中 修改代碼后需要通過 Ctrl+F9 重新編譯
原理介紹
spring-boot-devtools 是一個為開發者服務的一個模塊,其中最重要的功能就是自動應用代碼更改到最新的App上面去。
原理是在發現代碼有更改之后,重新啟動應用,但是速度比手動停止后再啟動還要更快,
更快指的不是節省出來的手工操作的時間。
其深層原理是:
使用了兩個ClassLoader,一個Classloader加載那些不會改變的類(第三方Jar包),
另一個ClassLoader加載會更改的類,稱為 restart ClassLoader,
這樣在有代碼更改的時候,原來的restart ClassLoader 被丟棄,
重新創建一個restart ClassLoader,由於需要加載的類相比較少,
所以實現了較快的重啟時間(5秒以內)。
部署方式:
熱部署 :在服務器運行時重新部署項目,直接重新加載整個應用,更多是在生產環境使用
熱加載:在運行時重新加載class,更多是在開發環境使用
熱部署
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>springloaded</artifactId> <version>1.2.8.RELEASE</version> </dependency> </dependencies>
mvn spring-boot:run
以上是spring boot 熱部署的方式之一。
還有2種方式,一種是通過下載springbootloaded jar包,在vm中啟動
另外一種 比較復雜可以通過加參數完成啟動。
面試過程中有一個問題比較有意思。
如何通過參數實現開發和生產環境數據庫切換的熱部署。。這個地方懶得百度了,但是是一個很好的知識點,目測是通過熱加載配置文件。
轉載自 https://blog.csdn.net/qq_27384769/article/details/79473992
更多干貨 請訪問 https://blog.csdn.net/qq_27384769/article/details/79473992