利用 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