上一节,spring boot实战系列1——从hello world开始,我们其实已经用实例说明了用spring boot编写微服务的过程。这一节,我们对spring boot构建微服务进一步解析,以期让伙伴们更加深入了解具体细节。
1.什么是微服务及微服务架构
微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被独立部署,各个微服务之间是松耦合的。每个微服务仅关注于完成一件任务并很好地完成该任务。在所有情况下,每个任务代表着一个小的业务能力。
对微服务还不太了解的伙伴们,建议先看看我们公众号中另一篇文章:简单聊聊微服务,而我们这个系列主要是实战。
2.创建springboot微服务应用
我们可以有多种方式创建springboot微服务应用,在STS开发工具中,有多种插件给予支持,下面说说下各种方式的优劣。
(1)使用Spring Initializr
这是我们spring boot实战系列1中的内容,伙伴们可以去回顾一下从hello world开始。
(2)使用buildship插件
在STS中,File-->New-->Other-->Gradle-->Gradle Project,如图:
之后的过程就不赘述了,都很简单。需要说明的是,使用buildship插件新建的工程,有几个缺点:
1)生成的文件结构不够完善,需要调整
2)生成的build.gradle构建文件不够完善,需要调整
3)没法在创建工程时选择所需要的组件依赖
4)在项目创建时,点击finish后就需要下载构建文件中的依赖,速度比较慢。
具体内容就不截图了,大家可以尝试一下,所以一般不会使用种方式新建工程。
(3)使用gradle(STS)插件
在STS中,File-->New-->Other-->Gradle-->Gradle Project,如图:
next后,填写项目名称,在sample project中选择Java Quickstart,finish。
使用gradle(sts)插件新建项目,缺点同buildship。如需要安装gradle(STS)插件,按如下方法:
help-->Eclipse Marketplace,搜索STS,安装Spring Tool Suit
(4)使用Spring Starter Project
spring starter向导,原理同(1)的spring initializr的创建过程,而我们可以直接在IDE中跟创建其他项目一样进行新建。如图:
在type中我们可以选择Maven或者gradle
注:STS的3.8.x版本,spring starter project对buildship插件不支持,请升级为3.9.0版本以上,下载地址:https://spring.io/tools,当前最新版本为3.9.2。
next之后,我们可选择所需要的组件:
next之后finish,或直接finish。
此种方式的缺点是
1)在项目创建时,点击finish后就需要下载构建文件中的依赖,速度比较慢
2)gradle(STS)的gradle tasks插件面板不能分组gradle task,如图:
相比较下,buileship插件的gradle tasks插件面板更加整洁,如图:
综上,我个人的习惯是使用第(1)种方式,生成项目后导入IDE,然后使用buildship的gradle tasks插件面板构建。不过,这只是相对于在IDE中的使用习惯问题而已了,如果使用gradle命令行构建,或者集成自动构建等,则不在此讨论。
当然,我们还有一种更好的方式,看下面第(5)种:
(5)搭建自己的Spring Initializr服务器
以上,我们均是使用了spring提供的服务器,如果在没有联网的情况下,是不是就只能拷贝旧项目进行修改以新建项目了呢?可不可以搭建自己的Spring Initializr服务器呢,答案当然是可以的。后面,我们会出一篇关于如何搭建自己的Spring Initializr服务器的文章,这里先剧透一下,到时单独开篇。
3.spring boot微服务应用浅析
(1)简单说说gradle与build.gradle
gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置。
gradle可以说结合了ant与maven两者的优点,gradle能很方便地实现自定义构建逻辑,还有更强大的依赖管理,更重要的是,gradle集成了其他构建工具,比如ant和maven,使得原来的项目很容易迁徙到Gradle。
gradle的构建脚本是build.gradle,需要说明的是:
buildscript中的声明是gradle脚本本身需要使用的资源,比如依赖项、maven仓库等。build.gradle文件中声明的依赖项、仓库地址等是项目需要的资源。
使用gradle的war插件可以将应用打包成war包,部署到web容器中运行。war插件继承自java,如果指定了war插件的话,即可以不用再声明java插件。
当修改了构建脚本,比如增加了依赖,需要右键项目或者构建文件,选择Gradle-->Refresh Gradle Project,对项目进行刷新。
(2)代码结构
如图,这是STS下gradle构建java项目的标准目录结构:
src/main/java----项目源码
src/main/resources----资源文件
src/test/java----测试代码
build----项目输出路径(如果Project Explorer视图下不可风,可切换到或Navigator视图或资源管理器下查看)
gradle文件夹下文件与gradlew构建脚本,允许没有安装gradle的机器进行gradle构建,进行build时会自动下载gradle-wrapper.properties配置的特定版本。gradlew用于unix,greadlew.bat用于window,使用方法 : gradlew + 命令,比如:gradlew biuld
(3)代码说明
1)入口类说明
DemoApplication.class是此应用程序入口类,用@SpringBootApplication进行了注解,鼠标移动到此注解上,可看到如下图的源码,包含了多个注解,最主要的是红框中的3个。
@SpringBootConfiguration----表示类为配置类,此类一般不提供业务功能,所以在此案例中,我们把hello服务移动到了Controller类下。
@EnableAutoConfiguration----自动配置,这也是spring boot的核心功能。spring boot能快速高效编写应用程序,就是依赖这个功能。比如我们引入web模块依赖,spring boot自动帮我们配置web项目相关内容如web.xml等,不需要我们再进行配置了。
@ComponentScan----自动扫描配置,默认会扫描当前包和所有子包。所以项目的其他类一般位于入口类所在包或子包之下,比如下面提到的Controller类。
2)Controller类说明
Controller类,我们一般放置于启动类的controller子包中,比如此项目中的DemoController.class类。不然,就算我们使用了@Controller注解,也无法自动将此类注册为SpringMVC的Controller对象。
在spring boot中,我们用@RestController对Controller类进行注解,此注解包含了@Controller与@ResponseBody注解,如下图,这样当我们需要使用@ResponseBody返回特定格式数据比如json时就只一个注解就可以了。
4.restful接口测试工具推荐
spring boot非常方便让我们实现基于restful接口的微服务,推荐伙伴们使用postman进行restful接口测试。使用非常的方便、简单、强大,不需要多作介绍。下载地址:https://www.getpostman.com/
本项目github地址:
https://github.com/exframework/springboot-demo
参考资料:
(1)https://projects.spring.io/spring-boot/
(2)https://gradle.org/
领取专属 10元无门槛券
私享最新 技术干货