为了账号安全,请及时绑定邮箱和手机立即绑定

Springboot单体架构搭建教程

标签:
SpringBoot
概述

本文将详细介绍如何使用Spring Boot搭建单体架构,包括环境搭建、项目创建、设计单体架构和添加基础功能模块等步骤。文章通过示例代码和配置文件详解,帮助读者快速掌握Spring Boot单体架构的搭建方法。通过本文的学习,开发者可以轻松创建和部署一个独立的、生产级别的Spring Boot应用。本文涵盖了从环境配置到项目运行的全过程。

引入Spring Boot框架
Spring Boot简介

Spring Boot是由Pivotal团队提供的全新框架,其目标是简化新Spring应用的初始搭建以及开发过程。使用Spring Boot,开发者只需一个项目即可快速搭建一个独立的、生产级别的应用。Spring Boot通过基于约定优于配置的方式,尽可能减少开发人员的配置工作量,同时提供了一套完整的开发、测试、运行以及部署方案。

主要特性

  • 自动配置:根据项目依赖自动配置Spring和其他框架。
  • 起步依赖:只需一个依赖就可以引入很多需要的库和配置。
  • 嵌入式服务器:内嵌Tomcat、Jetty或Undertow。
  • 生产就绪功能:包括Metrics、健康检查、外部配置等。
  • 无代码生成和XML配置
  • 支持开发人员工具:如自动重启、Spring Loaded等。

特点

  • 简化了Spring应用的初始化配置。
  • 提供了大量开箱即用的功能配置。
  • 提供了一组starter依赖,简化了依赖管理。
  • 可以快速创建独立的、生产级别的应用。
  • 提供了应用监控、安全等生产级功能。
  • 支持热部署和快速启动。

优势

  • 简化开发:减少了重复配置的工作。
  • 提高开发效率:使用起步依赖可以快速搭建项目。
  • 减少配置错误:默认配置减少配置错误的概率。
  • 支持多种开发环境:适应多种开发环境,如开发、测试、生产环境。
  • 支持多种数据库和缓存:支持多种数据库、缓存、消息队列等。
  • 支持多种主流开发工具:支持多种IDE和构建工具。
安装Java开发环境

安装JDK

安装Java开发工具包(JDK)是开发Spring Boot应用的前提条件。

  1. 访问Oracle官网或其他可信的Java官方网站下载JDK。
  2. 安装JDK,确保安装完成后设置环境变量。

    • JDK安装

      # 下载JDK安装包
      wget https://download.java.net/java/GA/jdk11/13/GPL/openjdk-11.0.1_linux-x64_bin.tar.gz
      
      # 解压安装包
      tar -xzf openjdk-11.0.1_linux-x64_bin.tar.gz
      
      # 移动到指定目录
      mv jdk-11.0.1 /usr/lib/jvm/
      
      # 设置环境变量
      export JAVA_HOME=/usr/lib/jvm/jdk-11.0.1
      export PATH=$JAVA_HOME/bin:$PATH

安装IDE

推荐使用Spring Initializr支持的IDE,如IntelliJ IDEA或Eclipse。

  1. 访问Spring Initializr官网,选择合适的IDE插件,如IntelliJ IDEA。
  2. 安装插件后,重启IDE。
  3. 使用Spring Initializr创建新的Spring Boot项目。

配置开发环境

  • IntelliJ IDEA配置
    1. 打开IntelliJ IDEA。
    2. 选择File -> New -> Project,选择Spring Initializr
    3. 输入项目相关信息(如项目名称、语言、依赖等),点击Finish按钮。
    4. 完成项目创建后,选择File -> Settings -> Build, Execution, Deployment -> Compiler,确保Compiler选项已启用。
  • Eclipse配置
    1. 打开Eclipse。
    2. 选择File -> New -> Spring Initializr Project
    3. 输入项目相关信息(如项目名称、语言、依赖等),点击Finish按钮。
    4. 完成项目创建后,选择Window -> Preferences,确保Build Automatically选项已启用。
创建第一个Spring Boot项目

使用Spring Initializr创建项目

  1. 访问Spring Initializr官网,选择合适的构建工具(如Maven或Gradle)。
  2. 选择项目语言(如Java)和项目依赖(如Web、JPA、Thymeleaf等)。
  3. 输入项目基本信息(如项目名称、包名等)。
  4. 点击Generate下载项目压缩包。
  5. 解压项目压缩包,导入IDE中。

示例代码

以下是一个简单的Spring Boot应用示例,包含一个控制器类和主启动类。

