構建一個執行在Azure虛擬機器上的MySQL Spring Boot應用程式
關鍵要點
- 從GitHub中獲取一個簡單的Spring Boot Java應用程式。
- 將應用程式連線到Azure MySQL資料庫服務。
- 在Azure上配置一個執行WildFly的Linux VM。
- 將示例應用程式部署到WildFly伺服器。
最近,我被要求構建一個在 WildFly應用程式平臺 上執行的演示網站,並連線到微軟Azure上的MySQL資料庫。前提看起來似乎很簡單,但實現起來可能很棘手,而且關於如何設定這樣的東西的文件也很有限。我花了很多時間來研究實現這一目標需要做些什麼,我將把步驟分享給大家。
請注意,我使用Nginx作為反向代理伺服器,因為這比在WildFly發行版中使用VM IP地址要容易得多。使用Nginx,我就能夠在內部使用
先決條件:
克隆GitHub示例
通過命令控制檯進入到某個工作目錄,並克隆 示例程式碼庫 。
通過命令列驗證你的Azure帳戶憑證
你需要一個Azure帳戶來完成這些步驟。你可以在這裡獲得 免費試用賬號 。要確保你已登入到自己的Azure帳戶,然後輸入az account list。如果你尚未登入,請輸入az login,然後按照提示操作。
使用Azure CLI建立Azure MySQL資料庫
接下來,讓我們使用 Azure CLI 建立一個 Azure MySQL資料庫 。我們將在命令列視窗中使用Azure CLI 2.0來建立資源組和MySQL例項。
Azure命令列介面(CLI)是在Mac、Linux和Windows的命令列中操作Azure的得力助手。它相容POSIX,使用Python編寫,並 在GitHub上開源 。CLI可以在Mac和Linux上的命令列視窗內執行,在Windows上,你可以通過命令提示符或Windows的Linux子系統(也就是 Windows上的Bash )來訪問CLI。甚至還有 適用於IOS和Android的CLI應用程式 。
登入並建立資源組
使用az login命令登入Azure,然後按照螢幕上的說明進行操作。
建立Azure資源組
Azure資源組 將Azure服務作為單位進行管理。每個資源組都必須對應一個位置。要檢視−−location--location的所有可能值,請使用az appservice list-locations命令。
以下示例在北歐地區建立了一個Azure資源組。
az group create --name myResourceGroup --location “North Europe”
建立一個MySQL伺服器
在Azure中建立MySQL伺服器。將下面命令中的<mysqlservername><mysqlservername>佔位符換成你自己的MySQL伺服器名稱。這個名稱是你的MySQL伺服器的主機名“<mysql_server_name> .mysql.database.azure.com”的一部分,因此它必須是全域性唯一的。也可以用自己的值替換<adminuser><adminuser>和<adminpassword><adminpassword>:
az mysql server create --name <mysql_server_name> --resource-group myResourceGroup --location "North Europe" --admin-user <admin_user> --admin-password <admin_password>
配置MySQL防火牆
使用az mysql server firewall-rule create命令為MySQL伺服器建立防火牆規則。下面是為一個IP地址範圍建立防火牆規則的示例(你可能希望縮小實際的防火牆IP地址範圍):
az mysql server firewall-rule create --name allIPs --server <mysql_server_name> --resource-group myResourceGroup --start-ip-address 0.0.0.0 --end-ip-address 255.255.255.255
配置Azure MySQL資料庫
使用之前為“<admin_user>”和“<mysql_server_name>”指定的值連線到MySQL伺服器。
mysql -u <admin_user>@<mysql_server_name> -h <mysql_server_name>.mysql.database.azure.com -P 3306 -p
在mysqlmysql提示符下,建立資料庫和表。
CREATE DATABASE tododb;
建立一個數據庫使用者,並在→dodb→dodb資料庫中賦予它所有許可權。用你自己唯一的應用程式名稱替換佔位符<Javaappuser><Javaappuser>和<Javaapppassword><Javaapppassword>:
CREATE USER '<Javaapp_user>' IDENTIFIED BY '<Javaapp_password>'; GRANT ALL PRIVILEGES ON tododb.* TO '<Javaapp_user>';
鍵入quitquit退出伺服器連線。
更新application.properties檔案中的值
更新src/main/resources/application.properties中的以下幾個值:
spring.datasource.url=jdbc:mysql://@<mysql_server_name>.mysql.database.azure.com:3306/tododb [email protected]<mysql_server_name> spring.datasource.password=password spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.jpa.hibernate.ddl-auto=update
構建並執行示例
使用程式碼庫中的Maven包裝器在本地構建和執行示例:
mvn package spring-boot:run
在瀏覽器中,開啟 http://localhost:8080 ,確保在我們將程式包傳送到Azure上的VM之前應用程式可以正常執行。
配置Maven以生成.WAR檔案
要將應用程式部署到vm,我們需要使用mvn package命令來部署.war檔案。maven已經生成了一個.jar檔案,我們需要將一個.WAR檔案部署到Firefly。只需將這一行新增到pom.xml中:
<packaging>war</packaging>
現在,在與pom.xml相同的位置執行mvn clean package,在目標目錄中生成名為todo-app-java-on-azure-1.0-SNAPSHOT.war的.WAR檔案。
在Azure上建立Linux VM
有幾種方法可以在Azure上建立新的Linux VM,在本文中,我們將使用命令列,使用az vm create命令。
這個命令會建立一個Linux VM,其中包含azure上可用的最新Ubuntu映象:
az vm create -n <vm name> -g <resource group> -l eastus2 --generate-ssh-key --image ubuntults
開啟埠8080和9990
接下來,在目標VM上開啟埠8080和9990。Spring Boot將埠8080用於應用程式,Wildfly使用埠9990進行管理訪問。當你在VM上開啟多個埠時必須設定優先順序,因此將Wildfly的埠(我使用800)設定為比Spring(保留預設值100)低。優先順序範圍可以從100到4096。
az vm open-port -n <vm name> -g <resource group> --port 8080 az vm open-port -n <vm name> -g <resource group> --port 9990 --priority 800
SSH到虛擬機器
使用az vm create命令生成的SSH金鑰連線到VM。使用你的VM使用者名稱替換<username>,預設是帳號電子郵件@左邊的部分。
ssh <username>@<PublicIpAddress>
然後你會收到下面的提示,輸入yes。
The authenticity of host '< PublicIpAddress> (< PublicIpAddress>)' can't be established. ECDSA key fingerprint is ………… Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added < PublicIpAddress> (ECDSA) to the list of known hosts.
準備VM
更新並安裝OpenJDK和nginx
現在,我們在虛擬機器中,讓我們確保我們擁有最新的Linux,然後安裝我們需要的軟體。我們使用nginx作為反向代理,並配置Wildfly,將其作為服務執行。我們還需要Java,因此我們需要安裝OpenJDK 8。
使用nginx意味著Wildfly伺服器可以使用預設值(127.0.0.1)在任何VM上執行。否則,我們必須使用VM的公共IP地址。在叢集或容器化的環境中,如果不使用nginx,Wildfly就會變得不靈活。在演示環境,我們可以跳過一些配置步驟(這些已經足夠了)。
apt-get update apt-get install -y openjdk-8* apt-get install nginx
安裝Wildfly,並將其設定為服務
接下來,讓我們安裝並配置Wildfly。Wildfly不能通過apt-get安裝,所以我們需要使用wget從伺服器中下載。
wget http://download.jboss.org/wildfly/12.0.0.Final/wildfly-12.0.0.Final.tar.gz mv wildfly-12.0.0.Final.tar.gz /opt/ cd /opt/ tar -zvxf wildfly-12.0.0.Final.tar.gz mv wildfly-12.0.0.Final wildfly
現在我們有了Wildfly,接下來需要新增一個管理使用者來處理管理任務:
cd wildfly/bin ./add-user.sh
以下是你將看到的提示以及我提供的答案:
What type of user do you wish to add? a) Management User (mgmt-users.properties) b) Application User (application-users.properties) (a): a Enter the details of the new user to add. Using realm 'ManagementRealm' as discovered from the existing property files. Username : Password : ! What groups do you want this user to belong to? (Please enter a comma separated list, or leave blank for none)[ ]: About to add user 'rhsotdemo1' for realm 'ManagementRealm' Is this correct yes/no? yes Is this new user going to be used for one AS process to connect to another AS process? e.g. for a slave host controller connecting to the master or for a Remoting connection for server to server EJB calls. yes/no? no
接下來,我們將在Widfly中配置一些有關VM的資訊:
cd /opt/wildfly/bin/ vi standalone.conf
新增或編輯以下內容:
JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64" JBOSS_HOME="/opt/wildfly"
將Wildfly配置為自啟動
將Wildfly配置為在VM啟動(或重新啟動)時自動啟動,方法是新增以下檔案:
vi /etc/default/wildfly
將以下這些新增到新檔案中:
WILDFLY_USER="wildfly" STARTUP_WAIT=180 SHUTDOWN_WAIT=30 WILDFLY_CONFIG=standalone.xml WILDFLY_MODE=standalone WILDFLY_BIND=0.0.0.0
儲存檔案,然後再建立一個新檔案:
vi /opt/wildfly/bin/launch.sh
將下面的內容新增到新檔案中:
#!/bin/sh if [ "x$WILDFLY_HOME" = "x" ]; then WILDFLY_HOME=/opt/wildfly fi if [ "x$1" = "xdomain" ]; then echo 'Starting wildfly in domain mode.' $WILDFLY_HOME/bin/domain.sh -c $2 -b $3 else echo 'Starting wildfly in standalone mode.' $WILDFLY_HOME/bin/standalone.sh -c $2 -b $3 fi
儲存該檔案,並把它變成可執行檔案:
chmod 755 /opt/wildfly/bin/launch.sh
接下來,建立一個systemd初始化檔案:
vi /etc/systemd/system/wildfly.service
將下面的內容新增到新檔案中:
[Unit] Description=The wildfly Application Server After=syslog.target network.target Before=nginx.service [Service] Environment=LAUNCH_JBOSS_IN_BACKGROUND=1 EnvironmentFile=/etc/default/wildfly User=wildfly LimitNOFILE=102642 PIDFile=/var/run/wildfly/wildfly.pid ExecStart=/opt/wildfly/bin/launch.sh $WILDFLY_MODE $WILDFLY_CONFIG $WILDFLY_BIND StandardOutput=null [Install] WantedBy=multi-user.target
儲存該檔案,並設定檔案和目錄的所有權:
chown wildfly:wildfly -R /opt/wildfly/ systemctl enable wildfly
我們還需要禁用nginx監聽埠80(Wildfly會處理這個):
vi /etc/nginx/sites-enabled/default
把下面這行註釋掉:
#listen [::]:80 default_server;
接下來,我們需要建立一個新的nginx伺服器塊:
vi /etc/nginx/sites-available/wildfly
將下面的內容新增到新檔案中:
upstream wildfly { server 127.0.0.1:8080; } server { listen 80; server_name your-domain.com; access_log /var/log/nginx/wildfly.access.log; error_log /var/log/nginx/wildfly.error.log; proxy_buffers 16 64k; proxy_buffer_size 128k; 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之間建立一個符號連結,然後啟動Wildfly服務,並讓nginx在Wildfly啟動時跟著啟動:
ln -s /etc/nginx/sites-available/wildfly /etc/nginx/sites-enabled/ systemctl enable nginx systemctl start nginx.service groupadd -r wildfly useradd -r -g wildfly -d /opt/wildfly -s /sbin/nologin wildfly systemctl daemon-reload systemctl start wildfly
如果你修改了以上任何內容,請使用以下命令重新啟動nginx和Wildfly:
systemctl restart nginx.service
將.WAR檔案部署到Wildfly伺服器
你現在已準備好將.WAR檔案傳輸到VM。最簡單的方法是使用scp(安全拷貝)。
scp /mnt/c/GitHub/todo-app-java-on-azure/target/todo-app-java-on-azure-1.0-SNAPSHOT.war <username>@< PublicIpAddress>:~/
使用mv命令將檔案移動到/opt/Wildfly/standalone/deployments/資料夾,Wildfly將自動為你啟動它。然後通過以下URL訪問應用程式:
http://<VMPublicIpAddress>
做完這些,你就應該知道如何在雲端Linux VM的Wildfly伺服器上執行Java應用程式,以及訪問Azure的MySQL資料庫。配置步驟有很多,但一旦建立了初始環境,就可以很容易地設定部署管道,將新版本的程式碼和資料庫推送到Azure環境中。
一如既往,我們重視你的反饋意見,請告訴我們你的想法!
1、具有1-5工作經驗的,面對目前流行的技術不知從何下手,
需要突破技術瓶頸的可以加。
2、在公司待久了,過得很安逸,
但跳槽時面試碰壁。
需要在短時間內進修、跳槽拿高薪的可以加。
3、如果沒有工作經驗,但基礎非常紮實,對java工作機制,
常用設計思想,常用java開發框架掌握熟練的,可以加。
4、覺得自己很牛B,一般需求都能搞定。
但是所學的知識點沒有系統化,很難在技術領域繼續突破的可以加。
5. 群號:高階架構群 Java進階群:180705916.備註好資訊!
6.阿里Java高階大牛直播講解知識點,分享知識,
相關推薦
構建一個執行在Azure虛擬機器上的MySQL Spring Boot應用程式
關鍵要點 從GitHub中獲取一個簡單的Spring Boot Java應用程式。 將應用程式連線到Azure MySQL資料庫服務。 在Azure上配置一個執行WildFly的Linux VM。 將示例應用程式部署到WildFly伺服器。 最近,我被要求構建一個在
故障排除:無法啟動、訪問或連線到 Azure 虛擬機器上執行的應用程式
有多種原因可導致無法啟用或連線到在 Azure 虛擬機器 (VM) 上執行的應用程式。原因包括應用程式未在預期埠上執行或偵聽、偵聽埠受到阻止,或網路規則未將流量正確傳遞到應用程式。本文說明有條理地找到問題並更正問題。 如果在使用 RDP 或 SSH 連線到 VM 時發生
.net 判斷程式是否執行在虛擬機器上 (方法2)
前面寫過一種方法是用第三方的dll來判斷是否執行在虛擬機器中,但是那個方法只能在32位下執行。 http://blog.csdn.net/fhl812432059/article/details/51
在Azure虛擬機器上開啟OpenVPN
不少人都想嘗試在雲虛擬機器上開啟VPN服務,從而實現本地到遠端的內網連線。Azure禁用了GRE、PPTP、IPSEC等網路服務,只能允許TCP/UDP協議訪問虛擬機器,這對通常的VPN架設方法產生了一些障礙,唯一的選擇,是採用Windows Azure本身提供的虛擬網路V
Spring Boot應用程式在啟動時執行一些操作的方法
如果想在生成物件時候完成某些初始化操作,而偏偏這些初始化操作又依賴於依賴注入,那麼就無法在建構函式中實現。為此,可以使用@PostConstruct註解一個方法來完成初始化,@PostConstruct註解的方法將會在依賴注入完成後被自動呼叫。 @PostConstruct是spring框架的註
在Docker環境開發一個Java 8 Spring Boot應用程式
本文旨在讓你瞭解:在你的機器上,不需要Java 8的情況下如何建立一個Java應用程式。就像Python的虛擬環境一樣,那麼這裡我們可以使用Docker。 Python開發人員使用的虛擬環境,用於為不同的專案建立和管理獨立的環境,每個使用不同版本的Python
使用Payara資料來源在Payara伺服器下執行Spring Boot應用程式
步驟1:在Payara 5中新增Connector / J(JDBC MySQL Connector) 為了與MySQL通訊,似鯖水狼牙魚需要聯結器/ J。下載並解壓縮Connector / J的存檔後,找到名為mysql-connector-java-5.1.47.jar的JAR檔案 
在Linux系統上安裝Spring boot應用
Unix/Linux 服務 systemd 服務 操作過程 1. 安裝了JDK的centOS7虛擬機器 注意下載linux版本JDK的時候不能直接通過wget這種直接連結下載,否則會解壓不成功,應該開啟原官網,點選同意許可後點擊下載(這種方式下載很慢),比較好的方式是複製下載頁的地址到迅雷,通過迅雷開
虛擬機器上執行AntDesignPro
步驟: 1. 保證linux虛擬機器正常執行和訪問網路 2. 保證yum install git 正常 , 以及wget 命令正常 3. 正確安裝nodejs ,並能通過node -v 和npm -v檢驗正確安裝 ,通過npm 安裝yarn , 通過y
如何在本地遠端連線linux虛擬機器上面的mysql
檢查遠端的虛擬機器是否可以ping通過 檢視虛擬機器IP為192.168.38.128 cmd視窗ping 192.168.38.128,出現如下介面說明是可以的 檢查虛擬機器mysql的埠號是否對外開通 比如我們能用xshell等
首次部署虛擬機器上且執行javaweb專案
準備工作:環境win7;軟體:vm軟體(Oracle VM VirtualBox)、Centos 7 (容量4G+版本,會自帶很多外掛)、mysql、 第一次獨自安裝虛擬機器,由於公司網路環境限制問題,來來回回安裝了不下5遍,遇到各種問題,都不知道怎麼解決。
在CentOS7上執行KVM虛擬機器
準備工作 檢查CPU特性 CPU應該支援vmx特性以更好地執行KVM虛擬機器:lscpu | grep vmx 安裝必要的軟體包 sudo yum install -y epel-release net-tools vim unzip zip wget ftp
在Win10上用Hyper-V執行Kali虛擬機器
下載完成之後你會看到如下檔案: 這裡我們只需要用到”Virtual Hard Disks”資料夾裡面的”Kali-Linux-2017.1-hyperv-amd64.vhdx”就可以了。我把這個檔案拷貝到了Hyper-V虛擬硬碟的預設目錄,當然你可
openstack 填坑筆記5:openstack虛擬機器上再構建內層openstack(雲上雲)網路除錯
openstack 最複雜的部分是網路,這兩天除錯了網路問題,解決經驗值得記錄備用我的需求是在學生實踐中需要在openstack環境的虛擬機器中再構建openstack環境,以供實踐實習使用,構建基礎是:三個網路在外層openstack構建: vxlan101 192.16
安卓開發問題一:在虛擬機器上執行APP不能執行,即閃退現象
在執行程式時,出現了虛擬機器上開啟自己寫的APP,提示不能執行,也就是閃退的現象。找了好多論壇,基本上是模擬器與API版本不同導致的,我的後來換了一個AVD裝置,莫名其妙的就自己好了 現將解決方法整理如下: 1、project->clean(測試無用) 2、在Mai
物理機上不能通過Navicat連線虛擬機器上安裝的mysql解決辦法
授權即可 1.授權方式--你想myuser使用mypassword從任何主機連線到mysql伺服器的話 GRANT ALL PRIVILEGES ON *.* TO 'myu
如何將一個已有的vdi檔案attach到一個虛擬機器上
環境:Linux Suse + Vbox 一個vbox的虛擬機器的主體其實就是一個vdi檔案,如果虛擬機器由於某種原因無法正常執行,而其中又儲存了一些重要資料,此時如果要訪問這些資料,可以新建一個虛擬機器,然後將原有的虛擬機器vdi檔案作為一個harddisk attac
Android 判斷程式是否在虛擬機器上執行
/** * 根據部分特徵引數裝置資訊來判斷是否為模擬器 * * @return true 為模擬器 */ private static boolean isFeatures() { return Bui
虛擬機器上設定一個新的網絡卡
1.cat /etc/udev/rules.d/70-persistent-net.rules 會列出所有已知的網絡卡 找到新新增的網絡卡,記錄NAME(用eth1暫代新的名字)與ATTR{address} 2.進到/etc/sys
[原]NDK程式在虛擬機器上執行出現signal 4 (SIGILL), fault addr 錯誤的原因及解決方法
終於到了移植的最後一步 ,但是編譯出來的SO檔案加入工程後在虛擬機器上總是無法執行,檢視DDMS發現報錯 03-14 10:43:08.623: INFO/DEBUG(28): signal 4 (SIGILL), fault addr 80a43224 03-14 10: