领先一步
VMware 提供培训和认证,以加速您的进步。
了解更多这是包含 6 部分系列文章的第 2 部分,每周一和周四发布新文章,介绍面向 Spring 开发人员的 Microsoft Azure。如果没有微软的 Asir Vedamuthu Selvasingh、Yitao Dong、Bruno Borges、Brian Benz 和 Theresa Nguyen 的投入,我无法完成这项工作。您可以在 Github 上找到本系列文章的代码。在阅读各部分内容时,如有任何反馈或问题,请通过 Twitter (@starbuxman) 联系我。您还可以通过我的 Spring Tips (@SpringTipsLive) 分期付款,Bootiful Azure 了解更多关于 Microsoft Azure 的信息。
以下是所有分期付款
让我们从简短而甜蜜的东西开始,那就是传奇的 Microsoft SQL Server。Microsoft SQL Server 是一款有趣的工具。当然,您可以自己运行它,但您不希望由构建产品的微软为您完成这项工作吗?这才是真正的全方位服务解决方案!想象一下这有多棒?您在其他环境中很少能看到这种解决方案。想象一下,购买一辆您可以随意驾驶的汽车,并且制造商会保证所有维护和维修?永远?即使汽车被小行星撞击?这就是为什么在 Microsoft Azure 上运行 Microsoft SQL Server 如此吸引人的原因:消除了所有权的繁琐工作。
别误会我的意思。SQL Server 本身也有很多优点。SQL Server 自 1989 年就存在了!它经常与 Oracle DB 和 PostgreSQL 等数据库一起被评为功能最丰富的数据库选项之一。它经过几十年的发展,旨在满足企业用例的需求。它甚至拥有一些其他数据库(包括久负盛名的 PostgreSQL)有时缺乏的功能,例如透明数据加密,其中数据在静态时会被透明加密。
SQL Server 最初是一款企业级数据库,运行在一个操作系统上……OS/2!等等,OS/2?您一定是说 Microsoft Windows 吧?不!微软在 20 世纪 80 年代后期加入了 Ashton-Tate 和 Sybase,为 IBM OS/2(当时与微软联合开发)创建了 Sybase SQL Server 的变体,并在第二年发布了该变体。
这是 Microsoft SQL Server 的第一个版本,也是微软进军企业级数据库市场的敲门砖,与 Oracle、IBM 以及后来的 Sybase 竞争。SQL Server 6.0 是第一个专为 NT 设计的版本,没有 Sybase 的指导。
Windows NT 于 1993 年 7 月发布,Sybase 和 Microsoft 走向了不同的方向。两者都追求自己的设计和营销方案。微软协商获得了为 Microsoft 操作系统编写的 SQL Server 所有版本的独家权利。如今,Sybase 和 Microsoft SQL Server 是截然不同的两件事,具有完全不同的代码库。现在,微软维护着针对不同用例和工作负载的多个 SQL Server 版本。很难说明为什么 Microsoft SQL Server 如此出色,因此我建议您参考 这个相当详尽的维基百科页面,该页面展示了各种 SQL 数据库引擎的不同功能。Microsoft SQL Server 表现非常出色!
因此,我希望向您展示如何在用户界面中按照这些说明进行操作(以屏幕截图的形式),但这似乎不太理想,因为 Azure 门户中的内容往往是…不稳定的。事物会四处移动。此外,这些东西的脚本编写能力无限地差。因此,我们将使用 az
CLI。问题是,它…很乏味。
从逻辑上讲,我们要做的事情很简单。我们想要
我们将使用脚本来完成这项工作
#!/bin/bash
# Set an admin login and password for your database
export adminlogin=bootiful
export password=B00t1ful
# The logical server name has to be unique in the system
export servername=${1}-server
# The ip address range that you want to allow to access your DB
export startip=0.0.0.0
export endip=223.255.255.255
# the name of the resource group
export rg=$1
# Create a logical server in the resource group
az sql server create \
--name $servername \
--resource-group $rg \
--admin-user $adminlogin \
--admin-password $password
# Configure a firewall rule for the server
az sql server firewall-rule create \
--resource-group $rg \
--server $servername \
-n AllowYourIp \
--start-ip-address $startip \
--end-ip-address $endip
# Create a database in the server with zone redundancy as true
az sql db create \
--resource-group $rg \
--server $servername \
--name ${1}-sample-db \
--service-objective Basic
这应该会输出一堵 JSON 墙!哎呀!我从 Azure 文档中提取了这个示例,谢天谢地!我不认为我想自己找到这个解决方案。您需要记下控制台中打印的第一个 JSON 片段中的 name
属性。我们使用 $RANDOM
变量生成了一个,嗯,随机名称,因此它在您的机器上会不同。在我的机器上,值为 bootiful-22952
。
现在,您已拥有一个可用的服务器和服务器内的一个可用的数据库。如果您在 Azure 门户中四处查看,您将获得连接到数据库所需的所有连接信息。或者,您可以使用这个简单技巧。
az sql db show-connection-string --client jdbc --name bootiful-sample-db
此命令为您提供许多技术的客户端连接字符串,包括 Windows ADO 子系统、Java 的 JDBC 驱动程序接口和 PHP 的 PDO 接口。您需要将 URI 的 <server>
、<username>
和 <password>
部分替换为相应的 value,在本例中分别为 bootiful-server
、bootiful
和 B00t1ful
。或者,正如我们稍后将看到的,您可以定义属性并使用属性占位符解析来参数化连接字符串的这部分内容。
现在我们已经启动并运行了一个新配置的 SQL Server 实例,我们只需要像在代码中使用任何其他 JDBC 依赖项一样使用它。如果您使用的是 Spring Initializr,则可以选择 SQL Server
,并且相应的依赖项将添加到您的 Maven 或 Gradle 构建中。或者,您可以使用以下坐标手动将其添加到您的构建中:com.microsoft.sqlserver
:mssql-jdbc
。您无需指定版本;Spring Boot 本身会为您完成此操作。此特定依赖项及其与 Microosft 技术的集成甚至不需要特定的 Maven 物料清单依赖项 - 它可以正常工作。
然后,您需要指定通常的配置属性,以便 Spring 可以为您实例化到 DataSource
的连接。
sql-db=bootiful-sample-db
sql-username=bootiful
sql-password=B00t1ful
sql-servername=bootiful-server
spring.datasource.url=jdbc:sqlserver://${sql-servername}.database.windows.net:1433;database=${sql-db};user=${sql-username}@${sql-servername};password=${sql-password};encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30
spring.datasource.username=${sql-username}
spring.datasource.password=${sql-password}
spring.datasource.initialization-mode=always
我在此处,在属性文件中编码了用户名和密码。这是一个错误的想法。通常,这正是您希望将其保存在环境变量或 Spring Cloud Config Server 等配置服务中的内容。完成此设置后,使用支持 JDBC(通常)和 Microsoft SQL Server(具体)的任何技术使用生成的连接都非常简单。
我们的应用程序将使用需要事先安装在数据库中的数据。Spring 可以在这里帮助我们。如果您在属性中指定 spring.datasource.initialization-mode=always
,则 Spring Boot 可以自动对配置的 DataSource
执行 src/main/resources/schema.sql
和 src/main/resources/data.sql
。schema.sql
是放置数据库 DDL 的理想位置,而 data.sql
是放置示例数据的理想位置。
我们的 Spring 博客软件不允许我出于,嗯,安全原因在本帖中捕获 SQL DDL?因此,以下是 Github 上的 src/main/resources/schema.sql
文件。请参阅该文件。
这是我们的 src/main/resources/data.sql
insert into customer(first_name, last_name)
values ('james', 'watters'),
('bob', 'lee'),
('trisha', 'gee'),
('mario', 'gray'),
('spencer', 'gibb'),
('yitao', 'dong');
在我们的各种事件侦听器之前,这两个文件都将被执行。让我们看一下使用 JdbcTemplate
提取这些数据的事件侦听器。
package com.example.bootifulazure;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.log4j.Log4j2;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.event.EventListener;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
@Log4j2
class SqlServerDemo {
private final JdbcTemplate jdbcTemplate;
SqlServerDemo(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@EventListener(ApplicationReadyEvent.class)
public void demo() {
String query = " select TOP 3 * from customer ";
RowMapper<Customer> rowMapper =
(rs, rowNum) -> new Customer(rs.getLong("id"), rs.getString("first_name"), rs.getString("last_name"));
List<Customer> customerList = this.jdbcTemplate.query(query, rowMapper);
customerList.forEach(log::info);
}
@Data
@AllArgsConstructor
@NoArgsConstructor
private static class Customer {
private Long id;
private String firstName, lastName;
}
}
SQL Server 对于许多用例来说都是一个引人注目的数据库,并且 Microsoft Azure 使其扩展变得如此容易,这对每个人来说都是一个胜利。值得一提的是,R2DBC(一项关于反应式 SQL 数据存储访问的尝试)除了 H2 和 PostgreSQL 之外,还提供了 Microsoft SQL Server 实现。您甚至可以进行反应式 SQL Server 访问以获得更快的应用程序。所有这些似乎都可以一键(或至少是一个乏味的部署脚本)完成。