控制器类

package com.example.demo.controller;

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, Spring Boot!";
    }
}

主启动类

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);
    }
}

运行项目

  1. 在IDE中运行DemoApplication类的main方法。
  2. 打开浏览器,访问http://localhost:8080/hello,显示"Hello, Spring Boot!"。
设计单体架构

什么是单体架构

单体架构是一种传统的企业级应用架构,将应用的所有功能模块组合在一个共同的部署单元中。所有模块共享同一个代码库、同一个数据库连接、同一个应用服务器。

单体架构的特点与优势

  • 易于开发:单体架构的代码库容易理解,便于开发和维护。
  • 易于部署:部署时只需复制整个应用,通常无需考虑微服务之间的复杂依赖关系。
  • 易于扩展:通过增加服务器资源如CPU、内存等快速扩展,无需考虑服务间的通信。
  • 易于测试:可以使用传统的方法进行测试,如单元测试和集成测试。
  • 易于调试:所有组件都在同一个进程内,调试时可以轻松地进行断点设置和变量查看。

单体架构的缺点

  • 部署和升级复杂:部署和升级整个应用时可能需要停机,影响生产环境。
  • 扩展性较差:整个应用必须同时扩展,即使是小部分功能需要扩展,也需要完整地部署整个应用。
  • 代码库庞大:随着应用规模的扩大,代码库变得庞大,降低开发和维护的效率。
  • 技术栈固化:一旦选择了某种技术栈,很难更改或替换,限制了技术选型的灵活性。
  • 性能瓶颈:整个应用共享资源,一旦性能瓶颈出现,可能影响所有功能的性能。

如何在Spring Boot中实现单体架构

在Spring Boot中实现单体架构,通常涉及以下几个步骤:

  1. 定义项目结构:将不同功能模块放在不同的包中,如controller、service、repository等。
  2. 添加依赖:根据功能模块添加相应的依赖,如JPA、MyBatis等。
  3. 设计数据模型:定义实体类,映射数据库表结构。
  4. 实现业务逻辑:编写业务逻辑处理代码。
  5. 创建API接口:设计RESTful API接口,实现数据的增删改查。

示例代码

以下是一个简单的Spring Boot项目结构示例,包含Controller、Service、Repository三个模块。

Controller模块

package com.example.demo.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    @GetMapping("/users")
    public String getUsers() {
        return "List of users";
    }
}

Service模块

package com.example.demo.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    public String getUsers() {
        return userRepository.findAll().toString();
    }
}

Repository模块

package com.example.demo.repository;

import com.example.demo.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}

添加依赖

pom.xml文件中添加相关依赖,如JPA、MyBatis等。

<dependencies>
    <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>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>
添加基础功能模块

数据访问层:使用JPA或MyBatis进行数据库操作

数据访问层是Spring Boot应用中最常见的模块之一,用于实现与数据库的交互。Spring Boot支持多种持久化框架,如JPA、MyBatis等。

使用JPA进行数据库操作

JPA是Java Persistence API的简称,是一种标准的数据持久化API,提供了统一的数据操作接口。Spring Boot对JPA提供了良好的支持,除了标准的CRUD操作,还可以使用JPA的查询语言(JPQL)和注解进行复杂的查询。

示例代码

  1. 配置数据源
    application.properties文件中配置数据库连接信息。

    spring.datasource.url=jdbc:mysql://localhost:3306/test
    spring.datasource.username=root
    spring.datasource.password=root
    spring.jpa.hibernate.ddl-auto=update
  2. 定义实体类
    实体类用于映射数据库表结构。

    package com.example.demo.entity;
    
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    
    @Entity
    public class User {
    
       @Id
       @GeneratedValue(strategy=GenerationType.IDENTITY)
       private Long id;
       private String name;
       private String email;
    
       // getters and setters
    }
  3. 定义Repository接口
    使用Spring Data JPA提供的JpaRepository接口,可以快速实现基本的CRUD操作。

    package com.example.demo.repository;
    
    import com.example.demo.entity.User;
    import org.springframework.data.jpa.repository.JpaRepository;
    
    public interface UserRepository extends JpaRepository<User, Long> {
    }
  4. 使用Repository接口
    在Service层中使用Repository接口进行数据库操作。

    package com.example.demo.service;
    
    import com.example.demo.entity.User;
    import com.example.demo.repository.UserRepository;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import java.util.List;
    
    @Service
    public class UserService {
    
       @Autowired
       private UserRepository userRepository;
    
       public List<User> getAllUsers() {
           return userRepository.findAll();
       }
    }

