文章目錄
- 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種關鍵政策:
- 基于POJO的輕量級和最小侵入性程式設計;
- 通過IOC,依賴注入(DI)和面向接口實作松耦合;
- 基于切面(AOP)和慣例進行聲明式程式設計;
- 通過切面和模版減少樣式代碼;
什麼是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包。特别是對于一個大型應用,我們不可能把所有内容都放在一個應用裡面,如何維護、如何分工合作都是問題。
微服務架構
all in one的架構方式,要求我們把所有的功能單元放在一個應用裡面。然後我們把整個應用部署到伺服器上。如果負載能力不行,我們将整個應用進行水準複制,進行擴充,然後在負載均衡。
所謂微服務架構,就是打破之前all in one的架構方式,把每個功能元素獨立出來。把獨立出來的功能元素的動态組合,需要的功能元素才去拿來組合,需要多一些時可以整合多個功能元素。是以微服務架構是對功能元素進行複制,而沒有對整個應用進行複制。
這樣做的好處是:
- 節省了調用資源。
- 每個功能元素的服務都是一個可替換的、可獨立更新的軟體代碼。
- Martin Flower 于 2014 年 3 月 25 日寫的《Microservices》,詳細的闡述了什麼是微服務
如何建構微服務
一個大型系統的微服務架構,就像一個複雜交織的神經網絡,每一個神經元就是一個功能元素,它們各自完成自己的功能,然後通過http互相請求調用。比如一個電商系統,查緩存、連資料庫、浏覽頁面、結賬、支付等服務都是一個個獨立的功能服務,都被微化了,它們作為一個個微服務共同建構了一個龐大的系統。如果修改其中的一個功能,隻需要更新更新其中一個功能服務單元即可。
但是這種龐大的系統架構給部署和運維帶來很大的難度。于是,spring為我們帶來了建構大型分布式微服務的全套、全程産品:
- 建構一個個功能獨立的微服務應用單元,可以使用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官方提供了非常友善的工具 Spring Initializr:https://start.spring.io/ 來幫助我們建立Spring Boot應用。
使用Spring Initializr頁面建立
打開 https://start.spring.io/ ,建立步驟如圖所示:
點選”Generate Project“按鈕生成項目;此時浏覽器會下載下傳一個與上面Artifact名稱一樣的壓縮包。
解壓項目包,并用編譯器以Maven項目導入,以IntelliJ IDEA為例,步驟如圖所示:
- 導入剛剛解壓好的項目,如圖所示:
- 在彈出來的界面中選擇Import project from external model,并選擇Maven,如圖所示:
- 保持預設選項,點選Next,如圖所示:
- 保持預設選項,點選Next,如圖所示:
- 保持預設選項,點選Next,如圖所示:
- 保持預設選項,點選Next,如圖所示:
- 等待項目導入完畢,如果是第一次使用,可能速度會比較慢,需要耐心等待一切就緒(确認需要的所有資源導入完畢!),如圖所示:
項目結構分析
- 基礎的項目檔案介紹如圖所示:
- 生成的DemoApplication和測試包下的DemoApplicationTests類都可以直接運作來啟動目前建立的項目,由于目前該項目未配合任何資料通路或Web子產品,程式會在加載完Spring之後結束運作。點選運作後,運作結果如圖所示:
-
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來直接運作。
代碼編寫
- 直接在主程式上加上一個方法,映射一個請求路徑,代碼如下:
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);
}
}
- 編寫完畢後,啟動項目,如圖所示:
- 向浏覽器發起請求,通路通路:http://localhost:8080/hello 看頁面傳回,如圖所示:
将項目打成jar包
步驟如圖所示:
将項目打成jar包後,就可以在任何地方運作了
彩蛋
事實上,每次運作SpringBoot時,顯示的字元拼成的字母是可以更改的。
- 進入這個網站,直接輸入要生成的字母,以及相應的字元格式,系統就會自動轉換,如圖所示:
____________ ________
/_ \_____ \ \_____ \
| |/ ____/ _(__ <
| / \ / \
|___\_______ \/______ /
\/ \/
- 然後複制下面轉換好的字元到resources下建立一個txt檔案就可以,即resources/banner.txt,如圖所示:
- 運作項目,就可以看到更改過後的效果,如圖所示: