Spring Boot 项目开发结束后的工作便是运维,简单来说需要配置 Web 运行参数和项目部署两大工作,本文将尽可能详细地给大家讲全!
目录
① 通过 IDEA Spring Initializr 创建项目
2.2 以 jar 包形式将 Spring Boot 项目部署到云服务器
3.2 以 Dockerfile 文件形式将 Spring Boot 项目部署到云服务器
Ⅰ 可选容器列表
其实 Spring Boot 不仅支持 Tomcat,还支持 jetty、undertow 等容器,本项目采用的是 Tomcat ,若要更换容器,需要将 spring-boot-starter-tomcat 从 Web 的 starter 里去掉,然后引入像 jetty 这样的 starter ~
Ⅱ 端口
Ⅲ 压缩支持
Ⅳ Tomcat 特定配置
Ⅴ 错误处理
Ⅵ 其他
Ⅶ 通过编程方式
通过WebServerFactoryCustomizer<T>做一些定制,在 1.3 可以看到
由于只是用作演示 Web 容器运行和部署,因此本项目很简单,写了几个简单的接口,而且也不连接数据库,以下是项目搭建的流程。


由于项目不做数据库相关操作,所以直接编写接口~
路径: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 终端进行访问,直接用浏览器也可~
返回成功,还附带了很多其他信息,包括状态、请求头等 👇

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

本文以压缩支持和报错处理为例
路径: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);//将配置传入
}
@Bean
public 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 👇

网盘链接: 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:$PATH
i 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>

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


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

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

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

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

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

报错也返回成功 👇

最后 ctrl +c 就结束进程了~
目前将 SpringBoot 项目打包成 Docker 镜像主要有两种方案
一般来说半自动化较为普遍,本文采用第二种方式
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"]

步骤参考本文的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镜像
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.
最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru
在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI
这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub