Yapılandırılmamış BLOB depolama (Azure ile gerçek dünyada bulut uygulamaları oluşturma)

, Mike te son, Rick Anderson, Tom Dykstra tarafından

Onarma projesini indirin veya E-kitabı indirin

Azure e-book Ile gerçek dünyada bulut uygulamaları oluşturma , Scott Guthrie tarafından geliştirilen bir sunuyu temel alır. Bulut için Web Apps 'i başarılı bir şekilde geliştirmeye yardımcı olabilecek 13 desen ve uygulamaları açıklar. E-kitap hakkında daha fazla bilgi için ilk bölümebakın.

Önceki bölümde bölümleme düzenlerini inceledik ve BT BT uygulamasının, Azure Depolama Blobu hizmetinde görüntüleri nasıl sakladığı ve Azure SQL veritabanı 'ndaki diğer görev verileri açıklanmaktadır. Bu bölümde, blob hizmetini daha ayrıntılı bir şekilde inceleyeceğiz ve BT Proje kodunu nasıl düzelteceğinizi nasıl uygulandığını göstereceğiz.

BLOB depolama nedir?

Azure Depolama Blobu hizmeti, dosyaları bulutta depolamak için bir yol sağlar. Blob hizmeti, dosyaları yerel ağ dosya sisteminde depolamanın çeşitli avantajları içerir:

  • Oldukça ölçeklenebilir. Tek bir depolama hesabı yüzlerce terabaytsaklayabilir ve birden çok depolama hesabınız olabilir. En büyük Azure müşterilerinin yüzlerce Petabaytlarca depolama alanı. Microsoft SkyDrive blob Storage kullanır.
  • Dayanıklı. Blob hizmetinde depoladığınız her dosya otomatik olarak yedeklenir.
  • Yüksek kullanılabilirlik sağlar. Depolama SLA 'sı , seçtiğiniz coğrafi artıklık seçeneğine bağlı olarak% 99,9 veya% 99,99 çalışma süresini taahhüt eder.
  • Azure 'un bir hizmet olarak platform (PaaS) özelliğidir. Bu, yalnızca dosya depoladığınız ve aldığınız, yalnızca kullandığınız depolama alanı için ödeme yaptığınız ve Azure 'un şu şekilde gerektirdiği tüm VM 'Leri ve disk sürücüleri ayarlama ve yönetme işlemini otomatik olarak gerçekleştirir. hizmetle.
  • Blob hizmetine bir REST API kullanarak veya bir programlama dili API 'SI kullanarak erişebilirsiniz. SDK 'lar .NET, Java, Ruby ve diğerleri için kullanılabilir.
  • Blob hizmetinde bir dosyayı depolayadığınızda, kolayca Internet üzerinden kullanılabilir hale getirebilirsiniz.
  • Blob hizmetindeki dosyaları yalnızca yetkili kullanıcılar tarafından erişilebilmeleri için güvenli hale getirebilirsiniz veya yalnızca sınırlı bir süre için kullanılabilir hale getiren geçici erişim belirteçleri sağlayabilirsiniz.

Azure için bir uygulama oluşturduğunuzda ve şirket içi bir ortamda çok fazla veri depolamak istediğinizde, resimler, videolar, PDF 'Ler, elektronik tablolar vb. gibi dosyalar da vardır. blob hizmetini düşünün.

Depolama hesabı oluşturma

Blob hizmetini kullanmaya başlamak için Azure 'da bir depolama hesabı oluşturursunuz. Portalda, yeni -- veri hizmetleri -- depolama -- hızlı oluştur' a tıklayın ve ardından bir URL ve veri merkezi konumu girin. Veri merkezi konumu, Web uygulamanız ile aynı olmalıdır.

Depolama hesabı oluşturma