业务逻辑层:添加业务逻辑处理

业务逻辑层是Spring Boot应用的核心,用于实现应用的业务逻辑。业务逻辑层通常包含Service类和对应的接口定义。

示例代码

  1. 定义Service接口

    package com.example.demo.service;
    
    import com.example.demo.entity.User;
    import java.util.List;
    
    public interface UserService {
       List<User> getAllUsers();
    }
  2. 实现Service接口

    package com.example.demo.service.impl;
    
    import com.example.demo.entity.User;
    import com.example.demo.repository.UserRepository;
    import com.example.demo.service.UserService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import java.util.List;
    
    @Service
    public class UserServiceImpl implements UserService {
    
       @Autowired
       private UserRepository userRepository;
    
       @Override
       public List<User> getAllUsers() {
           return userRepository.findAll();
       }
    }

控制层:创建RESTful API接口

控制层是Spring Boot应用的入口点,用于处理HTTP请求并调用业务逻辑层的方法。控制层通常包含Controller类,用于提供RESTful API接口。

示例代码

  1. 定义Controller类

    package com.example.demo.controller;
    
    import com.example.demo.entity.User;
    import com.example.demo.service.UserService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.util.List;
    
    @RestController
    @RequestMapping("/users")
    public class UserController {
    
       @Autowired
       private UserService userService;
    
       @GetMapping
       public List<User> getAllUsers() {
           return userService.getAllUsers();
       }
    }
  2. 在主启动类中启用Spring MVC

    package com.example.demo;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.web.servlet.config.annotation.EnableWebMvc;
    
    @SpringBootApplication
    @EnableWebMvc
    public class DemoApplication {
    
       public static void main(String[] args) {
           SpringApplication.run(DemoApplication.class, args);
       }
    }
配置文件详解

application.properties和application.yml文件介绍

application.propertiesapplication.yml是Spring Boot应用中的配置文件,用于设置应用的各种属性。这两个文件可以放在类路径的根目录下,也可以放在src/main/resources目录下。

application.properties文件

application.properties文件使用键值对的形式进行配置,键和值之间用等号=隔开。

# 数据源配置
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=root

# JPA配置
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect

# 其他配置
server.port=8080

application.yml文件

application.yml文件使用缩进和冒号:的形式进行配置,比application.properties更简洁。

spring:
  datasource:
   url: jdbc:mysql://localhost:3306/test
   username: root
   password: root
jpa:
   hibernate:
      ddl-auto: update
      show-sql: true
      dialect: org.hibernate.dialect.MySQL5Dialect
server:
   port: 8080

常用配置项说明

数据源配置

  • spring.datasource.url:数据库连接URL。
  • spring.datasource.username:数据库用户名。
  • spring.datasource.password:数据库密码。
  • spring.datasource.driver-class-name:数据库驱动类名。
  • spring.datasource.initialization-mode:是否初始化数据源。

JPA配置

  • spring.jpa.hibernate.ddl-auto:数据库模式生成策略。
  • spring.jpa.properties.hibernate.dialect:Hibernate方言。
  • spring.jpa.show-sql:是否显示SQL语句。
  • spring.jpa.hibernate.use-new-id-generator-mappings:是否使用新的主键生成策略。
  • spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation:是否使用非上下文创建LOB。

其他配置

  • server.port:应用端口号。
  • spring.profiles.active:激活的配置文件名称。
  • spring.application.name:应用名称。
  • logging.level:日志级别。
  • spring.mvc.view.prefix:视图前缀。
  • spring.mvc.view.suffix:视图后缀。
  • spring.datasource.tomcat.max-active:Tomcat数据源最大连接数。
  • spring.datasource.tomcat.max-wait:Tomcat数据源最大等待时间。

调试与日志配置

日志配置

Spring Boot使用SLF4J作为日志框架,并默认集成了Logback。可以通过修改logback-spring.xmllogback.xml文件进行日志配置。

日志级别配置

application.propertiesapplication.yml文件中设置日志级别,如DEBUGINFOWARNERROR等。

# application.properties
logging.level.root=INFO
logging.level.org.springframework.web=DEBUG
logging.level.com.example.demo=TRACE
# application.yml
logging:
   level:
      root: INFO
      org.springframework.web: DEBUG
      com.example.demo: TRACE

文件日志配置

可以通过配置logback-spring.xmllogback.xml文件,设置日志输出到文件。

