天天看點

Spring學習記錄 Day7(Spring Boot入門)

文章目錄

  • ​​Day 7​​
  • ​​Spring回顧​​
  • ​​什麼是Spring​​
  • ​​Spring是如何簡化Java開發的​​
  • ​​什麼是SpringBoot​​
  • ​​微服務​​
  • ​​什麼是微服務​​
  • ​​單體應用架構​​
  • ​​微服務架構​​
  • ​​如何建構微服務​​
  • ​​Hello World​​
  • ​​實驗内容​​
  • ​​準備​​
  • ​​建立項目​​
  • ​​項目結構分析​​
  • ​​代碼編寫​​
  • ​​将項目打成jar包​​
  • ​​彩蛋​​

Day 7

2019年8月7日。

這是我學習Spring的第七天。

這一天,我學到了以下的知識。

Spring回顧

什麼是Spring

Spring是一個開源架構,2003 年興起的一個輕量級的Java 開發架構,作者:Rod Johnson 。

Spring是為了解決企業級應用開發的複雜性而建立的,簡化開發。

Spring是如何簡化Java開發的

為了降低Java開發的複雜性,Spring采用了以下4種關鍵政策:

  1. 基于POJO的輕量級和最小侵入性程式設計;
  2. 通過IOC,依賴注入(DI)和面向接口實作松耦合;
  3. 基于切面(AOP)和慣例進行聲明式程式設計;
  4. 通過切面和模版減少樣式代碼;

什麼是SpringBoot

學過javaweb的人都知道,開發一個web應用,從最初開始接觸Servlet結合Tomcat,跑出伺服器端上第一個Hello Wolrld程式,是要經曆特别多的步驟; 後來就用了架構Struts ,再後來是SpringMVC,到了現在的SpringBoot,過一兩年又會有其他web架構出現;當架構不斷地演進,開發的項目也要與時俱進地産生變化。

言歸正傳,什麼是SpringBoot呢,就是一個javaweb的開發架構,和SpringMVC類似。對比其他javaweb架構的好處,官方說是簡化開發,約定大于配置, 能迅速的開發web應用,幾行代碼開發一個http接口。

所有的技術架構的發展似乎都遵循了一條主線規律:從一個複雜應用場景 衍生 一種規範架構,我們隻需要進行各種配置而不需要自己去實作它,這時候強大的配置功能成了優點;發展到一定程度之後,人們根據實際生産應用情況,選取其中實用功能和設計精華,重構出一些輕量級的架構;但之後為了提高開發效率,我們又嫌棄原先的各類配置過于麻煩,于是開始提倡“約定大于配置”,進而衍生出一些一站式的解決方案。

是的,這就是Java企業級應用->J2EE->spring->springboot的過程。

随着 Spring 不斷的發展,涉及的領域越來越多,項目整合開發需要配合各種各樣的檔案,慢慢變得不那麼易用簡單,違背了最初的理念,甚至人稱配置地獄。Spring Boot 正是在這樣的一個背景下被抽象出來的開發架構,目的為了讓大家更容易的使用 Spring 、更容易的內建各種常用的中間件、開源軟體;

Spring Boot 基于 Spring 開發,Spirng Boot 本身并不提供 Spring 架構的核心特性以及擴充功能,隻是用于快速、靈活地開發新一代基于 Spring 架構的應用程式。也就是說,它并不是用來替代 Spring 的解決方案,而是和 Spring 架構緊密結合用于提升 Spring 開發者體驗的工具。Spring Boot 以約定大于配置的核心思想,預設幫我們進行了很多設定,多數 Spring Boot 應用隻需要很少的 Spring 配置。同時它內建了大量常用的第三方庫配置(例如 Redis、MongoDB、Jpa、RabbitMQ、Quartz 等等),Spring Boot 應用中這些第三方庫幾乎可以零配置的開箱即用,

簡單來說,就是SpringBoot其實不是什麼新的架構,它預設配置了很多架構的使用方式,就像maven整合了所有的jar包,spring boot整合了所有的架構 。

Spring Boot 出生名門,從一開始就站在一個比較高的起點,又經過這幾年的發展,生态足夠完善,Spring Boot 已經當之無愧成為 Java 領域最熱門的技術。

