Freigeben über


Unstrukturierter Blobspeicher (Erstellen Real-World Cloud-Apps mit Azure)

von Rick Anderson, Tom Dykstra

Download Fix It Project oder Download E-Book

Das E-Book Building Real World Cloud Apps with Azure basiert auf einer Präsentation, die von Scott Guthrie entwickelt wurde. Es werden 13 Muster und Methoden erläutert, die Ihnen bei der erfolgreichen Entwicklung von Web-Apps für die Cloud helfen können. Informationen zum E-Book finden Sie im ersten Kapitel.

Im vorherigen Kapitel haben wir Partitionierungsschemas untersucht und erläutert, wie die Fix It-App Bilder im Azure Storage-Blobdienst und andere Aufgabendaten in Azure SQL-Datenbank speichert. In diesem Kapitel gehen wir ausführlicher auf den Blobdienst ein und zeigen, wie er im Projektcode "Fix It" implementiert wird.

Was ist Blobspeicher?

Der Azure Storage-Blobdienst bietet eine Möglichkeit zum Speichern von Dateien in der Cloud. Der Blob-Dienst hat eine Reihe von Vorteilen gegenüber dem Speichern von Dateien in einem lokalen Netzwerkdateisystem:

  • Es ist hochgradig skalierbar. Ein einzelnes Speicherkonto kann Hunderte von Terabytes speichern, und Sie können über mehrere Speicherkonten verfügen. Einige der größten Azure-Kunden speichern Hunderte von Petabytes. Microsoft SkyDrive verwendet Blob Storage.
  • Es ist dauerhaft. Jede Datei, die Sie im Blob-Dienst speichern, wird automatisch gesichert.
  • Es bietet Hochverfügbarkeit. Die SLA für Storage verspricht eine Betriebszeit von 99,9 % oder 99,99 %, je nachdem, welche Georedundanzoption Sie auswählen.
  • Es handelt sich um ein PaaS-Feature (Platform-as-a-Service) von Azure, d. h., Sie speichern und abrufen dateien und zahlen nur für die tatsächliche Speichermenge, die Sie verwenden, und Azure kümmert sich automatisch um die Einrichtung und Verwaltung aller VMs und Datenträger, die für den Dienst erforderlich sind.
  • Sie können mithilfe einer REST-API oder mithilfe einer Programmiersprache-API auf den Blobdienst zugreifen. SDKs sind für .NET, Java, Ruby und andere verfügbar.
  • Wenn Sie eine Datei im Blob-Dienst speichern, können Sie sie problemlos über das Internet öffentlich verfügbar machen.
  • Sie können Dateien im Blobdienst schützen, sodass nur autorisierte Benutzer darauf zugreifen können, oder Sie können temporäre Zugriffstoken bereitstellen, die sie nur für einen begrenzten Zeitraum für jemanden verfügbar machen.

Immer wenn Sie eine App für Azure erstellen und viele Daten speichern möchten, die in einer lokalen Umgebung in Dateien gespeichert werden ( z. B. Bilder, Videos, PDFs, Tabellen usw.). – Betrachten Sie den Blob-Dienst.

Erstellen eines Speicherkontos

Für die ersten Schritte mit dem Blob-Dienst erstellen Sie ein Speicherkonto in Azure. Klicken Sie im Portal auf Neuer -- DataServices-Speicher -- -- – Schnellerstellung, und geben Sie dann eine URL und einen Rechenzentrumsstandort ein. Der Standort des Rechenzentrums sollte mit ihrer Web-App identisch sein.

Erstellen eines Speicherkontos

Sie wählen die primäre Region aus, in der Sie den Inhalt speichern möchten. Wenn Sie die Georeplikationsoption auswählen, erstellt Azure Replikate aller Daten in einem anderen Rechenzentrum in einem anderen Teil des Landes/der Region. Wenn Sie z. B. das Rechenzentrum "USA, Westen" auswählen, wird eine Datei beim Speichern in das Rechenzentrum der westlichen USA übertragen, aber im Hintergrund kopiert Azure sie auch in eines der anderen US-Rechenzentren. Wenn ein Notfall in einem Teil des Landes/der Region auftritt, sind Ihre Daten weiterhin sicher.

Azure repliziert Daten nicht über geopolitische Grenzen hinweg: Wenn sich Ihr primärer Standort in den USA befindet, werden Ihre Dateien nur in eine andere Region innerhalb der USA repliziert; Wenn Ihr primärer Standort Australien ist, werden Ihre Dateien nur in ein anderes Rechenzentrum in Australien repliziert.

