构建一个运行在Azure虚拟机上的MySQL Spring Boot应用程序

栏目: 编程工具 · 发布时间: 6年前

内容简介:最近,我被要求构建一个在请注意,我使用Nginx作为反向代理服务器,因为这比在WildFly发行版中使用VM IP地址要容易得多。使用Nginx,我就能够在内部使用

关键要点

  • 从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虚拟机上的MySQL Spring Boot应用程序 

先决条件:

克隆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服务器。将下面命令中的`<mysql_server_name>`占位符换成你自己的MySQL服务器名称。这个名称是你的MySQL服务器的主机名“<mysql_server_name> .mysql.database.azure.com”的一部分,因此它必须是全局唯一的。也可以用自己的值替换`<admin_user>`和`<admin_password>`:

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

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

CREATE DATABASE tododb;

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

CREATE USER '<Javaapp_user>' IDENTIFIED BY '<Javaapp_password>'; 
GRANT ALL PRIVILEGES ON tododb.* TO '<Javaapp_user>';

键入`quit`退出服务器连接。

更新application.properties文件中的值

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

spring.datasource.url=jdbc:mysql://@<mysql_server_name>.mysql.database.azure.com:3306/tododb
spring.datasource.username=adminname@<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环境中。

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

关于作者

构建一个运行在Azure虚拟机上的MySQL Spring Boot应用程序 Brian Benz 是微软的Senior Cloud Developer Advocate,帮助Java开发人员充分利用Azure。在加入微软之前,他是IBM、德勤和其他公司的解决方案架构师、顾问、开发人员、作者和演讲者。可以通过@bbenz在Twitter上与他取得联系。

查看英文原文: Build a MySQL Spring Boot App Running on WildFly on an Azure VM


以上所述就是小编给大家介绍的《构建一个运行在Azure虚拟机上的MySQL Spring Boot应用程序》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Head First HTML and CSS

Head First HTML and CSS

Elisabeth Robson、Eric Freeman / O'Reilly Media / 2012-9-8 / USD 39.99

Tired of reading HTML books that only make sense after you're an expert? Then it's about time you picked up Head First HTML and really learned HTML. You want to learn HTML so you can finally create th......一起来看看 《Head First HTML and CSS》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

在线进制转换器
在线进制转换器

各进制数互转换器

SHA 加密
SHA 加密

SHA 加密工具