手记

Springboot微服务学习:从零开始的入门教程

概述

本文介绍了Spring Boot微服务学习的基础知识,包括Spring Boot框架的概述、核心概念以及快速搭建Spring Boot项目的步骤。文章还详细讲解了通过Spring Boot实现微服务的方法,并提供了构建简单微服务的实战案例。

Spring Boot简介

Spring Boot是什么

Spring Boot 是一个基于 Spring 框架的开源框架,旨在简化新 Spring 应用的初始搭建以及开发过程。它通过约定优于配置的原则,极大地减少了开发者在配置 Spring 应用时的复杂度。借助 Spring Boot,开发者可以迅速创建独立的、生产级别的基于 Spring 的应用。

Spring Boot的优势

  1. 快速开发:Spring Boot 提供了一系列开箱即用的特性,使得开发者能够快速搭建应用,无需编写大量的配置代码。
  2. 自动配置:Spring Boot 可以自动配置很多常见的场景,比如数据库连接、缓存、日志等。
  3. 嵌入式容器:支持 Tomcat、Jetty、Undertow 等主流的 Web 容器,使得应用可以以独立的可执行 JAR 文件的形式运行。
  4. 生产就绪:Spring Boot 提供了许多与生产环境相关的功能,如健康检查、性能监控等。
  5. 无代码生成:与 Spring 的传统做法不同,Spring Boot 不需要 XML 配置,提倡使用注解来简化配置过程。

Spring Boot的核心概念

  • Spring Boot Starter:Spring Boot Starter 是 Spring Boot 提供的一系列依赖管理的集合,可以大大简化项目依赖的配置。例如,spring-boot-starter-web 包含了创建 Web 应用所需的核心依赖。
  • 自动配置:Spring Boot 通过自动配置来简化配置过程,如使用 @SpringBootApplication 注解可以自动配置很多内容,包括组件扫描、自动配置上下文等。
  • Actuator:Spring Boot Actuator 提供了生产就绪的功能,如健康指标、信息暴露和审计等。
  • Spring Boot CLI:提供了一个命令行工具,可以用来快速创建和运行 Spring Boot 应用。
环境搭建

开发环境的选择

为了开始学习 Spring Boot,你需要选择合适的开发环境。以下是推荐的开发环境配置:

  1. JDK:建议安装 JDK 8 及以上版本。
  2. IDE:推荐使用 IntelliJ IDEA 或 Eclipse,这些 IDE 支持 Spring Boot 的特性,提供了丰富的工具支持。
  3. Spring Boot CLI:可选,但有助于快速创建 Spring Boot 项目。
  4. Maven 或 Gradle:推荐使用 Maven 或 Gradle 作为构建工具。

快速搭建Spring Boot项目

使用 Spring Initializr 快速搭建 Spring Boot 项目是最快捷的方式。Spring Initializr 提供了一个在线工具,帮助开发者快速生成项目结构。以下是操作步骤:

  1. 访问 Spring Initializr
  2. 选择项目的基本信息,如项目名、语言(Java)、依赖等。
  3. 生成项目并下载压缩包。
  4. 解压压缩包,使用 IDE 打开项目。

管理依赖与版本

Spring Boot 使用 Maven 或 Gradle 来管理项目的依赖和版本。以下是一个 Maven 的 pom.xml 示例:

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <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>
        </plugins>
    </build>
</project>

这个 pom.xml 文件定义了项目的依赖和打包信息。其中,<parent> 标签指定了 Spring Boot 的父 POM,确保了版本的一致性。<dependencies> 标签则列出了项目依赖,这里只添加了 spring-boot-starter-web 依赖,用于创建 Web 应用。

HelloWorld应用

创建第一个Spring Boot应用

创建一个名为 HelloWorldApplication 的 Spring Boot 应用,代码如下:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
public class HelloWorldApplication {

    public static void main(String[] args) {
        SpringApplication.run(HelloWorldApplication.class, args);
    }

    @RestController
    public class HelloWorldController {
        @GetMapping("/")
        public String hello() {
            return "Hello, World!";
        }
    }
}

