抢先一步
VMware 提供培训和认证,以加速您的进步。
了解更多这是由 6 部分组成的系列文章的第 6 部分,每周一和周四发布新文章,介绍面向 Spring 开发人员的 Microsoft Azure。如果没有微软的 Asir Vedamuthu Selvasingh、Yitao Dong、Bruno Borges、Brian Benz 和 Theresa Nguyen 的投入,我无法完成这项工作。您可以在 Github 上找到此系列文章的代码。在您阅读这些文章时,可以通过 Twitter (@starbuxman) 联系我,提出任何反馈或问题。您也可以在我的 Spring Tips (@SpringTipsLive) 文章中了解更多关于 Microsoft Azure 的信息,Bootiful Azure
以下是所有文章
本系列文章的最后一篇文章,回顾了 Microsoft Azure,实际上是一篇简短的总结文章,探讨了将使用 Spring Boot 和 Micosoft Azure 构建的应用程序部署到生产环境时需要注意的事项。
我们已经轻松自如地从本地机器上开发了应用程序,并在需要时插入相关的配置值。问题是,这些值通常非常敏感,不应该以未加密的形式存储在文件系统中。有很多好的解决方案。当然,您可以部署 Spring Cloud Config Service 本身。如果您正在 Microsoft Azure 上(或其他地方)运行 Pivotal Cloud Foundry,这是推荐的方法,因为只需一行命令即可部署并运行它。当然,您也可以部署 Hashicorp Vault 并使用 Spring Cloud Vault。或者,您可以将密钥和值存储在 Microsoft 的 Key Vault 服务 中。为了有效地使用 Key Vault,您需要配置 Microsoft Active Directory,虽然我不希望您或您的亲人,亲爱的读者,参与其中,但我对此非常感兴趣。
在我 20 多年的帮助组织构建软件的经历中,我几乎没有见过几个组织没有使用 Microsoft Active Directory,即使只是从 LDAP 接口使用。当然,我希望 Google Apps 在企业中获得更大的发展,但我们要明确一点:Active Directory 是企业 IT 中主要的标准。它是一种生活方式,即使我们可能在理想的应用程序开发世界中不必经常担心它。这是有充分理由的!它集成了企业专业人员的整个 Windows 桌面体验。它是 Office365 故事的核心,也是组织组织和自我结构的方式。想知道您是否获得了晋升?查看 Active Directory!想知道某人的座位在哪里?查看 Active Directory!想要强制重置密码?维护企业范围的审计日志?解雇某人?查看 Active Directory!您可能认为您的组织运行 Active Directory,但让我们明确一点:它运行您的组织。
Active Directory 是一个目录服务器。它提供了一个包含用户、组织等的树状结构。它充当 Microsoft CRM、Microsoft SQL Server、Microsoft Office 甚至 Microsoft Windows 本身等技术的身份管理器。您可以在 Active Directory 中描述用户、他们的权限和角色等等。这又回到了我们的主题。Microsoft Azure 为您运行 Active Directory!您可以直接从平台导入和配置 Microsoft Active Directory 安装的所有相关信息。甚至有一个 Spring Boot 启动器,可以将 Microsoft Azure 连接到您的 OAuth 代理 Spring Boot 和 Spring Security 驱动的应用程序。您可以自己部署和管理像 Microsoft SQL Server 或 Microsoft Active Directory 这样的东西吗?当然可以。但是,您应该这样做吗?
随着您扩展并启动更多微服务,您将引入越来越多的活动部件,并且能够观察系统中数据从一个节点到另一个节点的移动变得越来越重要。在这里,Spring 应用程序的 Microsoft 应用程序洞察集成(目前至少是独立于 Microsoft Azure 的主要 Spring 集成交付的)使使用它变得非常简单!将com.microsoft.azure
:applicationinsights-spring-boot-starter
:1.1.0-BETA
添加到您的构建文件中。
您可以像这样编写应用程序洞察订阅的创建脚本
#!/usr/bin/env bash
rg=$1
appname=${rg}-appinsights
az resource create \
--resource-group $rg \
--resource-type "Microsoft.Insights/components" \
--name $appname \
--location "South Central US" \
--properties '{"ApplicationId":"bootiful","Application_Type":"web"}'
这将创建一个订阅并将其绑定到bootiful
资源组。使用以下命令访问生成的密钥(假设相同的$rg
和$appname
变量在范围内)
az resource show -g $rg -n $appname --resource-type "Microsoft.Insights/components" --query properties.InstrumentationKey
然后,您需要指定azure.application-insights.instrumentation-key
并为您的应用程序提供一个spring.application.name
名称。公平地说,无论如何您都应该这样做。就是这样!重新启动您的应用程序,通过应用程序中的 HTTP 端点驱动一些流量(即使只是在localhost
上运行),然后登录到 Microsoft 应用程序洞察仪表板,并观察仪器的工作情况!
您不应该运行无法收费的软件。Pivotal 的传奇人物 James Watters 经常谈论“低于价值线”的工作,以及技术人员和高管应该专注于对特定组织而言高于价值线的工作这一理念。一般的组织已经存在足够多的问题。运行像 MySQL 或 Kafka 这样的商品软件不应该成为其中之一。运行不能让您的业务与众不同的东西不应该成为其中之一。如果其他人可以胜任这项工作,那么随着时间的推移,支付给某人运行这些东西的成本将无限地降低。理想情况下,最终运行这些软件的人应该对很好地运行这些软件有既得利益。大多数组织的使命绝不是配置 SSL 或调试 MySQL 复制问题。让其他人为您做这些事情几乎总是更便宜的。
如果您尝试做一些标准的事情,那么您绝对应该依靠标准化的工具。当您可以使用 Cloud Foundry 或 Kubernetes 时,为什么使用云供应商的锁定软件来运行基于 Java 或 Node 的应用程序?对于这些工具,人才库更大,成本几乎为零,易用性与云供应商提供的任何东西相当或更好?
微软和 Pivotal 之间拥有如此良好的合作关系,这在很大程度上是由于以下原因。企业客户明白,对于某些工作负载而言,公有云是必然的选择,但他们不希望被锁定。可选性非常宝贵。能够迁移到不同的平台非常宝贵。敏捷性——对变化做出反应的能力——同样宝贵。我们经常看到这种情况:在 Google Cloud Platform 推出时,某些工作负载类型的价格比 Amazon Web Services 更低。一些公有云供应商在您可能希望所在的区域拥有可用区,而其他供应商则没有。越来越多的组织开始采用混合云或多云策略,因为他们知道自己的工作负载会有所不同,可用性需求也会有所不同。这些组织希望尽可能降低在各种云基础设施上运行、保护、培训和部署的成本。
Pivotal Cloud Foundry 在这里是一个自然的选择;它允许组织可靠地部署到多个云平台中的任何一个,并且可以轻松地(在必要时)降级到特定平台的服务。这一事实是微软在 2017 年和 2018 年将 Pivotal 评为年度合作伙伴的原因之一。Pivotal Cloud Foundry(我们基于 Apache 2 许可的开源 Cloud Foundry 项目的发布版)有助于推动 Microsoft Azure 上的资源使用,并以尽可能可移植的方式实现这一点,同时仍然突出显示有价值和独特的功能。
我完全赞成使用 Microsoft Azure 等工具来简化建立基础设施的工作,因为微软可以提供差异化的体验。但运行 Java 进程或 Node.js 进程呢?坚持使用 Cloud Foundry 或 Kubernetes 等事实上的标准基础设施。在 Microsoft Azure 上部署 Cloud Foundry 非常简单,并且一旦部署完成,在上面部署 Spring Boot 应用程序也很简单。通常只需执行 cf push -p my.jar
即可。当然,您需要 Cloud Foundry CLI,请点击此处查看安装方法。
在 Cloud Foundry 世界中,服务代理是一个 HTTP API,Cloud Foundry 平台通过它来管理……某些内容的预配和生命周期。它可以是 MySQL 等数据库,也可以是 Apache Kafka 等消息队列。它可以是 Active Directory 安装,也可以是 CosmosDB 连接。它可以是许多事物中的任何一种。微软和 Pivotal 团队携手合作,确保在 Microsoft Azure 上运行 Pivotal Cloud Foundry 的用户可以使用服务代理选项以尽可能便捷的方式支持支柱服务。此列表包括 Microsoft Azure 服务,例如 Azure 存储、Azure Redis 缓存、Azure 服务总线、Azure 事件中心、Azure SQL 数据库(SQL Server、PostgreSQL 和 MySQL)和故障转移组,以及 Azure CosmosDB。
您可以通过在 CLI 上发出 cf marketplace
命令来检查 Cloud Foundry 服务目录。它将向您显示所有相关服务,然后您可以选择预配服务的实例及其关联的计划。计划描述了您可以从服务代理资源期望获得的特定服务级别,并且自然地特定于提供的每个服务代理。
假设您有一个部署到 Cloud Foundry 的 Spring Boot 应用程序,逻辑名称为 myapp
> cf push -p my.jar --no-start myapp
假设您希望为您的应用程序预配一个 Microsoft SQL Server 实例,并且您希望能够从逻辑上将该数据库称为 mydb
。您的会话可能如下所示。以下命令将预配一个 SQL Server 实例(通过内联 JSON 或 .json
文件路径指定参数),并为其分配逻辑名称 mydb
。
> cf create-service azure-sqldb basic mydb -c '{"sqlServerName": "Bootiful"}'
该服务很快就会预配好并可供应用程序使用。您只需要将服务绑定到您的应用程序,以便相关连接信息可以作为环境变量注入到应用程序的环境中。
cf bind-service myapp mydb
cf restart myapp
现在,您正在运行的 Spring Boot 应用程序将拥有一个环境变量 VCAP_SERVICES
,其内容将包含刚刚预配的服务的连接信息。它看起来像这样
"VCAP_SERVICES": {
"azure-sqldb": [
{
"credentials": {
"sqldbName": "fake-database",
"sqlServerName": "fake-server",
"sqlServerFullyQualifiedDomainName": "fake-server.database.windows.net",
"databaseLogin": "ulrich",
"databaseLoginPassword": "u1r8chP@ss",
"jdbcUrl": "jdbc:sqlserver://fake-server.database.windows.net:1433;database=fake-database;user=fake-admin;password=fake-password;Encrypt=true;TrustServerCertificate=false;HostNameInCertificate=*.database.windows.net;loginTimeout=30",
"jdbcUrlForAuditingEnabled": "jdbc:sqlserver://fake-server.database.secure.windows.net:1433;database=fake-database;user=fake-admin;password=fake-password;Encrypt=true;TrustServerCertificate=false;HostNameInCertificate=*.database.secure.windows.net;loginTimeout=30",
"hostname": "fake-server.database.windows.net",
"port": 1433,
"name": "fake-database",
"username": "ulrich",
"password": "u1r8chP@ss",
"uri": "mssql://ulrich:u1r8chP@[email protected]:1433/fake-database?encrypt=true&TrustServerCertificate=false&HostNameInCertificate=*.database.windows.net"
}
}
]
}
在 Spring Boot 中,您可以使用扁平化属性访问语法引用这些属性,例如:vcap.services.mydb.credentials.jdbcUrl
。这里一个常见的模式是在云中运行具有活动 Spring 配置文件的应用程序。例如,cloud
?这样,您可以在代码中的 application-cloud.properties
下放置一个配置文件,并且该属性文件将在应用程序在 Cloud Foundry 中启动时加载。您可以在 application-default.properties
中放置默认的本地配置。因此,当 Spring Boot 在未指定配置文件的情况下启动时,它将加载 application-default.properties
中的配置。在 Azure 上的 Cloud Foundry 中运行时,它将加载 application-cloud.properties
中的配置。因此,您可以将以下内容添加到 application-default.properties
文件中。
spring.datasource.url=${vcap.services.mydb.credentials.jdbcUrl}
太棒了!
在本篇文章和之前的文章中,我们仅仅触及了 Spring、Microsoft Azure 和 Cloud Foundry 的可能性。应该明确的是,这里存在良好的共生关系,每种技术都使下面的层级更加强大。难怪 Azure 的大量工作负载都基于 Linux、Spring Boot 和 Cloud Foundry:这些东西可以很好地协同工作。对于那些希望进一步了解 Microsoft Azure 上的 Spring 的人,请查看 Azure 的资源门户