从“Hello World”到部署上线:我的60分钟Spring Boot实战上手

半夜部署日记
2025-06-16 15:43
阅读 284

大家好,我是后端开发工程师小林。今天想和大家分享一次我刚接触Spring Boot时的真实经历。那还是我刚换工作不久的时候,公司有个紧急的内部项目需要快速搭建一套后台服务。领导给了我一个任务:用最快的时间把项目跑起来,功能虽然简单,但要能快速部署上线,并且保证可扩展性。

我之前做过一些Java Web开发,但主要是传统的SSM(Spring + Spring MVC + MyBatis),那种XML配置一大堆、动不动就出错的日子我还记忆犹新。现在公司推荐使用Spring Boot来构建微服务,我也正好趁这个机会好好学一学。

结果这一学,真香了。

初识Spring Boot:为什么选择它?

初识Spring Boot:为什么选择它?

说实话,第一次看到Spring Boot官方文档的时候,我还是有点懵的。不过当我按照教程一步步跑通第一个“Hello World”之后,顿时觉得——这东西简直太爽了!

传统的Spring项目光是配置数据库连接、事务管理、Servlet容器就已经够让人头疼了,而Spring Boot通过“约定优于配置”的方式,自动帮我们完成了大量的初始化配置,甚至内嵌了Tomcat等Web服务器,只需要几行代码就能启动一个完整的Web服务。

更重要的是,它的生态非常丰富,整合各种常用框架几乎像搭积木一样简单。比如MySQL、Redis、RabbitMQ、Elasticsearch、Spring Security等等,都有成熟的starter支持。你可以快速地进行扩展和集成。

我当时心里只有一个念头:这次我要把Spring Boot真正用起来。

项目背景:一个企业内部的数据接口平台

项目背景:一个企业内部的数据接口平台

当时我们部门要做一个小型的数据查询接口平台,用于提供给其他系统的同事调用,主要功能包括:

  • 用户登录认证
  • 查询某个数据表的元信息
  • 支持按条件分页查询数据记录
  • 提供简单的监控接口

整体架构不需要特别复杂,但要保证基本的稳定性和一定的性能。考虑到后续可能会接入多个微服务模块,所以一开始就打算用Spring Boot来打底。

第一步:创建项目

第一步:创建项目

开始前,我先在浏览器打开了 Spring Initializr —— 这个网站是我后来无数次用到的神器。

选好了以下几个依赖:

  • Spring Web:用来构建RESTful API
  • Spring Data JPA:方便做数据库CRUD操作
  • MySQL Driver:连接MySQL数据库
  • Spring Boot DevTools:提升开发效率的热部署工具
  • Spring Security:处理用户认证
  • Lombok:减少冗余代码

然后点击Generate,下载下来的ZIP包解压后就是一个标准的Spring Boot项目结构。导入IDEA或者Eclipse都可以直接运行,超级方便。

Project Structure:
│
├── src
│   ├── main
│   │   ├── java
│   │   └── resources
│   └── test
└── pom.xml

遇到的第一个挑战:数据库连接失败

遇到的第一个挑战:数据库连接失败

项目导入成功后,接下来就是配置数据库。我在application.properties中添加了如下内容:

spring.datasource.url=jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

但是运行启动类时却报错:

java.net.ConnectException: Connection refused

一开始我以为是数据库没启动,后来查了很久才发现是我的数据库配置写的url有问题,MySQL版本升级之后驱动也变了。于是我换成com.mysql.cj.jdbc.Driver,并且在URL里补上了时区参数。

最终修改后的配置如下:

spring.datasource.url=jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

经验总结: 不同版本的MySQL JDBC驱动对URL格式要求不同,一定要确认清楚是否包含时区设置、SSL是否开启等。

开始写业务逻辑:简单接口快速实现

首先我搭建了一个简单的UserController,用来验证接口是否能正常访问。

@RestController
@RequestMapping("/api/user")
public class UserController {

    @GetMapping("/hello")
    public String hello() {
        return "Hello, Spring Boot!";
    }
}

运行起来后,在浏览器访问 /api/user/hello,果然输出了“Hello, Spring Boot!”。那一刻,有种久违的成就感。

接着就开始整合JPA做数据持久层。为了简化实体类的操作,我用了Lombok库的注解:

@Entity
@Data // 自动生成getter/setter/toString等方法
@NoArgsConstructor
@AllArgsConstructor
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String username;
    private String password;
}

然后写一个继承JpaRepository的接口即可:

public interface UserRepository extends JpaRepository<User, Long> {
    User findByUsername(String username);
}

整个DAO层就这样完成了!

接口设计与安全性:引入Spring Security

因为系统涉及用户登录功能,所以我决定引入Spring Security来做权限控制。

最开始我只是实现了最基本的内存方式登录,后面计划接入JWT做Token鉴权。

在SecurityConfig中添加了基础的配置:

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .anyRequest().authenticated()
            .and()
            .httpBasic();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
            .withUser("admin").password("{noop}123456").roles("USER");
    }
}

这段代码的意思是:所有请求都需要经过认证,否则返回401;同时启用Basic认证方式。

测试的时候可以通过Postman带上用户名和密码来访问受保护的接口。效果还不错。

不过这套机制在生产环境显然不够安全,后面我把它替换成了JWT令牌机制,这里就不展开讲了。

踩坑现场回顾:跨域问题怎么破?