Natürlich können Sie auch ein Speicherkonto erstellen, indem Sie Befehle aus einem Skript ausführen, wie wir zuvor gesehen haben. Hier sehen Sie einen Windows PowerShell Befehl zum Erstellen eines Speicherkontos:

# Create a new storage account
New-AzureStorageAccount -StorageAccountName $Name -Location $Location -Verbose

Sobald Sie über ein Speicherkonto verfügen, können Sie sofort mit dem Speichern von Dateien im Blobdienst beginnen.

Verwenden von Blob Storage in der Fix It-App

Mit der Fix It-App können Sie Fotos hochladen.

Erstellen einer Fix It-Aufgabe

Wenn Sie auf FixIt erstellen klicken, lädt die Anwendung die angegebene Bilddatei hoch und speichert sie im Blobdienst.

Einrichten des Blobcontainers

Um eine Datei im Blobdienst zu speichern, benötigen Sie einen Container , in dem sie gespeichert werden soll. Ein Blobdienstcontainer entspricht einem Dateisystemordner. Die Skripts für die Umgebungserstellung, die wir im Kapitel Automatisieren von Alles überprüft haben, erstellen das Speicherkonto, aber sie erstellen keinen Container. Daher besteht der Zweck der CreateAndConfigure -Methode der PhotoService -Klasse darin, einen Container zu erstellen, wenn er noch nicht vorhanden ist. Diese Methode wird von der Application_Start -Methode in Global.asax aufgerufen.

public async void CreateAndConfigureAsync()
{
    try
    {
        CloudStorageAccount storageAccount = StorageUtils.StorageAccount;

        // Create a blob client and retrieve reference to images container
        CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
        CloudBlobContainer container = blobClient.GetContainerReference("images");

        // Create the "images" container if it doesn't already exist.
        if (await container.CreateIfNotExistsAsync())
        {
            // Enable public access on the newly created "images" container
            await container.SetPermissionsAsync(
                new BlobContainerPermissions
                {
                    PublicAccess =
                        BlobContainerPublicAccessType.Blob
                });

            log.Information("Successfully created Blob Storage Images Container and made it public");
        }
    }
    catch (Exception ex)
    {
        log.Error(ex, "Failure to Create or Configure images container in Blob Storage Service");
    }
}

Der Name des Speicherkontos und der Zugriffsschlüssel werden in der appSettings Auflistung der Web.config-Datei gespeichert, und code in der StorageUtils.StorageAccount -Methode verwendet diese Werte, um eine Verbindungszeichenfolge zu erstellen und eine Verbindung herzustellen:

string account = CloudConfigurationManager.GetSetting("StorageAccountName");
string key = CloudConfigurationManager.GetSetting("StorageAccountAccessKey");
string connectionString = String.Format("DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}", account, key);
return CloudStorageAccount.Parse(connectionString);

Die CreateAndConfigureAsync -Methode erstellt dann ein -Objekt, das den Blob-Dienst darstellt, und ein -Objekt, das einen Container (Ordner) mit dem Namen "images" im Blob-Dienst darstellt:

CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference("images");

Wenn noch kein Container mit dem Namen "images" vorhanden ist (was bei der ersten Ausführung der App für ein neues Speicherkonto der Fall ist), erstellt der Code den Container und legt Berechtigungen fest, um ihn öffentlich zu machen. (Standardmäßig sind neue Blobcontainer privat und nur für Benutzer zugänglich, die über die Berechtigung zum Zugriff auf Ihr Speicherkonto verfügen.)

if (await container.CreateIfNotExistsAsync())
{
    // Enable public access on the newly created "images" container
    await container.SetPermissionsAsync(
        new BlobContainerPermissions
        {
            PublicAccess =
                BlobContainerPublicAccessType.Blob
        });

    log.Information("Successfully created Blob Storage Images Container and made it public");
}

Speichern des hochgeladenen Fotos in Blob Storage

Zum Hochladen und Speichern der Bilddatei verwendet die App eine IPhotoService Schnittstelle und eine Implementierung der Schnittstelle in der PhotoService -Klasse. Die Datei PhotoService.cs enthält den gesamten Code in der Fix It-App, die mit dem Blob-Dienst kommuniziert.

