利用 create-spring-boot-app 快速建立 Spring Boot 應用 從屬於筆者的 服務端應用程序開發與系統架構。最近一段時間我司業務快速擴展,針對不一樣的項目分割了不少代碼庫,爲了方便新同事學習與快速使用 Spring Boot 項目,順手將以前的模板整合爲 create-spring-boot-app,跟筆者以前的 create-react-boilerplate 都是屬於腳手架系列。
更多編程語言、服務端開發方面的知識圖譜參考 2016: 個人技術體系結構圖、探究高可用服務端架構的優秀資料索引、追求技術之上的進階閱讀學習索引 、 機器學習、深度學習與天然語言處理領域推薦的書籍列表。html
若是你還沒有安裝 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 > Plugins
segmentfault
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 證書和支持;可使用 Nginx/Caddy 這樣的 Web 服務器進行反向代理與負載均衡操做,更多信息參考 清新脫俗的 Web 服務器 Caddy 、Nginx 基本配置備忘。
項目中使用了 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,包括公衆平臺管理、微信支付等各個版本。老實說,微信的文檔並非很友好,坑很多啊~~ 筆者在這裏準備的算是半自動化的。參考 這裏 查看具體的功能描述與代碼說明
筆者擬計劃將來添加如下特性:
繼續完成經常使用功能
相似於 Rails 的代碼自動生成
嵌入的常見 Java 調試工具
歡迎你們提出建議、需求與 PR