Spring Boot的主要優點:

  • 為所有Spring開發者更快的入門
  • 開箱即用,提供各種預設配置來簡化項目配置
  • 内嵌式容器簡化Web項目
  • 沒有備援代碼生成和XML配置的要求

微服務

什麼是微服務

微服務是一種架構風格,它要求我們在開發一個應用的時候,這個應用必須建構成一系列小服務的組合;

可以通過http的方式進行互通。

要說微服務架構,就得先說說過去的單體應用架構。

單體應用架構

所謂單體應用架構(all in one)是指,我們将一個應用的中的所有應用服務都封裝在一個應用中。

無論是ERP、CRM或是其他什麼系統,你都把資料庫通路,web通路,等等各個功能放到一個war包内。

這樣做的好處是,易于開發和測試;也十分友善部署;當需要擴充時,隻需要将war複制多份,然後放到多個伺服器上,再做個負載均衡就可以了。

單體應用架構的缺點是,哪怕要修改一個非常小的地方,都需要停掉整個服務,重新打包、部署這個應用war包。特别是對于一個大型應用,我們不可能把所有内容都放在一個應用裡面,如何維護、如何分工合作都是問題。

Spring學習記錄 Day7(Spring Boot入門)

微服務架構

all in one的架構方式,要求我們把所有的功能單元放在一個應用裡面。然後我們把整個應用部署到伺服器上。如果負載能力不行,我們将整個應用進行水準複制,進行擴充,然後在負載均衡。

所謂微服務架構,就是打破之前all in one的架構方式,把每個功能元素獨立出來。把獨立出來的功能元素的動态組合,需要的功能元素才去拿來組合,需要多一些時可以整合多個功能元素。是以微服務架構是對功能元素進行複制,而沒有對整個應用進行複制。

這樣做的好處是:

  1. 節省了調用資源。
  2. 每個功能元素的服務都是一個可替換的、可獨立更新的軟體代碼。
  3. Spring學習記錄 Day7(Spring Boot入門)
  4. Martin Flower 于 2014 年 3 月 25 日寫的《Microservices》,詳細的闡述了什麼是微服務

如何建構微服務

一個大型系統的微服務架構,就像一個複雜交織的神經網絡,每一個神經元就是一個功能元素,它們各自完成自己的功能,然後通過http互相請求調用。比如一個電商系統,查緩存、連資料庫、浏覽頁面、結賬、支付等服務都是一個個獨立的功能服務,都被微化了,它們作為一個個微服務共同建構了一個龐大的系統。如果修改其中的一個功能,隻需要更新更新其中一個功能服務單元即可。

Spring學習記錄 Day7(Spring Boot入門)

但是這種龐大的系統架構給部署和運維帶來很大的難度。于是,spring為我們帶來了建構大型分布式微服務的全套、全程産品:

Spring學習記錄 Day7(Spring Boot入門)
  • 建構一個個功能獨立的微服務應用單元,可以使用Springboot,可以幫助我們快速建構一個應用;
  • 大型分布式網絡服務的調用,這部分由Spring cloud來完成,實作分布式;
  • 在分布式中間,進行流式資料計算、批處理,我們有Spring cloud data flow。

spring為我們想清楚了整個從開始建構應用到大型分布式應用全流程方案。

Hello World

實驗内容

我們将學習如何快速地建立一個Spring Boot應用,并且實作一個簡單的Http請求處理。通過這個例子,我們會對Spring Boot有一個初步的了解,并且體驗其結構簡單、開發快速的特性。

準備

實驗環境:

  • java version “1.8.0_181”
  • Maven-3.6.1
  • SpringBoot 2.1.6(目前的穩定版)
  • IDEA
  • Spring學習記錄 Day7(Spring Boot入門)

建立項目

Spring官方提供了非常友善的工具 Spring Initializr:​​https://start.spring.io/​​ 來幫助我們建立Spring Boot應用。

使用Spring Initializr頁面建立

打開 ​​https://start.spring.io/​​ ,建立步驟如圖所示:

Spring學習記錄 Day7(Spring Boot入門)
Spring學習記錄 Day7(Spring Boot入門)
Spring學習記錄 Day7(Spring Boot入門)

點選”Generate Project“按鈕生成項目;此時浏覽器會下載下傳一個與上面Artifact名稱一樣的壓縮包。

