前言
在以往传统的企业系统架构中,我们针对一个复杂的业务需求通常使用对象或者业务类型来构建一个单体项目。在业务发展初期,由于所有的业务逻辑在一个应用中,开发、测试、部署都还比较容易且方便。但是随着企业的发展,系统为了应对不同的业务需求会不断的为该单体项目增加不同的业务模块,不断扩大的需求会使得单体应用变得越来越臃肿。单体应用的问题就逐渐凸显出来,由于所有业务功能都在一个单体应用中,往往改动一个很小的功能,就要重新部署上线,可能还会影响其他功能,这个时候维护成本就变得越来越大,并且变得越来越难以控制。
为了解决单体应用变得越来越臃肿的问题,这时候微服务诞生了。简单地说,微服务是系统架构上的一种设计风格,他的主旨是将一个原本独立的系统拆分成多个小型服务,这些小型服务都在各自独立的进程中运行,互不干扰,服务之间通过基于HTTP的Restful API进行通信协作。每个小型服务都是原单体应用中耦合度较高的业务模块,并且每个服务都维护着自身的数据存储、业务开发、测试以及独立部署等。下面我们一步一步来创建一个Spring Boot基础项目,并且实现一个简单的RESTful API,通过这个例子对Spring Boot有一个初步的了解,体验Spring Boot的简单、自动化配置、开发迅速等特性。
项目构建
项目版本要求
-
Java 8
-
IDEA 2019.2.4
-
Spring Boot 2.2.1
-
Gradle 5.6.4
我们通过IDEA来初始化构建一个SpringBoot工程 打开IDEA File --> New --> Project,选择Spring Initializr
然后点击next
在这里配置好Group、Artifact,Type选择Gradle Project
然后点击next
接下来是选择依赖,Spring Boot版本选择2.2.1
由于我们是一个简单的Spring Boot工程,所以我们只选择了以下依赖
- Spring Boot DevTools:开发相关
- Lombok:通过注解形式来简化java代码
- Spring Web:web开发模块
然后点击下一步
设置工程名称和工程目录,点击Finish完成
这样我们就创建了一个用户中心的项目,我们这里的项目名称为 dd-user项目目录结构如下
Gradle配置文件解析
打开项目工程目录下的build.gradle文件
plugins {
# springboot版本
id 'org.springframework.boot' version '2.2.1.RELEASE'
id 'io.spring.dependency-management' version '1.0.8.RELEASE'
id 'java'
}
group = 'com.cdd'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
configurations {
developmentOnly
runtimeClasspath {
extendsFrom developmentOnly
}
compileOnly {
extendsFrom annotationProcessor
}
}
# Maven仓库
repositories {
mavenCentral()
}
# 项目依赖
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
annotationProcessor 'org.projectlombok:lombok'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
}
test {
useJUnitPlatform()
}
实现RESTful API
在Spring Boot中创建一个RESTful API很简单,同SpringMVC一样,只是不需要像SpringMVC那样要做很多配置,废话不多说,上代码新建controller包,命名为com.cdd.user.controller,在该包下新建类UserController, 写入如下代码
package com.cdd.user.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/user")
public class UserController {
@RequestMapping("/hello")
public String hello(){
return "Hello coder的自我修养";
}
}
现在让我们启动该应用
或者在DdUserApplication类中直接run
出现如下界面,说明项目启动成功
下面我们在浏览器中访问或者在Postman中访问
http://localhost:8080/user/hello
到此我们就成功构建了一个简单的SpringBoot应用,项目虽然简单,但是所有的复杂应用都是在此基础上一步一步构建出来的。
配置说明
在上面的项目中,我们除了Gradle配置文件中有一些配置外,没有引入其他任何配置,因为Spring Boot针对日常的开发场景提供了一系列的自动化配置类来减少原本复杂而又几乎很少改动的模板化配置内容。下面我们就来讲解一下如何更改SpringBoot的默认配置。 Spring Boot的默认配置文件路径为 src/main/resources/application.properties,项目构建完成后会为我们自动生成该文件。下面我们来更改一下Spring Boot的默认配置,以更改端口号为例,在application.properties中填入以下配置
server.port=8081
重新启动后访问
http://localhost:8081/user/hello
出现如下结果
application 是 Springboot 的默认配置文件名,后缀可以是 .properties 或者 .yml, .yml 文件是树状层次结构文本,能够使配置一目了然,更加清晰。
当两者同时存在时,.yml 的优先级小于 .properties。下面我们新建 application.yml,并写入以下配置
server:
port: 8082
让我们在重新启动,控制台打出的端口还是8081
多环境配置
软件开发中经常有开发环境、测试环境、预发布环境、生产环境,而且一般这些环境配置会各不相同,手动改配置麻烦且容易出错,如何管理不同环境的配置参数呢?SpringBoot支持通过命令来启动不同的环境,但是配置文件要满足 application-{profile}.yml 或 application-{profile}.properties,profile代表环境标识,我们可以通过修改 spring.profiles.active 来达到多环境的目的。下面我们以开发环境和生成环境为例来进行多环境配置。在 src/main/resources 目录下新建 application-dev.properties和 application-prod.properties配置文件,分别写开发环境和生成环境的端口配置。application-dev.properties
server.port=8081
application-prod.properties
server.port=8082
修改 application.properties
spring.profiles.active=dev
让我们重新启动项目可以看到如下日志
image
同理修改 application.properties
spring.profiles.active=prod
可以看到如下日志
我们不仅可以更改Spring Boot的默认配置,还可以自定义日志,我们在application-dev.properties中加入我们的自定义配置,如下
dd.username=coder的自我修养
dd.password=123456
新建com.cdd.user.models包,并新建User类如下
package com.cdd.user.models;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
@Data
@Component
public class User {
@Value("${dd.username}")
private String username;
@Value("${dd.password}")
private String password;
}
修改UserController,如下
package com.cdd.user.controller;
import com.cdd.user.models.User;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
@RequestMapping("/user")
public class UserController {
@Resource
private User user;
@RequestMapping("/hello")
public User hello(){
return user;
}
}
由上图可以看到,我们的自定义配置已经生效。