介绍本文主要讲一下springboot的五种部署方式。有什么你不知道的吗?!可以使用多种方法将SpringBoot应用程序部署到生产系统。在本文中,我们将通过以下5种方法逐步部署一个SpringBoot应用程序:在JavaArchive(JAR)中部署为独立应用程序,将WebApplicationArchive(WAR)部署到servlet容器中,在Docker容器中部署,在NGINXWeb服务器后面部署-直接设置,在NGINXWeb服务器后面部署-容器化设置。在Java存档(JAR)中作为独立应用程序部署SpringBoot应用程序可以轻松打包到JAR文件中并作为独立应用程序部署。这是由spring-boot-maven-plugin完成的。通过SpringInitializr将Spring项目创建为Maven项目后,该插件将自动添加到pom.xml中。org.springframework.bootspring-boot-maven-plugin将适用程序打包在一个(fat)jar文件中,请在项目目录下运行maven命令mvnpackage。这会将应用程序打包成一个可执行的jar文件,其中包含所有依赖项(包括嵌入式servlet容器-如果它是Web应用程序)。要运行jar文件,请使用以下标准JVM命令:java-jar.jar将Web应用程序存档(WAR)部署到servlet容器中您可以将SpringBoot应用程序打包到WAR文件中以进行部署到现有的servlet容器(例如Tomcat、Jetty等)中。这可以按如下方式完成:通过pom.xml文件指定WAR包war。这会将应用程序打包成WAR文件(而不是JAR)。第二步,设置Tomcat(servlet容器)依赖的scope为provided(这样就不会部署到WAR文件中):org.springframework.bootspring-boot-starter-tomcatprovided通过扩展Sp??ringBootServletInitializer并重写configure方法初始化Tomcat所需的Servlet上下文,如下:@SpringBootApplicationpublicclassDemoAppextendsSpringBootServletInitializer{@OverrideprotectedSpringApplicationBuilderconfigure(SpringApplicationBuilderbuilderbuilder){ret.sources(DemoApp.class);}publicstaticvoidmain(String[]args){SpringApplication.run(DemoApp.class,args);}}将应用程序打包成war文件,在项目目录maven下运行mvncleanpackage命令。这将生成一个可以部署到servlet容器中的WAR包。要在现有Tomcat容器中运行应用程序,请将生成的WAR文件复制到tomcat/webapps/目录。在Docker容器中部署在将应用程序部署到Docker容器中之前,我们首先将应用程序打包到一个(胖)JAR文件中。这个过程之前已经解释过,所以我假设我们有一个jar文件。第一步,我们需要构建一个容器镜像。为此,我们首先在项目根目录中创建一个Dockerfile,如下所示:#latestoracleopenjdkisthebasisFROMopenjdk:oracle#copyjarfileintocontainerimageunderappdirectoryCOPYtarget/demoApp.jarapp/demoApp.jar#exposeserverportacceptconnectionsEXPOSE8080#startapplicationCMD["java","-jar","app/demoApp.jar"]请注意,在上面的代码片段中,我们假设应用程序JAR文件“demoApp.jar”位于项目的目标目录下。我们还假设嵌入式servlet端口是8080(这是Tomcat的默认端口)。我们现在可以使用以下命令构建Docker镜像(Dockerfile所在的位置):dockerimagebuild-tdemo-app:latest。-t是要构建的图像的名称和标签。构建镜像后,我们可以通过以下方式创建并运行容器:dockercontainerrun-p8080:8080-d--nameapp-containerdemo-app-p是将主机端口发布(映射)到容器端口(在本例中,两者都是8080)。选项-d(分离)指定在后台运行容器,--name指定容器的名称。在NGINX网络服务器后面部署——直接设置一个为实际生产配置的servlet容器(例如Tomcat或Jetty)可能并不简单(但可行)(即在端口80上运行,无需root并使用SSL)。因此,建议在SpringBoot应用程序的前端使用Web服务器(如Nginx)。这可以通过两种方式完成;直接设置或Docker设置。在本节中,我们将演示简单的设置。在直接设置中,我们直接在本地主机上(当然在不同的端口上)运行NginxWeb服务器和SpringBoot应用程序。我们让Ngnix代理REST请求到SpringBoot应用程序:要在Linux上安装NginxWeb服务器sudoapt-getinstallnginx,用文本编辑器打开/etc/ngnix/sites-available/default文件,比方说,我们有两个SpringBoot应用程序需要代理。然后将文件中的“location”块替换为两个SpringBoot应用程序的以下块。请注意,所有Nginx-Java配置都可以在这里找到。location/app1{proxy_passhttp://localhost:8080;}location/app2{proxy_passhttp://localhost:9000;}基于此,以后对http://localhost/app1/的请求将定向到/http://localhost:8080/,以后对http://localhost/app2/的请求将被定向到/http://localhost:9000/。负载平衡如果您正在运行SpringBoot应用程序的多个实例,则可以启用Nginx来应用负载平衡。例如,如果我们在端口8080、8081和8082上运行3个app1实例。我们可以按如下方式在这些服务器之间进行负载平衡:打开文件/etc/ngnix/sites-available/default并在顶部添加以下块文件(在服务器块之前):#configureload-balancingupstreambackend{serverlocalhost:8080;serverlocalhost:8081;serverlocalhost:8082;}修改app1的proxy_pass参数如下:location/app1{proxy_passhttp://backend;}基于这个请求http://localhost/app1/会被发送到/http://localhost:8080/、/http://localhost:8081/或/http://localhost:8082/。部署在NGINXWeb服务器后面——容器化设置在容器化设置中,我们将NginxWeb服务器和所有SpringBoot应用程序部署在单独的Docker容器中。我们让Nginx(在它自己的容器中运行)将REST请求代理到SpringBoot应用程序容器。我们首先将所有SpringBoot应用程序打包在(胖)jar文件中(之前解释过)。此时,通过将以下行添加到application.properties(或application.yml)文件,注意为每个SpringBoot应用程序设置单独的服务器端口和根上下文路径:server.port=8082server.servlet.context-path=/search-service然后我们将生成的jar包部署到一个单独的Docker容器中(之前也有说明)。比如我们部署了四个SpringBoot应用;“分析服务”应用程序的单个实例和“搜索服务”应用程序的三个实例。搜索服务应用程序的三个实例将由Nginx进行负载平衡。我们根据默认配置创建Nginx配置文件nginx.conf。我们为每个服务添加负载均衡和代理信息如下:http{upstreambackend{serversearch-service-1:8080;serversearch-service-2:8081;serversearch-service-3:8082;}server{listen80default_server;listen[::]:80default_server;root/var/www/html;server_name_;location/search-service{proxy_passhttp://backend/search-service;}location/analysis-service{proxy_passhttp://analysis-service:8083/analysis-service;}}}events{worker_connections1024;}对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://分析服务:8083/分析服务/。创建配置文件(nginx.conf)后,我们将在Docker容器中部署NginxWeb服务器。为此,我们创建一个Dockerfile,如下所示:dockerimagebuild-tcustom-nginx:latest。我们为Nginx网络服务器构建一个Docker镜像,如下所示:图像,您可以通过在以下docker-compose.yml文件上运行docker-composeup来部署所有系统:version:'3.7'services:nginx_server:image:custom-nginxports:-'80:80'networks:-demo-networkdepends_on:-"search-service-1"-"search-service-2"-"search-service-3"-"analysis-service"search-service-1:image:search-service-1ports:-'8080:8080'网络:-demo-networksearch-service-2:image:search-service-2ports:-'8081:8081'网络:-demo-networksearch-service-3:image:search-service-3ports:-'8082:8082'networks:-demo-networkanalysis-service:image:analysis-serviceports:-'8083:8083'networks:-demo-networknetworks:demo-network:name:demo-network总结我们演示了部署SpringBoot应用程序的五种方法.部署的选择基于整体解决方案架构、目标平台的要求(例如安全性和可用资源)。