Spring Boot的五種部署方式
可以使用各種方法將Spring Boot應用程式部署到生產系統中。在本文中,我們將透過以下5種方法逐步部署Spring Boot應用程式:
- 在Java Archive(JAR)中作為獨立應用程式進行部署,
- 將Web應用程式存檔(WAR)部署到servlet容器中,
- 在Docker Container中部署,
- 在NGINX Web伺服器後面部署 - 直接設定,
- 部署在NGINX Web伺服器後面 - 容器化設定。
在Java Archive(JAR)中作為獨立應用程式進行部署
Spring Boot應用程式可以輕鬆打包到JAR檔案中,並作為獨立應用程式進行部署。這是由spring-boot-maven-plugin完成的。一旦Spring專案透過Spring Initializr建立為Maven專案,外掛就會自動新增到pom.xml中。
<build> <plugins> <plugin> <groupId> org.springframework.boot </ groupId> <artifactId> spring-boot-maven-plugin </ artifactId> </ plugin> </ plugins> </ build> |
要將應用程式打包在單個(胖)jar檔案中,請mvn package在專案目錄下執行maven命令。這將把應用程式打包到一個可執行的jar檔案中,該檔案包含所有依賴項(包括嵌入式servlet容器 - 如果它是一個Web應用程式)。要執行jar檔案,請使用以下標準JVM命令:
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檔案中):
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId <scope>provided</scope> </dependency> |
透過擴充套件SpringBootServletInitializer並覆蓋configure方法來初始化Tomcat所需的Servlet上下文,如下所示:
@SpringBootApplication public 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檔案中,請mvn clean package在專案目錄下執行標準maven命令。這將生成可以部署到servlet容器中的WAR包。要在現有Tomcat容器中執行應用程式,請將生成的WAR檔案複製到tomcat/webapps/目錄。
在Docker Container中部署
在將應用程式部署到Docker容器之前,我們首先將應用程式打包在(胖)JAR檔案中。之前已經解釋了這個過程,因此我假設我們有一個jar檔案。
在第一步,我們需要構建一個容器映象。為此,我們首先在專案根目錄中建立一個Dockerfile,如下所示:
# latest oracle openjdk is the basis FROM openjdk:oracle # copy jar file into container image under app directory 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”位於專案的目標目錄下。我們還假設嵌入式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指定容器的名稱。
部署在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配置。
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/。
負載均衡
如果您正在執行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/。
部署在NGINX Web伺服器後面 - 容器化設定
在容器化設定中,我們將Nginx Web伺服器和所有Spring Boot應用程式部署在單獨的Docker容器上。我們讓Nginx(在自己的容器中執行)向Spring Boot應用程式容器代理REST請求。
我們首先將所有Spring Boot應用程式打包在(胖)jar檔案中(之前已經解釋過)。此時,請注意透過向application.properties(或application.yml)檔案新增以下行來為每個Spring Boot應用程式設定單個伺服器埠和根上下文路徑:
server.port=8082 server.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 FROM 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 up在以下docker-compose.yml檔案上執行命令來部署所有系統:
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-network search-service-2: image: search-service-2 ports: - '8081:8081' networks: - demo-network search-service-3: image: search-service-3 ports: - '8082:8082' networks: - demo-network analysis-service: image: analysis-service ports: - '8083:8083' networks: - demo-network networks: demo-network: name: demo-network |
總結
我們演示了五種部署Spring Boot應用程式的方法。部署的選擇基於整體解決方案體系結構,目標平臺的要求,例如安全性和可用資源。
相關文章
- 極速開發之Spring Boot五種熱部署方式Spring Boot熱部署
- 阿里原來是這麼幹的!Spring Boot 五種熱部署方式阿里Spring Boot熱部署
- Spring Boot開啟的2種方式Spring Boot
- Spring事務配置的五種方式Spring
- Spring Boot中@Import三種使用方式!Spring BootImport
- Spring Boot 專案鑑權的 4 種方式Spring Boot
- Spring boot 讀取properties檔案的四種方式Spring Boot
- Spring Boot 讀取配置內容的三種方式Spring Boot
- Spring Boot讀取配置檔案的幾種方式Spring Boot
- Spring Boot 整合 Shiro ,兩種方式全總結!Spring Boot
- Spring Boot 實現定時任務的 4 種方式Spring Boot
- Spring Boot中初始化資源的幾種方式Spring Boot
- Spring Boot 2.0(四):使用 Docker 部署 Spring BootSpring BootDocker
- Spring Boot下Profile的四種切換方式思路總結Spring Boot
- spring-boot-route(一)Controller接收引數的幾種方式SpringbootController
- Spring Boot 中實現定時任務的兩種方式Spring Boot
- Spring Boot更改上下文路徑的四種方式Spring Boot
- 你應該知道的幾種Spring boot非同步呼叫方式Spring Boot非同步
- Spring Boot(十二):Spring Boot 如何測試打包部署Spring Boot
- Spring Boot中的 6 種API請求引數讀取方式Spring BootAPI
- spring-boot-route(二)讀取配置檔案的幾種方式Springboot
- 使用 Docker 部署 Spring BootDockerSpring Boot
- Spring Boot 2.0(五):Docker Compose + Spring Boot + Nginx + Mysql 實踐Spring BootDockerNginxMySql
- Spring boot學習(五)Spring boot整合Mybatis Generator以及PageHelperSpring BootMyBatis
- Spring Boot整合熱部署框架Spring Boot熱部署框架
- Jenkins自動部署spring bootJenkinsSpring Boot
- spring boot(五)非同步呼叫Spring Boot非同步
- flowable 部署流程的三種方式
- Spark的四種部署方式概括Spark
- java建立物件的五種方式Java物件
- 精進 Spring Boot 03:Spring Boot 的配置檔案和配置管理,以及用三種方式讀取配置檔案Spring Boot
- Spring Boot (五)Spring Data JPA 操作 MySQL 8Spring BootMySql
- spring boot使用註解的方式整合mybaitsSpring BootAI
- docker方式部署的spring boot專案無法訪問宿主機目錄(解決)DockerSpring Boot
- Spring Boot2 系列教程(十六)定時任務的兩種實現方式Spring Boot
- 使用 Docker 部署 Spring Boot 專案DockerSpring Boot
- 使用Docker部署Spring Boot專案DockerSpring Boot
- Spring注入Bean的幾種方式SpringBean