在上面的代码中,@SpringBootApplication 注解包含了 @Configuration@EnableAutoConfiguration@ComponentScan 三个重要的注解,简化了应用的配置。HelloWorldController 类使用了 @RestController 注解,表示该类中的方法都将返回 JSON 格式的响应。hello 方法通过 @GetMapping("/") 注解,监听根路径的 GET 请求,并返回 "Hello, World!"。

运行和调试应用

要运行和调试上面创建的 Spring Boot 应用,可以使用以下几种方式:

  1. IDE 调试:在 IntelliJ IDEA 或 Eclipse 中,直接在 main 方法处添加断点并运行。
  2. 命令行运行:在项目根目录下,使用以下命令运行:
mvn spring-boot:run
  1. 打包并运行:可以将应用打包成可执行的 JAR 文件,然后在命令行运行:
mvn clean package
java -jar target/demo-0.0.1-SNAPSHOT.jar

项目结构解析

Spring Boot 项目的基本结构如下:

src
├── main
│   ├── java
│   │   └── com
│   │       └── example
│   │           └── demo
│   │               └── HelloWorldApplication.java
│   ├── resources
│   │   ├── application.properties
│   │   └── logback-spring.xml
├── test
│   └── java
│       └── com
│           └── example
│               └── demo
│                   └── HelloWorldApplicationTests.java
  • src/main/java:存放 Java 源代码。
  • src/main/resources:存放资源文件,如配置文件 application.properties 和日志配置文件 logback-spring.xml
  • src/test/java:存放测试代码,如单元测试。
Spring Boot微服务基础

微服务的概念

微服务是一种架构风格,通过将一个应用拆分成多个小的、独立的服务来实现应用的模块化。每个服务都在自己的进程中运行,有自己的业务逻辑和数据存储。微服务架构有以下特点:

  1. 服务松耦合:微服务之间通过轻量级的通信机制进行交互。
  2. 服务独立部署:每个服务都可以独立部署和扩展,便于开发和运维。
  3. 技术栈多样化:每个服务可以使用不同的语言和技术栈。
  4. 每个服务都是一个独立的进程:每个服务运行在独立的进程中,互相之间不会相互影响。

Spring Boot实现微服务的方法

Spring Boot 提供了多种工具和框架来支持微服务架构,以下是一些常用的手段:

  1. Spring Cloud:Spring Cloud 是一套基于 Spring Boot 的微服务框架,提供了服务注册与发现、配置中心、服务网关、断路器等核心组件。
  2. Spring Boot Actuator:提供了生产环境中需要的监控和管理功能。
  3. Spring Boot Starter:提供了多种 Starter 依赖来快速搭建微服务应用。

服务发现与注册

服务发现是微服务架构中的一个关键环节,它允许服务在发现并调用其他服务时自动获取其他服务的地址。Spring Cloud 提供了 Eureka 实现服务发现与注册。以下是一个简单的 Eureka 示例:

  1. 添加依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
  1. 配置 Eureka 服务端
server:
  port: 8761

spring:
 application:
 name: eureka-service

eureka:
 client:
   register-with-eureka: false
   fetch-registry: false
 server:
   enable-self-preservation: false
  1. 启动服务

在服务端应用中,添加 @EnableEurekaServer 注解:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class, args);
    }
}

实战案例:构建简单的微服务

设计一个简单的微服务

假设我们要构建一个简单的用户管理系统,包含用户信息的增删改查操作。我们先设计一个简单的数据库表结构:

CREATE TABLE user (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50),
    email VARCHAR(100)
);

接着,我们可以设计一个简单的服务结构,包括用户服务(User Service)和用户接口(User Interface),使用 Spring Boot 和 Spring Data JPA 进行开发。

实现服务的拆分和组合

首先,创建用户服务模块,配置数据库连接和 Spring Data JPA:

  1. 添加依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>
  1. 配置数据库连接
spring:
  datasource:
  url: jdbc:h2:mem:testdb
  driverClassName: org.h2.Driver
  username: sa
  password:
 jpa:
  hibernate:
    ddl-auto: update
  1. 创建 User 实体类
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String name;
    private String email;

    // getters and setters
    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public String getEmail() { return email; }
    public void setEmail(String email) { this.email = email; }
}
  1. 创建 UserRepository 接口