开发前端的同学联调接口时遇到一个问题:

No 'Access-Control-Allow-Origin' header present on the requested resource.

这明显是CORS的问题。

Spring Boot当然有办法解决。我尝试在Controller加@CrossOrigin注解,发现只能局部生效。于是最终决定在全局配置一个CorsFilter。

@Configuration
public class CorsConfig {

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/api/**")
                    .allowedOrigins("*")
                    .allowedMethods("GET", "POST", "PUT", "DELETE")
                    .allowedHeaders("*")
                    .exposedHeaders("Authorization");
            }
        };
    }
}

这样所有以/api开头的路径都允许跨域访问,并且支持常见的请求方式和头信息。

如果你用的是Spring Boot 2.4以上,也可以通过配置文件直接启用CORS,比如:

spring:
  mvc:
    cors:
      allowed-origins: "*"
      allowed-methods: GET, POST, PUT, DELETE

但我建议还是结合实际项目情况灵活调整,不要一股脑放开所有权限。

生产部署:别忘了这些细节

本地调试OK之后,就要准备部署上线了。

我是在腾讯云买了台CentOS服务器,安装了Java环境和MySQL,然后上传jar包运行。

几点注意事项:

1. 使用外部Tomcat or 内嵌?

我们选择了默认的内嵌Tomcat方式打包成fat jar运行。好处是部署简单,坏处是如果需要定制Tomcat配置会比较麻烦。如果你需要深度优化Tomcat性能,比如线程池、连接数限制等,可以考虑自定义。

2. 修改数据库配置

将application.properties中的本地数据库地址改成线上MySQL服务器IP,还有用户名和密码也要更新。

spring.datasource.url=jdbc:mysql://your-production-db:3306/db_name?...

3. 启动脚本优化

编写了一个简单的shell脚本来启动jar包:

#!/bin/bash

APP_NAME=myapp.jar
JVM_OPTS="-Xms512m -Xmx1g"

if [ ! -f "$APP_NAME" ]; then
    echo "找不到 $APP_NAME 文件,请检查路径或文件是否存在"
    exit 1
fi

nohup java $JVM_OPTS -jar $APP_NAME > app.log 2>&1 &
echo "应用已启动,日志写入 app.log"

加上执行权限后就可以通过命令一键启动了。

4. 日志和异常监控

为了排查问题,我们在application.properties中开启了日志记录:

logging.level.root=INFO
logging.file.name=logs/app.log

还可以接入ELK套件做集中式日志收集,不过刚开始阶段没有必要太复杂。

效果与收益:高效上线+持续扩展能力

不到一天时间,我们就完成了项目的原型开发并成功部署上线。前后端同学配合流畅,接口响应速度也很快。

更棒的是,当我们后期想要加入新的模块时,Spring Boot的结构让我们可以轻松新增Controller、Service和Entity类,整个项目扩展性非常好。

举个例子,后来我们要加一个定时任务统计访问日志。只需添加一个@Scheduled注解的方法,就能实现每天凌晨自动执行的任务。

@Component
public class LogScheduler {

    @Scheduled(cron = "0 0 0 * * ?") // 每天0点执行
    public void dailyLogStat() {
        // 做日志统计逻辑...
    }
}

这样的便利,真是传统Spring项目难以企及的。

我的经验总结:新手如何快速上手Spring Boot

回顾这段经历,我想给正在学习Spring Boot的新手们几个实用建议:

✅ 1. 从真实需求出发练手

不要上来就背Spring Boot的原理或者API列表,而是找一个具体的项目目标去实践。比如做一个博客系统、一个图书管理系统或者用户注册登录功能。

✅ 2. 多用Starter,少造轮子

Spring Boot社区提供的各种Starter能帮你省下大量时间。尽量避免自己去手动配置一堆依赖,除非真的有必要。

✅ 3. 学会看日志和错误提示

Spring Boot的日志输出非常详细,遇到问题时第一反应不是百度Stack Overflow,而是仔细看看控制台有没有红字错误说明,很多时候答案就在里面。

✅ 4. 熟悉常见注解的作用

@RestController@RequestMapping@Entity@Service@Component这些注解要烂熟于心。它们是Spring Boot的核心构成单元。

✅ 5. 适当了解Spring Boot底层原理

虽然Spring Boot封装得很好,但了解一些核心机制,比如自动装配原理、Conditional条件加载、Starters的工作机制等,对排查复杂问题帮助很大。

✅ 6. 实践运维部署流程

真正的工程师不仅写得了代码,还得懂部署、看日志、修Bug。建议你至少跑一遍从打包到Linux部署的全过程,哪怕只是用虚拟机练习。

写在最后:技术的价值在于落地

Spring Boot只是一个工具,它本身并不能替我们思考业务问题。但一个好的工具可以大大提升我们的开发效率,让我们有更多精力去思考架构设计、业务逻辑和用户体验。

在我后来参与的各种项目中,无论是单体服务、分布式微服务,还是Serverless架构,Spring Boot的身影都无处不在。可以说,掌握它已经成为现代Java开发者的一项基本素养。

希望这篇文章能够帮到正在学习Spring Boot的你。如果在过程中有什么疑问,欢迎留言交流。一起进步吧!


如有兴趣深入学习Spring Boot进阶知识(如多数据源、缓存、OAuth2、Spring Cloud等),我也很乐意继续分享。

评论 0

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