İçeriği depolamak istediğiniz birincil bölgeyi seçersiniz ve coğrafi çoğaltma seçeneğini belirlerseniz Azure, diğer tüm verilerinizin, ülkenin başka bir bölgesindeki farklı bir veri merkezinde kopyalarını oluşturur. Örneğin, Batı ABD veri merkezini seçerseniz, Batı ABD veri merkezine giden bir dosyayı depoladığınız halde Azure, arka planda diğer ABD veri merkezlerinden birine de kopyalanır. Ülkenin bir bölgesinde bir olağanüstü durum oluşursa, verileriniz hala güvende olur.

Azure, coğrafi olmayan sınırlar arasında veri çoğaltmayacaktır: birincil konumunuz ABD içindeyse dosyalarınız yalnızca ABD içindeki başka bir bölgeye çoğaltılır; birincil konumunuz Avustralya ise dosyalarınız yalnızca Avustralya 'daki başka bir veri merkezine çoğaltılır.

Kuşkusuz, daha önce gördüğünüz gibi bir betikten komutları yürüterek bir depolama hesabı da oluşturabilirsiniz. Bir depolama hesabı oluşturmak için bir Windows PowerShell komutu aşağıda verilmiştir:

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

Depolama Hesabınız olduktan sonra blob hizmetinde dosyaları depolamaya hemen başlayabilirsiniz.

BT BT uygulamasında blob depolamayı kullanma

BT BT uygulaması, Fotoğrafları karşıya yüklemenizi sağlar.

Bir düzelme görevi oluşturun

Armatürü oluştur' a tıkladığınızda, uygulama belirtilen görüntü dosyasını karşıya yükler ve BLOB hizmetinde depolar.

Blob kapsayıcısını ayarlama

Blob hizmetinde bir dosyayı depolamak için bir kapsayıcıya ihtiyacınız vardır. Blob hizmeti kapsayıcısı bir dosya sistemi klasörüne karşılık gelir. Her şeyi otomatikleştirin bölümünde gözden geçirdiğimiz ortam oluşturma betikleri depolama hesabını oluşturur, ancak bir kapsayıcı oluşturmaz. Bu nedenle, PhotoService sınıfının CreateAndConfigure yönteminin amacı, zaten mevcut değilse bir kapsayıcı oluşturmaktır. Bu yöntem, Global. asaxdosyasındaki Application_Start yönteminden çağrılır.

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");
    }
}

Depolama hesabı adı ve erişim anahtarı, Web. config dosyasının appSettings koleksiyonunda depolanır ve StorageUtils.StorageAccount yöntemindeki kod bu değerleri bir bağlantı dizesi oluşturmak ve bir bağlantı oluşturmak için kullanır:

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);

CreateAndConfigureAsync yöntemi daha sonra blob hizmetini temsil eden bir nesne ve BLOB hizmetinde "görüntüler" adlı bir kapsayıcıyı (klasör) temsil eden bir nesneyi oluşturur:

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

"Görüntüler" adlı bir kapsayıcı henüz yoksa ve uygulamayı yeni bir depolama hesabında ilk kez çalıştırdığınızda doğru olacaktır; kod kapsayıcıyı oluşturur ve ortak hale getirmek için izinleri ayarlar. (Varsayılan olarak, yeni blob kapsayıcıları özeldir ve yalnızca depolama hesabınıza erişim izni olan kullanıcılar için erişilebilir.)

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");
}

Karşıya yüklenen fotoğrafı BLOB depolama alanına depolayın

Uygulama, görüntü dosyasını karşıya yüklemek ve kaydetmek için bir IPhotoService arabirimi ve PhotoService sınıfında arabirimin bir uygulamasını kullanır. Photoservice.cs dosyası, blob hizmetiyle Iletişim kuran BT BT uygulamasındaki tüm kodu içerir.

Aşağıdaki MVC denetleyici yöntemi, Kullanıcı Armaöğeyi oluştur' a tıkladığında çağrılır. Bu kodda, photoService PhotoService sınıfının bir örneğine başvurur ve fixittask yeni bir görev için veri depolayan FixItTask Entity sınıfının bir örneğine başvurur.

[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);
}

PhotoService sınıfındaki UploadPhotoAsync yöntemi, karşıya yüklenen dosyayı blob hizmetinde depolar ve yeni Blobun işaret eden bir URL döndürür.

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;
}

