猜你不知道Spring Boot的几种部署方式

新闻
本文主要讲的是spring boot的五种部署方式,里面是否有你不知道的呢,如果有欢迎评论留言哦,一起交流探讨哦!!!

 引言

本文主要讲的是spring boot的五种部署方式,里面是否有你不知道的呢,如果有欢迎评论留言哦,一起交流探讨哦!!!

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

  1. 在Java Archive(JAR)中作为独立应用程序进行部署,
  2. 将Web应用程序存档(WAR)部署到servlet容器中,
  3. 在Docker Container中部署,
  4. 在NGINX Web服务器后面部署 - 直接设置,
  5. 部署在NGINX Web服务器后面 - 容器化设置。

在Java Archive(JAR)中作为独立应用程序进行部署

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

  1. <build>  
  2.  <plugins>  
  3.  <plugin>  
  4.  <groupId> org.springframework.boot </ groupId>  
  5.  <artifactId> spring-boot-maven-plugin </ artifactId>  
  6.  </ plugin>  
  7.  </ plugins>  
  8. </ build> 

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

  1. java -jar <jar-file-name>.jar 

将Web应用程序存档(WAR)部署到servlet容器中

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

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

  1. <dependency> 
  2.  <groupId>org.springframework.boot</groupId> 
  3.  <artifactId>spring-boot-starter-tomcat</artifactId 
  4.  <scope>provided</scope> 
  5. </dependency> 

通过扩展SpringBootServletInitializer并覆盖configure方法来初始化Tomcat所需的Servlet上下文,如下所示:

  1. @SpringBootApplication 
  2. public class DemoApp extends SpringBootServletInitializer { 
  3.  @Override 
  4.  protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { 
  5.  return builder.sources(DemoApp.class); 
  6.  } 
  7.  public static void main(String[] args) { 
  8.  SpringApplication.run(DemoApp.class, args); 
  9.  } 

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

在Docker Container中部署

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

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

  1. # latest oracle openjdk is the basis 
  2. FROM openjdk:oracle 
  3. # copy jar file into container image under app directory 
  4. COPY target/demoApp.jar app/demoApp.jar 
  5. # expose server port accept connections 
  6. EXPOSE 8080 
  7. # start application 
  8. CMD ["java""-jar""app/demoApp.jar"

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

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

  1. docker image build -t demo-app:latest . 

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

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

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

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

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

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

  • 在Linux上安装Nginx Web服务器sudo apt-get install nginx,
  • /etc/ngnix/sites-available/default使用文本编辑器打开文件,
  • 比如说,我们有两个Spring Boot应用程序需要代理。然后用两个Spring Boot应用程序的以下块替换文件中的“location”块。请注意,可以在此处找到所有Nginx-Java配置。
  1. location /app1 { 
  2.  proxy_pass http://localhost:8080; 
  3. location /app2 { 
  4.  proxy_pass http://localhost:9000; 

在此基础上对将来的请求http://localhost/app1/将被定向到/http://localhost:8080/,和将来的请求http://localhost/app2/将被引导到/http://localhost:9000/。

负载均衡

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

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

  1. #configure load-balancing  
  2. upstream backend {  
  3.  server localhost:8080;  
  4.  server localhost:8081;  
  5.  server localhost:8082;  

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

  1. location / app1 {  
  2.  proxy_pass http:// backend;  

基于此请求http://localhost/app1/将被发送到/http://localhost:8080/,/http://localhost:8081/或/http://localhost:8082/。

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

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

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

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

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

例如,我们部署了四个Spring Boot应用程序; “分析服务”应用程序的单个实例和“搜索服务”应用程序的三个实例。搜索服务应用程序的三个实例将由Nginx负载平衡。

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

  1. http { 
  2.  upstream backend { 
  3.  server search-service-1:8080
  4.  server search-service-2:8081
  5.  server search-service-3:8082
  6.  } 
  7.  server { 
  8.  listen 80 default_server; 
  9.  listen [::]:80 default_server; 
  10.  root /var/www/html; 
  11.  server_name _; 
  12.  location /search-service { 
  13.  proxy_pass http://backend/search-service; 
  14.  } 
  15.  location /analysis-service { 
  16.  proxy_pass http://analysis-service:8083/analysis-service; 
  17.  } 
  18.  } 
  19. 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,如下所示:

  1. # latest nginx 
  2. FROM nginx 
  3. # copy custom configuration file 
  4. COPY nginx.conf /etc/nginx/nginx.conf 
  5. # expose server port 
  6. EXPOSE 80 
  7. # start server 
  8. CMD ["nginx""-g""daemon off;"

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

  1. docker image build -t custom-nginx:latest . 

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

  1. version: '3.7' 
  2. services: 
  3.  nginx_server: 
  4.  image: custom-nginx 
  5.  ports: 
  6.  - '80:80' 
  7.  networks: 
  8.  - demo-network 
  9.  depends_on: 
  10.  - "search-service-1" 
  11.  - "search-service-2" 
  12.  - "search-service-3" 
  13.  - "analysis-service" 
  14. search-service-1
  15.  image: search-service-1 
  16.  ports: 
  17.  - '8080:8080' 
  18.  networks: 
  19.  - demo-network 
  20. search-service-2
  21.  image: search-service-2 
  22.  ports: 
  23.  - '8081:8081' 
  24.  networks: 
  25.  - demo-network 
  26. search-service-3
  27.  image: search-service-3 
  28.  ports: 
  29.  - '8082:8082' 
  30.  networks: 
  31.  - demo-network 
  32. analysis-service: 
  33.  image: analysis-service 
  34.  ports: 
  35.  - '8083:8083' 
  36.  networks: 
  37.  - demo-network 
  38. networks: 
  39.  demo-network: 
  40.  name: demo-network 

总结

我们演示了五种部署Spring Boot应用程序的方法。部署的选择基于整体解决方案体系结构,目标平台的要求,例如安全性和可用资源。

Java架构-猜你不知道Spring Boot的几种部署方式
责任编辑:张燕妮 来源: 今日头条
相关推荐

2019-07-23 15:56:56

Spring Boot部署servlet

2023-09-08 08:23:29

Servlet程序MVC

2020-04-27 10:34:23

HTTPDNSDNS网络协议

2021-07-30 06:00:31

Prometheus elasticsear运维

2022-07-17 06:53:24

微服务架构

2020-07-28 08:26:34

WebSocket浏览器

2020-06-12 09:20:33

前端Blob字符串

2010-08-06 13:15:35

2009-12-10 09:37:43

2022-10-13 11:48:37

Web共享机制操作系统

2011-09-15 17:10:41

2021-02-01 23:23:39

FiddlerCharlesWeb

2018-01-26 08:26:35

RAID阵列组成

2022-11-04 08:19:18

gRPC框架项目

2020-09-15 08:35:57

TypeScript JavaScript类型

2010-08-23 09:56:09

Java性能监控

2021-01-05 11:22:58

Python字符串代码

2014-03-12 09:23:06

DevOps团队合作

2020-01-29 19:40:36

Python美好,一直在身边Line

2017-03-02 14:05:42

AndroidAndroid Stu调试技巧
点赞
收藏

51CTO技术栈公众号