一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - SpringBoot 實(shí)戰(zhàn) 之 優(yōu)雅終止服務(wù)的方法

SpringBoot 實(shí)戰(zhàn) 之 優(yōu)雅終止服務(wù)的方法

2021-04-25 13:16chinrui Java教程

本篇文章主要介紹了SpringBoot 實(shí)戰(zhàn) 之 優(yōu)雅終止服務(wù)的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

由于 springboot 是一個(gè)微服務(wù)框架,其生產(chǎn)部署的方式也需要盡可能的簡單,與常規(guī)的 web 應(yīng)用有著一個(gè)巨大的不同之處,它可以內(nèi)嵌一個(gè) web 容器,如:tomcat、jetty等,不再需要將應(yīng)用打包成容器規(guī)定的特定形式。

對于 springboot 來說,打包成一個(gè)簡單的 jar 包直接使用 java -jar即可啟動(dòng),這是一種非常優(yōu)雅的方式,但同時(shí)也帶來了一定的問題,如:應(yīng)用如何停止?在過去,應(yīng)用程序是部署在特定的容器中的,使用容器提供的腳本可以優(yōu)雅停服,但現(xiàn)在容器被內(nèi)嵌了,腳本沒有了,怎么辦?直接 kill 是一種方式,但未免顯得太過粗魯,而且可能帶來許多意想不到的問題。

既然我們能想到問題,框架的制定者也會(huì)想到,那么他們有沒有為我們準(zhǔn)備好解決方案呢?答案是有的,下面我介紹下我了解到的幾種方案。

1. 使用 endpoints

在 springboot 官方文檔的第4部分中介紹了為應(yīng)用發(fā)布生產(chǎn)準(zhǔn)備的各種特性,其中,通過 actuator 的 http endpoint,開發(fā)人員可以方便地對應(yīng)用的監(jiān)控與管理。

引入指定的 starter 包:

?
1
"org.springframework.boot:spring-boot-starter-actuator:${springbootversion}"

在 application.yml 中打開如下兩個(gè)配置,即可實(shí)現(xiàn)通過 http 請求停止應(yīng)用

?
1
2
3
4
5
6
management:
 security:
  enabled: false
endpoints:
 shutdown:
  enabled: true

操作命令如下:

?
1
curl -x post http://host:port/shutdown

但這種方式有一個(gè)非常嚴(yán)重的問題,那就是任意人都可以控制應(yīng)用的停止,這對于一個(gè)生產(chǎn)應(yīng)用無疑是不可接受的。有些人可能會(huì)想,現(xiàn)在的鏈接地址太簡單了,非維護(hù)人員也可以輕易地猜出來,如果使用一個(gè)非常復(fù)雜的地址是否可以避免這個(gè)問題。很好,這個(gè)提議不錯(cuò),那我們再看看 springboot 為我們提供的相關(guān)配置。

?
1
2
3
4
endpoints:
 shutdown:
  enabled: true
  path: /xxx

配置完成后,上面的命令就不可用了,需更新命令為:

?
1
curl -x post http://host:port/xxx

其中的/xxx當(dāng)然只是我隨手設(shè)置的一個(gè),你可以設(shè)置任意的地址。雖然安全性高了那么一點(diǎn),但這樣的安全級(jí)別仍然是無法應(yīng)用到生產(chǎn)環(huán)境的。那是否還有其它的防護(hù)手段呢?有,除了修改shutdown的路徑外,我們還可以給所有的管理操作加上一個(gè)統(tǒng)一的上下文,配置獨(dú)立的端口,并限制指定ip訪問(一般限定為本機(jī)),配置如下:

?
1
2
3
4
5
6
management:
 security:
  enabled: false
 port: 9001
 address: 127.0.0.1
 context-path: /admin

變更后的停服命令為:

?
1
curl -x post http://127.0.0.1:9001/admin/xxx

這樣其實(shí)已經(jīng)足夠安全了,為了進(jìn)一步的保證系統(tǒng)的安全,再給其加上一層 http basic auth。

增加 security 依賴:

?
1
"org.springframework.boot:spring-boot-starter-security:${springbootversion}"

修改配置文件如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
endpoints:
 shutdown:
  enabled: true
  path: /xxx
