1. 程式人生 > >構建一個執行在Azure虛擬機器上的MySQL Spring Boot應用程式

構建一個執行在Azure虛擬機器上的MySQL Spring Boot應用程式

關鍵要點

  • 從GitHub中獲取一個簡單的Spring Boot Java應用程式。
  • 將應用程式連線到Azure MySQL資料庫服務。
  • 在Azure上配置一個執行WildFly的Linux VM。
  • 將示例應用程式部署到WildFly伺服器。

最近,我被要求構建一個在 WildFly應用程式平臺 上執行的演示網站,並連線到微軟Azure上的MySQL資料庫。前提看起來似乎很簡單,但實現起來可能很棘手,而且關於如何設定這樣的東西的文件也很有限。我花了很多時間來研究實現這一目標需要做些什麼,我將把步驟分享給大家。

請注意,我使用Nginx作為反向代理伺服器,因為這比在WildFly發行版中使用VM IP地址要容易得多。使用Nginx,我就能夠在內部使用 

http://127.0.0.1 。這樣還能夠在雲環境中更輕鬆地使用叢集和擴充套件WildFly。



先決條件:

克隆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: