翻译自 Deploying Spring Boot Applications[1]

原作者 Murat Artim[2]

可以使用各种方法将 Spring Boot 应用程序部署到生产系统中。在本文中,我们将通过以下 5 种方法来部署 Spring Boot 应用程序:

  • 使用 Java Archive (JAR) 作为独立应用程序进行部署
  • 将 Web Application Archive (WAR) 部署到 servlet 容器中
  • 在 Docker 容器中部署
  • 部署在 NGINX Web 服务器后面 - 直接设置
  • 部署在 NGINX Web 服务器后面 - 容器化设置

1. 使用 Java Archive (JAR) 作为独立应用程序进行部署

Spring Boot 应用程序可以轻松打包到 JAR 文件中,并作为独立应用程序进行部署。这是通过 spring-boot-maven-plugin 这个插件完成的。一旦 Spring 项目通过 Spring Initializr[3] 创建为 Maven 项目,插件就会自动添加到 pom.xml 中。

org.springframework.boot      spring-boot-maven-plugin    

要将应用程序打包在单个 jar 文件中,需要在项目目录下运行 maven 命令 mvn package。这将把应用程序打包到一个可执行的 jar 文件中,该文件包含所有依赖项(包括嵌入式 servlet 容器 ,如果它是一个 Web 应用程序)。要运行 jar 文件,请使用以下标准 JVM 命令 java -jar .jar。

2. 将 Web Application Archive (WAR) 部署到 servlet 容器中

可以将 Spring Boot 应用程序打包到 WAR 文件中,以部署到现有的 servlet 容器(例如 Tomcat,Jetty 等)中。可以按如下方式完成:

在 pom.xml 文件中,通过 war packaging> 指定为 WAR 包。这会将应用程序打包成 WAR 文件(而不是 JAR)。在第二步,将 Tomcat(servlet 容器)依赖关系的范围设置为 provided(以便它不会部署到 WAR 文件中):

org.springframework.boot  spring-boot-starter-tomcatprovided

通过继承 SpringBootServletInitializer 并重写 configure 方法来初始化 Tomcat 所需的 Servlet 上下文,如下所示:

@SpringBootApplicationpublic class DemoApp extends SpringBootServletInitializer {  @Override  protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {    return builder.sources(DemoApp.class);  }  public static void main(String[] args) {    SpringApplication.run(DemoApp.class, args);  }}

要将应用程序打包到 war 文件中,请在项目目录下运行标准 maven 命令mvn clean package。这将生成可以部署到 servlet 容器中的 WAR 包。要在现有 Tomcat 容器中运行应用程序,请将生成的 WAR 文件复制到tomcat/webapps/目录。

3. 在 Docker 容器中部署

在将应用程序部署到 Docker 容器之前,我们首先要将应用程序打包在 JAR 文件中。之前已经解释了这个过程,因此我假设我们有一个 jar 文件。

在第一步,我们需要构建一个容器镜像。为此,我们首先在项目根目录中创建一个 Dockerfile 文件,如下所示:

# latest oracle openjdk is the basis 将最新的oracle openjdk作为基础FROM openjdk:oracle# copy jar file into container image under app directory   将jar文件复制到容器镜像的app目录COPY target/demoApp.jar app/demoApp.jar# expose server port accept connections  暴露服务端口接收连接EXPOSE 8080# start application 运行应用程序CMD ["java", "-jar", "app/demoApp.jar"]

请注意,在上面的代码片段中,我们假设应用程序 JAR 文件“demoApp.jar”位于项目的 target 目录下。我们还假设嵌入式 servlet 端口是 8080(这是 Tomcat 的默认情况)。

我们现在可以使用以下命令构建 Docker 镜像(Dockerfile 所在的位置):

docker image build -t demo-app:latest .

其中 -t 是要构建的镜像的名称和标记。构建镜像后,我们可以通过以下方式创建和运行容器:

docker container run -p 8080:8080 -d --name app-container demo-app

其中-p将主机端口(映射)到容器端口(在这种情况下,两者都是 8080)。选项-d(detach)是指在后台运行容器,- name指定容器的名称。

4. 部署在 NGINX Web 服务器后面 - 直接设置

为实际生产配置 servlet 容器(例如 Tomcat 或 Jetty )(即在端口 80 上运行,没有 root 用户和使用 SSL)可能不是直接的(但可行)。因此,建议在 Spring Boot 应用程序前使用 Web 服务器(如 Nginx)。这可以通过两种方式完成: 直接设置或容器设置。在本节中,我们将演示直接设置。

在直接设置中,我们直接在 localhost 上运行 Nginx Web 服务器和 Spring Boot 应用程序(当然在不同的端口上)。我们让 Ngnix 代理 REST 请求到 Spring Boot 应用程序。为了这:

1.通过 sudo apt-get install nginx 在 Linux 上安装 Nginx Web 服务器

2.使用文本编辑器打开文件/etc/ngnix/sites-available/default