CreateAndConfigure yönteminde olduğu gibi, kod depolama hesabına bağlanır ve "görüntüler" blob kapsayıcısını temsil eden bir nesne oluşturur; burada, kapsayıcının zaten var olduğunu varsaymaktadır.

Sonra, dosya uzantısıyla yeni bir GUID değeri birleştirerek karşıya yüklenmek üzere bir benzersiz tanımlayıcı oluşturur:

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

Daha sonra kod, blob nesnesi oluşturmak için blob kapsayıcı nesnesini ve yeni benzersiz tanımlayıcıyı kullanır, bu nesne üzerinde ne tür dosya olduğunu gösteren bir özniteliği ayarlar ve sonra blob nesnesini kullanarak dosyayı BLOB depolama alanında depolar.

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

Son olarak, blob 'a başvuran bir URL alır. Bu URL veritabanında depolanacak ve karşıya yüklenen görüntüyü göstermek için BT Web sayfalarında kullanılabilir.

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

Bu URL, FixItTask tablosunun sütunlarından biri olarak veritabanında depolanır.

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; } 
}

Yalnızca veritabanındaki URL ve BLOB depolamada bulunan görüntüler ile, BT BT uygulaması veritabanını küçük, ölçeklenebilir ve pahalı halde tutar, ancak resimler depolamanın depolama birimi olduğu ve terabayt veya petabaytlarca işleme yeteneğine sahip olduğu yerde saklanır. Bir depolama hesabı yüzlerce terabaytlık BT fotoğraflarını saklayabilir ve yalnızca kullandığınız kadar ödersiniz. Bu nedenle, ilk gigabayt için küçük ödeme 9 ' u kapatabilir ve ek gigabayt başına yarımada için daha fazla görüntü ekleyebilirsiniz.

Karşıya yüklenen dosyayı görüntüle

BT BT uygulaması, bir görevin ayrıntılarını görüntülediğinde karşıya yüklenen resim dosyasını görüntüler.

Fotoğraf ile BT görevi ayrıntılarını onarma

Görüntüyü görüntülemek için, tüm MVC görünümü tarayıcıya gönderilen HTML 'de PhotoUrl değerini içermelidir. Web sunucusu ve veritabanı, görüntüyü göstermek için döngüleri kullanmıyor, görüntü URL 'sine yalnızca birkaç bayt sunuluyor. Aşağıdaki Razor kodunda, Model FixItTask varlık sınıfının bir örneğine başvurur.

<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>

Görüntülenen sayfanın HTML 'sine bakarsanız, BLOB depolama alanındaki görüntüye doğrudan işaret eden URL 'yi görürsünüz, şöyle bir şey vardır:

<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>

Özet

Bu uygulamayı onarma uygulamasının, blob hizmetinde görüntüleri ve yalnızca SQL veritabanındaki görüntü URL 'Lerini nasıl depoladığını gördünüz. Blob hizmetini kullanmak SQL veritabanının çok daha küçük olmasını önler, aksi takdirde, neredeyse sınırsız sayıda göreve kadar ölçeklendirme yapabilir ve çok fazla kod yazmadan yapılabilir.

Bir depolama hesabında yüzlerce terabayta sahip olabilirsiniz ve depolama maliyeti SQL veritabanı depolamadan çok daha ucuzdur. Bu işlem, ayda gigabayt başına yaklaşık 3 sent ve küçük bir işlem ücreti ile başlar. Ve yalnızca gerçekten depoladığınız miktar için, en yüksek kapasite için ödeme yapmadıysanız, ancak uygulamanızın ölçeklendirmeye hazır olması, ancak tüm bu ek kapasiteniz için ödeme yapamayacağınızı unutmayın.

Bir sonraki bölümde , bir bulut uygulamasının sorunları sorunsuz bir şekilde işlemesini sağlamak için önem derecesi hakkında konuşacağız.

Kaynaklar

Daha fazla bilgi için aşağıdaki kaynaklara bakın: