Bir önceki yazımda Azure un depolama servisinin yapısından,yonetiminden ve nasıl kullanılacagından bahsetmişdim.Bu yazımda ise daha çok Amazon Simple Storage Service(Amazon S3) den bahsetmek istiyorum.Bu servisler arasında karşılaşdırma yapacak olursak,araşdırdıgıma göre bu her iki servis geliştiriciler için hemen hemen aynı özellikde hizmet vermektedirler.Her ikisinde Ücretlendirme kullandıgınız alana göre değişmekte,web ortamında istediyiniz noktadan erişim imkanı saglama,sınırsız depolama alanı sağlama gibi ortak özelliklere sahiptirler.Fakat verilerin tutulmasında ve veriye nasıl gözle bakılması yönenden farklar var diyebiliriz.Birde burada belirtmem gereken Azureda de olan Standart ve Premium storage gibi,Amazon da çok sık erişilen ve az sık erişilen depolama hizmeti vardır ve bunların ücretlendirmesi arasında da tahmin edilecegi gibi farklılıklar mevcuttur.Yönetim işine geldikde Azure gibi Amazon da yönetim konsolu aracılıgıyla yönetilebilmektedir,ve bana göre Amazon bu işde daha saglam hizmet vermektedir.Geliştiriciler için,Azure da oldugu gibi, Amazon da bir çok programlama dili için SDK sağlamaktadır.Örnegin burdan Java ile depolama servisi geliştirmek için Java SDK ve Eclipse üzerinden direk Amazon S3 üzerinde istediyiniz işlemleri gerçekleştirmek için Eclipse SDK yi indirim sisteminize kurabilirsiniz.
Veriyi Tutma Şekilleri Arasındaki Farklar.Amazon S3 veriyi nesne şeklinde buckets(kovalar) içinde tutmakdadır.Bu Azure Storage deki Container mantığıyla aynıdır.Depodaki bir nesne bir dosyadan ve bununla isteğe bağlı olarak ilişkilendirilmiş bir metadata(üstveri)dan ibaretdir.Her bucket için ayrı bir bölge,erişim izni ve hatta bu bucket in barındırdığı her nesne için bile ayrı erişim izni oluşturula bilmektedir.Bucketler nested(iç-içe) şeklinde olabilmektedir,yani bir bucket başka bir bucket'i barıdıra bilmektedir.
Amazon SDK for Java ,Azure Storage SDK for Java dan farklı olarak sadece depolama işlemleri için kütüphaneler barıdrımamaktadır.Bu sdk Amazonun bütün servisleri için Java API'leri barındırmaktadır.Örneğin;Amazon Elastic Compute Cloud(Amazon EC2),Amazon SimpleDB vs.Bu sdk ile aws s3 e bağlanmak için azure storage de oldugu gibi bir "credentials"(kimlik bilgileri oluşturulmalıdır.
Buradaki iki key e sahip olmak için bir aws accounta sahip olmak gerekir.AWS platformunda Security Credentials bölümünden bu Access Key leri oluşturup elde edilebilir.Ve tabi Azure Sdkda da oldugu gibi bir istemciye ihtiyaç vardır.
AmazonS3 istemci =newAmazonS3Client(credentials);
Amazon S3 storage üzerinde Java SDK ile diğer işlemleri gerçekleştirmek için buradan faydalanabilirsiniz.
Bulut teknolojisi,verileri için ölçeklenebilirlik,süreklilik,güvenlik vs. gereken uygulamalar için depolama servisini sunabilmektedir.Azure Storage,"big data" konseptli bilimsel, finans,analiz ,media tarzı uygulamaların yüzlerce terabyte'lık verilerini işleme ve depolama imkanını sağlamakla birlikte küçük miktarda verilerin depolanmasınıda sağlamaktadır.Kullandığın kadar öde prensibiyle çalışmaktadır ve anlık olarak milyonlarca kullanıcı isteyine karşılık vermektedir. Azure Storage dunyanın heryerinden erişilebilir olmakla birlikde istekde bulunan uygulamanın tipinden ve çalıştığı platformdan bagımsız olarak hizmet vermektedir.Java,C++,.NET vs gibi proramlama dillerini desteklemektedir.Azure Storage hizmetini kulanabilmek için bir Storage Account'a(depolama hesabı) sahip olunması gerekir.İki tür depolama bulunmaktadır.Standart Storage Account: Bu hesap türü Blob Storage,Table Storage,Queue Storage,File Storage depolama türlerini barındırır.
Blob Storage dosya verilerini depolar.Bir blob döküman,media dosyası vs. gibi herhangi bir metin tipi veya binary veri olabilir.Blob Storage bazen Object Storage olarakda bilinir.
Table Storage. yapılandırılmış veri kümelerini depolar.Table storage hızlı geliştirme(development) ve büyük miktardaki veriye hızlı erişim sağlayan bir NoSQL anahtar özellikli depodur.
Queue Storage iş akışını işleme ve bulut hizmetlerinin bileşenleri arasında güvenli mesajlaşma sağlar.
File Storage standart SMB protokolünü kullanan uygulamalar için ortak paylaşımlı depolama sağlar.
Premium Storage Account üzerinde I\O yoğunluklu işyüklerinin çalıştırıldığı sanal makineler için yüksek performanslı ve düşük gecikmeli disk desteyi sağlamaktadır.Uygulamalarınızın VM disklerini bu depolama birimine taşıyarak performans ve hız artışı sağlanabilir.
Blob Storage'e daha yakından bakarak örnekle gösterelim.Örnekde bir web sayfası bizden resim dosyası alsın ve bu resim dosyasını daha önceden oluşturduğumuz storage hesabımıza yüklesin. Öncelikle Blob Storage;
Blob Storage,büyük miktarda yapılandırılmamış verilerinizi tuttabileceyiniz dünyanın heryerinden HTTP veya HTTPS protokolleri ile erişilebilir olan bir servisdir. Verilerinizi herkese açık veya özel olarak tutabilirsiniz
Genel olarak aşağıdaki işlemler için kullanılmaktadır;
Resim veya dökümanların web browsera servis edilmesi.
Dosyaların dağıtık erişim için depolanması.
Video ve Audio iletimi ve diğer işlemler.
Blob Servisin yapısı resimdeki gibidir.
Account dan bahsetmişdik.Container farklı blob setlerini tutan bir yapıdır.Bütün bloblar containerda tutulmalıdır.Blob ise herhangi bir tipte ve boyutdadaki bir dosyadır.Yapıcağımız örnekte azure cloud üzerinde çalışan apache tomcat websitesi,azure cloudda çalışan bir storage var.Öncelikle Storage Accounta bağlanmak için bir bağlantı stringi tanımlamamız lazım.
Bunlara azure platformundan erişe bilirsiniz.Storage ile ilgili java üzerinden işlemler yapabilmemiz için Azure Storage SDK for Java ya ihtiyaç vardır.Jar dosyası bu adresden indirilebilir.Bununla beraber daha birkaç .jar dosyalarını indirmemiz lazım.Bunlar ;
jackson-core-2.x.x.jar
slf4j-api-1.x.x.jar
slf4j-simple-1.x.x.jar
web sayfamızın ana sayfası index.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"><html><head><title>Dosya Yukleme Formu</title></head><body>
yuklemek icin dosya secin: <br /><formaction="main.jsp"method="post"enctype="multipart/form-data"><inputtype="file"name="file"size="50" /><br /><inputtype="submit"value="Yukle" /></form></body></html>
Burada dosya seçildikden sonra sunucuda bir yere kaydedilicek ve sonra Blob storage e gönderilicek.Bunun için main.jsp
<%@ page import="java.io.*,java.util.*, javax.servlet.*" %>
<%@ page import="javax.servlet.http.*" %>
<%@ page import="org.apache.commons.fileupload.*" %>
<%@ page import="org.apache.commons.fileupload.disk.*" %>
<%@ page import="org.apache.commons.fileupload.servlet.*" %>
<%@ page import="org.apache.commons.io.output.*" %>
<%@ page import="com.microsoft.azure.storage.* "%>
<%@ page import="com.microsoft.azure.storage.blob.*" %>
<%
File file ;
int maxFileSize =5000*1024;
int maxMemSize =5000*1024;
//yuklenecek olan dosyanın serverde tutulacak dizinini belirleString filePath ="d:\\home\\site\\wwwroot\\bin\\apache-tomcat-8.0.28\\data\\";
String fileName="";
// formdan gelen içeriyin tipini dogrulaString contentType = request.getContentType();
if ((contentType.indexOf("multipart/form-data") >=0)){
DiskFileItemFactory factory =newDiskFileItemFactory();
// bellekte depolanacak maksimum boyut
factory.setSizeThreshold(maxMemSize);
// yuklemek için handler oluşturServletFileUpload yukle =newServletFileUpload(factory);
// yuklemek için maximum doya boyutunu belirle
yukle.setSizeMax( maxFileSize );
try{
// yuklenen dosyanın parametrelerini parse et.List fileItems = yukle.parseRequest(request);
// yuklenen dosyaları işleIterator i = fileItems.iterator();
out.println("<title>JSP Dosya Yukleme</title>");
while ( i.hasNext () ) {
FileItem fi = (FileItem)i.next();
if ( !fi.isFormField () )
{
// dosyanın parametrelerini alString fieldName = fi.getFieldName();
fileName = fi.getName();
boolean isInMemory = fi.isInMemory();
long sizeInBytes = fi.getSize();
// dosyanın ismini bul ve oluşturif( fileName.lastIndexOf("\\") >=0 ){
file =newFile( filePath +
fileName.substring( fileName.lastIndexOf("\\"))) ;
}else{
file =newFile( filePath +
fileName.substring(fileName.lastIndexOf("\\")+1)) ;
}
//dosyayı yaz
fi.write( file ) ;
out.println("Upload edilen dosya: "+ filePath +
fileName +"<br>");
}
}
}catch(Exception ex) {
System.out.println(ex);
}
}
else{
out.println("Dosya Yüklenemedi <br>");
}
//Bağlantı stringi oluşturString storageConnectionString ="DefaultEndpointsProtocol=http;"+"AccountName=hesap_adi;"+"AccountKey=hesap_anahtari";
try{
// storage hesabını elde etCloudStorageAccount storageAccount =CloudStorageAccount.parse(storageConnectionString);
// istemci oluşturCloudBlobClient istemciBlob = storageAccount.createCloudBlobClient();
// container oluşturCloudBlobContainer container = istemciBlob.getContainerReference("resimler");
container.createIfNotExists();
//storage e yuklenecek olan resim için yolu belirleStringYuklenmisfilePath= filePath+fileName;
// blob oluştur.CloudBlockBlob blob = container.getBlockBlobReference(fileName);
File dosya =newFile(YuklenmisfilePath);
//yükle
blob.upload(newFileInputStream(dosya), dosya.length());
out.println("Dosyayi Storage e Yukleme Basarili <br>");
//resim yüklendiyse,resmin containerde olup olmadıgını gosterint i=1;//blobları numaralandırmak içinfor (ListBlobItem blobItem : container.listBlobs()) {
//blob veya sanal dizin oldgunu kontrol et,blob ise if (blobItem instanceofCloudBlob) {
// uygun blob u oluştur.CloudBlob blob1 = (CloudBlob) blobItem;
//container daki butun dosyalari listele
out.println(i+".blob:"+blob1.getName()+"<br>");
i++;
}
}
}
catch (Exception e)
{
out.println("Dosya Storage e yüklenemedi.... <br>");
}
%>
Burada belirtmemiz gereken iki jar dosyası daha var,bu jarlar form üzerinden upload işlemi için gerekli doslardır.Bunlar;
commons-io- 2.x.jar
commons-fileupload-1.x.x.jar
Uygulamanın kkodlari bunlardır.Bu kodlar jar dosyalarının classpath e eklenerek yerelde veya sunucu üzerinde çalıştırılabilir.Upload işlemi yapıldıkdan sonra uygulamanın çıktısı;
Buradan bu web uygulamasına erişebilinir.Aşağıdaki video da Azure platformu üzerinden Storage oluşturma ve buna erişim için gereken bilgilerin nasıl elde edileceği anlatılmaktadır.