【Java开发】 Spring 11 :Spring Boot 配置 Web 运行参数并部署至服务器

news/2025/3/14 16:28:57/

Spring Boot 项目开发结束后的工作便是运维,简单来说需要配置 Web 运行参数和项目部署两大工作,本文将尽可能详细地给大家讲全!

目录

1 定制 Web 容器运行参数

1.1 运行参数介绍

1.2 项目搭建

① 通过 IDEA Spring Initializr 创建项目

② 添加 Spring Web 等依赖

③ 编写 controller 层的接口

④ 测试接口

1.2 定制运行参数

① 配置压缩支持 + 报错处理

② 报错处理

③ 压缩支持

2 将应用以 Jar 包形式部署至服务器

2.1 云服务器安装 JDK8

① 下载 linux 版本下的 jdk

② 上传至指定文件夹并解压

③ 配置环境变量

④ 验证

2.2 以 jar 包形式将 Spring Boot 项目部署到云服务器

① 添加maven依赖

② 通过 idea 打包项目

③ 项目上传到服务器

④ 在服务器运行 jar 文件

⑤ 云服务器防火墙设置

⑥ 浏览器访问

3 将应用以 Docker 镜像文件形式部署至服务器

3.1 Dockerfile 文件

① 新建 Dockerfile 文件

② 将 Dockerfile 文件上传至服务器

3.2 以  Dockerfile 文件形式将 Spring Boot 项目部署到云服务器 

① 将项目打包成 jar 并放到服务器

② 在当前目录下运行指令,构建镜像

③ 运行镜像并检验


项目源码:尹煜 / rundemo · GitCode

1 定制 Web 容器运行参数

1.1 运行参数介绍

Ⅰ 可选容器列表

其实 Spring Boot 不仅支持 Tomcat,还支持 jetty、undertow 等容器,本项目采用的是 Tomcat ,若要更换容器,需要将 spring-boot-starter-tomcat 从 Web 的 starter 里去掉,然后引入像 jetty 这样的 starter ~

  • spring-boot-starter-tomcat
  • spring-boot-starter-jetty
  • spring-boot-starter-undertow
  • spring-boot-starter-reactor-netty

Ⅱ 端口

  • server.port:指定端口号
  • server.address:指定地址

Ⅲ 压缩支持

  • server.compression.enabled=true:开启压缩支持
  • server.compression.min-response-size:设置最小需要压缩的大小 默认为2t
  • server.compression.mime-types:设置默认压缩的类型

Ⅳ Tomcat 特定配置

  • server.tomcat.max-connections=10000:最大连接数
  • server.tomcat.max-http-post-size=2MB:设置post参数字符串大小
  • server.tomcat.max-swallow-size=2MB:请求正文的最大大小
  • server.tomcat.max-threads=200:最大线程数量
  • server.tomcat.min-spare-threads=10:最小空闲线程数

Ⅴ 错误处理

  • server.error.path=/error:错误页地址
  • server.error.include-exception=false:是否在错误页面显示异常信息
  • server.error.include-stacktrace=never:是不是要打出 stacktrace(堆栈轨迹),在开发环境中可以打开 在产线上不要打开
  • server.error.whitelabel.enabled=true:是否开启默认的错误页面

Ⅵ 其他

  • server.use-forward-headers:设置一些头,通过头传递真实的来源ip
  • server.servlet.session.timeout:设置 session 的超时

Ⅶ 通过编程方式

通过WebServerFactoryCustomizer<T>做一些定制,在 1.3 可以看到

  • TomcatServletWebServerFactory
  • JettyServletWebServerFactory
  • UndertowServletWebServerFactory

1.2 项目搭建

由于只是用作演示 Web 容器运行和部署,因此本项目很简单,写了几个简单的接口,而且也不连接数据库,以下是项目搭建的流程。

① 通过 IDEA Spring Initializr 创建项目

② 添加 Spring Web 等依赖

③ 编写 controller 层的接口

由于项目不做数据库相关操作,所以直接编写接口~

路径:src/main/java/com/rundemo/controller/UserController.java

