Spring Boot應用的建立
Spring Boot支援多種內建方式,如CLI,Maven,Gradle。這裡以Mavan為例,一個典型的Maven Spring Boot應用需要滿足Spring Boot的約定,比如最常用的從spring-boot-starter-web開始,那麼項目的build腳本可以這樣配置開始:
1 <?xml version="1.0" encoding="UTF-8"?>
2
3 <project xmlns="http://maven.apache.org/POM/4.0.0"
4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
6 <modelVersion>4.0.0</modelVersion>
7
8 <groupId>com.example</groupId>
9 <artifactId>cnblogs_example</artifactId>
10 <version>1.0-SNAPSHOT</version>
11
12 <parent>
13 <groupId>org.springframework.boot</groupId>
14 <artifactId>spring-boot-starter-parent</artifactId>
15 <version>2.0.0.BUILD-SNAPSHOT</version>
16 </parent>
17
18
19 <dependencies>
20 <dependency>
21 <groupId>org.springframework.boot</groupId>
22 <artifactId>spring-boot-starter-web</artifactId>
23 </dependency>
24 </dependencies>
25
26 <!-- ignore others-->
27 </project>
一個基本的應用可以由Example.java的定義完成:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@EnableAutoConfiguration
public class Example {
@RequestMapping("/")
String home() {
return "Hello World!";
}
public static void main(String[] args) throws Exception {
SpringApplication.run(Example.class, args);
}
自此,一個完整,雖然簡單的Spring Boot Web應用已經産生。當然,如果需要直接通過"mvn package"就可以生成一個all-in-one的可執行jar(Uber jar),我們還需要在pom.xml中添加一些内容,最終的内容如下:
<?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>
<groupId>com.example</groupId>
<artifactId>cnblogs_example</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.BUILD-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>Example</mainClass>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
View Code
這樣就可以簡單地通過“java -jar cnblogs_example-1.0-SNAPSHOT.jar”來運作這個web應用,并可以通過http://127.0.0.1:8080/來通路了,真的是很簡單,而且可移植性強,一個jar檔案在有Java運作時的地方都可以跑起來了。
一些配置規範(COO)
Application源
Application源指的是用SpringApplication搜尋的Application的定義的集合。如示例中的 SpringApplication.run(Example.class, args); 用的就是“Class”類型的源,因為指定的是一個具體的Class。
根據參考【2】,目前(v2.0)支援的sources類型有:
- Class:能夠被AnnotatedBeanDefinitionReader加載的Java類
- Resource:能夠被XmlBeanDefinitonReader加載的XML資源,或者能被GroovyBeanDefinitionReader加載的groovy script
- Package:被ClassPathBeanDefinitionScanner掃描的Java包
- CharSequence:依次嘗試作為Java class,Resource, 和Java包加載。
配置檔案application.properties
Spring Boot預設的配置檔案甚至可以不存在,需要的話也很簡單,隻要在項目的“src/main/resources”目錄下建立application.properties檔案就可以了,很多配置就可以直接寫在這裡了,常用的配置有port,datasource等等。比如:
server.port=9090
spring.datasource.url = [url]
spring.datasource.username = [username]
spring.datasource.password = [password]
spring.datasource.driverClassName = oracle.jdbc.OracleDriver
spring.datasource.jmx-enabled=true
#second db ... spring.secondDatasource.url = [url] spring.secondDatasource.username = [username] spring.secondDatasource.password = [password] spring.secondDatasource.driverClassName = oracle.jdbc.OracleDriver
spring. secondDatasource .jmx-enabled=true
順便記錄一下程式中datasource的引用方式:
@Bean
@Primary
@ConfigurationProperties(prefix="spring.datasource")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
這裡雖然可以配置多個datasource,我們在項目中需要使用JMX查詢bean,使用中發現,目前Spring Boot + Tomcat的使用中還隻支援primary datasource的JMX暴露,而且名稱固定為“dataSourceMBean”。
應用是如何組織起來的?
顯然Spring Boot為我們隐藏了很多技術細節,包括啟動過程,這裡希望對其啟動的原理做一點總結。
簡化的Maven父項目
在上面示例項目中,繼承了“
spring-boot-starter-parent
”項目,背後也為我們提供了很多便利性支援,比如自動具有了如下功能【1】:
- Java 1.6作為預設的編譯級别
- UTF-8編碼
- 依賴聲明中可以省略<version>,預設從
繼承spring-boot-dependencies
- 敏感資訊過濾
強大的包依賴和插件管理
這本身是maven的特性,但Spring Boot通過提供maven的擴充插件為微服務的運作提供了很好的封裝。比如,我們在項目中使用的幾個插件:
maven-dependency-plugin
用于打包操作,把一些依賴的jar内容解壓到項目源碼清單中,以便通過一般jar的規範來引用。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<phase>prepare-package</phase>
<goals>
<goal>unpack-dependencies</goal>
</goals>
<configuration>
<includeArtifactIds>foglight-agent</includeArtifactIds>
<outputDirectory>${project.build.outputDirectory}</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
maven-jar-plugin
用于操作Uber-jar的manifest:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifestEntries>
<Premain-Class>com.quest.pas.agent15.AgentPremain</Premain-Class>
<Can-Redefine-Classes>true</Can-Redefine-Classes>
<Can-Retransform-Classes>true</Can-Retransform-Classes>
</manifestEntries>
</archive>
</configuration>
</plugin>
再比如,在加入“spring-boot-starter-web”依賴之後,Spring Boot就得到了如下的依賴,包含Tomcat和Spring Boot自身jar:
D:\Workspace\MicroServices\cnblogs_example>mvn dependency:tree
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building cnblogs_example 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.10:tree (default-cli) @ cnblogs_example ---
[INFO] com.example:cnblogs_example:jar:1.0-SNAPSHOT
[INFO] \- org.springframework.boot:spring-boot-starter-web:jar:2.0.0.BUILD-SNAPSHOT:compile
[INFO] +- org.springframework.boot:spring-boot-starter:jar:2.0.0.BUILD-SNAPSHOT:compile
[INFO] | +- org.springframework.boot:spring-boot:jar:2.0.0.BUILD-SNAPSHOT:compile
[INFO] | | \- io.projectreactor.addons:reactor-test:jar:3.0.5.RELEASE:compile
[INFO] | | \- io.projectreactor:reactor-core:jar:3.0.5.RELEASE:compile
[INFO] | | \- org.reactivestreams:reactive-streams:jar:1.0.0:compile
[INFO] | +- org.springframework.boot:spring-boot-autoconfigure:jar:2.0.0.BUILD-SNAPSHOT:compile
[INFO] | +- org.springframework.boot:spring-boot-starter-logging:jar:2.0.0.BUILD-SNAPSHOT:compile
[INFO] | | +- ch.qos.logback:logback-classic:jar:1.2.2:compile
[INFO] | | | +- ch.qos.logback:logback-core:jar:1.2.2:compile
[INFO] | | | \- org.slf4j:slf4j-api:jar:1.7.25:compile
[INFO] | | +- org.slf4j:jcl-over-slf4j:jar:1.7.25:compile
[INFO] | | +- org.slf4j:jul-to-slf4j:jar:1.7.25:compile
[INFO] | | \- org.slf4j:log4j-over-slf4j:jar:1.7.25:compile
[INFO] | +- org.springframework:spring-core:jar:5.0.0.BUILD-SNAPSHOT:compile
[INFO] | \- org.yaml:snakeyaml:jar:1.18:runtime
[INFO] +- org.springframework.boot:spring-boot-starter-tomcat:jar:2.0.0.BUILD-SNAPSHOT:compile
[INFO] | +- org.apache.tomcat.embed:tomcat-embed-core:jar:8.5.12:compile
[INFO] | +- org.apache.tomcat.embed:tomcat-embed-el:jar:8.5.12:compile
[INFO] | \- org.apache.tomcat.embed:tomcat-embed-websocket:jar:8.5.12:compile
[INFO] +- org.hibernate:hibernate-validator:jar:5.4.1.Final:compile
[INFO] | +- javax.validation:validation-api:jar:1.1.0.Final:compile
[INFO] | +- org.jboss.logging:jboss-logging:jar:3.3.1.Final:compile
[INFO] | \- com.fasterxml:classmate:jar:1.3.3:compile
[INFO] +- com.fasterxml.jackson.core:jackson-databind:jar:2.9.0.pr2:compile
[INFO] | +- com.fasterxml.jackson.core:jackson-annotations:jar:2.9.0.pr2:compile
[INFO] | \- com.fasterxml.jackson.core:jackson-core:jar:2.9.0.pr2:compile
[INFO] +- org.springframework:spring-web:jar:5.0.0.BUILD-SNAPSHOT:compile
[INFO] | +- org.springframework:spring-aop:jar:5.0.0.BUILD-SNAPSHOT:compile
[INFO] | +- org.springframework:spring-beans:jar:5.0.0.BUILD-SNAPSHOT:compile
[INFO] | \- org.springframework:spring-context:jar:5.0.0.BUILD-SNAPSHOT:compile
[INFO] \- org.springframework:spring-webmvc:jar:5.0.0.BUILD-SNAPSHOT:compile
[INFO] \- org.springframework:spring-expression:jar:5.0.0.BUILD-SNAPSHOT:compile
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
SpringApplication引導程式
SpringApplication類為使用者程式提供了引導程式的作用,啟動方式為在使用者的main方法中調用,SpringApplication的主要工作有,參考【2】:
- 根據classpath建立合适的ApplicationContxt執行個體
- 為啟動指令行參數注冊CommandLinePropertySource,并作為Spring的屬性對外暴露
- 重新整理ApplicationContext,加載所有的單例bean
- 觸發所有的CommandLineRunner beans。
這裡又會涉及大量的實作細節,也有很多文章做了詳細的描述,可以通過搜尋來加深了解。
Spring Boot是什麼? - Microservices話題
要了解Spring Boot,還得了解一點它的自身身份定位,因為Spring Boot本身不是憑空而出的,它一定是為了解決某類問題而出現的,那麼它要解決的問題就是Microservices的落地問題。這裡主要是想梳理一下幾個重要的概念,具體細節已經有很多文章參考了。
Microservices
Microservices,可以參考wikipedia的詞條,注意這裡帶“s”結尾,它指的是微服務架構,或者更準确說是一種架構風格。如同其他架構風格一樣,微服務也有它的曆史源頭和發展路徑,到如今成為熱門話題,也是因為它符合了曆史潮流。從“認祖歸宗”的角度來看,它還是屬于“SOA”的一個實踐方案。 背後的哲學思想是:“Do one thing and do it well”。也是現在的我自己正在并繼續努力奉行的哲學。
除了wikipedia之外,我看到這篇文章也對微服務架構做了很好的總結。
Microservice chassis
不确定這個詞怎麼翻譯合适,先這麼用着吧。為什麼提到這個詞,因為人們會吧Spring Boot定位為一種Microservice chassis,個人認為這是一種較為精确的分類,Pattern: Microservice chassis一文中也有詳細的說明。從這個角度分類,這就好比Spring Boot誕生的背後的價值觀,Spring Boot确切的說是用來解決我們實作Microservices過程中可能遇到的一些具體“麻煩”,是一種framework,友善開發者的工作。從前面的簡單示例裡面可以看到,真的使得開發變得很簡單!
Microservice chassis需要解決的實際問題包括:外部配置、日志、健康監控、運作狀态和分布式的跟蹤。
Microservices架構
我的了解,這是從另外一個角度來歸類Spring Boot,這說明Spring Boot除了解決以上一些開發的具體“麻煩”瑣事之外,還提供了更一般性的,可複用的軟體開發和運作環境,包括支援指令、編譯器、類庫、工具集、API等來支援一個軟體項目/系統的開發。
對Spring Boot來說,它解決了基本的開發問題,通過依賴的方式提供了所有開發一個微服務系統的所需的所有功能,同時配合Spring Cloud就足夠完備了。
是以,chassis和架構很多時候是在一個系統都實作了,或者說一個完備的系統會同時滿足chassis和架構的要求。
References:
【1】Spring Bootf官方文檔:http://docs.spring.io/spring-boot/docs/current/reference/html/
【2】: http://zhaox.github.io/java/2016/03/22/spring-boot-start-flow
【3】:http://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/SpringApplication.html
【4】Spring Boot啟動過程與回調接口彙總:https://segmentfault.com/a/1190000006918229
【5】Microservices: https://en.wikipedia.org/wiki/Microservices
【6】Microservice chassis: http://microservices.io/patterns/microservice-chassis.html
版權申明: 歡迎分享,轉載請注明出處http://www.cnblogs.com/1xin/p/6627054.html
轉載于:https://www.cnblogs.com/1xin/p/6627054.html