management:
 security:
  enabled: true
 port: 9001
 address: 127.0.0.1
 context-path: /admin
security:
 basic:
  enabled: true
  path: /admin
 user:
  name: root
  password: 123456

配置完成后,最終的停服命令為:

?
1
curl -x post -u root:123456 http://127.0.0.1:9001/admin/xxx

2. 注冊為系統(tǒng)服務(wù)

除了使用 java -jar 運(yùn)行 springboot 應(yīng)用程序外,還可以輕松地用 init.d 或 systemd 注冊成 linux/unix 系統(tǒng)服務(wù),這使得在生產(chǎn)環(huán)境中,安裝和管理 springboot 應(yīng)用程序變得非常簡單。

在maven工程里面,為了創(chuàng)建一個(gè)“完全可執(zhí)行”的 jar,需要引入如下插件:

?
1
2
3
4
5
6
7
8
<plugin>
  <groupid>org.springframework.boot</groupid>
  <artifactid>spring-boot-maven-plugin</artifactid>
  <version>1.5.2.release</version>
  <configuration>
    <executable>true</executable>
  </configuration>
</plugin>

在 gradle 工程里面,等效配置如下:

?
1
2
3
4
5
6
7
plugins {
  id 'org.springframework.boot' version '1.5.2.release'
}
 
springboot {
  executable = true
}

配置完成后,即可以通過 ./application-name.jar 運(yùn)行構(gòu)建好的應(yīng)用程序。

最后,我們需要將打包好的應(yīng)用程序安裝成一個(gè)init.d 服務(wù),這樣就可以很方便地使用 unix/linux 進(jìn)行管理了。操作方式很簡單,只需要將應(yīng)用程序簡單的鏈接到 init.d 即可(其中funda為我自己的應(yīng)用名,自己實(shí)驗(yàn)時(shí)需要視情況替換)。

?
1
ln -s /app/funda/funda.jar /etc/init.d/funda

檢查鏈接是否建立成功

?
1
ls -l /etc/init.d/funda

啟動(dòng)服務(wù),應(yīng)用日志可查看文件 /var/log/funda.log

?
1
service funda start

其它常用命令

?
1
2
3
4
# 查看應(yīng)用運(yùn)行狀態(tài)
service funda status
# 停止應(yīng)用
service funda stop

問題匯總:

在鏈接成功后,應(yīng)用啟動(dòng)時(shí),無法成功啟動(dòng),提示unable to find java,使用如下命令將jdk的java命令鏈接到/sbin/java即可。

?
1
ln -s /usr/local/jdk1.8.0_131/bin/java /sbin/java

參考鏈接:

endpoints
monitoring and management over http
unix/linux services
unable to find java #5690

項(xiàng)目鏈接:

github : https://github.com/qchery/funda

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

原文鏈接:https://blog.csdn.net/chinrui/article/details/78685032

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲人成绝费网站色ww | 楚乔传第二部免费观看全集完整版 | 国产日产精品久久久久快鸭 | 国产91在线精品 | 肉车各种play文r | 乌克兰18sex性hd | h日本漫画全彩在线观看 | 99热精品69堂国产 | 无人影院在线播放 | 视频一区在线免费观看 | 韩国三级在线播放 | 高清在线观看mv的网址免费 | 手机在线免费观看高清 | 性色香蕉AV久久久天天网 | www.东方影库 | 亚洲欧美乱 | 亚洲男人精品 | 九九精品免费视频 | 91精品综合国产在线观看 | katsumi精品hd| 国产老妇 | 男人天堂色 | 99精品国产久热在线观看66 | 日本草草视频在线观看 | 国产成人青草视频 | 亚洲福利视频一区 | 日本高清色视影www日本 | 兽皇日本| 国产视频在线一区 | 成人18网址在线观看 | 国亚洲欧美日韩精品 | 亚洲精品在线免费 | 色佬头| 99re8在这里只有精品2 | 国产精品一区二区三 | 国产在线步兵一区二区三区 | 日韩免费在线视频 | 色cccwww在线播放| 热99精品只有里视频最新 | 亚洲国产精品二区久久 | 香蕉视频在线观看网址 |