package com.rundemo.controller;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;@RestController
@RequestMapping("/run")
public class UserController {@RequestMapping("/visit/{userId}")public int allUser(@PathVariable("userId") int id) {return 2/id;}@RequestMapping("/demo")//模拟下实体内容返回public Map<String, String> queryUser() {Map<String, String> map = new HashMap<>();map.put("id","1");map.put("name","yinyu");map.put("status","ok");return map;}}

④ 测试接口

首先启动启动类 👇

然后用 Termimal 终端进行访问,直接用浏览器也可~

返回成功,还附带了很多其他信息,包括状态、请求头等 👇

1.2 定制运行参数

首先展示一下项目框架 👇,很清爽~

① 配置压缩支持 + 报错处理

本文以压缩支持和报错处理为例

路径:src/main/resources/application.properties

#压缩支持
server.compression.enabled=true
server.compression.min-response-size=512#报错处理
server.error.include-stacktrace = always
server.error.include-exception = true

路径:src/main/java/com/rundemo/RundemoApplication.java

package com.rundemo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.TimeZone;@SpringBootApplication
public class RundemoApplication  implements WebMvcConfigurer,WebServerFactoryCustomizer<TomcatServletWebServerFactory> {public static void main(String[] args) {SpringApplication.run(RundemoApplication.class, args);}@Override //压缩配置,在application.properties和启动类选择一个配置即可public void customize(TomcatServletWebServerFactory factory) {
//        Compression compression = new Compression(); //压缩的配置
//        compression.setEnabled(true);//开启压缩
//        compression.setMinResponseSize(DataSize.ofBytes(200));// 设置最小需要压缩的大小
//        factory.setCompression(compression);//将配置传入}@Beanpublic Jackson2ObjectMapperBuilderCustomizer jacksonBuilderCustomizer() {return builder ->builder.indentOutput(true).timeZone(TimeZone.getTimeZone("Asia/Shanghai"));}}

② 报错处理

首先启动项目的启动类,然后正常访问 /run/visit/1 接口,正确返回 👇

访问 /run/visit/0,此时预期会报错,因为分母无法为0,那么以下正确返回报错信息 👇,不过不建议在生产环境如下配置哈

③ 压缩支持

还是启动一下那个启动类,通过浏览器访问接口,打开 F12,切换到 NetWork 下,右键表头选择 Response Headers 下的Content-Encoding,如果开启了 Gzip,对应接口中的Content-Encoding中会有显示。

未压缩时:

压缩后,体积减小,Content-Encoding 也更新为 Gzip 👇

2 将应用以 Jar 包形式部署至服务器

部署springboot项目到云服务器的两种方式(jar+war)_倔强的Zero猪的博客-CSDN博客_springboot部署到服务器

如何将springboot项目打包成jar包并部署到服务器上_SHUKAI618的博客-CSDN博客

2.1 云服务器安装 JDK8

① 下载 linux 版本下的 jdk

网盘链接: jdk-8u171-linux-x64.tar.gz 网盘链接

② 上传至指定文件夹并解压

MobaXterm 中文版链接:MobaXterm中文版网盘链接

我通过 MobaXterm 工具将 jar 文件放到 home/java 目录下(也可根据需要使用rz命令、FileZilla工具等方式)

接下来就是切换到该目录下并解压👇

解压命令:tar -xvf jdk-8u171-linux-x64.tar.gz

再次查看该目录下的文件,红框内说明解压成功 👇

③ 配置环境变量

编辑文件命令:vi /etc/profile

在文件末尾加上 jdk 配置:

export JAVA_HOME=/home/java/jdk1.8.0_171   
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:
export PATH=${JAVA_HOME}/bin:$PATHi  1、进入编辑模式
esc 2、退出编辑模式 
:wq! 3、退出保存

编辑保存后 cat 查看该文件,末尾已加上 jdk 配置 👇

刷新配置文件,让配置生效:source /etc/profile

④ 验证

验证命令:java -version

2.2 以 jar 包形式将 Spring Boot 项目部署到云服务器

① 添加maven依赖

    <groupId>com</groupId><artifactId>rundemo</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging>

② 通过 idea 打包项目

在控制台中看到有如下输出则表示输出成功 👇

package 会将 Maven 工程打包成一个可执行的 jar 文件存放在 target 目录下

③ 项目上传到服务器

通过 MobaXterm 工具将 jar 文件 media/ 目录下

④ 在服务器运行 jar 文件

首先切换到 jar 文件所在目录

然后执行命令:java -jar rundemo.jar

⑤ 云服务器防火墙设置

由于我用的是腾讯云服务器,还需要开放 8080 端口~

⑥ 浏览器访问

注意和在本地电脑运行相比,只需将 ip 地址换成服务器的即可,端口号(默认8080)和路径名都是与本地一致,也可自行配置

访问返回成功 👇

报错也返回成功 👇

最后 ctrl +c 就结束进程了~

3 将应用以 Docker 镜像文件形式部署至服务器

目前将 SpringBoot 项目打包成 Docker 镜像主要有两种方案

  • 全自动化 :在项目的 pom文件/maven配置里配置好镜像仓库地址,并在项目配置Dockerfile文件,这样项目在idea中打包完成后可自动上传到镜像仓库,docker 直接启动该镜像就行了
  • 半自动化:将 SpringBoot 项目打包成普通的 jar 包,将该 jar 包上传至服务器,在同目录下创建一个 Dockerfile 文件,执行 docker build 命令,将这个 jar 包构建成一个 docker 镜像,然后就可以通过 docker 运行这个镜像了

一般来说半自动化较为普遍,本文采用第二种方式

3.1 Dockerfile 文件

Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,’#’ 为 Dockerfile 中的注释。

① 新建 Dockerfile 文件

Dockerfile 文件是文本文档,不需要后缀,目录依据在服务器的具体位置

# java8运行环境
FROM java  
# 作者名称
MAINTAINER yinyu# 切换工作目录
WORKDIR /media# 添加rundemo.jar文件到docker环境内
ADD rundemo.jar /media/rundemo.jar
# 暴露端口8080
EXPOSE 8080
# 运行命令
ENTRYPOINT ["java", "-server", "-Xms512m", "-Xmx512m", "-jar", "/media/rundemo.jar"]

② 将 Dockerfile 文件上传至服务器

3.2 以  Dockerfile 文件形式将 Spring Boot 项目部署到云服务器 

① 将项目打包成 jar 并放到服务器

步骤参考本文的2.2小节,是一样的

② 在当前目录下运行指令,构建镜像

后边一个“.”,代表当前路径

docker build -t rundemo:0.0.1 .

通过 docker images 命令,查看镜像已创建成功

③ 运行镜像并检验

docker run -p 8080:8080 -t rundemo:0.0.1

浏览器访问,只需将 ip 地址换成服务器的即可,端口号(默认8080)和路径名都是与本地一致,也可自行配置,访问成功 👇

此时需要 docker stop rundemo:0.0.1 命令来停止 Spring Boot 项目的运行~


参考文章

docker系列之打包spring boot 项目成docker镜像__shan123的博客-CSDN博客_springboot打包docker镜像

如何定制 Web 容器的运行参数_L# S@的博客-CSDN博客_怎么web设置容器运行参数

部署springboot项目到云服务器的两种方式(jar+war)


http://www.ppmy.cn/news/3888.html

相关文章

Json字符串转成对象

Json字符串转成对象 Hello吖&#x1f60a;&#xff0c;我是孤音&#xff08;一个你理解不了的程序猿&#xff09;&#xff0c;今天来分享一个小技巧&#xff0c;能够大大滴提高效率额 问题&#x1f635; 接收到一串JSON格式的字符串&#xff0c;需要获取其中某些字段的值 思路…

Python——字典

什么是字典&#xff1f; 有时候我们需要存储一组相关党得数据的时候&#xff0c;比如要存储一个人的信息&#xff0c;那么有user_name, age, birthday 等&#xff0c;如果这些信息都存储在列表中&#xff0c;比如[ user_name , age , birthday] 那么用起来可能不是很方便。比较…

功能测试进阶自动化测试,一个女测试工的坎坷之路

绝大多数测试工程师都是从功能测试做起的&#xff0c;工作忙忙碌碌&#xff0c;每天在各种业务需求学习和点点中度过&#xff0c;过了好多年发现自己还只是一个功能测试工程师。 随着移动互联网的发展&#xff0c;从业人员能力的整体进步&#xff0c;软件测试需要具备的能力要…

学习->C++篇十七:C++的类型转换和IO流

目录 一.类型转换 1.C语言中的类型转换 2.C中的类型转换 二.IO流 1. C语言的输入与输出 2. 流是什么 3. stringstream 一.类型转换 1.C语言中的类型转换 &#xff08;1&#xff09;隐式类型转换&#xff0c;编译阶段自动进行&#xff0c;不能转换就编译报错。&#xff…

【C语言数据结构(基础版)】第三站:链表(二)

目录 一、单链表的缺陷以及双向链表的引入 1.单链表的缺陷 2.双向链表的引入 3.八大链表结构 &#xff08;1&#xff09;单向和双向 &#xff08;2&#xff09;带头和不带头 &#xff08;3&#xff09;循环和不循环 &#xff08;4&#xff09;八种链表结构 二、带头双向…

对 CSS 工程化的理解

CSS 工程化是为了解决以下问题&#xff1a; 宏观设计&#xff1a;CSS 代码如何组织、如何拆分、模块结构怎样设计&#xff1f;编码优化&#xff1a;怎样写出更好的 CSS&#xff1f;构建&#xff1a;如何处理我的 CSS&#xff0c;才能让它的打包结果最优&#xff1f;可维护性&a…

【1785. 构成特定和需要添加的最少元素】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给你一个整数数组 nums &#xff0c;和两个整数 limit 与 goal 。数组 nums 有一条重要属性&#xff1a;abs(nums[i]) < limit 。 返回使数组元素总和等于 goal 所需要向数组中添加的 最少元素数…

读书笔记(四)——12.14-12.16

文章目录一、曾国藩家书1.1 读书必须有恒心1.2 读书不可太疏忽一、曾国藩家书 1.1 读书必须有恒心 在此篇&#xff0c;有言学问之道无穷&#xff0c;而总以有恒为主。理解就是&#xff0c;幸好学问是没有穷尽的&#xff0c;我们可以每天以滴水石穿的有恒&#xff0c;来学习广…