構(gòu)建一個(gè)運(yùn)行在Azure虛擬機(jī)上的MySQL Spring Boot應(yīng)用程序

關(guān)鍵要點(diǎn)

從GitHub中獲取一個(gè)簡單的Spring Boot Java應(yīng)用程序绊诲。

將應(yīng)用程序連接到Azure MySQL數(shù)據(jù)庫服務(wù)。

在Azure上配置一個(gè)運(yùn)行WildFly的Linux VM碍彭。

將示例應(yīng)用程序部署到WildFly服務(wù)器。

最近邢滑,我被要求構(gòu)建一個(gè)在?WildFly應(yīng)用程序平臺(tái)?上運(yùn)行的演示網(wǎng)站蹂午,并連接到微軟Azure上的MySQL數(shù)據(jù)庫。前提看起來似乎很簡單翔怎,但實(shí)現(xiàn)起來可能很棘手窃诉,而且關(guān)于如何設(shè)置這樣的東西的文檔也很有限。我花了很多時(shí)間來研究實(shí)現(xiàn)這一目標(biāo)需要做些什么赤套,我將把步驟分享給大家飘痛。

請(qǐng)注意,我使用Nginx作為反向代理服務(wù)器容握,因?yàn)檫@比在WildFly發(fā)行版中使用VM IP地址要容易得多宣脉。使用Nginx,我就能夠在內(nèi)部使用?http://127.0.0.1?剔氏。這樣還能夠在云環(huán)境中更輕松地使用集群和擴(kuò)展WildFly塑猖。

先決條件:

一個(gè)Azure帳戶(?此處免費(fèi)試用?)

一個(gè)Git客戶端

Azure CLI 2.0

Java 7 JDK或更高版本

克隆GitHub示例

通過命令控制臺(tái)進(jìn)入到某個(gè)工作目錄,并克隆?示例代碼庫?谈跛。

git clone?https://github.com/bbenz/spring-boot-todo

通過命令行驗(yàn)證你的Azure帳戶憑證

你需要一個(gè)Azure帳戶來完成這些步驟羊苟。你可以在這里獲得?免費(fèi)試用賬號(hào)?。要確保你已登錄到自己的Azure帳戶感憾,然后輸入az account list蜡励。如果你尚未登錄,請(qǐng)輸入az login,然后按照提示操作巍虫。

使用Azure CLI創(chuàng)建Azure MySQL數(shù)據(jù)庫

接下來纺蛆,讓我們使用?Azure CLI?創(chuàng)建一個(gè)?Azure MySQL數(shù)據(jù)庫?辱魁。我們將在命令行窗口中使用Azure CLI 2.0來創(chuàng)建資源組和MySQL實(shí)例。

Azure命令行界面(CLI)是在Mac、Linux和Windows的命令行中操作Azure的得力助手膏燃。它兼容POSIX科雳,使用Python編寫秃踩,并?在GitHub上開源?衷快。CLI可以在Mac和Linux上的命令行窗口內(nèi)運(yùn)行,在Windows上搔啊,你可以通過命令提示符或Windows的Linux子系統(tǒng)(也就是?Windows上的Bash?)來訪問CLI柬祠。甚至還有?適用于IOS和Android的CLI應(yīng)用程序?。

你還可以通過瀏覽器訪問?azure portal?或?shell.azure.com?來使用Azure CLI负芋。你可以在此處找到有關(guān)?shell的更多信息漫蛔,以及合作伙伴的CLI的信息?。請(qǐng)注意旧蛾,所有這些都需要一個(gè)微軟Azure帳戶(此處可以申請(qǐng)免費(fèi)試用)莽龟。

登錄并創(chuàng)建資源組

使用az login命令登錄Azure,然后按照屏幕上的說明進(jìn)行操作锨天。

創(chuàng)建Azure資源組

Azure資源組?將Azure服務(wù)作為單位進(jìn)行管理毯盈。每個(gè)資源組都必須對(duì)應(yīng)一個(gè)位置。要查看??location--location的所有可能值病袄,請(qǐng)使用az appservice list-locations命令搂赋。