Spring學習記錄 Day7(Spring Boot入門)
Spring學習記錄 Day7(Spring Boot入門)

解壓項目包,并用編譯器以Maven項目導入,以IntelliJ IDEA為例,步驟如圖所示:

  1. 導入剛剛解壓好的項目,如圖所示:
  2. Spring學習記錄 Day7(Spring Boot入門)
  3. 在彈出來的界面中選擇Import project from external model,并選擇Maven,如圖所示:
  4. Spring學習記錄 Day7(Spring Boot入門)
  5. 保持預設選項,點選Next,如圖所示:
  6. Spring學習記錄 Day7(Spring Boot入門)
  7. 保持預設選項,點選Next,如圖所示:
Spring學習記錄 Day7(Spring Boot入門)
  1. 保持預設選項,點選Next,如圖所示:
Spring學習記錄 Day7(Spring Boot入門)
  1. 保持預設選項,點選Next,如圖所示:
  2. Spring學習記錄 Day7(Spring Boot入門)
  3. 等待項目導入完畢,如果是第一次使用,可能速度會比較慢,需要耐心等待一切就緒(确認需要的所有資源導入完畢!),如圖所示:
  4. Spring學習記錄 Day7(Spring Boot入門)

項目結構分析

  1. 基礎的項目檔案介紹如圖所示:
  2. Spring學習記錄 Day7(Spring Boot入門)
  3. 生成的DemoApplication和測試包下的DemoApplicationTests類都可以直接運作來啟動目前建立的項目,由于目前該項目未配合任何資料通路或Web子產品,程式會在加載完Spring之後結束運作。點選運作後,運作結果如圖所示:
  4. Spring學習記錄 Day7(Spring Boot入門)
  5. pom.xml分析

    打開pom.xml,可以看到Spring Boot項目的依賴,代碼如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.6.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>

<properties>
    <java.version>1.8</java.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

</project>      

如上所示,主要有四個部分:

  • 項目中繼資料:建立時候輸入的Project Metadata部分,也就是Maven項目的基本元素,包括:groupId、artifactId、version、name、description等
  • parent:繼承spring-boot-starter-parent的依賴管理,控制版本與打包等内容
  • dependencies:項目具體依賴,這裡包含了spring-boot-starter-web用于實作HTTP接口(該依賴中包含了Spring MVC),官網對它的描述是:使用Spring MVC建構Web(包括RESTful)應用程式的入門者,使用Tomcat作為預設嵌入式容器。spring-boot-starter-test用于編寫單元測試的依賴包。更多功能子產品的使用将在後面逐漸展開。
  • build:建構配置部分。預設使用了spring-boot-maven-plugin,配合spring-boot-starter-parent就可以把Spring Boot應用打包成JAR來直接運作。

代碼編寫

  1. 直接在主程式上加上一個方法,映射一個請求路徑,代碼如下:
package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@SpringBootApplication
public class DemoApplication {

  @RequestMapping("/hello")
  public String index() {
    return "Hello World";
  }

  public static void main(String[] args) {
    SpringApplication.run(DemoApplication.class, args);
  }

}      
  1. 編寫完畢後,啟動項目,如圖所示:
  2. Spring學習記錄 Day7(Spring Boot入門)
  3. 向浏覽器發起請求,通路通路:​​http://localhost:8080/hello​​ 看頁面傳回,如圖所示:
Spring學習記錄 Day7(Spring Boot入門)

将項目打成jar包

步驟如圖所示:

Spring學習記錄 Day7(Spring Boot入門)

将項目打成jar包後,就可以在任何地方運作了

彩蛋

事實上,每次運作SpringBoot時,顯示的字元拼成的字母是可以更改的。

  1. 進入這個網站,直接輸入要生成的字母,以及相應的字元格式,系統就會自動轉換,如圖所示:
  2. Spring學習記錄 Day7(Spring Boot入門)
____________  ________  
/_   \_____  \ \_____  \ 
 |   |/  ____/   _(__  < 
 |   /       \  /       \
 |___\_______ \/______  /
             \/       \/       
  1. 然後複制下面轉換好的字元到resources下建立一個txt檔案就可以,即resources/banner.txt,如圖所示:
  2. 運作項目,就可以看到更改過後的效果,如圖所示:

繼續閱讀