構建一個執行在Azure虛擬機器上的MySQL Spring Boot應用程式
\\\關鍵要點
\\
- 從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。
\\\\先決條件:
\\- 一個Azure帳戶(此處免費試用)\\t
- 一個Git客戶端\\t
- Azure CLI 2.0\\t
- Java 7 JDK或更高版本\
克隆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 portal或shell.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環境中。
\\一如既往,我們重視你的反饋意見,請告訴我們你的想法!
\\關於作者
\\Brian Benz 是微軟的Senior Cloud Developer Advocate,幫助Java開發人員充分利用Azure。在加入微軟之前,他是IBM、德勤和其他公司的解決方案架構師、顧問、開發人員、作者和演講者。可以通過@bbenz在Twitter上與他取得聯絡。
\\\\檢視英文原文:Build a MySQL Spring Boot App Running on WildFly on an Azure VM
相關文章
- 設定Jenkins伺服器構建Spring Boot應用程式 - MarcusJenkins伺服器Spring Boot
- Microsoft Azure News(4) Azure新D系列虛擬機器上線ROS虛擬機
- Spring Boot 之路(一):一個簡單的Spring Boot應用Spring Boot
- Azure App Service(一)利用Azure DevOps Pipeline 構建映象,部署應用程式APPdev
- Azure DevOps(一)利用Azure DevOps Pipeline 構建應用程式映象到AWS ECRdev
- 從零開始寫一個執行在 Kubernetes 叢集上的 Gin 應用
- Spring Boot 中 10 行程式碼構建 RESTful 風格應用Spring Boot行程REST
- 縮減Azure上Linux虛擬機器系統盤容量Linux虛擬機
- Podman中如何執行一個 Linux 虛擬機器?Linux虛擬機
- Spring Boot虛擬執行緒與Webflux在JWT驗證和MySQL查詢上的效能比較Spring Boot執行緒WebUXJWTMySql
- 五、Spring Web應用程式構建SpringWeb
- 基於 Spring Boot 2.0 構建一個 RESTful WebServiceSpring BootRESTWeb
- 構建Spring Boot應用的微服務服務動態路由Spring Boot微服務路由
- 構建Spring Boot應用的效能監控與最佳化Spring Boot
- VMware虛擬機器優化,提高虛擬機器執行速度的方法?虛擬機優化
- 用 golang 寫一個語言(編譯器,虛擬機器)Golang編譯虛擬機
- 【Azure DevOps系列】Azure DevOps構建併發布.NET5應用程式dev
- 構建第一個基於 Gradle 的 Spring Boot 專案GradleSpring Boot
- 使用 Spring Boot 構建可重用的模擬模組Spring Boot
- Android上的ART虛擬機器Android虛擬機
- Android上的Dalvik虛擬機器Android虛擬機
- apache虛擬web主機構建ApacheWeb
- Spring Boot 應用程式中的 QueryDSLSpring Boot
- 使用 sshuttle 構建一個窮人的虛擬專網
- 使用 shuttle 構建一個窮人的虛擬專網
- 構建Spring Boot應用的微服務服務監控與告警Spring Boot微服務
- “Hello,Jetpack”:構建您的第一個Jetpack應用程式Jetpack
- Java 虛擬機器之三:Java虛擬機器的記憶體結構Java虛擬機記憶體
- Centos 7 構建虛擬Web主機CentOSWeb
- Dalvik虛擬機器、Java虛擬機器與ART虛擬機器虛擬機Java
- ABAP report的遞迴submit和在虛擬機器裡再次啟動另一個虛擬機器遞迴MIT虛擬機
- 我寫了一個TypeScript虛擬機器。TypeScript虛擬機
- tomcat中虛擬主機以及web應用程式的配置TomcatWeb
- VirtureBox如何執行VM的虛擬機器虛擬機
- 如何用Visual Studio Code遠端除錯執行在伺服器上的nodejs應用除錯伺服器NodeJS
- 使用 SAP BTP 建立一個 Spring Boot Java 應用Spring BootJava
- 深入理解虛擬機器之虛擬機器位元組碼執行引擎虛擬機
- 深入學習Java虛擬機器——虛擬機器位元組碼執行引擎Java虛擬機