利用 create-spring-boot-app 快速建立 Spring Boot 應用

利用 create-spring-boot-app 快速建立 Spring Boot 應用 從屬於筆者的 服務端應用程序開發與系統架構。最近一段時間我司業務快速擴展,針對不一樣的項目分割了不少代碼庫,爲了方便新同事學習與快速使用 Spring Boot 項目,順手將以前的模板整合爲 create-spring-boot-app,跟筆者以前的 create-react-boilerplate 都是屬於腳手架系列。
更多編程語言、服務端開發方面的知識圖譜參考 2016: 個人技術體系結構圖探究高可用服務端架構的優秀資料索引追求技術之上的進階閱讀學習索引機器學習、深度學習與天然語言處理領域推薦的書籍列表html

利用 create-spring-boot-app 快速建立 Spring Boot 應用

若是你還沒有安裝 Node.js 環境,推薦使用 nvm 安裝 Node.js 基本環境。若是你還沒有安裝 Java 或者 Gradle,推薦使用 sdkman 安裝 Java/Gradle。基本環境安裝完畢以後可使用 npm 安裝腳手架:前端

npm install create-spring-boot-app -g

安裝完畢後,能夠查看經常使用命令:react

➜  ~ create-spring-boot-app -h

  Usage: create-spring-boot-app <project-name> [options]

  Options:

    -h, --help               output usage information
    -V, --version            output the version number
    -p, --package [package]  選擇包名(默認 wx.csba)
    -t, --type [type]        選擇模板類型 [gradle/maven]
    -a, --addon [addon]      選擇所須要的擴展,多個以逗號隔開 [all/weixin]

    僅 <project-name> 是必須參數!

咱們如今可使用 create-spring-boot-app 直接建立新的 Spring Boot 項目:git

➜  ~ create-spring-boot-app testtest -p com.test
開始建立新的 Spring Boot 應用位於文件夾 /Users/apple/testtest
初始化 testtest 基於 gradle-boilerplate
開始抓取遠端模板 https://github.com/wxyyxc1992/create-spring-boot-app
將包名更爲:com.test
應用建立完畢

使用 cd testtest 進入項目文件夾
使用 gradle :help 查看可用命令

進入到項目目錄下,咱們能夠查看可用命令:github

➜  testtest gradle :help
Starting a Gradle Daemon, 25 stopped Daemons could not be reused, use --status for details
:help
使用 gradle :bootRun 運行 Spring Boot 項目(這裏的 : 表示從根模塊開始運行)
使用 gradle :build 打包 Jar
使用 gradle task 查看全部任務

BUILD SUCCESSFUL

Total time: 3.966 secs

而後使用 gradle :bootRun 命令啓動服務器,而後打開 localhost:8081 便可查看基本的訪問返回。爲了保證應用具備熱加載功能,咱們使用 Spring Loaded 插件:spring

buildscript {
    repositories { jcenter() }
    dependencies {
        classpath "org.springframework.boot:spring-boot-gradle-plugin:1.5.2.RELEASE"
        classpath 'org.springframework:springloaded:1.2.6.RELEASE'
    }
}

apply plugin: 'idea'

idea {
    module {
        inheritOutputDirs = false
        outputDir = file("$buildDir/classes/main/")
    }
}

// ...

該插件在筆者的 Java 8u121 版本中是會報異常,正在嘗試解決中。數據庫

目錄結構

- spring-boot-app
    - src
        - application
    - module
        - api    
            - controller
            - logic
            - graphql
        - shared
            - entity
            - util
        - model
            - rds
            - kv
        - service
    - addon
        - weixin

各個模塊之間獨立可測試,模塊間儘可能顯式依賴;不過這些模塊並不是強制分組,對於初期應用也能夠選擇不進行分模塊,所有代碼寫在根應用中。模塊之間的依賴關係以下:npm

共享模塊

實體類

實體類推薦使用 Lombok 進行實時封裝。Lombok主要依賴編譯時代碼生成技術,幫你自動生成基於模板的經常使用的 Java 代碼,譬如最多見的 Getter 與 Setter 。以前動態的插入 Getter 與 Setter 主要有兩種,一個是像 Intellij 與 Eclipse 這樣在開發時動態插入,缺點是這樣雖然不用你手動寫,可是仍是會讓你的代碼異常的冗長。另外一種是經過相似於 Spring 這樣基於註解的在運行時利用反射動態添加,不過這樣的缺陷是會影響性能,而且有必定侷限性。筆者目前用的開發環境是 Intellij+Gradle,這裏只介紹下這種搭建方式,其餘的基於 Eclipse 或者 Maven 的能夠到官網主頁查看。
(1)在 Intellij 中添加 Plugin編程

  • Go to File > Settings > Pluginssegmentfault

  • Click on Browse repositories...

  • Search for Lombok Plugin

  • Click on Install plugin

  • Restart Android Studio

(2)容許註解處理

  • Settings -> Compiler -> Annotation Processors

(3)Gradle中添加依賴(默認已經添加)

compile "org.projectlombok:lombok:1.12.6"

數據接口

接口風格

接口推薦使用 RESTful 與 ActionBased 風格的接口,對於複雜查詢能夠考慮使用 GraphQL 風格的查詢語言進行二次封裝。不過在應用服務器自己應該儘量地提供原子化的接口,特別是在快速迭代的產品開發中,在需求穩定以前後臺應該儘量地提供細粒度的接口讓前端自由封裝。能夠參考 來自於PayPal的RESTful API標準Google API Design Guide 等。

邏輯與反作用分離

筆者特地設置了 logic 包,應將業務邏輯抽象爲純函數的方式放置到 logic 包中,方便測試與複用。

數據持久化

項目中計劃使用 Mybatis 做爲半自動的數據持久化工具,使用 Mybatis Generator 做爲代碼自動生成工具。

微服務

HTTPS 與負載均衡

推薦是全部的對外開放的接口所有使用 HTTPS 鏈接,可是不建議直接在應用服務器上添加 HTTPS 證書和支持;可使用 Nginx/Caddy 這樣的 Web 服務器進行反向代理與負載均衡操做,更多信息參考 清新脫俗的 Web 服務器 CaddyNginx 基本配置備忘

服務狀態監聽

項目中使用了 actuator-service 監聽服務運行狀態,須要在依賴中添加 compile("org.springframework.boot:spring-boot-starter-actuator"),而後在配置文件中指定監聽地址:

management.port=8082
management.address=127.0.0.1

在應用啓動後,訪問 /health 便可以獲取到系統當前信息:

{
    status: "UP",
    diskSpace: {
        status: "UP",
        total: 249804890112,
        free: 27797606400,
        threshold: 10485760
        }
}

測試

單元測試

單元測試的目標是某個單獨類或者函數的功能,應該儘量地經過 Mock 等技術隔離測試環境,譬如咱們要測試某個接口:

@RunWith(SpringRunner.class)
@WebMvcTest(IndexController.class)
public class IndexControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void greetingShouldReturnMessageFromService() throws Exception {
        this.mockMvc.perform(get("/")).andDo(print()).andExpect(status().isOk())
                .andExpect(content().string(containsString("Hello Mock")));
    }

}

集成測試

在集成測試中咱們須要儘可能模擬真實環境,測試多個模塊間的互動;譬如在單元測試中咱們會 Mock 數據庫鏈接、外部服務等,可是在集成測試中咱們的測試目標仍然是單元功能點,可是會測試其在真實環境下的多模塊耦合的功能表現。

端到端測試

端到端測試相對而言屬於黑盒測試,咱們每每對部署在生產環境下的應用服務測試其可用性與邏輯準確性。

擴展

/addon 目錄下存放的是某些可複用的業務擴展代碼,典型的譬如微信後臺,包括微信登陸、微信支付等經常使用功能;開發者可使用 -a 選項來選擇初始化時須要的擴展模板,默認是所有擴展都會被添加進來。

  • 微信:個人微信SDK,包括公衆平臺管理、微信支付等各個版本。老實說,微信的文檔並非很友好,坑很多啊~~ 筆者在這裏準備的算是半自動化的。參考 這裏 查看具體的功能描述與代碼說明

Roadmap

筆者擬計劃將來添加如下特性:

  • 繼續完成經常使用功能

  • 相似於 Rails 的代碼自動生成

  • 嵌入的常見 Java 調試工具

歡迎你們提出建議、需求與 PR

相關文章
相關標籤/搜索