Die folgende MVC-Controllermethode wird aufgerufen, wenn der Benutzer auf FixIt erstellen klickt. In diesem Code photoService bezieht sich auf eine instance der PhotoService -Klasse und fixittask auf eine instance der Entitätsklasse, die FixItTask Daten für eine neue Aufgabe speichert.

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Create([Bind(Include = "FixItTaskId,CreatedBy,Owner,Title,Notes,PhotoUrl,IsDone")]FixItTask fixittask, HttpPostedFileBase photo)
{
    if (ModelState.IsValid)
    {
        fixittask.CreatedBy = User.Identity.Name;
        fixittask.PhotoUrl = await photoService.UploadPhotoAsync(photo);
        await fixItRepository.CreateAsync(fixittask);
        return RedirectToAction("Success");
    }

    return View(fixittask);
}

Die UploadPhotoAsync -Methode in der PhotoService -Klasse speichert die hochgeladene Datei im Blob-Dienst und gibt eine URL zurück, die auf das neue Blob verweist.

public async Task<string> UploadPhotoAsync(HttpPostedFileBase photoToUpload)
{            
    if (photoToUpload == null || photoToUpload.ContentLength == 0)
    {
        return null;
    }

    string fullPath = null;
    Stopwatch timespan = Stopwatch.StartNew();

    try
    {
        CloudStorageAccount storageAccount = StorageUtils.StorageAccount;

        // Create the blob client and reference the container
        CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
        CloudBlobContainer container = blobClient.GetContainerReference("images");

        // Create a unique name for the images we are about to upload
        string imageName = String.Format("task-photo-{0}{1}",
            Guid.NewGuid().ToString(),
            Path.GetExtension(photoToUpload.FileName));

        // Upload image to Blob Storage
        CloudBlockBlob blockBlob = container.GetBlockBlobReference(imageName);
        blockBlob.Properties.ContentType = photoToUpload.ContentType;
        await blockBlob.UploadFromStreamAsync(photoToUpload.InputStream);

        // Convert to be HTTP based URI (default storage path is HTTPS)
        var uriBuilder = new UriBuilder(blockBlob.Uri);
        uriBuilder.Scheme = "http";
        fullPath = uriBuilder.ToString();

        timespan.Stop();
        log.TraceApi("Blob Service", "PhotoService.UploadPhoto", timespan.Elapsed, "imagepath={0}", fullPath);
    }
    catch (Exception ex)
    {
        log.Error(ex, "Error upload photo blob to storage");
    }

    return fullPath;
}

Wie bei der CreateAndConfigure -Methode stellt der Code eine Verbindung mit dem Speicherkonto her und erstellt ein Objekt, das den Blobcontainer "images" darstellt, außer hier wird davon ausgegangen, dass der Container bereits vorhanden ist.

Anschließend wird ein eindeutiger Bezeichner für das Bild erstellt, das hochgeladen wird, indem ein neuer GUID-Wert mit der Dateierweiterung verkettet wird:

string imageName = String.Format("task-photo-{0}{1}",
    Guid.NewGuid().ToString(),
    Path.GetExtension(photoToUpload.FileName));

Der Code verwendet dann das Blobcontainerobjekt und den neuen eindeutigen Bezeichner, um ein Blobobjekt zu erstellen, legt ein Attribut für dieses Objekt fest, das angibt, um welche Art von Datei es sich handelt, und verwendet dann das Blobobjekt, um die Datei im Blobspeicher zu speichern.

CloudBlockBlob blockBlob = container.GetBlockBlobReference(imageName);
blockBlob.Properties.ContentType = photoToUpload.ContentType;
blockBlob.UploadFromStream(photoToUpload.InputStream);

Schließlich wird eine URL abgerufen, die auf das Blob verweist. Diese URL wird in der Datenbank gespeichert und kann unter Fix It-Webseiten verwendet werden, um das hochgeladene Bild anzuzeigen.

fullPath = String.Format("http://{0}{1}", blockBlob.Uri.DnsSafeHost, blockBlob.Uri.AbsolutePath);

Diese URL wird in der Datenbank als eine der Spalten der FixItTask-Tabelle gespeichert.

public class FixItTask
{
    public int FixItTaskId  { get; set; }
    public string CreatedBy { get; set; }
    [Required]
    public string Owner     { get; set; }
    [Required]
    public string Title     { get; set; }
    public string Notes     { get; set; }
    public string PhotoUrl  { get; set; }
    public bool IsDone      { get; set; } 
}

Da nur die URL in der Datenbank und Bilder im Blobspeicher enthalten sind, hält die Fix It-App die Datenbank klein, skalierbar und kostengünstig, während die Bilder gespeichert werden, wo der Speicher billig ist und Terabytes oder Petabytes verarbeiten kann. Ein Speicherkonto kann Hunderte von Terabytes an Fix It-Fotos speichern, und Sie bezahlen nur für das, was Sie verwenden. Sie können also mit einer kleinen Zahlung von 9 Cent für das erste Gigabyte beginnen und weitere Bilder für Pfennige pro zusätzlichem Gigabyte hinzufügen.

Anzeigen der hochgeladenen Datei

Die Fix It-Anwendung zeigt die hochgeladene Bilddatei an, wenn Details für eine Aufgabe angezeigt werden.

Beheben von Aufgabendetails mit Foto

Um das Bild anzuzeigen, muss die MVC-Ansicht nur den Wert in den PhotoUrl HTML-Code einschließen, der an den Browser gesendet wird. Der Webserver und die Datenbank verwenden keine Zyklen zum Anzeigen des Bilds, sie stellen nur einige Bytes für die Bild-URL bereit. Im folgenden Razor-Code Model bezieht sich auf eine instance der FixItTask Entitätsklasse.

<fieldset>
<legend>@Html.DisplayFor(model => model.Title)</legend>
<dl>
    <dt>Opened By</dt>
    <dd>@Html.DisplayFor(model => model.CreatedBy)</dd>
                <br />
    <dt>@Html.DisplayNameFor(model => model.Notes)</dt>
    <dd>@Html.DisplayFor(model => model.Notes)</dd>
                <br />
                @if(Model.PhotoUrl != null) {
        <dd><img src="@Model.PhotoUrl" title="@Model.Title" /></dd>
                }
</dl>
</fieldset>

Wenn Sie sich den HTML-Code der angezeigten Seite ansehen, sehen Sie, dass die URL direkt auf das Bild im Blobspeicher verweist, etwa wie folgt:

<fieldset>
<legend>Brush the dog again</legend>
<dl>
    <dt>Opened By</dt>
    <dd>Tom</dd>
                <br />
    <dt>Notes</dt>
    <dd>Another dog brushing task</dd>
                <br />
    <dd>
<img src="http://storageaccountname.blob.core.windows.net/images/task-photo-312dd635-ba87-4542-8b15-767032c55f4e.jpg" 
           title="Brush the dog again" />
    </dd>
</dl>
</fieldset>

Zusammenfassung

Sie haben gesehen, wie die Fix It-App Bilder im Blob-Dienst und nur Image-URLs in der SQL-Datenbank speichert. Die Verwendung des Blob-Diensts hält die SQL-Datenbank viel kleiner, als es andernfalls der Fall wäre, ermöglicht das Hochskalieren auf eine nahezu unbegrenzte Anzahl von Aufgaben und kann ohne das Schreiben von viel Code ausgeführt werden.

Sie können Hunderte von Terabytes in einem Speicherkonto enthalten, und die Speicherkosten sind viel kostengünstiger als SQL-Datenbank Speicher, beginnend bei etwa 3 Cent pro Gigabyte pro Monat zuzüglich einer geringen Transaktionsgebühr. Und denken Sie daran, dass Sie nicht für die maximale Kapazität bezahlen, sondern nur für den Betrag, den Sie tatsächlich speichern, sodass Ihre App bereit ist, zu skalieren, aber Sie nicht für all diese zusätzliche Kapazität bezahlen.

Im nächsten Kapitel wird erläutert, wie wichtig es ist, eine Cloud-App zu erstellen, die Fehler ordnungsgemäß behandeln kann.

Ressourcen

Weitere Informationen finden Sie in den folgenden Ressourcen:

  • Verwenden des Azure Blob Storage-Diensts in .NET. Offizielle Dokumentation auf der MicrosoftAzure.com Website. Eine kurze Einführung in Blob Storage gefolgt von Codebeispielen, die zeigen, wie Sie eine Verbindung mit Blob Storage herstellen, Container erstellen, Blobs hochladen und herunterladen usw.
  • FailSafe: Erstellen skalierbarer, resilienter Cloud Services. Neunteilige Videoreihe von Ulrich Homann, Marc Mercuri und Mark Simms. Präsentiert allgemeine Konzepte und Architekturprinzipien auf sehr zugängliche und interessante Weise, mit Geschichten, die aus der Erfahrung des Microsoft Customer Advisory Teams (CAT) mit tatsächlichen Kunden stammen. Eine Erläuterung des Azure Storage-Diensts und der Blobs finden Sie in Episode 5 ab 35:13.
  • Microsoft-Muster und -Methoden: Azure-Leitfaden. Weitere Informationen finden Sie unter Valet Key-Muster.