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

weixin_34253539發表於2018-09-04
\

關鍵要點

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

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

\\

請注意,我使用Nginx作為反向代理伺服器,因為這比在WildFly發行版中使用VM IP地址要容易得多。使用Nginx,我就能夠在內部使用http://127.0.0.1。這樣還能夠在雲環境中更輕鬆地使用叢集和擴充套件WildFly。

\\

44c6e8e5ff960a5dba5b6efc2ab08eb2.jpg

\\

先決條件:

\\

克隆GitHub示例

\\

通過命令控制檯進入到某個工作目錄,並克隆示例程式碼庫

\\

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

\\

通過命令列驗證你的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應用程式

\\

你還可以通過瀏覽器訪問azure portalshell.azure.com來使用Azure CLI。你可以在此處找到有關shell的更多資訊,以及合作伙伴的CLI的資訊。請注意,所有這些都需要一個微軟Azure帳戶(此處可以申請免費試用)。

\\

登入並建立資源組

\\

使用az login命令登入Azure,然後按照螢幕上的說明進行操作。

\\

建立Azure資源組

\\

Azure資源組將Azure服務作為單位進行管理。每個資源組都必須對應一個位置。要檢視`--location`的所有可能值,請使用az appservice list-locations命令。

\\

以下示例在北歐地區建立了一個Azure資源組。

\\
\az group create --name myResourceGroup --location “North Europe”
\\

建立一個MySQL伺服器

\\

在Azure中建立MySQL伺服器。將下面命令中的`\u0026lt;mysql_server_name\u0026gt;`佔位符換成你自己的MySQL伺服器名稱。這個名稱是你的MySQL伺服器的主機名“\u0026lt;mysql_server_name\u0026gt; .mysql.database.azure.com”的一部分,因此它必須是全域性唯一的。也可以用自己的值替換`\u0026lt;admin_user\u0026gt;`和`\u0026lt;admin_password\u0026gt;`:

\\
\az mysql server create --name \u0026lt;mysql_server_name\u0026gt; --resource-group myResourceGroup --location \"North Europe\" --admin-user \u0026lt;admin_user\u0026gt; --admin-password \u0026lt;admin_password\u0026gt;
\\

配置MySQL防火牆

\\

使用az mysql server firewall-rule create命令為MySQL伺服器建立防火牆規則。下面是為一個IP地址範圍建立防火牆規則的示例(你可能希望縮小實際的防火牆IP地址範圍):

\\
\az mysql server firewall-rule create --name allIPs --server \u0026lt;mysql_server_name\u0026gt; --resource-group myResourceGroup --start-ip-address 0.0.0.0 --end-ip-address 255.255.255.255
\\

配置Azure MySQL資料庫

\\

使用之前為“\u0026lt;admin_user\u0026gt;”和“\u0026lt;mysql_server_name\u0026gt;”指定的值連線到MySQL伺服器。

\\
\mysql -u \u0026lt;admin_user\u0026gt;@\u0026lt;mysql_server_name\u0026gt; -h \u0026lt;mysql_server_name\u0026gt;.mysql.database.azure.com -P 3306 -p
\\

在`mysql`提示符下,建立資料庫和表。

\\
\CREATE DATABASE tododb;
\\

建立一個資料庫使用者,並在`tododb`資料庫中賦予它所有許可權。用你自己唯一的應用程式名稱替換佔位符`\u0026lt;Javaapp_user\u0026gt;`和`\u0026lt;Javaapp_password\u0026gt;`:

\\
\CREATE USER '\u0026lt;Javaapp_user\u0026gt;' IDENTIFIED BY '\u0026lt;Javaapp_password\u0026gt;'; \GRANT ALL PRIVILEGES ON tododb.* TO '\u0026lt;Javaapp_user\u0026gt;';
\\

鍵入`quit`退出伺服器連線。

\\

更新application.properties檔案中的值

\\

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

\\
\spring.datasource.url=jdbc:mysql://@\u0026lt;mysql_server_name\u0026gt;.mysql.database.azure.com:3306/tododb\spring.datasource.username=adminname@\u0026lt;mysql_server_name\u0026gt;\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中:

\\
\\u0026lt;packaging\u0026gt;war\u0026lt;/packaging\u0026gt;
\\

現在,在與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 \u0026lt;vm name\u0026gt; -g \u0026lt;resource group\u0026gt; -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 \u0026lt;vm name\u0026gt; -g \u0026lt;resource group\u0026gt;  --port 8080\az vm open-port -n \u0026lt;vm name\u0026gt; -g \u0026lt;resource group\u0026gt;  --port 9990 --priority 800
\\

SSH到虛擬機器

\\

使用az vm create命令生成的SSH金鑰連線到VM。使用你的VM使用者名稱替換\u0026lt;username\u0026gt;,預設是帳號電子郵件@左邊的部分。

\\
\ssh \u0026lt;username\u0026gt;@\u0026lt;PublicIpAddress\u0026gt;
\\

然後你會收到下面的提示,輸入yes。

\\
\The authenticity of host '\u0026lt; PublicIpAddress\u0026gt; (\u0026lt; PublicIpAddress\u0026gt;)' can't be established.\ECDSA key fingerprint is …………\Are you sure you want to continue connecting (yes/no)? yes\Warning: Permanently added \u0026lt; PublicIpAddress\u0026gt; (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 \u0026lt;username\u0026gt;@\u0026lt; PublicIpAddress\u0026gt;:~/
\\

使用mv命令將檔案移動到/opt/Wildfly/standalone/deployments/資料夾,Wildfly將自動為你啟動它。然後通過以下URL訪問應用程式:

\\

http://\u0026lt;VMPublicIpAddress\u0026gt;

\\

做完這些,你就應該知道如何在雲端Linux VM的Wildfly伺服器上執行Java應用程式,以及訪問Azure的MySQL資料庫。配置步驟有很多,但一旦建立了初始環境,就可以很容易地設定部署管道,將新版本的程式碼和資料庫推送到Azure環境中。

\\

一如既往,我們重視你的反饋意見,請告訴我們你的想法!

\\

關於作者

\\

5b5ba44034fbe90de5809b2cd895749d.jpgBrian Benz 是微軟的Senior Cloud Developer Advocate,幫助Java開發人員充分利用Azure。在加入微軟之前,他是IBM、德勤和其他公司的解決方案架構師、顧問、開發人員、作者和演講者。可以通過@bbenz在Twitter上與他取得聯絡。

\\\\

檢視英文原文Build a MySQL Spring Boot App Running on WildFly on an Azure VM

相關文章