天天看點

Spring Boot應用開發起步

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