.NET Core ve Golang Birlikte Nasıl Durur?

net-core-and-golang
PRO

.NET Core ve Golang Birlikte Nasıl Durur?

.NET Core; bana göre, bulut teknolojileri, modern web uygulamaları ve mobil servisler geliştirme rekabetine dahil olmuş, Ruby, Python, NodeJs vb. dil ve platformlara ilgi-ihtiyaç duyan .NET geliştiriciler için açık kaynak kodlu ve cross-platform destekli bir ortama olan gereksinimi karşılar.
Böylelikle; C# veya F# programlama dilleri ile Linux, MAC OSx ve Windows işletim sistemlerinde çalışabilen, performanslı, derlenip dağıtılabilir programlar geliştirebilir.
Bir diğer tarafta Google tarafından 2007 yılında duyurulan Golang programlama dili; hızla gelişen, her geçen gün artan popülerliği ve etkin bir topluluk dayanışması ile performanslı sistemler, web uygulamaları, dağıtık servisler vb. geliştirebilmek için birçok alanda tercih edilmektedir. Docker, moby, kubernetes vb. açık kaynak kodlu projeler ve bulut altyapısı sağlayacıları (DigitalOcean, Azure, Amazon) Golang’ın gelişmesine katkı sağlamaya devem ediyor.
Burada ön plana çıkan bir farktan bahsetmek isterim. .NET Core çalışma zamanında CoreCLR olarak adlandırılan bir çalıştırıcıya ihtiyaç duyup C# veya F# ile yazılan programların derlenip bu host ile çalıştırılmasını ister. Golang ise bağımsız olarak derleme sonucu oluşturulan çalıştırılabilir bir program üretir. Golang ile yazılan programın; işletim sistemi tarafından sunulan SDK, API, alt seviye işlemleri ve uyumluluk durumlarını kendiniz işler ve idare edersiniz. (Makefile, cross compiling)
Her iki ortamın Github hesapları (.NET Core, Golang), açık kaynak kodlu projeleri, detaylı dokümantasyon içerikleri (Docs Microsoft, Golang Docs) çok zengin ve kesinlikle incelemeye değer.
Basit bir giriş yapmak istemiştim ama sanırım bu iki platformun özelliklerini anlatmak için ayrı bir yazı dizisi gerektiği aşikar.
Teknolojileri lehimize kullanarak; ihtiyaç duyduğumuz çözümleri üretmek, fanatik yaklaşımlardan uzaklaşarak şartları lehimize çevirebilecek basit ve kestirme yolları tercih etmenin, işlerimizi kolaylaştırdığını çoğu zaman tecrübe ettiğimi söyleyebilirim. Buradan yola çıkarak bu iki ortamın farklı özelliklerinden nasıl yararlandığımıza, .NET Core ve Golang’in birlikte gerçek bir senaryo üzerinden nasıl işlediğine bakalım.
Deneyim: İç ağımızda hizmet veren bir dosya sunucusunun belirli dizin ve içeriklerinin servisler, web uygulamaları (ASP.NET Core MVC Web Application) vb. hizmetler tarafından kullanılması isteniyor. Bu sunucuda .NET veya .NET Core framework kurulumu veya yükseltmesi yapamadığımızı varsayıyorum. Burada görevi Golang devralıyor.

​Bölüm Golang​
package mainimport(“log””net/http””os””path””path/filepath”)funcmain(){ dir, err:= filepath.Abs(filepath.Dir(os.Args[0]))if err!=nil{ log.Fatal(err)} combined:= path.Join(dir,”wwwroot”)panic(http.ListenAndServe(“:1444”, http.FileServer(http.Dir(combined))))}

​​Yukarıda​ki Golang programı, çalıştırıldığı dizinde belirtilen klasörü (wwwroot) ve tüm dizin içeriklerini http://*:1444 HTTP protokolü üzerinden erişilebilir yapar. Bir kaç satır kod ile statik içerik host edebilen, cross-platform bir sunucu programı yazmış olduk.
Bu programı sunucuya atıp terminalden – konsoldan çalıştırabilir ve hizmeti başlatabiliriz. Ben bu programı Windows Server 2012 R2 üzerinde bir windows servis olarak çalıştırıp, işletim sistemi tarafından gerekli durumlarda yeniden başlatılmasını sağlamak istiyorum (restart, exception, power vb.). Bunun için Github’ dan Service isimli açık kaynak kodlu bir kütüphaneden yararlanıyorum. Varsayılan olarak derlenen Golang programını bu haliyle windows servis olarak Service Control Manager aracılığıyla kayıt – register edemiyoruz. Bu sebeple programı şu şekilde güncelliyorum:​package mainimport(“log””net/http””os””path””path/filepath””github.com/kardianos/service”)var logger service.Loggertype programstruct{}func(p*program)Start(s service.Service)error{// Start should not block. Do the actual work async.go p.run()returnnil}func(p*program)run(){ dir, err:= filepath.Abs(filepath.Dir(os.Args[0]))if err!=nil{ log.Fatal(err)} combined:= path.Join(path.Dir(dir),”../wwwroot”)panic(http.ListenAndServe(“:1444″, http.FileServer(http.Dir(combined))))}func(p*program)Stop(s service.Service)error{// Stop should not block. Return with a few seconds.returnnil}funcmain(){ svcConfig:=&service.Config{ Name:”GoStaticServer”, DisplayName:”Go Static File Server”, Description:”Static file server”,} prg:=&program{} s, err

 

Arşivler