<configuration>
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>logs/app.log</file>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} - %msg%n</pattern>
        </encoder>
    </appender>
    <root level="info">
        <appender-ref ref="FILE" />
    </root>
</configuration>

示例代码

  1. 修改application.properties文件

    # 数据源配置
    spring.datasource.url=jdbc:mysql://localhost:3306/test
    spring.datasource.username=root
    spring.datasource.password=root
    
    # JPA配置
    spring.jpa.hibernate.ddl-auto=update
    spring.jpa.show-sql=true
    spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
    
    # 其他配置
    server.port=8080
    
    # 日志配置
    logging.level.root=INFO
    logging.level.org.springframework.web=DEBUG
    logging.level.com.example.demo=TRACE
  2. 修改logback-spring.xml文件
    <configuration>
       <appender name="FILE" class="ch.qos.logback.core.FileAppender">
           <file>logs/app.log</file>
           <encoder>
               <pattern>%d{yyyy-MM-dd HH:mm:ss} - %msg%n</pattern>
           </encoder>
       </appender>
       <root level="info">
           <appender-ref ref="FILE" />
       </root>
    </configuration>
运行与测试

运行Spring Boot应用

运行Spring Boot应用通常通过IDE中的main方法启动,也可以通过命令行启动。

使用IDE运行

  1. 打开IDE,导入Spring Boot项目。
  2. 右键点击主启动类,选择RunDebug

使用命令行运行

  1. 打开终端,进入项目目录。
  2. 运行mvn spring-boot:rungradle bootRun命令启动应用。

使用Postman进行API测试

Postman是一款流行的API测试工具,可以用来测试Spring Boot应用的API接口。

示例代码

  1. 打开Postman,创建一个新的GET请求。
  2. 设置请求URL为http://localhost:8080/users
  3. 发送请求,查看返回的用户列表。

单元测试与集成测试简介

单元测试

单元测试是对应用中的最小可测试单元(如函数、方法)进行测试。Spring Boot使用JUnit和Mockito进行单元测试。

package com.example.demo.test;

import com.example.demo.repository.UserRepository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;

import java.util.List;

import static org.junit.jupiter.api.Assertions.assertEquals;

@DataJpaTest
public class UserRepositoryTest {

    @Autowired
    private UserRepository userRepository;

    @Test
    public void testFindAll() {
        List<User> users = userRepository.findAll();
        assertEquals(0, users.size());
    }
}

集成测试

集成测试是对应用中的多个组件进行测试。Spring Boot使用Spring Boot Test和Spring Boot Test Starter进行集成测试。

package com.example.demo.test;

import com.example.demo.entity.User;
import com.example.demo.repository.UserRepository;
import com.example.demo.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;

import java.util.List;

import static org.junit.jupiter.api.Assertions.assertEquals;

@SpringBootTest
@ActiveProfiles("test")
public class UserServiceTest {

    @Autowired
    private UserService userService;

    @Autowired
    private UserRepository userRepository;

    @Test
    public void testGetAllUsers() {
        User user = new User();
        user.setName("Test User");
        user.setEmail("test@example.com");
        userRepository.save(user);

        List<User> users = userService.getAllUsers();
        assertEquals(1, users.size());
    }
}
打包与部署

打包Spring Boot应用

Spring Boot提供了多种打包方式,如使用Maven或Gradle进行打包。

使用Maven打包

mvn clean package

这将生成一个target目录下的可执行jar文件。

使用Gradle打包

./gradlew bootJar

这将生成一个build/libs目录下的可执行jar文件。

部署到本地或云服务器

部署Spring Boot应用到服务器通常涉及以下几个步骤:

  1. 上传jar文件:将打包好的jar文件上传到服务器。
  2. 设置运行环境:确保服务器上安装了Java运行环境。
  3. 运行jar文件:使用java -jar命令启动jar文件。

示例代码

  1. 上传jar文件

    scp target/myapp.jar user@server:/home/user/
  2. 设置运行环境
    确保服务器上安装了Java运行环境。

    java -version
  3. 运行jar文件
    java -jar myapp.jar

环境变量配置

在服务器上设置环境变量,如设置JAVA_OPTS环境变量。

export JAVA_OPTS="-Xms512m -Xmx1024m"

示例代码

  1. 设置环境变量

    export JAVA_OPTS="-Xms512m -Xmx1024m"
  2. 运行jar文件
    java -jar -Dspring.profiles.active=prod myapp.jar

以上是Spring Boot单体架构搭建教程的详细步骤。希望这些步骤和示例代码能帮助你快速搭建并运行一个Spring Boot应用。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消