以下示例在北歐地區(qū)創(chuàng)建了一個(gè)Azure資源組。

az groupcreate--name myResourceGroup --location “North Europe”

創(chuàng)建一個(gè)MySQL服務(wù)器

在Azure中創(chuàng)建MySQL服務(wù)器益缠。將下面命令中的占位符換成你自己的MySQL服務(wù)器名稱脑奠。這個(gè)名稱是你的MySQL服務(wù)器的主機(jī)名“ .mysql.database.azure.com”的一部分,因此它必須是全局唯一的幅慌。也可以用自己的值替換和:

az mysql server create --name--resource-group myResourceGroup --location"North Europe"--admin-user--admin-password

配置MySQL防火墻

使用az mysql server firewall-rule create命令為MySQL服務(wù)器創(chuàng)建防火墻規(guī)則宋欺。下面是為一個(gè)IP地址范圍創(chuàng)建防火墻規(guī)則的示例(你可能希望縮小實(shí)際的防火墻IP地址范圍):

azmysqlserverfirewall-rulecreate--nameallIPs--server--resource-groupmyResourceGroup--start-ip-address0.0.0.0--end-ip-address255.255.255.255

配置Azure MySQL數(shù)據(jù)庫

使用之前為“”和“”指定的值連接到MySQL服務(wù)器。

mysql -u@-h.mysql.database.azure.com-P3306-p

在mysqlmysql提示符下欠痴,創(chuàng)建數(shù)據(jù)庫和表迄靠。

CREATEDATABASEtododb;

創(chuàng)建一個(gè)數(shù)據(jù)庫用戶秒咨,并在→dodb→dodb數(shù)據(jù)庫中賦予它所有權(quán)限喇辽。用你自己唯一的應(yīng)用程序名稱替換占位符和:

CREATEUSER''IDENTIFIEDBY'';GRANTALLPRIVILEGESONtododb.*TO'';

鍵入quitquit退出服務(wù)器連接。

更新application.properties文件中的值

更新src/main/resources/application.properties中的以下幾個(gè)值:

spring.datasource.url=jdbc:mysql://@.mysql.database.azure.com:3306/tododbspring.datasource.username=adminname@spring.datasource.password=passwordspring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.jpa.hibernate.ddl-auto=update

構(gòu)建并運(yùn)行示例

使用代碼庫中的Maven包裝器在本地構(gòu)建和運(yùn)行示例:

mvn package spring-boot:run

在瀏覽器中雨席,打開?http://localhost:8080?菩咨,確保在我們將程序包發(fā)送到Azure上的VM之前應(yīng)用程序可以正常運(yùn)行。

配置Maven以生成.WAR文件

要將應(yīng)用程序部署到vm,我們需要使用mvn package命令來部署.war文件抽米。maven已經(jīng)生成了一個(gè).jar文件特占,我們需要將一個(gè).WAR文件部署到Firefly。只需將這一行添加到pom.xml中:

war

現(xiàn)在云茸,在與pom.xml相同的位置運(yùn)行mvn clean package是目,在目標(biāo)目錄中生成名為todo-app-java-on-azure-1.0-SNAPSHOT.war的.WAR文件。

在Azure上創(chuàng)建Linux VM

有幾種方法可以在Azure上創(chuàng)建新的Linux VM标捺,在本文中懊纳,我們將使用命令行,使用az vm create命令亡容。

這個(gè)命令會(huì)創(chuàng)建一個(gè)Linux VM嗤疯,其中包含azure上可用的最新Ubuntu鏡像:

az vmcreate-n -g -l eastus2--generate-ssh-key --image ubuntults

打開端口8080和9990

接下來,在目標(biāo)VM上打開端口8080和9990闺兢。Spring Boot將端口8080用于應(yīng)用程序茂缚,Wildfly使用端口9990進(jìn)行管理訪問。當(dāng)你在VM上打開多個(gè)端口時(shí)必須設(shè)置優(yōu)先級(jí)屋谭,因此將Wildfly的端口(我使用800)設(shè)置為比Spring(保留默認(rèn)值100)低脚囊。優(yōu)先級(jí)范圍可以從100到4096。

azvmopen-port -n -g ? --port8080azvmopen-port -n -g ? --port9990--priority800

SSH到虛擬機(jī)

使用az vm create命令生成的SSH密鑰連接到VM戴而。使用你的VM用戶名替換凑术,默認(rèn)是帳號(hào)電子郵件@左邊的部分。

ssh@

然后你會(huì)收到下面的提示所意,輸入yes淮逊。

The authenticityofhost'< PublicIpAddress>(< PublicIpAddress>)' can't be established.ECDSAkeyfingerprintis…………Are you sure you wanttocontinueconnecting (yes/no)? yesWarning: Permanently added < PublicIpAddress> (ECDSA)tothe listofknown hosts.

準(zhǔn)備VM

更新并安裝OpenJDK和nginx

現(xiàn)在,我們?cè)谔摂M機(jī)中扶踊,讓我們確保我們擁有最新的Linux泄鹏,然后安裝我們需要的軟件。我們使用nginx作為反向代理秧耗,并配置Wildfly备籽,將其作為服務(wù)運(yùn)行。我們還需要Java分井,因此我們需要安裝OpenJDK 8车猬。

使用nginx意味著Wildfly服務(wù)器可以使用默認(rèn)值(127.0.0.1)在任何VM上運(yùn)行。否則尺锚,我們必須使用VM的公共IP地址珠闰。在集群或容器化的環(huán)境中,如果不使用nginx瘫辩,Wildfly就會(huì)變得不靈活伏嗜。在演示環(huán)境坛悉,我們可以跳過一些配置步驟(這些已經(jīng)足夠了)。

apt-getupdateapt-getinstall-y openjdk-8*apt-getinstallnginx

安裝Wildfly承绸,并將其設(shè)置為服務(wù)

接下來裸影,讓我們安裝并配置Wildfly。Wildfly不能通過apt-get安裝军熏,所以我們需要使用wget從服務(wù)器中下載轩猩。

wget http://download.jboss.org/wildfly/12.0.0.Final/wildfly-12.0.0.Final.tar.gzmv wildfly-12.0.0.Final.tar.gz/opt/cd/opt/tar -zvxf wildfly-12.0.0.Final.tar.gzmv wildfly-12.0.0.Finalwildfly

現(xiàn)在我們有了Wildfly,接下來需要添加一個(gè)管理用戶來處理管理任務(wù):

cdwildfly/bin./add-user.sh

以下是你將看到的提示以及我提供的答案:

What type of userdoyou wishtoadd? a)ManagementUser(mgmt-users.properties) b) ApplicationUser(application-users.properties)(a): aEnter the detailsofthenewusertoadd.Usingrealm'ManagementRealm'asdiscoveredfromthe existing property files.Username :Password: !Whatgroupsdoyou want thisusertobelongto? (Please enter a comma separatedlist,orleave blankfornone)[? ]:Abouttoadduser'rhsotdemo1'forrealm'ManagementRealm'Isthis correct yes/no? yesIsthisnewusergoingtobe usedforoneASprocesstoconnecttoanotherASprocess?e.g.foraslavehost controller connectingtothemasterorfora RemotingconnectionforservertoserverEJB calls.yes/no?no

接下來荡澎,我們將在Widfly中配置一些有關(guān)VM的信息:

cd/opt/wildfly/bin/vistandalone.conf

添加或編輯以下內(nèi)容:

JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64"JBOSS_HOME="/opt/wildfly"

將Wildfly配置為自啟動(dòng)

將Wildfly配置為在VM啟動(dòng)(或重新啟動(dòng))時(shí)自動(dòng)啟動(dòng)界轩,方法是添加以下文件:

vi/etc/default/wildfly