import org.springframework.data.jpa.repository.JpaRepository;
import com.example.demo.User;

public interface UserRepository extends JpaRepository<User, Long> {
}
  1. 创建 UserController 控制器
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/users")
public class UserController {

    @Autowired
    private UserRepository userRepository;

    @GetMapping
    public List<User> getAllUsers() {
        return userRepository.findAll();
    }

    @PostMapping
    public User createUser(@RequestBody User user) {
        return userRepository.save(user);
    }

    @GetMapping("/{id}")
    public User getUserById(@PathVariable Long id) {
        return userRepository.findById(id).orElse(null);
    }

    @PutMapping("/{id}")
    public User updateUser(@PathVariable Long id, @RequestBody User user) {
        user.setId(id);
        return userRepository.save(user);
    }

    @DeleteMapping("/{id}")
    public void deleteUser(@PathVariable Long id) {
        userRepository.deleteById(id);
    }
}

测试微服务的运行

要测试上面创建的服务,可以通过 Postman 或者直接使用浏览器进行请求。以下是几个示例请求:

  1. 创建用户
{
    "name": "John Doe",
    "email": "john.doe@example.com"
}
  1. 获取所有用户
GET http://localhost:8080/users
  1. 获取单个用户
GET http://localhost:8080/users/{id}
  1. 更新用户
{
    "name": "Jane Doe",
    "email": "jane.doe@example.com"
}
  1. 删除用户
DELETE http://localhost:8080/users/{id}
深入理解与进阶

Spring Boot配置管理

Spring Boot 提供了多种配置管理的方式,包括 application.propertiesapplication.yml,可以覆盖默认配置。配置文件放在 src/main/resources 目录下。以下是一些常见的配置属性:

  • 服务器配置

    server:
    port: 8080
    contextPath: /api
  • 数据源配置

    datasource:
    url: jdbc:mysql://localhost:3306/mydb
    driverClassName: com.mysql.jdbc.Driver
    username: root
    password: root
  • JPA 配置

    spring:
    jpa:
      hibernate:
        ddl-auto: update
      show-sql: true

日志管理和监控

Spring Boot 提供了内置的日志管理和监控工具,如 Spring Boot ActuatorSpring Boot Admin

  1. Spring Boot Actuator

    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

    默认情况下,Actuator 提供了多个健康检查端点(如 /actuator/health),可以用来监控应用的运行状态。

  2. Spring Boot Admin

    Spring Boot Admin 是一个用来管理 Spring Boot 应用的 Web 应用,提供了更多的监控和管理功能,如应用列表、日志查看、JMX 管理等。

安全与部署

  • Spring Security:Spring Security 提供了强大的安全功能,可以用来保护 Spring Boot 应用的安全。以下是一个简单的 Spring Security 配置示例:

    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
    import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
    import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
    
    @Configuration
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
      @Override
      protected void configure(HttpSecurity http) throws Exception {
          http
              .authorizeRequests()
                  .antMatchers("/", "/home").permitAll()
                  .anyRequest().authenticated()
              .and()
                  .formLogin()
                  .loginPage("/login")
                  .permitAll()
              .and()
                  .logout()
                  .permitAll();
      }
    
      @Bean
      public BCryptPasswordEncoder passwordEncoder() {
          return new BCryptPasswordEncoder();
      }
    }
  • 部署:Spring Boot 应用可以打包成可执行的 JAR 文件,然后在任何支持 Java 的环境中运行。推荐使用 Docker 来进行部署,可以简化部署过程并提供一致的运行环境。

    1. 创建 Dockerfile
    FROM openjdk:8-jdk-alpine
    VOLUME /tmp
    ADD target/demo-0.0.1-SNAPSHOT.jar app.jar
    ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
    1. 构建 Docker 镜像
    docker build -t my-spring-boot-app .
    1. 运行 Docker 容器
    docker run -p 8080:8080 my-spring-boot-app
0人推荐
随时随地看视频
慕课网APP