构建一个运行在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。

先决条件:

一个Azure帐户( 此处免费试用 )

一个Git客户端

Azure CLI 2.0

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--location的所有可能值,请使用az appservice list-locations命令。

以下示例在北欧地区创建了一个Azure资源组。

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

创建一个MySQL服务器

在Azure中创建MySQL服务器。将下面命令中的占位符换成你自己的MySQL服务器名称。这个名称是你的MySQL服务器的主机名“ .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服务器创建防火墙规则。下面是为一个IP地址范围创建防火墙规则的示例(你可能希望缩小实际的防火墙IP地址范围):

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

配置Azure MySQL数据库

使用之前为“”和“”指定的值连接到MySQL服务器。

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

在mysqlmysql提示符下,创建数据库和表。

CREATEDATABASEtododb;

创建一个数据库用户,并在→dodb→dodb数据库中赋予它所有权限。用你自己唯一的应用程序名称替换占位符和:

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

键入quitquit退出服务器连接。

更新application.properties文件中的值

更新src/main/resources/application.properties中的以下几个值:

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

构建并运行示例

使用代码库中的Maven包装器在本地构建和运行示例:

mvn package spring-boot:run

在浏览器中,打开 http://localhost:8080 ,确保在我们将程序包发送到Azure上的VM之前应用程序可以正常运行。

配置Maven以生成.WAR文件

要将应用程序部署到vm,我们需要使用mvn package命令来部署.war文件。maven已经生成了一个.jar文件,我们需要将一个.WAR文件部署到Firefly。只需将这一行添加到pom.xml中:

war

现在,在与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 vmcreate-n -g -l eastus2--generate-ssh-key --image ubuntults

打开端口8080和9990

接下来,在目标VM上打开端口8080和9990。Spring Boot将端口8080用于应用程序,Wildfly使用端口9990进行管理访问。当你在VM上打开多个端口时必须设置优先级,因此将Wildfly的端口(我使用800)设置为比Spring(保留默认值100)低。优先级范围可以从100到4096。

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

SSH到虚拟机

使用az vm create命令生成的SSH密钥连接到VM。使用你的VM用户名替换,默认是帐号电子邮件@左边的部分。

ssh@

然后你会收到下面的提示,输入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.

准备VM

更新并安装OpenJDK和nginx

现在,我们在虚拟机中,让我们确保我们拥有最新的Linux,然后安装我们需要的软件。我们使用nginx作为反向代理,并配置Wildfly,将其作为服务运行。我们还需要Java,因此我们需要安装OpenJDK 8。

使用nginx意味着Wildfly服务器可以使用默认值(127.0.0.1)在任何VM上运行。否则,我们必须使用VM的公共IP地址。在集群或容器化的环境中,如果不使用nginx,Wildfly就会变得不灵活。在演示环境,我们可以跳过一些配置步骤(这些已经足够了)。

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

安装Wildfly,并将其设置为服务

接下来,让我们安装并配置Wildfly。Wildfly不能通过apt-get安装,所以我们需要使用wget从服务器中下载。

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

现在我们有了Wildfly,接下来需要添加一个管理用户来处理管理任务:

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中配置一些有关VM的信息:

cd/opt/wildfly/bin/vistandalone.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=180SHUTDOWN_WAIT=30WILDFLY_CONFIG=standalone.xmlWILDFLY_MODE=standaloneWILDFLY_BIND=0.0.0.0

保存文件,然后再创建一个新文件:

vi/opt/wildfly/bin/launch.sh

将下面的内容添加到新文件中:

#!/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

保存该文件,并把它变成可执行文件:

chmod755/opt/wildfly/bin/launch.sh

接下来,创建一个systemd初始化文件:

vi/etc/systemd/system/wildfly.service

将下面的内容添加到新文件中:

[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

保存该文件,并设置文件和目录的所有权:

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

我们还需要禁用nginx监听端口80(Wildfly会处理这个):

vi/etc/nginx/sites-enabled/default

把下面这行注释掉:

#listen[::]:80default_server;

接下来,我们需要创建一个新的nginx服务器块:

vi/etc/nginx/sites-available/wildfly

将下面的内容添加到新文件中:

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之间创建一个符号链接,然后启动Wildfly服务,并让nginx在Wildfly启动时跟着启动:

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

如果你修改了以上任何内容,请使用以下命令重新启动nginx和Wildfly:

systemctlrestart 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 @< PublicIpAddress>:~/

使用mv命令将文件移动到/opt/Wildfly/standalone/deployments/文件夹,Wildfly将自动为你启动它。然后通过以下URL访问应用程序:

http://

做完这些,你就应该知道如何在云端Linux VM的Wildfly服务器上运行Java应用程序,以及访问Azure的MySQL数据库。配置步骤有很多,但一旦建立了初始环境,就可以很容易地设置部署管道,将新版本的代码和数据库推送到Azure环境中。

一如既往,我们重视你的反馈意见,请告诉我们你的想法!

1、具有1-5工作经验的,面对目前流行的技术不知从何下手,

需要突破技术瓶颈的可以加。

2、在公司待久了,过得很安逸,

但跳槽时面试碰壁。

需要在短时间内进修、跳槽拿高薪的可以加。

3、如果没有工作经验,但基础非常扎实,对java工作机制,

常用设计思想,常用java开发框架掌握熟练的,可以加。

4、觉得自己很牛B,一般需求都能搞定。

但是所学的知识点没有系统化,很难在技术领域继续突破的可以加。

5. 群号:高级架构群 Java进阶群:180705916.备注好信息!

6.阿里Java高级大牛直播讲解知识点,分享知识,

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容