將以下這些添加到新文件中:

WILDFLY_USER="wildfly"STARTUP_WAIT=180SHUTDOWN_WAIT=30WILDFLY_CONFIG=standalone.xmlWILDFLY_MODE=standaloneWILDFLY_BIND=0.0.0.0

保存文件,然后再創(chuàng)建一個(gè)新文件:

vi/opt/wildfly/bin/launch.sh

將下面的內(nèi)容添加到新文件中:

#!/bin/shif["x$WILDFLY_HOME"="x"];thenWILDFLY_HOME=/opt/wildflyfiif["x$1"="xdomain"];thenecho'Starting wildfly in domain mode.'$WILDFLY_HOME/bin/domain.sh -c$2-b$3elseecho'Starting wildfly in standalone mode.'$WILDFLY_HOME/bin/standalone.sh -c$2-b$3fi

保存該文件衔瓮,并把它變成可執(zhí)行文件:

chmod755/opt/wildfly/bin/launch.sh

接下來浊猾,創(chuàng)建一個(gè)systemd初始化文件:

vi/etc/systemd/system/wildfly.service

將下面的內(nèi)容添加到新文件中:

[Unit]Description=The wildfly Application ServerAfter=syslog.target network.targetBefore=nginx.service[Service]Environment=LAUNCH_JBOSS_IN_BACKGROUND=1EnvironmentFile=/etc/default/wildflyUser=wildflyLimitNOFILE=102642PIDFile=/var/run/wildfly/wildfly.pidExecStart=/opt/wildfly/bin/launch.sh$WILDFLY_MODE$WILDFLY_CONFIG$WILDFLY_BINDStandardOutput=null[Install]WantedBy=multi-user.target

保存該文件,并設(shè)置文件和目錄的所有權(quán):

chownwildfly:wildfly -R/opt/wildfly/systemctl enable wildfly

我們還需要禁用nginx監(jiān)聽端口80(Wildfly會(huì)處理這個(gè)):

vi/etc/nginx/sites-enabled/default

把下面這行注釋掉:

#listen[::]:80default_server;

接下來热鞍,我們需要?jiǎng)?chuàng)建一個(gè)新的nginx服務(wù)器塊:

vi/etc/nginx/sites-available/wildfly

將下面的內(nèi)容添加到新文件中:

upstream wildfly {? ? server127.0.0.1:8080;}server {? ? listen80;? ? server_name your-domain.com;? ? access_log? /var/log/nginx/wildfly.access.log;? ? error_log? /var/log/nginx/wildfly.error.log;? ? proxy_buffers1664k;? ? proxy_buffer_size128k;location/{? ? ? ? proxy_pass? http://wildfly;proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;? ? ? ? proxy_redirect off;? ? ? ? proxy_set_header? ? Host? ? ? ? ? ? $host;? ? ? ? proxy_set_header? ? X-Real-IP? ? ? $remote_addr;? ? ? ? proxy_set_header? ? X-Forwarded-For$proxy_add_x_forwarded_for;? ? ? ? proxy_set_header? ? X-Forwarded-Proto https;? ? }}

通過命令在nginx和Wildfly之間創(chuàng)建一個(gè)符號(hào)鏈接葫慎,然后啟動(dòng)Wildfly服務(wù),并讓nginx在Wildfly啟動(dòng)時(shí)跟著啟動(dòng):

ln -s/etc/nginx/sites-available/wildfly/etc/nginx/sites-enabled/systemctl enable nginxsystemctl start nginx.servicegroupadd -r wildflyuseradd -r -g wildfly -d/opt/wildfly -s/sbin/nologin wildflysystemctl daemon-reloadsystemctl start wildfly

如果你修改了以上任何內(nèi)容薇宠,請(qǐng)使用以下命令重新啟動(dòng)nginx和Wildfly:

systemctlrestart nginx.service

將.WAR文件部署到Wildfly服務(wù)器

你現(xiàn)在已準(zhǔn)備好將.WAR文件傳輸?shù)絍M偷办。最簡單的方法是使用scp(安全拷貝)。

scp/mnt/c/GitHub/todo-app-java-on-azure/target/todo-app-java-on-azure-1.0-SNAPSHOT.war @< PublicIpAddress>:~/

使用mv命令將文件移動(dòng)到/opt/Wildfly/standalone/deployments/文件夾澄港,Wildfly將自動(dòng)為你啟動(dòng)它椒涯。然后通過以下URL訪問應(yīng)用程序:

http://

做完這些,你就應(yīng)該知道如何在云端Linux VM的Wildfly服務(wù)器上運(yùn)行Java應(yīng)用程序回梧,以及訪問Azure的MySQL數(shù)據(jù)庫废岂。配置步驟有很多,但一旦建立了初始環(huán)境狱意,就可以很容易地設(shè)置部署管道湖苞,將新版本的代碼和數(shù)據(jù)庫推送到Azure環(huán)境中。

一如既往详囤,我們重視你的反饋意見财骨,請(qǐng)告訴我們你的想法!

1藏姐、具有1-5工作經(jīng)驗(yàn)的隆箩,面對(duì)目前流行的技術(shù)不知從何下手,

需要突破技術(shù)瓶頸的可以加羔杨。

2捌臊、在公司待久了,過得很安逸问畅,

但跳槽時(shí)面試碰壁娃属。

需要在短時(shí)間內(nèi)進(jìn)修、跳槽拿高薪的可以加护姆。

3矾端、如果沒有工作經(jīng)驗(yàn),但基礎(chǔ)非常扎實(shí)卵皂,對(duì)java工作機(jī)制秩铆,

常用設(shè)計(jì)思想,常用java開發(fā)框架掌握熟練的灯变,可以加殴玛。

4、覺得自己很牛B添祸,一般需求都能搞定滚粟。

但是所學(xué)的知識(shí)點(diǎn)沒有系統(tǒng)化,很難在技術(shù)領(lǐng)域繼續(xù)突破的可以加刃泌。

5. 群號(hào):高級(jí)架構(gòu)群 Java進(jìn)階群:180705916.備注好信息凡壤!

6.阿里Java高級(jí)大牛直播講解知識(shí)點(diǎn),分享知識(shí)耙替,

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末亚侠,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子俗扇,更是在濱河造成了極大的恐慌硝烂,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铜幽,死亡現(xiàn)場離奇詭異滞谢,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)除抛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門爹凹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人镶殷,你說我怎么就攤上這事禾酱。” “怎么了绘趋?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵颤陶,是天一觀的道長。 經(jīng)常有香客問我陷遮,道長滓走,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任帽馋,我火速辦了婚禮搅方,結(jié)果婚禮上比吭,老公的妹妹穿的比我還像新娘。我一直安慰自己姨涡,他們只是感情好衩藤,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著涛漂,像睡著了一般赏表。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上匈仗,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天瓢剿,我揣著相機(jī)與錄音,去河邊找鬼悠轩。 笑死间狂,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的火架。 我是一名探鬼主播前标,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼距潘!你這毒婦竟也來了炼列?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤音比,失蹤者是張志新(化名)和其女友劉穎俭尖,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體洞翩,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡稽犁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了骚亿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片已亥。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖来屠,靈堂內(nèi)的尸體忽然破棺而出虑椎,到底是詐尸還是另有隱情,我是刑警寧澤俱笛,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布捆姜,位于F島的核電站,受9級(jí)特大地震影響迎膜,放射性物質(zhì)發(fā)生泄漏泥技。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一磕仅、第九天 我趴在偏房一處隱蔽的房頂上張望珊豹。 院中可真熱鬧簸呈,春花似錦、人聲如沸店茶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽忽妒。三九已至,卻和暖如春兼贸,著一層夾襖步出監(jiān)牢的瞬間段直,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來泰國打工溶诞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鸯檬,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓螺垢,卻偏偏與公主長得像喧务,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子枉圃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容