3.比如说,我们有两个 Spring Boot 应用程序需要代理。可以用以下内容替换文件中的 location 块。请注意,可以在此处[4]找到所有 Nginx-Java 配置

location /app1 {  proxy_pass http://localhost:8080;}location /app2 {  proxy_pass http://localhost:9000;}

基于此,来自 http://localhost/app1/的请求将被定向到 /http://localhost:8080/,来自 http://localhost/app2/的请求将被定向到 /http://localhost:9000/。

4.1 负载均衡

如果您正在运行 Spring Boot 应用程序的多个实例,则可以启用 Nginx 以应用负载均衡。例如,如果我们在端口 8080,8081 和 8082 上运行 3 个 app1 实例。我们可以在这些服务器之间进行负载均衡,如下所示:

打开文件 /etc/ngnix/sites-available/default 并在文件顶部添加以下内容(在服务器内容之前):

# configure load-balancing 配置负载均衡upstream backend {  server localhost:8080;  server localhost:8081;  server localhost:8082;}

修改 app1 的 proxy_pass 参数,如下所示:

location /app1 {  proxy_pass http://backend;}

基于此,来自 http://localhost/app1/ 的请求将被定向到 /http://localhost:8080/,/http://localhost:8081/或 /http://localhost:8082/的其中之一。

5. 部署在 NGINX Web 服务器后面 - 容器化设置

在容器化设置中,我们将 Nginx Web 服务器和所有 Spring Boot 应用程序部署在单独的 Docker 容器上。我们让 Nginx(在自己的容器中运行)向 Spring Boot 应用程序容器代理 REST 请求。

我们首先将所有 Spring Boot 应用程序打包在 jar 文件中(之前已经解释过)。此时,请注意通过向 application.properties(或 application.yml)文件添加以下代码来为每个 Spring Boot 应用程序设置单个服务器端口和根上下文路径:

server.port=8082server.servlet.context-path=/search-service

然后我们将生成的 jar 包部署在单独的 Docker 容器中(之前也有解释)。

例如,我们部署了四个 Spring Boot 应用程序; 一个“分析服务”实例和三个“搜索服务”实例。搜索服务的三个实例将由 Nginx 负载均衡。我们的基本架构如下所示:

我们基于默认配置创建 Nginx 配置文件 nginx.conf 。我们为每个服务添加负载均衡和代理信息,如下所示:

http {  upstream backend {    server search-service-1:8080;    server search-service-2:8081;    server search-service-3:8082;  }  server {    listen 80 default_server;    listen [::]:80 default_server;    root /var/www/html;    server_name _;    location /search-service {      proxy_pass http://backend/search-service;    }    location /analysis-service {      proxy_pass http://analysis-service:8083/analysis-service;    }  }}events { worker_connections 1024; }

基于此,来自http://localhost/search-service/的请求将被定向到 http://search-service-1:8080/search-service/, /http://search-service-2:8081/search-service/和 http://search-service-3:8082/search-service/,来自 http://localhost/analysis-service/ 的请求将被定向到 http://analysis-service:8083/analysis-service/。

创建配置文件(nginx.conf)后,我们将在 Docker 容器中部署 Nginx Web 服务器。为此,我们创建一个 Dockerfile ,如下所示:

# latest nginx 最新的nginxFROM nginx# copy custom configuration file  复制自定义配置文件COPY nginx.conf /etc/nginx/nginx.conf# expose server port 暴露服务端口EXPOSE 80# start server 开启服务CMD ["nginx", "-g", "daemon off;"]

我们为 Nginx Web 服务器构建一个 Docker 镜像,如下所示:

docker image build -t custom-nginx:latest .

构建所有 Docker 镜像后,可以通过在以下 docker-compose.yml 文件上运行docker-compose up命令来部署所有系统:

version: '3.7'services:  nginx_server:    image: custom-nginx    ports:      - '80:80'    networks:      - demo-network    depends_on:      - "search-service-1"      - "search-service-2"      - "search-service-3"      - "analysis-service"search-service-1:  image: search-service-1  ports:    - '8080:8080'  networks:    - demo-networksearch-service-2:  image: search-service-2  ports:    - '8081:8081'  networks:    - demo-networksearch-service-3:  image: search-service-3  ports:    - '8082:8082'  networks:    - demo-networkanalysis-service:  image: analysis-service  ports:    - '8083:8083'  networks:    - demo-networknetworks:  demo-network:    name: demo-network

以上,我们演示了部署 Spring Boot 应用程序的五种方法。选择哪种部署方式要基于整体架构以及目标平台的要求,例如安全性和可用资源。

参考资料

[1] Deploying Spring Boot Applications: https://medium.com/swlh/deploying-spring-boot-applications-15e14db25ff0

[2] Murat Artim: https://medium.com/@muratartim_5366

[3] Spring Initializr: https://start.spring.io/

[4] 此处: https://www.nginx.com/resources/wiki/start/topics/examples/javaservers/

jar容器部署成功无法访问_Spring Boot 应用程序五种部署方式相关推荐

  1. springboot 没有找到service_Spring Boot 应用程序五种部署方式

    翻译自 Deploying Spring Boot Applications[1] 原作者 Murat Artim[2] 可以使用各种方法将 Spring Boot 应用程序部署到生产系统中.在本文中 ...

  2. easy-mock本地部署成功,访问报错:EADDRNOTAVAIL 0.0.0.0:7300 解决方案

    easy-mock本地部署成功,访问报错:EADDRNOTAVAIL 0.0.0.0:7300 解决方案 参考文章: (1)easy-mock本地部署成功,访问报错:EADDRNOTAVAIL 0.0 ...

  3. springboot jar服务器运行后无法请求_Spring boot、微服务、OAuth、OpenID的爱恨情仇!...

    在本文中,我们学习如何使用Spring boot轻松配置和部署微服务,然后使用OAuth和OpenID保护它们. 在微服务体系架构中,其中较大的应用程序由多个较小的服务组成,每个服务都有自己的目标,它 ...

  4. 打包tomcat没有xml文件_Spring Boot 项目打包 War 并部署到 Tomcat

    之前使用 SpringBoot 所做的开发,都是将项目打包成 Jar 的,但是如果是作为一个 Web 项目,最好是将项目打包成 War. 1. Jar 包和 War 包的区别 1.概念 jar 包:J ...

  5. springboot jar服务器运行后无法请求_Spring Boot微服务中Chaos Monkey的应用

    有多少人从未在生产环境中遇到系统崩溃或故障?当然,你们每个人迟早都会经历它.如果我们无法避免失败,那么解决方案似乎是将我们的系统维持在永久性故障状态.Chaos Monkey - 这个概念是Netfl ...

  6. 项目部署到tomcat6.0启动成功后访问页面报500_.net core IIS部署教程

    今天上午基于.net core做了一个简单的Web Api的Demo,练习一下IIS部署,本以为很简单,没想到遇到了很多坑,折腾了大半天才部署成功,简单记录一下,以供大家参考. 1.发布项目 2.下载 ...

  7. was中java目录_was8.5选择安装选项,安装应用程序的目录填写自定义目录,应用部署成功后访问不了页面?...

    pz.jpg 配置如上图所示 选择 安装应用程序的目录为自定义的 appdatasiap 部署成功后,访问不了页面. 错误信息如下: Error Page Exception SRVE0260E: T ...

  8. springboot jar中没有主清单属性_Spring Boot 常见错误及解决方法

    导读 Spring Boot 作为 Java 生态中最流行的开发框架,意味着被数以万计的开发者所使用.下面根据我们自身遇到的问题,加上用户提供的一些反馈,来大致梳理下 Spring Boot 的常见错 ...

  9. C++之顺序性容器vector、list、deque的五种定义方式

    要使用顺序性容器,首先必须包含相关的头文件,也就是以下三者之一:   #include<vector>   #include<list>   #include<deque ...

最新文章

  1. Nature方法 | 三代长读长宏基因组组装软件metaFlye
  2. PTP4L 简化版本OC模式
  3. html浏览器影响js问题,js 浏览器兼容性问题
  4. 美甲帮:玩转指甲上的大数据平台
  5. CTF-i春秋网鼎杯第一场misc部分writeup
  6. 从0开始配置Flutter并运行demo
  7. 2020年行政区划代码_2020年梧州市行政区划,了解梧州市有几个区,详细数据
  8. 一文看懂家庭宽带光纤是如何入户
  9. LeetCode 401. 二进制手表
  10. 我的应用我做主丨动手搭建招聘小应用
  11. 软件设计师25-操作系统
  12. 【AS3 Coder】任务七:初涉PureMVC——天气预报功能实现
  13. linux系统显卡驱动下载官网,NVIDIA显卡Linux系统驱动313.09版下载
  14. 经验模态分解股票波动matlab,LMD经验模态分解matlab程序——原味的
  15. 应用程序无法正常启动(0xc000000d)的解决方法
  16. 背单词APP测试与评估(百词斩vs扇贝)
  17. 怎样恢复计算机到桌面,电脑任务栏怎么还原到下面 电脑任务栏还原方法【图文】...
  18. snmp v3 参数_snmp v3的安全配置 snmp认证与加密配置(53)
  19. 从B站审核变慢现象,聊聊谛听安全内容社区产品的内容风控
  20. Apache Ant安装及使用

热门文章

  1. WordPress主题制作函数
  2. 设计模式学习(五) 适配器模式
  3. 设计模式学习每天一个——Factory模式 和 Abstract Factory模式
  4. django学习之路(五)站点管理admin - django - 一直很安静 - Powered by Discuz!
  5. DirectX11 SDK下载地址:
  6. Struts 2中#、%和$符号的相应用途
  7. [图]为C# Windows服务添加安装程序
  8. AWS Storage Gateway 分类
  9. 2018-07-09--记录一次gitlab迁移事件及遇到的问题
  10. JavaScript对象的创建