Spring Boot 微服务学习入门涵盖了从快速搭建项目到微服务架构的应用,详细介绍了Spring Boot的核心功能和微服务的实现方法,帮助开发者快速掌握Spring Boot微服务开发。
Spring Boot简介 Spring Boot是什么Spring Boot 是由 Pivotal 团队提供的框架,用于简化新Spring应用的初始搭建及开发过程。Spring Boot使开发者以最少的配置快速构建独立运行的应用程序。它基于Spring框架增加了自动配置的支持,简化了配置过程,使得开发任务更加高效。
Spring Boot的优势- 快速启动:Spring Boot提供大量的默认配置,让开发者能够快速启动应用,减少繁琐的配置工作。
- 自包含:Spring Boot可以打包为独立的jar或war文件,通过
java -jar
命令直接运行,无需部署到应用服务器上。 - 自动配置:Spring Boot可以自动配置Spring应用,使得配置过程更加简单。
- 依赖管理:Spring Boot提供一系列
Starter
依赖管理,简化了依赖的引入和管理过程。 - 内置Web服务器:Spring Boot内置了Web服务器(如Tomcat、Jetty或Undertow),可以直接运行在开发环境中。
- 健康检查:Spring Boot Actuator提供健康检查功能,帮助开发者监控应用的运行状态。
- 无代码生成:Spring Boot不需要XML配置,所有配置文件都是通过Java或YAML文件进行。
- Web应用开发:Spring Boot可用于开发各种Web应用,如RESTful API、静态文件服务等。
- 微服务架构:Spring Boot与Spring Cloud结合,可以实现微服务架构,支持服务发现、负载均衡、配置中心等功能。
- 命令行应用:Spring Boot可用于开发命令行工具,提供丰富的命令行功能。
- 测试工具:Spring Boot提供了一套完整的测试框架,可以用于单元测试、集成测试等。
- 数据访问:Spring Boot支持各种数据库操作,如关系型数据库(如MySQL、PostgreSQL)和非关系型数据库(如MongoDB)。
创建Spring Boot项目的方法包括通过Spring Initializr在线创建、使用IDE(IntelliJ IDEA、Eclipse)创建以及使用命令行工具创建。
使用Spring Initializr在线创建
Spring Initializr是一个在线工具,用于快速创建Spring Boot项目。访问Spring Initializr网站(https://start.spring.io/),选择项目类型、语言、依赖等,点击"Generate"按钮,下载项目压缩包,解压后导入到IDE中进行开发。
使用IDE创建
使用IntelliJ IDEA创建
- 打开 IntelliJ IDEA,选择 "File" -> "New" -> "Project"。
- 在弹出的窗口中选择 "Spring Initializr",点击 "Next"。
- 输入项目名称、项目位置等信息,选择语言(Java或Kotlin)、Spring Boot版本。
- 添加依赖(如Web、JPA、Thymeleaf等),点击 "Finish" 按钮完成项目的创建。
使用Eclipse创建
- 打开 Eclipse,选择 "File" -> "New" -> "Spring Starter Project"。
- 输入项目名称、项目位置等信息,选择Spring Boot版本。
- 添加依赖(如Web、JPA、Thymeleaf等),点击 "Finish" 按钮完成项目的创建。
使用命令行工具创建
- 安装Maven或Gradle。
- 打开命令行工具,创建一个新的目录,并进入该目录。
- 使用Maven或Gradle创建新的项目。
使用Maven创建
mvn archetype:generate -DgroupId=com.example -DartifactId=springboot-demo -Dversion=0.0.1-SNAPSHOT -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
- 修改
pom.xml
文件,添加Spring Boot依赖。<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.4.RELEASE</version> </parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</build>
5. 执行`mvn spring-boot:run`命令启动项目。
#### 使用Gradle创建
```shell
gradle init --type java-application --dsl groovy
- 修改
build.gradle
文件,添加Spring Boot依赖。plugins { id 'org.springframework.boot' version '2.3.4.RELEASE' id 'io.spring.dependency-management' version '1.0.9.RELEASE' id 'java' }
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
}
5. 执行`gradle bootRun`命令启动项目。
## 初始化项目的基本步骤
1. 创建项目目录结构,如`src/main/java`和`src/main/resources`。
2. 创建`Application.java`文件,作为项目的启动类。
```java
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
- 创建
application.properties
或application.yml
文件,用于配置项目的属性。# application.properties server.port=8080 spring.application.name=demo-app
# application.yml server: port: 8080 spring: application: name: demo-app
- 创建
Controller
类,用于定义RESTful接口。package com.example.demo;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "Hello, World!";
}
}
5. 运行`DemoApplication`类,启动项目。
# Spring Boot核心概念
## Spring Boot自动配置
Spring Boot自动配置是Spring Boot的核心功能之一。它根据配置文件中的属性,自动配置Spring应用。自动配置通常发生在项目启动时,根据不同的属性值,Spring Boot会自动配置不同的Bean。
### 自动配置的实现原理
Spring Boot自动配置的实现原理是通过`@Conditional`注解来控制Bean的创建。这些注解可以根据不同的属性值控制Bean的创建。例如,`@ConditionalOnClass`注解可以根据类是否存在来控制Bean的创建,`@ConditionalOnProperty`注解可以根据属性值来控制Bean的创建。
### 自动配置的配置过程
1. Spring Boot提供大量的`AutoConfiguration`类,这些类定义了自动配置的逻辑。
2. 在项目启动时,Spring Boot会扫描这些`AutoConfiguration`类。
3. 根据配置文件中的属性,Spring Boot会调用`@Conditional`注解,控制Bean的创建。
4. 如果满足条件,Spring Boot会创建相应的Bean。
### 自动配置的禁用
可以通过`@SpringBootApplication`注解的`exclude`属性来禁用自动配置。例如,可以禁用`DataSourceAutoConfiguration`类的自动配置。
```java
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
Spring Boot Starter依赖管理
Spring Boot Starter是Spring Boot的依赖管理工具,用于简化依赖的引入和管理过程。Spring Boot Starter提供了一系列的依赖管理,使得开发者能够以最少的配置完成依赖的引入和管理。
Spring Boot Starter的工作原理
Spring Boot Starter的工作原理是将一组常用的依赖打包成一个jar文件。开发者只需要引入这个jar文件,就可以引入这组依赖。
Spring Boot Starter的使用方法
- 引入Spring Boot Starter依赖。例如,可以引入
spring-boot-starter-web
依赖来引入Spring Web依赖。<!-- pom.xml --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
- 使用Spring Boot Starter依赖。例如,可以使用
@RestController
注解来定义RESTful接口。package com.example.demo;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "Hello, World!";
}
}
## Spring Boot Actuator监控工具
Spring Boot Actuator是Spring Boot的监控工具,提供了健康检查、审计、信息、端点等特性。
### Actuator的功能
1. **健康检查**:提供`/actuator/health`端点,用于检查应用的健康状态。
2. **审计**:提供`/actuator/auditevents`端点,用于审计应用的审计事件。
3. **信息**:提供`/actuator/info`端点,用于获取应用的信息。
4. **端点**:提供`/actuator/metrics`端点,用于获取应用的指标。
### Actuator的配置
1. 引入`spring-boot-starter-actuator`依赖。
```xml
<!-- pom.xml -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
- 配置Actuator的端点。例如,可以配置
management.endpoints.web.exposure.include
属性来控制哪些端点可以被访问。# application.properties management.endpoints.web.exposure.include=health,info
- 访问Actuator的端点。例如,可以访问
/actuator/health
和/actuator/info
端点来获取应用的健康状态和信息。curl http://localhost:8080/actuator/health curl http://localhost:8080/actuator/info
微服务是一种架构风格,将一个单一的应用程序拆分成一组小型、独立的微服务,每个微服务运行在自己的进程中,彼此之间通过轻量级的通信协议进行通信。微服务强调独立部署、独立扩展、独立开发、独立维护。
微服务的优势
- 独立部署:每个微服务都可以独立部署,降低了部署的复杂性。
- 独立扩展:每个微服务都可以独立扩展,提高了系统的可伸缩性。
- 独立开发:每个微服务都可以独立开发,提高了开发的效率。
- 独立维护:每个微服务都可以独立维护,降低了维护的复杂性。
- 服务重用:微服务可以重用,降低了代码的冗余。
微服务的劣势
- 开发复杂:微服务的开发需要更多的工具支持,增加了开发的复杂性。
- 部署复杂:微服务的部署需要更多的工具支持,增加了部署的复杂性。
- 维护复杂:微服务的维护需要更多的工具支持,增加了维护的复杂性。
- 服务间通信复杂:微服务之间需要通过通信协议进行通信,增加了服务间通信的复杂性。
微服务的概念实例
一个微服务应用可以分为多个独立的服务,每个服务负责不同的业务逻辑。例如,一个用户服务可以处理用户的注册、登录和信息更新等功能,另一个订单服务可以处理订单的创建、更新和取消等功能。
使用Spring Boot创建RESTful服务创建RESTful服务的基本步骤
- 引入
spring-boot-starter-web
依赖。<!-- pom.xml --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
- 创建
Controller
类,用于定义RESTful接口。package com.example.demo;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "Hello, World!";
}
}
3. 运行`DemoApplication`类,启动项目。
### RESTful服务的配置
1. 配置启动端口。
```properties
# application.properties
server.port=8080
- 配置应用名称。
# application.properties spring.application.name=demo-app
- 配置服务路径。
@GetMapping("/api/hello") public String hello() { return "Hello, World!"; }
配置文件的使用
Spring Boot支持多种配置文件,如application.properties
、application.yml
、application-{profile}.properties
、application-{profile}.yml
等。可以通过spring.profiles.active
属性来激活不同的配置文件。
配置文件的示例
# application.properties
server.port=8080
spring.application.name=demo-app
# application.yml
server:
port: 8080
spring:
application:
name: demo-app
# application-dev.properties
server.port=8081
spring.application.name=demo-dev-app
# application-dev.yml
server:
port: 8081
spring:
application:
name: demo-dev-app
配置文件的激活
可以通过spring.profiles.active
属性来激活不同的配置文件。例如,可以在命令行中使用--spring.profiles.active=dev
参数来激活application-dev.properties
配置文件。
java -jar -Dspring.profiles.active=dev demo-app.jar
微服务间的通信
服务发现与注册
服务发现与注册是微服务架构中的一个重要环节,用于实现服务之间的发现与注册。服务发现与注册可以实现服务之间的动态发现与注册,提高了系统的可伸缩性。
服务发现与注册的实现方式
- 服务注册:服务注册是将服务注册到注册中心。注册中心可以是Eureka、Consul、Zookeeper等。
- 服务发现:服务发现是服务通过注册中心来发现其他服务。服务发现通常使用Service Registry(服务注册中心)来实现。
- 服务调用:服务调用是服务通过发现的服务来调用服务。服务调用通常使用服务调用者来实现。
服务发现与注册的示例
使用Eureka实现服务发现与注册
- 引入
spring-cloud-starter-netflix-eureka-server
和spring-cloud-starter-netflix-eureka-client
依赖。<!-- pom.xml --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
- 配置Eureka服务注册中心。
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
3. 配置Eureka服务注册中心。
```properties
# application.properties
server.port=8761
spring.application.name=eureka-server
eureka.instance.hostname=localhost
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
- 配置Eureka服务注册。
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
}
}
5. 配置Eureka服务注册。
```properties
# application.properties
server.port=8080
spring.application.name=service-provider
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
使用Spring Cloud Config进行配置管理
Spring Cloud Config是Spring Cloud的配置中心,用于实现配置管理。Spring Cloud Config提供了集中化的配置管理,可以实现配置的动态更新。
Config Server的配置
- 引入
spring-cloud-starter-config
依赖。<!-- pom.xml --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency>
- 配置Config Server。
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
3. 配置Config Server。
```properties
# application.properties
server.port=8888
spring.application.name=config-server
spring.cloud.config.server.git.uri=https://github.com/username/repo
spring.cloud.config.server.git.clone-uri=https://github.com/username/repo
Config Client的配置
- 引入
spring-cloud-starter-config
依赖。<!-- pom.xml --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency>
- 配置Config Client。
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ConfigClientApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigClientApplication.class, args);
}
}
3. 配置Config Client。
```properties
# bootstrap.properties
spring.application.name=service-provider
spring.cloud.config.uri=http://localhost:8888
实现服务间的调用(Feign、RestTemplate)
使用Feign实现服务调用
- 引入
spring-cloud-starter-openfeign
依赖。<!-- pom.xml --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
- 配置Feign客户端。
package com.example.demo;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
@FeignClient("service-provider")
public interface ServiceClient {
@GetMapping("/api/hello")
String hello();
}
### 使用RestTemplate实现服务调用
1. 引入`spring-boot-starter-web`依赖。
```xml
<!-- pom.xml -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
- 配置RestTemplate。
package com.example.demo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
public class DemoApplication {
@Autowired
private RestTemplateBuilder builder;
@Bean
public RestTemplate restTemplate() {
return builder.build();
}
}
3. 使用RestTemplate实现服务调用。
```java
package com.example.demo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class HelloController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/hello")
public String hello() {
return restTemplate.getForObject("http://localhost:8080/api/hello", String.class);
}
}
部署与运行Spring Boot微服务
打包Spring Boot应用
打包方式
Spring Boot支持两种打包方式,分别是jar
和war
。jar
打包方式适用于独立运行的应用程序,war
打包方式适用于部署到应用服务器的应用程序。
打包步骤
- 使用Maven或Gradle打包。
使用Maven打包
mvn clean package
- 打包后的
jar
文件位于target
目录下。
使用Gradle打包
./gradlew bootJar
- 打包后的
jar
文件位于build/libs
目录下。
打包示例
# Maven打包
mvn clean package
# Gradle打包
./gradlew bootJar
在本地或云平台上部署微服务
在本地部署
- 启动本地应用服务器。
java -jar target/demo-app.jar
- 访问服务。
curl http://localhost:8080/api/hello
在云平台上部署
- 将打包后的
jar
文件上传到云平台。 - 在云平台上启动应用。
- 访问服务。
Docker容器化微服务的步骤
- 创建Dockerfile。
# Dockerfile FROM openjdk:11-jre-slim COPY target/demo-app.jar /app/demo-app.jar ENTRYPOINT ["java", "-jar", "/app/demo-app.jar"]
- 构建Docker镜像。
docker build -t demo-app:latest .
- 运行Docker容器。
docker run -p 8080:8080 demo-app:latest
Docker容器化微服务的示例
# Dockerfile
FROM openjdk:11-jre-slim
COPY target/demo-app.jar /app/demo-app.jar
ENTRYPOINT ["java", "-jar", "/app/demo-app.jar"]
# 构建Docker镜像
docker build -t demo-app:latest .
# 运行Docker容器
docker run -p 8080:8080 demo-app:latest
通过以上操作,Spring Boot微服务可以被快速搭建、开发、部署和监控。微服务架构的优势也使得Spring Boot微服务更加灵活、可伸缩和可维护。