Bootiful Azure:走向生产 (6/6)

工程 | Josh Long | 2019年1月21日 | ...

这是6部分系列文章的第6部分,新文章将于每周一和周四发布,介绍面向Spring开发人员的Microsoft Azure。没有Microsoft的Asir Vedamuthu Selvasingh、Yitao Dong、Bruno Borges、Brian Benz和Theresa Nguyen的输入,我无法完成这项工作。你可以在 Github 上找到该系列的代码。在阅读连载文章时,请通过 Twitter (@starbuxman) 与我联系,提供任何反馈或问题。你还可以在我的 Spring Tips (@SpringTipsLive) 连载文章 Bootiful Azure 中了解更多关于Microsoft Azure的信息。

以下是所有安装内容

这个系列文章中关于Microsoft Azure的最后一篇文章,实际上是一篇快速总结文章,探讨了在将使用Spring Boot和Microsoft Azure构建的应用程序部署到生产环境时需要考虑的事项。

安全配置

我们在本地机器上轻松愉快地开发了应用程序,并在需要时插入了相关的配置值。问题是,这些值通常非常敏感,不应在静止状态下未加密地存储在文件系统中。对此有许多个好的解决方案。当然,你可以自己部署Spring Cloud Config Service。如果你正在运行 Microsoft Azure 上的 Pivotal Cloud Foundry(或其他平台),这是推荐的方式,因为它只需要一行命令即可部署和运行。当然,你也可以部署 Hashicorp Vault 并使用 Spring Cloud Vault。或者,你可以将密钥和值存储在Microsoft的 自有 Key Vault 服务 中。为了有效使用Key Vault,你需要配置Microsoft Active Directory,虽然我不会把它推荐给你或你的亲人,亲爱的读者,但我非常感兴趣。

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吗?当然可以。但是,你应该这样做吗

Application Insights

随着你扩展并启动更多的微服务,你将引入越来越多的活动部件,并且能够观察数据在系统中从一个节点到另一个节点的移动变得越来越关键。在这里,Microsoft Application Insights对Spring应用程序的集成——目前至少与Microsoft Azure的主要Spring集成是分开提供的——使得使用它变得轻而易举!在你的构建文件中添加 com.microsoft.azure: applicationinsights-spring-boot-starter : 1.1.0-BETA

你可以像这样脚本化Application Insights订阅的创建

#!/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 Application Insights仪表板,观察正在运行的仪表板!

Cloud Foundry

你不应该运行你无法收费的软件。Pivotal传奇人物 James Watters 经常谈论“低于价值线”的工作,以及技术人员和高管应该专注于对某个组织而言高于价值线的工作。普通组织有很多问题。运行MySQL或Kafka等商品软件不应该是其中之一。运行不能区分你业务的东西不应该是其中之一。随着时间的推移,支付有人为你运行任何东西(无论是什么)的成本将无限低,前提是别人能胜任。理想情况下,最终运行该软件的人应该对将其运行良好有既得利益。大多数组织都有一个与配置SSL或调试MySQL复制问题无关的使命。让他们为你做这件事几乎总是更便宜的。

如果你正在尝试做一些标准的事情,那么你绝对应该依赖标准化的工具。为什么在可以使用Cloud Foundry或Kubernetes(其招聘池更大、成本几乎为零、易用性与云供应商提供的相当或更好)的情况下,使用云供应商的锁定软件来运行Java或Node应用程序?

这是Microsoft和Pivotal拥有如此良好关系的重要原因之一。企业客户明白,对于某些工作负载,公共云是必然的选择,但他们不想被锁定。可选性是有价值的。能够迁移到不同平台是有价值的。敏捷性——应对变化的能力——是有价值的。我们经常看到这一点;Google Cloud Platform在某些工作负载类型的价格上比AWS首次亮相时便宜。一些公共云供应商在你可能想去的区域拥有其他供应商没有的可用区域。越来越多的组织开始采用混合云或多云战略,知道他们的工作负载会不同,他们的可用性需求也会不同。尽可能地,这些组织希望降低运营、安全、培训和部署到各种云基础设施的成本。

Pivotal Cloud Foundry是这里的自然选择;它允许组织可靠地部署到多个云平台,并且可以轻松地在必要时回退到平台特定的服务。事实上,这是Microsoft在2017年和2018年将Pivotal命名为年度合作伙伴的原因之一。Pivotal Cloud Foundry是我们分发的Apache 2许可的开源Cloud Foundry项目,它有助于以尽可能可移植的方式驱动Microsoft Azure上的资源使用,同时仍然呈现出有价值和独特的功能。

我完全支持使用Microsoft Azure之类的产品来简化基础设施的搭建工作,其中Microsoft可以提供差异化的体验。但是运行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连接。它可以是许多东西中的任何一种。Microsoft和Pivotal团队携手合作,确保为在Microsoft Azure上运行Pivotal Cloud Foundry的用户提供的服务代理选项尽可能方便地支持核心服务。这个列表包括Azure Storage、Azure Redis Cache、Azure Service Bus、Azure Event Hubs、Azure SQL Databases(SQL Server、PostgreSQL和MySQL)和故障转移组,以及Azure CosmosDB等Microsoft Azure服务。

你可以通过在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}

Bootiful!

下一步

在这篇文章和之前的文章中,我们才刚刚开始触及Spring、Microsoft Azure和Cloud Foundry的潜力。应该清楚的是,这里存在一种良好的共生关系,每种技术都使它下面的层更加强大。难怪Azure的大量工作负载都是基于Linux、Spring Boot和Cloud Foundry的:这些东西在一起配合得很好。对于那些想了解更多关于Spring在Microsoft Azure上的信息的人,请查看 Azure提供的资源门户

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,助您加速进步。

了解更多

获得支持

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件,只需一份简单的订阅。

了解更多

即将举行的活动

查看 Spring 社区所有即将举行的活动。

查看所有