猜你不知道Spring Boot的幾種部署方式(小結(jié))
引言
本文主要講的是spring boot的五種部署方式,里面是否有你不知道的呢,如果有歡迎評(píng)論留言哦,一起交流探討哦?。?!
可以使用各種方法將Spring Boot應(yīng)用程序部署到生產(chǎn)系統(tǒng)中。在本文中,我們將通過(guò)以下5種方法逐步部署Spring Boot應(yīng)用程序:
- 在Java Archive(JAR)中作為獨(dú)立應(yīng)用程序進(jìn)行部署,
- 將Web應(yīng)用程序存檔(WAR)部署到servlet容器中,
- 在Docker Container中部署,
- 在NGINX Web服務(wù)器后面部署 - 直接設(shè)置,
- 部署在NGINX Web服務(wù)器后面 - 容器化設(shè)置。
在Java Archive(JAR)中作為獨(dú)立應(yīng)用程序進(jìn)行部署
Spring Boot應(yīng)用程序可以輕松打包到JAR文件中,并作為獨(dú)立應(yīng)用程序進(jìn)行部署。這是由spring-boot-maven-plugin完成的。一旦Spring項(xiàng)目通過(guò)Spring Initializr創(chuàng)建為Maven項(xiàng)目,插件就會(huì)自動(dòng)添加到pom.xml中。
<build> <plugins> <plugin> <groupId> org.springframework.boot </ groupId> <artifactId> spring-boot-maven-plugin </ artifactId> </ plugin> </ plugins> </ build>
要將應(yīng)用程序打包在單個(gè)(胖)jar文件中,請(qǐng)mvn package在項(xiàng)目目錄下運(yùn)行maven命令。這將把應(yīng)用程序打包到一個(gè)可執(zhí)行的jar文件中,該文件包含所有依賴(lài)項(xiàng)(包括嵌入式servlet容器 - 如果它是一個(gè)Web應(yīng)用程序)。要運(yùn)行jar文件,請(qǐng)使用以下標(biāo)準(zhǔn)JVM命令:
java -jar <jar-file-name>.jar
將Web應(yīng)用程序存檔(WAR)部署到servlet容器中
可以將Spring Boot應(yīng)用程序打包到WAR文件中,以部署到現(xiàn)有的servlet容器(例如Tomcat,Jetty等)中。這可以按如下方式完成:
通過(guò)pom.xml文件指定WAR包<packaging>war</packaging>。這會(huì)將應(yīng)用程序打包成WAR文件(而不是JAR)。在第二步,將Tomcat(servlet容器)依賴(lài)關(guān)系的范圍設(shè)置為provided(以便它不會(huì)部署到WAR文件中):
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId <scope>provided</scope> </dependency>
通過(guò)擴(kuò)展SpringBootServletInitializer并覆蓋configure方法來(lái)初始化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);
}
}
要將應(yīng)用程序打包到war文件中,請(qǐng)mvn clean package在項(xiàng)目目錄下運(yùn)行標(biāo)準(zhǔn)maven命令。這將生成可以部署到servlet容器中的WAR包。要在現(xiàn)有Tomcat容器中運(yùn)行應(yīng)用程序,請(qǐng)將生成的WAR文件復(fù)制到tomcat/webapps/目錄。
在Docker Container中部署
在將應(yīng)用程序部署到Docker容器之前,我們首先將應(yīng)用程序打包在(胖)JAR文件中。之前已經(jīng)解釋了這個(gè)過(guò)程,因此我假設(shè)我們有一個(gè)jar文件。
在第一步,我們需要構(gòu)建一個(gè)容器鏡像。為此,我們首先在項(xiàng)目根目錄中創(chuàng)建一個(gè)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"]
請(qǐng)注意,在上面的代碼片段中,我們假設(shè)應(yīng)用程序JAR文件“ demoApp.jar”位于項(xiàng)目的目標(biāo)目錄下。我們還假設(shè)嵌入式servlet端口是8080(這是Tomcat的默認(rèn)情況)。
我們現(xiàn)在可以使用以下命令構(gòu)建Docker鏡像(Dockerfile所在的位置):
docker image build -t demo-app:latest .
-t是要構(gòu)建的鏡像的名稱(chēng)和標(biāo)記。構(gòu)建鏡像后,我們可以通過(guò)以下方式創(chuàng)建和運(yùn)行容器:
docker container run -p 8080:8080 -d --name app-container demo-app
-p是發(fā)布(映射)主機(jī)端口到容器端口(在這種情況下,兩個(gè)都是8080)。選項(xiàng)-d(detach)指定在后臺(tái)運(yùn)行容器,并用--name指定容器的名稱(chēng)。
部署在NGINX Web服務(wù)器后面 - 直接設(shè)置
為實(shí)際生產(chǎn)配置servlet容器(例如Tomcat或Jetty)(即在端口80上運(yùn)行,沒(méi)有root用戶(hù)和使用SSL)可能不是直接的(但可行)。此,建議在Spring Boot應(yīng)用程序前使用Web服務(wù)器(如Nginx)。這可以通過(guò)兩種方式完成; 直接設(shè)置或Docker設(shè)置。在本節(jié)中,我們將演示直接設(shè)置。
在直接設(shè)置中,我們直接在localhost上運(yùn)行Nginx Web服務(wù)器和Spring Boot應(yīng)用程序(當(dāng)然在不同的端口上)。我們讓Ngnix代理REST請(qǐng)求到Spring Boot應(yīng)用程序:
- 在Linux上安裝Nginx Web服務(wù)器sudo apt-get install nginx,
- /etc/ngnix/sites-available/default使用文本編輯器打開(kāi)文件,
- 比如說(shuō),我們有兩個(gè)Spring Boot應(yīng)用程序需要代理。然后用兩個(gè)Spring Boot應(yīng)用程序的以下塊替換文件中的“l(fā)ocation”塊。請(qǐng)注意,可以在此處找到所有Nginx-Java配置。
location /app1 {
proxy_pass http://localhost:8080;
}
location /app2 {
proxy_pass http://localhost:9000;
}
在此基礎(chǔ)上對(duì)將來(lái)的請(qǐng)求http://localhost/app1/將被定向到/http://localhost:8080/,和將來(lái)的請(qǐng)求http://localhost/app2/將被引導(dǎo)到/http://localhost:9000/。
負(fù)載均衡
如果您正在運(yùn)行Spring Boot應(yīng)用程序的多個(gè)實(shí)例,則可以啟用Nginx以應(yīng)用負(fù)載平衡。例如,如果我們?cè)诙丝?080,8081和8082上運(yùn)行3個(gè)app1實(shí)例。我們可以在這些服務(wù)器之間進(jìn)行負(fù)載平衡,如下所示:
打開(kāi)文件/etc/ngnix/sites-available/default并在文件頂部添加以下塊(在服務(wù)器塊之前):
#configure load-balancing
upstream backend {
server localhost:8080;
server localhost:8081;
server localhost:8082;
}
修改app1 的proxy_pass參數(shù),如下所示:
location / app1 {
proxy_pass http:// backend;
}
基于此請(qǐng)求http://localhost/app1/將被發(fā)送到/http://localhost:8080/,/http://localhost:8081/或/http://localhost:8082/。
部署在NGINX Web服務(wù)器后面 - 容器化設(shè)置
在容器化設(shè)置中,我們將Nginx Web服務(wù)器和所有Spring Boot應(yīng)用程序部署在單獨(dú)的Docker容器上。我們讓Nginx(在自己的容器中運(yùn)行)向Spring Boot應(yīng)用程序容器代理REST請(qǐng)求。
我們首先將所有Spring Boot應(yīng)用程序打包在(胖)jar文件中(之前已經(jīng)解釋過(guò))。此時(shí),請(qǐng)注意通過(guò)向application.properties(或application.yml)文件添加以下行來(lái)為每個(gè)Spring Boot應(yīng)用程序設(shè)置單個(gè)服務(wù)器端口和根上下文路徑:
server.port=8082 server.servlet.context-path=/search-service
然后我們將生成的jar包部署在單獨(dú)的Docker容器中(之前也有解釋?zhuān)?/p>
例如,我們部署了四個(gè)Spring Boot應(yīng)用程序; “分析服務(wù)”應(yīng)用程序的單個(gè)實(shí)例和“搜索服務(wù)”應(yīng)用程序的三個(gè)實(shí)例。搜索服務(wù)應(yīng)用程序的三個(gè)實(shí)例將由Nginx負(fù)載平衡。
我們基于默認(rèn)配置創(chuàng)建Nginx配置文件nginx.conf。我們?yōu)槊總€(gè)服務(wù)添加負(fù)載平衡和代理信息,如下所示:
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; }
請(qǐng)求到http://localhost/search-service/將被引導(dǎo)到一個(gè)/http://search-service-1:8080/search-service/,/http://search-service-2:8081/search-service/和/http://search-service-3:8082/search-service/,和請(qǐng)求http://localhost/analysis-service/將被引導(dǎo)到/http://analysis-service:8083/analysis-service/。
創(chuàng)建配置文件(nginx.conf)后,我們將在Docker容器中部署Nginx Web服務(wù)器。為此,我們創(chuàng)建一個(gè)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;"]
我們?yōu)镹ginx Web服務(wù)器構(gòu)建一個(gè)Docker鏡像,如下所示:
docker image build -t custom-nginx:latest .
構(gòu)建所有Docker鏡像后,可以通過(guò)docker-compose up在以下docker-compose.yml文件上運(yùn)行命令來(lái)部署所有系統(tǒng):
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
總結(jié)
我們演示了五種部署Spring Boot應(yīng)用程序的方法。部署的選擇基于整體解決方案體系結(jié)構(gòu),目標(biāo)平臺(tái)的要求,例如安全性和可用資源。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Sharding-jdbc報(bào)錯(cuò):Missing the data source
在使用MyBatis-plus進(jìn)行數(shù)據(jù)操作時(shí),新增Order實(shí)體屬性后,出現(xiàn)了數(shù)據(jù)源缺失的提示錯(cuò)誤,原因是因?yàn)閡serId屬性值使用了隨機(jī)函數(shù)生成的Long值,這與sharding-jdbc的路由規(guī)則計(jì)算不匹配,導(dǎo)致無(wú)法找到正確的數(shù)據(jù)源,通過(guò)調(diào)整userId生成邏輯2024-11-11
Springboot集成Elasticsearch的步驟與相關(guān)功能
ElasticSearch是開(kāi)源搜索平臺(tái)領(lǐng)域的一個(gè)新成員,?ElasticSearch是一個(gè)基于Lucene構(gòu)建的開(kāi)源,分布式,RESTful搜索引擎,這篇文章主要給大家介紹了關(guān)于Springboot集成Elasticsearch的相關(guān)資料,需要的朋友可以參考下2021-12-12
詳解Idea中HTTP Client請(qǐng)求測(cè)試工具的使用
今天抽空給大家分享Idea中HTTP Client請(qǐng)求測(cè)試工具的使用,小編在這建議使用HTTP Client的Idea版本最好在2018以上,不然的話(huà)體驗(yàn)不是多好,今天就給大家介紹Idea中HTTP Client怎么使用的,感興趣的朋友跟隨小編一起看看吧2021-05-05
Spring Boot2.0中SpringWebContext找不到無(wú)法使用的解決方法
這篇文章主要給大家介紹了關(guān)于Spring Boot2.0中SpringWebContext找不到無(wú)法使用的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12
SpringBoot+Thymeleaf靜態(tài)資源的映射規(guī)則說(shuō)明
這篇文章主要介紹了SpringBoot+Thymeleaf靜態(tài)資源的映射規(guī)則說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
95%的Java程序員人都用不好Synchronized詳解
這篇文章主要為大家介紹了95%的Java程序員人都用不好Synchronized詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
MyBatis 多個(gè)條件使用Map傳遞參數(shù)進(jìn)行批量刪除方式
這篇文章主要介紹了MyBatis 多個(gè)條件使用Map傳遞參數(shù)進(jìn)行批量刪除方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12

