{"id":44188,"date":"2026-08-19T09:10:27","date_gmt":"2026-08-19T06:10:27","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/go-ile-mikroservisler-olusturmaya-pratik-bir-giris-gofr-ile-tanisin\/"},"modified":"2026-08-19T09:10:45","modified_gmt":"2026-08-19T06:10:45","slug":"go-ile-mikroservisler-olusturmaya-pratik-bir-giris-gofr-ile-tanisin","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/go-ile-mikroservisler-olusturmaya-pratik-bir-giris-gofr-ile-tanisin\/","title":{"rendered":"Go ile Mikroservisler Olu\u015fturmaya Pratik Bir Giri\u015f: GoFr ile Tan\u0131\u015f\u0131n"},"content":{"rendered":"<h2>Go ile Mikroservisler Olu\u015fturmaya Pratik Bir Giri\u015f: GoFr ile Tan\u0131\u015f\u0131n<\/h2>\n<p>Modern yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda \u00f6l\u00e7eklenebilirlik, esneklik ve h\u0131zl\u0131 da\u011f\u0131t\u0131m giderek daha kritik hale gelmektedir. Monolitik uygulamalar\u0131n getirdi\u011fi zorluklar kar\u015f\u0131s\u0131nda mikroservis mimarisi, geli\u015ftiricilere daha mod\u00fcler ve y\u00f6netilebilir sistemler in\u015fa etme olana\u011f\u0131 sunar. Bu kapsaml\u0131 rehberde, Go programlama dilinin g\u00fcc\u00fcn\u00fc ve GoFr framework&#8217;\u00fcn\u00fcn pratikli\u011fini birle\u015ftirerek mikroservis d\u00fcnyas\u0131na ad\u0131m ataca\u011f\u0131z. Performansl\u0131, bak\u0131m\u0131 kolay ve \u00f6l\u00e7eklenebilir uygulamalar geli\u015ftirmek hi\u00e7 bu kadar basit olmam\u0131\u015ft\u0131. GoFr ile mikroservislerin temel prensiplerini anlamak, ilk servisinizi olu\u015fturmak ve ger\u00e7ek d\u00fcnya senaryolar\u0131nda nas\u0131l kullanabilece\u011finizi ke\u015ffetmek i\u00e7in haz\u0131rsan\u0131z, bu yolculu\u011fa ba\u015flayal\u0131m.<\/p>\n<h2>Mikroservis Mimarisi Neden \u00d6nemli ve Go Neden \u0130deal Bir Se\u00e7imdir?<\/h2>\n<p>Yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7leri, \u00f6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k sistemlerde, s\u00fcrekli olarak yeni zorluklarla kar\u015f\u0131la\u015fmaktad\u0131r. Geleneksel monolitik (b\u00fct\u00fcnle\u015fik) mimarilerde, t\u00fcm uygulaman\u0131n tek bir b\u00fcy\u00fck kod taban\u0131 i\u00e7inde yer almas\u0131, zamanla geli\u015ftirme h\u0131z\u0131n\u0131 yava\u015flatabilir, yeni \u00f6zelliklerin eklenmesini zorla\u015ft\u0131rabilir ve sistemin tamam\u0131n\u0131 etkileyen hatalara yol a\u00e7abilir. Tek bir bile\u015fendeki bir de\u011fi\u015fiklik, t\u00fcm uygulaman\u0131n yeniden derlenmesini ve da\u011f\u0131t\u0131lmas\u0131n\u0131 gerektirebilir ki bu da ciddi operasyonel y\u00fckler anlam\u0131na gelir. \u00d6l\u00e7eklenebilirlik a\u00e7\u0131s\u0131ndan da monolitikler, uygulaman\u0131n yaln\u0131zca belirli bir b\u00f6l\u00fcm\u00fc a\u015f\u0131r\u0131 y\u00fcklense bile t\u00fcm sistemin \u00f6l\u00e7eklendirilmesini gerektirdi\u011fi i\u00e7in kaynak israf\u0131na neden olabilir.<\/p>\n<p>\u0130\u015fte tam da bu noktada mikroservis mimarisi devreye girer. Mikroservisler, bir uygulamay\u0131 ba\u011f\u0131ms\u0131z, k\u00fc\u00e7\u00fck ve kendi kendine yeten servisler koleksiyonu olarak tasarlama yakla\u015f\u0131m\u0131d\u0131r. Her servis, belirli bir i\u015f alan\u0131na odaklan\u0131r ve kendi veritaban\u0131na, i\u015f mant\u0131\u011f\u0131na ve API&#8217;sine sahip olabilir. Bu yap\u0131, bir\u00e7ok \u00f6nemli avantaj\u0131 beraberinde getirir. \u00d6ncelikle, servisler birbirinden ba\u011f\u0131ms\u0131z oldu\u011fu i\u00e7in, bir serviste yap\u0131lan de\u011fi\u015fiklikler di\u011fer servisleri do\u011frudan etkilemez, bu da geli\u015ftirme ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerini h\u0131zland\u0131r\u0131r. \u0130kincisi, her servis kendi teknolojisini (programlama dili, veritaban\u0131 vb.) se\u00e7ebilir, bu da ekibin en uygun ara\u00e7lar\u0131 kullanmas\u0131na olanak tan\u0131r. \u00dc\u00e7\u00fcnc\u00fcs\u00fc, servisler ba\u011f\u0131ms\u0131z olarak \u00f6l\u00e7eklendirilebilir, yani yaln\u0131zca ihtiyac\u0131 olan servislerin kaynaklar\u0131 art\u0131r\u0131larak maliyet etkinli\u011fi sa\u011flan\u0131r. Son olarak, hata yal\u0131t\u0131m\u0131 (fault isolation) sayesinde, bir servisteki bir hata t\u00fcm sistemin \u00e7\u00f6kmesine neden olmaz, bu da sistemin genel direncini art\u0131r\u0131r.<\/p>\n<p>Peki, mikroservis geli\u015ftirmek i\u00e7in neden Go (Golang) programlama dili bu kadar pop\u00fcler bir tercih haline geldi? Go, Google taraf\u0131ndan geli\u015ftirilmi\u015f, derlenmi\u015f, e\u015fzamanl\u0131l\u0131k (concurrency) odakl\u0131, statik tipli bir dildir. Mikroservisler i\u00e7in ideal olmas\u0131n\u0131 sa\u011flayan ba\u015fl\u0131ca \u00f6zellikleri \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong>Performans:<\/strong> Go, C\/C++ gibi dillere yak\u0131n bir performans sunarken, Python veya JavaScript gibi dillere g\u00f6re \u00e7ok daha h\u0131zl\u0131 \u00e7al\u0131\u015f\u0131r. Bu, y\u00fcksek trafikli mikroservisler i\u00e7in kritik bir avantajd\u0131r.<\/li>\n<li><strong>E\u015fzamanl\u0131l\u0131k (Concurrency):<\/strong> Go&#8217;nun goroutine&#8217;leri ve channel&#8217;lar\u0131, e\u015fzamanl\u0131 programlamay\u0131 son derece kolay ve verimli hale getirir. Bu, ayn\u0131 anda birden fazla iste\u011fi i\u015fleyebilen ve I\/O yo\u011fun operasyonlar\u0131 sorunsuz bir \u015fekilde y\u00f6netebilen mikroservisler i\u00e7in bi\u00e7ilmi\u015f kaftand\u0131r.<\/li>\n<li><strong>K\u00fc\u00e7\u00fck Bellek Ayak \u0130zi:<\/strong> Go ile yaz\u0131lan uygulamalar genellikle d\u00fc\u015f\u00fck bellek t\u00fcketimine sahiptir, bu da bulut ortamlar\u0131nda maliyet tasarrufu sa\u011flar.<\/li>\n<li><strong>H\u0131zl\u0131 Derleme S\u00fcresi:<\/strong> Go projeleri \u00e7ok h\u0131zl\u0131 derlenir, bu da geli\u015ftirme d\u00f6ng\u00fclerini k\u0131salt\u0131r.<\/li>\n<li><strong>Statik Ba\u011flant\u0131 (Static Linking):<\/strong> Go, t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131 tek bir \u00e7al\u0131\u015ft\u0131r\u0131labilir dosyaya derleyebilir, bu da da\u011f\u0131t\u0131m\u0131 (deployment) son derece basitle\u015ftirir (tek bir dosya kopyalamak yeterlidir).<\/li>\n<li><strong>G\u00fc\u00e7l\u00fc Standart K\u00fct\u00fcphane:<\/strong> Go&#8217;nun standart k\u00fct\u00fcphanesi, HTTP sunucular\u0131, JSON i\u015fleme, veritaban\u0131 s\u00fcr\u00fcc\u00fcleri gibi bir\u00e7ok temel mikroservis ihtiyac\u0131n\u0131 kar\u015f\u0131layacak zengin \u00f6zellikler sunar.<\/li>\n<\/ul>\n<p>GoFr ise, Go&#8217;nun bu g\u00fc\u00e7l\u00fc y\u00f6nlerini al\u0131p mikroservis geli\u015ftirme s\u00fcrecini daha da kolayla\u015ft\u0131ran, hafif ve mod\u00fcler bir framework (yaz\u0131l\u0131m \u00e7er\u00e7evesidir). Yap\u0131land\u0131rma y\u00f6netimi, ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu, HTTP y\u00f6nlendirme ve hata i\u015fleme gibi tekrarlayan g\u00f6revleri basitle\u015ftirerek geli\u015ftiricilerin i\u015f mant\u0131\u011f\u0131na odaklanmas\u0131n\u0131 sa\u011flar. Bu sayede, Go ile performansl\u0131 ve \u00f6l\u00e7eklenebilir mikroservisler olu\u015fturmak, GoFr&#8217;\u0131n sundu\u011fu kolayl\u0131klarla birlikte \u00e7ok daha eri\u015filebilir hale gelir.<\/p>\n<h2>GoFr Nedir ve Mikroservis Geli\u015ftirmeyi Nas\u0131l Basitle\u015ftirir?<\/h2>\n<p>Go programlama dilinin mikroservisler i\u00e7in sundu\u011fu avantajlar\u0131 ele ald\u0131k. Ancak, her ne kadar Go g\u00fc\u00e7l\u00fc bir dil olsa da, s\u0131f\u0131rdan bir mikroservis in\u015fa etmek; HTTP y\u00f6nlendirme, yap\u0131land\u0131rma y\u00f6netimi, ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu, loglama, hata y\u00f6netimi ve veritaban\u0131 entegrasyonu gibi bir\u00e7ok temel bile\u015fenin manuel olarak kurulmas\u0131n\u0131 ve yap\u0131land\u0131r\u0131lmas\u0131n\u0131 gerektirebilir. \u0130\u015fte GoFr, tam da bu noktada devreye girerek geli\u015ftiricilerin hayat\u0131n\u0131 kolayla\u015ft\u0131ran, hafif ve mod\u00fcler bir Go framework&#8217;\u00fc olarak \u00f6ne \u00e7\u0131kar.<\/p>\n<p>GoFr, &#8220;opinionated&#8221; (belirli bir yakla\u015f\u0131m\u0131 benimsemi\u015f) bir framework olmaktan ziyade, geli\u015ftiricilere esneklik sunan, ancak ayn\u0131 zamanda mikroservisler i\u00e7in en iyi uygulamalar\u0131 te\u015fvik eden bir yap\u0131da tasarlanm\u0131\u015ft\u0131r. Temel amac\u0131, Go ile mikroservis geli\u015ftirmeyi daha h\u0131zl\u0131, daha g\u00fcvenilir ve daha az tekrarlayan bir s\u00fcre\u00e7 haline getirmektir. Bunu yaparken, Go&#8217;nun kendi felsefesine sad\u0131k kal\u0131r: basitlik ve performans.<\/p>\n<p>GoFr&#8217;\u0131n mikroservis geli\u015ftirmede \u00e7\u00f6zd\u00fc\u011f\u00fc ba\u015fl\u0131ca sorunlar ve sundu\u011fu kolayl\u0131klar \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong>Yap\u0131land\u0131rma Y\u00f6netimi:<\/strong> Mikroservisler genellikle farkl\u0131 ortamlar (geli\u015ftirme, test, \u00fcretim) i\u00e7in farkl\u0131 yap\u0131land\u0131rmalara ihtiya\u00e7 duyar. GoFr, ortam de\u011fi\u015fkenleri, dosya tabanl\u0131 yap\u0131land\u0131rmalar veya komut sat\u0131r\u0131 arg\u00fcmanlar\u0131 arac\u0131l\u0131\u011f\u0131yla kolay ve merkezi bir yap\u0131land\u0131rma y\u00f6netimi sa\u011flar. Bu sayede, servislerinizin ayarlar\u0131n\u0131 dinamik olarak y\u00f6netebilirsiniz.<\/li>\n<li><strong>HTTP Y\u00f6nlendirme (Routing):<\/strong> Bir API servisi olu\u015ftururken farkl\u0131 URL yollar\u0131na (path) ve HTTP metotlar\u0131na (GET, POST, PUT, DELETE) istekleri y\u00f6nlendirmek temel bir gereksinimdir. GoFr, sezgisel ve performans\u0131 y\u00fcksek bir y\u00f6nlendirme mekanizmas\u0131 sunarak, API endpoint&#8217;lerinizi kolayca tan\u0131mlaman\u0131z\u0131 sa\u011flar.<\/li>\n<li><strong>Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu (Dependency Injection &#8211; DI):<\/strong> B\u00fcy\u00fck uygulamalarda bile\u015fenler aras\u0131 ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00f6netmek karma\u015f\u0131k olabilir. GoFr, ba\u011f\u0131ml\u0131l\u0131k enjeksiyonunu destekleyerek kodunuzu daha mod\u00fcler, test edilebilir ve s\u00fcrd\u00fcr\u00fclebilir hale getirir. Bu, \u00f6zellikle test yazarken veya bile\u015fenleri de\u011fi\u015ftirirken b\u00fcy\u00fck kolayl\u0131k sa\u011flar.<\/li>\n<li><strong>Hata Y\u00f6netimi:<\/strong> Sa\u011flam bir mikroservis, hatalar\u0131 d\u00fczg\u00fcn bir \u015fekilde ele almal\u0131 ve istemciye anlaml\u0131 yan\u0131tlar d\u00f6nd\u00fcrmelidir. GoFr, merkezi bir hata i\u015fleme mekanizmas\u0131 sunarak, uygulaman\u0131zdaki hatalar\u0131 standart bir \u015fekilde yakalaman\u0131za ve y\u00f6netmenize olanak tan\u0131r.<\/li>\n<li><strong>Loglama:<\/strong> Uygulamalar\u0131n \u00e7al\u0131\u015fma zaman\u0131ndaki davran\u0131\u015flar\u0131n\u0131 izlemek ve sorunlar\u0131 gidermek i\u00e7in etkili loglama kritik \u00f6neme sahiptir. GoFr, yap\u0131land\u0131r\u0131labilir ve performansl\u0131 bir loglama \u00e7\u00f6z\u00fcm\u00fc sunar, b\u00f6ylece servislerinizin ne yapt\u0131\u011f\u0131n\u0131 kolayca takip edebilirsiniz.<\/li>\n<li><strong>Veritaban\u0131 Entegrasyonu:<\/strong> \u00c7o\u011fu mikroservis, verileri kal\u0131c\u0131 olarak depolamak i\u00e7in bir veritaban\u0131na ihtiya\u00e7 duyar. GoFr, pop\u00fcler veritabanlar\u0131yla (PostgreSQL, MySQL vb.) kolay entegrasyon sa\u011flayarak veri eri\u015fim katman\u0131n\u0131 basitle\u015ftirir.<\/li>\n<li><strong>Middleware Deste\u011fi:<\/strong> \u0130stek i\u015fleme zincirine ek i\u015flevsellik (kimlik do\u011frulama, yetkilendirme, CORS, s\u0131k\u0131\u015ft\u0131rma vb.) eklemek i\u00e7in middleware&#8217;ler vazge\u00e7ilmezdir. GoFr, esnek bir middleware yap\u0131s\u0131 sunarak bu t\u00fcr i\u015flevleri kolayca entegre etmenizi sa\u011flar.<\/li>\n<\/ul>\n<p>Di\u011fer Go framework&#8217;leri (\u00f6rne\u011fin Gin, Echo, Fiber) genellikle sadece HTTP y\u00f6nlendirme ve istek i\u015fleme katman\u0131na odaklan\u0131rken, GoFr daha kapsaml\u0131 bir \u00e7\u00f6z\u00fcm sunar. Yap\u0131land\u0131rma, DI, loglama gibi mikroservislerin temel ihtiya\u00e7lar\u0131n\u0131 tek bir \u00e7at\u0131da birle\u015ftirerek, geli\u015ftiricilerin farkl\u0131 k\u00fct\u00fcphaneleri bir araya getirme y\u00fck\u00fcn\u00fc azalt\u0131r. Mod\u00fcler yap\u0131s\u0131 sayesinde, sadece ihtiyac\u0131n\u0131z olan bile\u015fenleri kullanabilir, gereksiz \u015fi\u015fkinlikten ka\u00e7\u0131nabilirsiniz. K\u0131sacas\u0131, GoFr, Go ile mikroservis geli\u015ftirmek isteyenler i\u00e7in h\u0131zl\u0131 ba\u015flang\u0131\u00e7 yapmalar\u0131n\u0131 sa\u011flayan, iyi d\u00fc\u015f\u00fcn\u00fclm\u00fc\u015f ve pratik bir ara\u00e7 setidir.<\/p>\n<h2>GoFr ile \u0130lk Mikroservisinizi Olu\u015fturma Rehberi<\/h2>\n<p>GoFr&#8217;\u0131n ne oldu\u011funu ve neden mikroservis geli\u015ftirmede faydal\u0131 oldu\u011funu \u00f6\u011frendik. \u015eimdi s\u0131ra geldi ilk GoFr mikroservisimizi olu\u015fturmaya. Bu b\u00f6l\u00fcmde, Go&#8217;nun kurulu oldu\u011fu bir ortamda s\u0131f\u0131rdan basit bir HTTP API servisi nas\u0131l yaz\u0131l\u0131r, ad\u0131m ad\u0131m g\u00f6rece\u011fiz. Bu \u00f6rnek, GoFr&#8217;\u0131n temel yap\u0131s\u0131n\u0131 ve bir endpoint&#8217;i nas\u0131l tan\u0131mlad\u0131\u011f\u0131n\u0131z\u0131 anlaman\u0131za yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<h3>\u00d6n Gereksinimler<\/h3>\n<p>Ba\u015flamadan \u00f6nce sisteminizde Go programlama dilinin kurulu oldu\u011fundan emin olmal\u0131s\u0131n\u0131z. Go&#8217;nun resmi web sitesinden (go.dev) i\u015fletim sisteminize uygun s\u00fcr\u00fcm\u00fc indirip kurabilirsiniz. Kurulumu do\u011frulama i\u00e7in terminalinizde <code>go version<\/code> komutunu \u00e7al\u0131\u015ft\u0131rabilirsiniz.<\/p>\n<h3>Proje Klas\u00f6r\u00fc Olu\u015fturma ve Go Mod\u00fcl\u00fcn\u00fc Ba\u015flatma<\/h3>\n<p>\u0130lk olarak, projemiz i\u00e7in yeni bir klas\u00f6r olu\u015ftural\u0131m ve bu klas\u00f6r\u00fcn i\u00e7ine girelim. Ard\u0131ndan, Go mod\u00fcl\u00fcn\u00fc ba\u015flatarak projemizin ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 y\u00f6netecek bir <code>go.mod<\/code> dosyas\u0131 olu\u015ftural\u0131m:<\/p>\n<div class=\"code-container\">\n<pre><code>\nmkdir my-first-gofr-service\ncd my-first-gofr-service\ngo mod init my-first-gofr-service\n  <\/code><\/pre>\n<\/div>\n<p>Yukar\u0131daki komutlar, projeniz i\u00e7in <code>my-first-gofr-service<\/code> ad\u0131nda bir dizin olu\u015fturacak ve bu dizini bir Go mod\u00fcl\u00fc olarak ba\u015flatacakt\u0131r. <code>go.mod<\/code> dosyas\u0131, projenizin ihtiya\u00e7 duydu\u011fu k\u00fct\u00fcphaneleri ve onlar\u0131n s\u00fcr\u00fcmlerini takip etmenizi sa\u011flar.<\/p>\n<h3>Basit Bir &#8220;Hello World&#8221; API Endpoint&#8217;i Olu\u015fturma<\/h3>\n<p>\u015eimdi projemizin ana dosyas\u0131 olan <code>main.go<\/code> dosyas\u0131n\u0131 olu\u015ftural\u0131m ve i\u00e7ine GoFr ile basit bir &#8220;Hello World&#8221; API endpoint&#8217;i tan\u0131mlayan kodu yazal\u0131m:<\/p>\n<div class=\"code-container\">\n<pre><code>\n\/\/ main.go\npackage main\n\nimport (\n\t\"my-first-gofr-service\/app\" \/\/ Kendi uygulama paketimizi i\u00e7e aktar\u0131yoruz\n)\n\nfunc main() {\n\t\/\/ GoFr uygulamas\u0131n\u0131 ba\u015flat\u0131yoruz\n\tapp.New().Run()\n}\n\n\/\/ app\/app.go\npackage app\n\nimport (\n\t\"github.com\/gofr-dev\/gofr\"\n)\n\nfunc New() *gofr.App {\n\tapp := gofr.New()\n\n\t\/\/ GET \/hello endpoint'ini tan\u0131ml\u0131yoruz\n\tapp.GET(\"\/hello\", func(c *gofr.Context) (interface{}, error) {\n\t\tname := c.Param(\"name\") \/\/ URL parametresini al\u0131yoruz\n\t\tif name == \"\" {\n\t\t\tname = \"D\u00fcnya\"\n\t\t}\n\t\treturn \"Merhaba, \" + name + \"!\", nil \/\/ JSON yan\u0131t\u0131 d\u00f6nd\u00fcr\u00fcyoruz\n\t})\n\n\treturn app\n}\n  <\/code><\/pre>\n<\/div>\n<p>Yukar\u0131daki kodda iki \u00f6nemli dosya bulunmaktad\u0131r: <code>main.go<\/code> ve <code>app\/app.go<\/code>. Bu ayr\u0131m, Go projelerinde genellikle uygulaman\u0131n ana ba\u015flatma mant\u0131\u011f\u0131n\u0131 ve i\u015f mant\u0131\u011f\u0131n\u0131 ayr\u0131 tutmak i\u00e7in kullan\u0131lan iyi bir uygulamad\u0131r. \u0130lk olarak, projenizin k\u00f6k dizininde <code>main.go<\/code> dosyas\u0131n\u0131 olu\u015fturun. Ard\u0131ndan, <code>app<\/code> ad\u0131nda yeni bir dizin olu\u015fturun ve i\u00e7ine <code>app.go<\/code> dosyas\u0131n\u0131 yerle\u015ftirin.<\/p>\n<p>Kodun a\u00e7\u0131klamas\u0131n\u0131 yapal\u0131m:<\/p>\n<ul>\n<li><code>package main<\/code>: Go&#8217;da \u00e7al\u0131\u015ft\u0131r\u0131labilir programlar\u0131n ana paketi budur.<\/li>\n<li><code>import \"my-first-gofr-service\/app\"<\/code>: Kendi uygulama mant\u0131\u011f\u0131m\u0131z\u0131 i\u00e7eren <code>app<\/code> paketini i\u00e7e aktar\u0131yoruz.<\/li>\n<li><code>func main()<\/code>: Go programlar\u0131n\u0131n ba\u015flang\u0131\u00e7 noktas\u0131d\u0131r. Burada <code>app.New().Run()<\/code> \u00e7a\u011fr\u0131s\u0131 ile GoFr uygulamas\u0131n\u0131 ba\u015flat\u0131yoruz.<\/li>\n<li><code>app\/app.go<\/code> dosyas\u0131nda <code>package app<\/code> ile ayr\u0131 bir paket tan\u0131ml\u0131yoruz.<\/li>\n<li><code>import \"github.com\/gofr-dev\/gofr\"<\/code>: GoFr framework&#8217;\u00fcn\u00fc i\u00e7e aktar\u0131yoruz.<\/li>\n<li><code>func New() *gofr.App<\/code>: Bu fonksiyon, yeni bir GoFr uygulamas\u0131 (<code>*gofr.App<\/code>) \u00f6rne\u011fi olu\u015fturur ve yap\u0131land\u0131r\u0131r.<\/li>\n<li><code>app := gofr.New()<\/code>: Yeni bir GoFr uygulama nesnesi olu\u015fturulur.<\/li>\n<li><code>app.GET(\"\/hello\", func(c *gofr.Context) (interface{}, error) { ... })<\/code>: Bu sat\u0131r, HTTP GET metodu ile <code>\/hello<\/code> yoluna gelen istekleri i\u015fleyecek bir y\u00f6nlendirici (router) tan\u0131mlar. \u0130\u00e7indeki anonim fonksiyon (handler), iste\u011fi i\u015fler.\n<ul>\n<li><code>c *gofr.Context<\/code>: GoFr, her istek i\u00e7in bir <code>Context<\/code> (ba\u011flam) nesnesi sa\u011flar. Bu nesne, istekle ilgili bilgilere (parametreler, ba\u015fl\u0131klar, g\u00f6vde vb.) eri\u015fmek ve yan\u0131t d\u00f6nd\u00fcrmek i\u00e7in kullan\u0131l\u0131r.<\/li>\n<li><code>c.Param(\"name\")<\/code>: URL&#8217;den &#8220;name&#8221; ad\u0131nda bir parametre almaya \u00e7al\u0131\u015f\u0131r. \u00d6rne\u011fin, <code>\/hello?name=Ali<\/code> iste\u011finde &#8220;Ali&#8221; de\u011ferini al\u0131r.<\/li>\n<li><code>return \"Merhaba, \" + name + \"!\", nil<\/code>: \u0130stemciye bir string yan\u0131t\u0131 d\u00f6nd\u00fcr\u00fcr. <code>nil<\/code> ise hatan\u0131n olmad\u0131\u011f\u0131n\u0131 belirtir. GoFr, bu string&#8217;i otomatik olarak bir JSON yan\u0131t\u0131na d\u00f6n\u00fc\u015ft\u00fcrecektir.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3>Uygulamay\u0131 \u00c7al\u0131\u015ft\u0131rma ve Test Etme<\/h3>\n<p>Kodumuzu yazd\u0131ktan sonra, GoFr ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 indirmemiz gerekiyor. Terminalinizde proje klas\u00f6r\u00fcn\u00fczde iken \u015fu komutu \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<div class=\"code-container\">\n<pre><code>\ngo mod tidy\n  <\/code><\/pre>\n<\/div>\n<p>Bu komut, <code>go.mod<\/code> dosyan\u0131zdaki eksik ba\u011f\u0131ml\u0131l\u0131klar\u0131 indirir ve gereksiz olanlar\u0131 kald\u0131r\u0131r. \u015eimdi uygulamam\u0131z\u0131 \u00e7al\u0131\u015ft\u0131rabiliriz:<\/p>\n<div class=\"code-container\">\n<pre><code>\ngo run main.go\n  <\/code><\/pre>\n<\/div>\n<p>Uygulama ba\u015far\u0131yla ba\u015flat\u0131ld\u0131\u011f\u0131nda, terminalinizde GoFr&#8217;\u0131n varsay\u0131lan olarak <code>:8000<\/code> portunda dinlemeye ba\u015flad\u0131\u011f\u0131n\u0131 belirten bir mesaj g\u00f6rmelisiniz. \u015eimdi bir web taray\u0131c\u0131s\u0131 veya cURL gibi bir ara\u00e7 kullanarak API&#8217;mizi test edebiliriz:<\/p>\n<ul>\n<li>Taray\u0131c\u0131n\u0131zda veya cURL ile: <code>http:\/\/localhost:8000\/hello<\/code> adresine gidin. Yan\u0131t olarak <code>\"Merhaba, D\u00fcnya!\"<\/code> g\u00f6rmelisiniz.<\/li>\n<li>Taray\u0131c\u0131n\u0131zda veya cURL ile: <code>http:\/\/localhost:8000\/hello?name=GofrKullanicisi<\/code> adresine gidin. Yan\u0131t olarak <code>\"Merhaba, GofrKullanicisi!\"<\/code> g\u00f6rmelisiniz.<\/li>\n<\/ul>\n<p>Tebrikler! \u0130lk GoFr mikroservisinizi ba\u015far\u0131yla olu\u015fturdunuz ve \u00e7al\u0131\u015ft\u0131rd\u0131n\u0131z. Bu basit \u00f6rnek, GoFr&#8217;\u0131n ne kadar h\u0131zl\u0131 ve kolay bir \u015fekilde bir HTTP API olu\u015fturman\u0131za olanak tan\u0131d\u0131\u011f\u0131n\u0131 g\u00f6stermektedir. \u0130lerleyen b\u00f6l\u00fcmlerde, bu temelin \u00fczerine daha karma\u015f\u0131k \u00f6zellikler in\u015fa etmeyi \u00f6\u011frenece\u011fiz.<\/p>\n<h2>Veritaban\u0131 Entegrasyonu ve CRUD Operasyonlar\u0131: GoFr ile Veri Y\u00f6netimi<\/h2>\n<p>Modern mikroservislerin \u00e7o\u011fu, verileri kal\u0131c\u0131 olarak depolamak ve y\u00f6netmek i\u00e7in bir veritaban\u0131na ihtiya\u00e7 duyar. GoFr, \u00e7e\u015fitli veritabanlar\u0131yla (PostgreSQL, MySQL, SQLite, MongoDB gibi) kolay entegrasyon sa\u011flayarak bu s\u00fcreci basitle\u015ftirir. Bu b\u00f6l\u00fcmde, GoFr kullanarak bir veritaban\u0131na nas\u0131l ba\u011flanaca\u011f\u0131m\u0131z\u0131, veri modellerini nas\u0131l tan\u0131mlayaca\u011f\u0131m\u0131z\u0131 ve temel CRUD (Create, Read, Update, Delete) operasyonlar\u0131n\u0131 nas\u0131l ger\u00e7ekle\u015ftirece\u011fimizi ad\u0131m ad\u0131m inceleyece\u011fiz. Basit bir &#8220;G\u00f6rev Y\u00f6netimi&#8221; mikroservisi \u00fczerinden bu kavramlar\u0131 peki\u015ftirece\u011fiz.<\/p>\n<h3>Veritaban\u0131 Se\u00e7imi ve Ba\u011flant\u0131<\/h3>\n<p>Bu \u00f6rnek i\u00e7in pop\u00fcler ve g\u00fc\u00e7l\u00fc bir ili\u015fkisel veritaban\u0131 olan PostgreSQL&#8217;i kullanaca\u011f\u0131z. GoFr, veritaban\u0131 ba\u011flant\u0131lar\u0131n\u0131 yap\u0131land\u0131rma dosyalar\u0131 \u00fczerinden veya ortam de\u011fi\u015fkenleri arac\u0131l\u0131\u011f\u0131yla kolayca y\u00f6netmenizi sa\u011flar. \u0130lk olarak, projemizin k\u00f6k dizininde bir <code>config.dev.toml<\/code> dosyas\u0131 olu\u015ftural\u0131m ve veritaban\u0131 ba\u011flant\u0131 bilgilerini buraya ekleyelim:<\/p>\n<div class=\"code-container\">\n<pre><code>\n# config.dev.toml\n[DB]\nHOST=\"localhost\"\nPORT=\"5432\"\nUSER=\"postgres\"\nPASSWORD=\"mysecretpassword\"\nDBNAME=\"gofr_tasks\"\nSSLMODE=\"disable\"\n  <\/code><\/pre>\n<\/div>\n<p>Bu yap\u0131land\u0131rma, GoFr&#8217;\u0131n veritaban\u0131 ba\u011flant\u0131s\u0131n\u0131 otomatik olarak kurmas\u0131n\u0131 sa\u011flayacakt\u0131r. Veritaban\u0131 ba\u011flant\u0131s\u0131n\u0131 test etmek i\u00e7in <code>app\/app.go<\/code> dosyam\u0131z\u0131 g\u00fcncelleyelim:<\/p>\n<div class=\"code-container\">\n<pre><code>\n\/\/ app\/app.go (g\u00fcncellenmi\u015f)\npackage app\n\nimport (\n\t\"database\/sql\"\n\t\"fmt\"\n\t\"github.com\/gofr-dev\/gofr\"\n\t_ \"github.com\/lib\/pq\" \/\/ PostgreSQL s\u00fcr\u00fcc\u00fcs\u00fc\n)\n\n\/\/ Task veri modelimiz\ntype Task struct {\n\tID          int    <code>json:&quot;id&quot;<\/code>\n\tTitle       string <code>json:&quot;title&quot;<\/code>\n\tDescription string <code>json:&quot;description&quot;<\/code>\n\tCompleted   bool   <code>json:&quot;completed&quot;<\/code>\n}\n\nfunc New() *gofr.App {\n\tapp := gofr.New()\n\n\t\/\/ Veritaban\u0131 ba\u011flant\u0131s\u0131n\u0131 kontrol ediyoruz\n\tapp.GET(\"\/db-check\", func(c *gofr.Context) (interface{}, error) {\n\t\t_, err := c.DB.Query(\"SELECT 1\")\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"veritaban\u0131 ba\u011flant\u0131 hatas\u0131: %w\", err)\n\t\t}\n\t\treturn \"Veritaban\u0131 ba\u011flant\u0131s\u0131 ba\u015far\u0131l\u0131!\", nil\n\t})\n\n\t\/\/ ... di\u011fer endpoint'ler buraya gelecek ...\n\n\treturn app\n}\n  <\/code><\/pre>\n<\/div>\n<p><code>_ \"github.com\/lib\/pq\"<\/code> sat\u0131r\u0131, PostgreSQL s\u00fcr\u00fcc\u00fcs\u00fcn\u00fc GoFr&#8217;\u0131n veritaban\u0131 mod\u00fcl\u00fc taraf\u0131ndan kullan\u0131lmak \u00fczere i\u00e7e aktar\u0131r. <code>app.GET(\"\/db-check\", ...)<\/code> endpoint&#8217;i, veritaban\u0131 ba\u011flant\u0131s\u0131n\u0131n ba\u015far\u0131l\u0131 olup olmad\u0131\u011f\u0131n\u0131 kontrol eder.<\/p>\n<h3>Veri Modeli Tan\u0131mlama ve CRUD Operasyonlar\u0131<\/h3>\n<p>\u015eimdi <code>Task<\/code> ad\u0131nda bir veri modeli tan\u0131mlayal\u0131m ve bu model \u00fczerinde CRUD operasyonlar\u0131 ger\u00e7ekle\u015ftiren API endpoint&#8217;leri olu\u015ftural\u0131m. <code>Task<\/code> struct&#8217;\u0131m\u0131z, JSON etiketleri (<code>json:\"id\"<\/code> gibi) sayesinde HTTP yan\u0131tlar\u0131nda ve isteklerinde kolayca serile\u015ftirilip serile\u015ftirilebilir.<\/p>\n<div class=\"code-container\">\n<pre><code>\n\/\/ app\/app.go (CRUD operasyonlar\u0131 eklenmi\u015f)\npackage app\n\nimport (\n\t\"database\/sql\"\n\t\"fmt\"\n\t\"github.com\/gofr-dev\/gofr\"\n\t_ \"github.com\/lib\/pq\"\n)\n\ntype Task struct {\n\tID          int    <code>json:&quot;id&quot;<\/code>\n\tTitle       string <code>json:&quot;title&quot;<\/code>\n\tDescription string <code>json:&quot;description&quot;<\/code>\n\tCompleted   bool   <code>json:&quot;completed&quot;<\/code>\n}\n\nfunc New() *gofr.App {\n\tapp := gofr.New()\n\n\t\/\/ \u0130lk olarak, veritaban\u0131nda g\u00f6revler tablosunun var oldu\u011fundan emin olal\u0131m\n\t\/\/ Bu genellikle bir migration arac\u0131 ile yap\u0131l\u0131r, ancak basitlik i\u00e7in burada yap\u0131yoruz.\n\t_, err := app.DB.Exec(<code>CREATE TABLE IF NOT EXISTS tasks (\n\t\t\tid SERIAL PRIMARY KEY,\n\t\t\ttitle VARCHAR(255) NOT NULL,\n\t\t\tdescription TEXT,\n\t\t\tcompleted BOOLEAN DEFAULT FALSE\n\t\t);<\/code>)\n\tif err != nil {\n\t\tapp.Logger.Errorf(\"Veritaban\u0131 tablosu olu\u015fturulurken hata olu\u015ftu: %v\", err)\n\t}\n\n\tapp.GET(\"\/db-check\", func(c *gofr.Context) (interface{}, error) {\n\t\t_, err := c.DB.Query(\"SELECT 1\")\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"veritaban\u0131 ba\u011flant\u0131 hatas\u0131: %w\", err)\n\t\t}\n\t\treturn \"Veritaban\u0131 ba\u011flant\u0131s\u0131 ba\u015far\u0131l\u0131!\", nil\n\t})\n\n\t\/\/ CREATE: Yeni bir g\u00f6rev olu\u015fturma\n\tapp.POST(\"\/tasks\", func(c *gofr.Context) (interface{}, error) {\n\t\tvar task Task\n\t\t\/\/ \u0130stek g\u00f6vdesinden JSON verisini Task struct'\u0131na bind ediyoruz\n\t\tif err := c.Bind(&task); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"istek g\u00f6vdesi okunamad\u0131: %w\", err)\n\t\t}\n\n\t\t\/\/ Veritaban\u0131na yeni g\u00f6rev ekliyoruz\n\t\terr := c.DB.QueryRow(\n\t\t\t\"INSERT INTO tasks (title, description, completed) VALUES ($1, $2, $3) RETURNING id\",\n\t\t\ttask.Title, task.Description, task.Completed,\n\t\t).Scan(&task.ID) \/\/ Olu\u015fturulan g\u00f6revin ID'sini geri al\u0131yoruz\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"g\u00f6rev olu\u015fturulurken hata olu\u015ftu: %w\", err)\n\t\t}\n\t\treturn task, nil\n\t})\n\n\t\/\/ READ: T\u00fcm g\u00f6revleri listeleme\n\tapp.GET(\"\/tasks\", func(c *gofr.Context) (interface{}, error) {\n\t\trows, err := c.DB.Query(\"SELECT id, title, description, completed FROM tasks\")\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"g\u00f6revler sorgulan\u0131rken hata olu\u015ftu: %w\", err)\n\t\t}\n\t\tdefer rows.Close()\n\n\t\tvar tasks []Task\n\t\tfor rows.Next() {\n\t\t\tvar task Task\n\t\t\tif err := rows.Scan(&task.ID, &task.Title, &task.Description, &task.Completed); err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"g\u00f6rev verisi okunurken hata olu\u015ftu: %w\", err)\n\t\t\t}\n\t\t\ttasks = append(tasks, task)\n\t\t}\n\t\treturn tasks, nil\n\t})\n\n\t\/\/ READ: Belirli bir g\u00f6revi ID ile getirme\n\tapp.GET(\"\/tasks\/{id}\", func(c *gofr.Context) (interface{}, error) {\n\t\tid := c.Param(\"id\") \/\/ URL'den ID parametresini al\u0131yoruz\n\n\t\tvar task Task\n\t\terr := c.DB.QueryRow(\n\t\t\t\"SELECT id, title, description, completed FROM tasks WHERE id = $1\",\n\t\t\tid,\n\t\t).Scan(&task.ID, &task.Title, &task.Description, &task.Completed)\n\n\t\tif err == sql.ErrNoRows {\n\t\t\treturn nil, fmt.Errorf(\"ID %s ile g\u00f6rev bulunamad\u0131\", id)\n\t\t}\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"g\u00f6rev sorgulan\u0131rken hata olu\u015ftu: %w\", err)\n\t\t}\n\t\treturn task, nil\n\t})\n\n\t\/\/ UPDATE: Bir g\u00f6revi g\u00fcncelleme\n\tapp.PUT(\"\/tasks\/{id}\", func(c *gofr.Context) (interface{}, error) {\n\t\tid := c.Param(\"id\")\n\t\tvar task Task\n\t\tif err := c.Bind(&task); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"istek g\u00f6vdesi okunamad\u0131: %w\", err)\n\t\t}\n\n\t\tresult, err := c.DB.Exec(\n\t\t\t\"UPDATE tasks SET title = $1, description = $2, completed = $3 WHERE id = $4\",\n\t\t\ttask.Title, task.Description, task.Completed, id,\n\t\t)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"g\u00f6rev g\u00fcncellenirken hata olu\u015ftu: %w\", err)\n\t\t}\n\n\t\trowsAffected, _ := result.RowsAffected()\n\t\tif rowsAffected == 0 {\n\t\t\treturn nil, fmt.Errorf(\"ID %s ile g\u00fcncellenecek g\u00f6rev bulunamad\u0131\", id)\n\t\t}\n\t\treturn \"G\u00f6rev ba\u015far\u0131yla g\u00fcncellendi\", nil\n\t})\n\n\t\/\/ DELETE: Bir g\u00f6revi silme\n\tapp.DELETE(\"\/tasks\/{id}\", func(c *gofr.Context) (interface{}, error) {\n\t\tid := c.Param(\"id\")\n\n\t\tresult, err := c.DB.Exec(\"DELETE FROM tasks WHERE id = $1\", id)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"g\u00f6rev silinirken hata olu\u015ftu: %w\", err)\n\t\t}\n\n\t\trowsAffected, _ := result.RowsAffected()\n\t\tif rowsAffected == 0 {\n\t\t\treturn nil, fmt.Errorf(\"ID %s ile silinecek g\u00f6rev bulunamad\u0131\", id)\n\t\t}\n\t\treturn \"G\u00f6rev ba\u015far\u0131yla silindi\", nil\n\t})\n\n\treturn app\n}\n  <\/code><\/pre>\n<\/div>\n<p>Bu kod blo\u011funda, <code>app\/app.go<\/code> dosyam\u0131za bir <code>Task<\/code> modeli ve bu model \u00fczerinde \u00e7al\u0131\u015fan be\u015f farkl\u0131 API endpoint&#8217;i ekledik:<\/p>\n<ul>\n<li><code>POST \/tasks<\/code>: Yeni bir g\u00f6rev olu\u015fturur. \u0130stek g\u00f6vdesinden JSON olarak <code>title<\/code>, <code>description<\/code> ve <code>completed<\/code> bilgilerini al\u0131r.<\/li>\n<li><code>GET \/tasks<\/code>: T\u00fcm g\u00f6revleri listeler.<\/li>\n<li><code>GET \/tasks\/{id}<\/code>: Belirli bir ID&#8217;ye sahip g\u00f6revi getirir.<\/li>\n<li><code>PUT \/tasks\/{id}<\/code>: Belirli bir ID&#8217;ye sahip g\u00f6revi g\u00fcnceller. \u0130stek g\u00f6vdesinden g\u00fcncel bilgileri al\u0131r.<\/li>\n<li><code>DELETE \/tasks\/{id}<\/code>: Belirli bir ID&#8217;ye sahip g\u00f6revi siler.<\/li>\n<\/ul>\n<p>Kodun ba\u015f\u0131nda, GoFr uygulamas\u0131n\u0131n ba\u015flat\u0131lmas\u0131 s\u0131ras\u0131nda <code>tasks<\/code> tablosunun varl\u0131\u011f\u0131n\u0131 kontrol eden ve yoksa olu\u015fturan bir SQL sorgusu bulunmaktad\u0131r. Bu, geli\u015ftirme a\u015famas\u0131nda h\u0131zl\u0131 ba\u015flang\u0131\u00e7 i\u00e7in kullan\u0131\u015fl\u0131d\u0131r, ancak \u00fcretim ortamlar\u0131nda genellikle veritaban\u0131 migration (g\u00f6\u00e7) ara\u00e7lar\u0131 tercih edilir.<\/p>\n<h3>Test Etme<\/h3>\n<p>Uygulamay\u0131 \u00e7al\u0131\u015ft\u0131rmadan \u00f6nce, sisteminizde bir PostgreSQL sunucusu kurulu ve yap\u0131land\u0131r\u0131lm\u0131\u015f olmal\u0131d\u0131r. Ayr\u0131ca, <code>gofr_tasks<\/code> ad\u0131nda bir veritaban\u0131 olu\u015fturdu\u011funuzdan ve <code>config.dev.toml<\/code> dosyas\u0131ndaki kullan\u0131c\u0131 ad\u0131\/\u015fifre ile eri\u015febildi\u011finizden emin olun.<\/p>\n<p>Uygulamay\u0131 tekrar <code>go run main.go<\/code> ile \u00e7al\u0131\u015ft\u0131r\u0131n. \u015eimdi cURL veya Postman gibi bir ara\u00e7 kullanarak API&#8217;yi test edebilirsiniz:<\/p>\n<ol>\n<li><strong>Veritaban\u0131 Ba\u011flant\u0131s\u0131n\u0131 Kontrol Etme:<\/strong>\n<div class=\"code-container\">\n<pre><code>\ncurl http:\/\/localhost:8000\/db-check\n          <\/code><\/pre>\n<\/p><\/div>\n<p>        Beklenen Yan\u0131t: <code>\"Veritaban\u0131 ba\u011flant\u0131s\u0131 ba\u015far\u0131l\u0131!\"<\/code>\n    <\/li>\n<li><strong>Yeni G\u00f6rev Olu\u015fturma (POST):<\/strong>\n<div class=\"code-container\">\n<pre><code>\ncurl -X POST -H \"Content-Type: application\/json\" -d '{\"title\": \"GoFr \u00d6\u011fren\", \"description\": \"GoFr framework'\u00fcn\u00fc detayl\u0131 incele\", \"completed\": false}' http:\/\/localhost:8000\/tasks\n          <\/code><\/pre>\n<\/p><\/div>\n<p>        Beklenen Yan\u0131t: Olu\u015fturulan g\u00f6revin ID&#8217;sini i\u00e7eren JSON.\n    <\/li>\n<li><strong>T\u00fcm G\u00f6revleri Listeleme (GET):<\/strong>\n<div class=\"code-container\">\n<pre><code>\ncurl http:\/\/localhost:8000\/tasks\n          <\/code><\/pre>\n<\/p><\/div>\n<p>        Beklenen Yan\u0131t: Olu\u015fturdu\u011funuz g\u00f6revleri i\u00e7eren bir JSON dizisi.\n    <\/li>\n<li><strong>Belirli Bir G\u00f6revi Getirme (GET):<\/strong> (ID&#8217;yi yukar\u0131daki POST yan\u0131t\u0131ndan al\u0131n)\n<div class=\"code-container\">\n<pre><code>\ncurl http:\/\/localhost:8000\/tasks\/1\n          <\/code><\/pre>\n<\/p><\/div>\n<p>        Beklenen Yan\u0131t: ID&#8217;si 1 olan g\u00f6revin JSON&#8217;\u0131.\n    <\/li>\n<li><strong>G\u00f6revi G\u00fcncelleme (PUT):<\/strong>\n<div class=\"code-container\">\n<pre><code>\ncurl -X PUT -H \"Content-Type: application\/json\" -d '{\"title\": \"GoFr \u00d6\u011fren\", \"description\": \"GoFr framework'\u00fcn\u00fc detayl\u0131 incele ve kullan\", \"completed\": true}' http:\/\/localhost:8000\/tasks\/1\n          <\/code><\/pre>\n<\/p><\/div>\n<p>        Beklenen Yan\u0131t: <code>\"G\u00f6rev ba\u015far\u0131yla g\u00fcncellendi\"<\/code>.\n    <\/li>\n<li><strong>G\u00f6revi Silme (DELETE):<\/strong>\n<div class=\"code-container\">\n<pre><code>\ncurl -X DELETE http:\/\/localhost:8000\/tasks\/1\n          <\/code><\/pre>\n<\/p><\/div>\n<p>        Beklenen Yan\u0131t: <code>\"G\u00f6rev ba\u015far\u0131yla silindi\"<\/code>.\n    <\/li>\n<\/ol>\n<p>Bu b\u00f6l\u00fcmle birlikte, GoFr ile sadece basit bir API olu\u015fturmakla kalmad\u0131k, ayn\u0131 zamanda bir veritaban\u0131 ile entegrasyon kurarak kal\u0131c\u0131 veri y\u00f6netimi sa\u011flayan ger\u00e7ek d\u00fcnya senaryolar\u0131na bir ad\u0131m atm\u0131\u015f olduk. GoFr&#8217;\u0131n sundu\u011fu kolayl\u0131klar sayesinde, veritaban\u0131 operasyonlar\u0131n\u0131 API endpoint&#8217;lerine ba\u011flamak olduk\u00e7a basittir.<\/p>\n<h2>G\u00fcvenlik, Sa\u011flaml\u0131k ve Servisler Aras\u0131 \u0130leti\u015fim: Middleware&#8217;ler ve Hata Y\u00f6netimi<\/h2>\n<p>Bir mikroservisin sadece i\u015f mant\u0131\u011f\u0131n\u0131 do\u011fru bir \u015fekilde yerine getirmesi yeterli de\u011fildir; ayn\u0131 zamanda g\u00fcvenli, sa\u011flam ve di\u011fer servislerle etkile\u015fim kurabilen bir yap\u0131ya sahip olmas\u0131 gerekir. GoFr, bu ihtiya\u00e7lar\u0131 kar\u015f\u0131lamak i\u00e7in middleware (ara katman yaz\u0131l\u0131m\u0131) deste\u011fi ve geli\u015fmi\u015f hata y\u00f6netimi mekanizmalar\u0131 sunar. Ayr\u0131ca, farkl\u0131 mikroservislerin birbirleriyle nas\u0131l ileti\u015fim kurdu\u011funu da inceleyece\u011fiz.<\/p>\n<h3>Middleware&#8217;ler: \u0130stek \u0130\u015fleme Zincirini G\u00fc\u00e7lendirme<\/h3>\n<p>Middleware&#8217;ler, bir HTTP iste\u011fi ana i\u015fleyici (handler) fonksiyona ula\u015fmadan \u00f6nce veya ula\u015ft\u0131ktan sonra belirli i\u015flemlerin yap\u0131lmas\u0131n\u0131 sa\u011flayan fonksiyonlard\u0131r. Bu sayede, yetkilendirme, kimlik do\u011frulama, loglama, CORS (Cross-Origin Resource Sharing) ba\u015fl\u0131klar\u0131 ekleme, s\u0131k\u0131\u015ft\u0131rma veya istek\/yan\u0131t formatlama gibi tekrarlayan g\u00f6revleri merkezi bir yerde y\u00f6netebilirsiniz. GoFr, esnek bir middleware yap\u0131s\u0131na sahiptir.<\/p>\n<p>\u00d6rnek olarak, basit bir kimlik do\u011frulama (authentication) middleware&#8217;i olu\u015ftural\u0131m. Bu middleware, her iste\u011fin bir <code>Authorization<\/code> ba\u015fl\u0131\u011f\u0131 i\u00e7erip i\u00e7ermedi\u011fini kontrol edecek ve ge\u00e7erli bir token (basit bir string kontrol\u00fc yapaca\u011f\u0131z) i\u00e7ermiyorsa iste\u011fi reddedecektir.<\/p>\n<div class=\"code-container\">\n<pre><code>\n\/\/ app\/app.go (Middleware ve hata y\u00f6netimi eklenmi\u015f)\npackage app\n\nimport (\n\t\"database\/sql\"\n\t\"fmt\"\n\t\"github.com\/gofr-dev\/gofr\"\n\t_ \"github.com\/lib\/pq\"\n\t\"net\/http\"\n)\n\n\/\/ ... Task struct'\u0131 ve di\u011fer import'lar ayn\u0131 kalacak ...\n\n\/\/ AuthMiddleware: Basit bir kimlik do\u011frulama middleware'i\nfunc AuthMiddleware(h gofr.Handler) gofr.Handler {\n\treturn func(c *gofr.Context) (interface{}, error) {\n\t\tauthToken := c.Request.Header.Get(\"Authorization\")\n\n\t\t\/\/ Basit bir token kontrol\u00fc yapal\u0131m\n\t\tif authToken != \"Bearer supersecrettoken\" {\n\t\t\t\/\/ Hata d\u00f6nd\u00fcr\u00fcrken GoFr'\u0131n hata yap\u0131s\u0131n\u0131 kullanabiliriz\n\t\t\treturn nil, gofr.NewError(\"Yetkilendirme hatas\u0131: Ge\u00e7ersiz token\", http.StatusUnauthorized)\n\t\t}\n\t\treturn h(c) \/\/ Token ge\u00e7erliyse iste\u011fi bir sonraki i\u015fleyiciye aktar\n\t}\n}\n\nfunc New() *gofr.App {\n\tapp := gofr.New()\n\n\t\/\/ ... (tablo olu\u015fturma kodu ayn\u0131 kalacak) ...\n\n\t\/\/ Global bir middleware ekleyelim (t\u00fcm endpoint'ler i\u00e7in ge\u00e7erli)\n\t\/\/ app.Use(AuthMiddleware)\n\n\t\/\/ Sadece belirli bir endpoint i\u00e7in middleware ekleyelim\n\tapp.GET(\"\/protected-tasks\", AuthMiddleware(func(c *gofr.Context) (interface{}, error) {\n\t\t\/\/ Bu endpoint sadece ge\u00e7erli token ile eri\u015filebilir\n\t\treturn \"Bu gizli g\u00f6revler listesidir!\", nil\n\t}))\n\n\t\/\/ ... (di\u011fer CRUD endpoint'leri ayn\u0131 kalacak, ancak isterseniz onlara da AuthMiddleware ekleyebilirsiniz) ...\n\n\treturn app\n}\n  <\/code><\/pre>\n<\/div>\n<p>Yukar\u0131daki \u00f6rnekte <code>AuthMiddleware<\/code> fonksiyonu, bir <code>gofr.Handler<\/code> al\u0131p ba\u015fka bir <code>gofr.Handler<\/code> d\u00f6nd\u00fcr\u00fcr. Bu, GoFr&#8217;\u0131n middleware zincirini olu\u015fturma \u015feklidir. Middleware&#8217;i t\u00fcm uygulamaya uygulamak i\u00e7in <code>app.Use(AuthMiddleware)<\/code> kullanabilir veya belirli bir endpoint&#8217;e uygulamak i\u00e7in <code>app.GET(\"\/path\", AuthMiddleware(handlerFunc))<\/code> \u015feklinde kullanabiliriz.<\/p>\n<p>\u015eimdi <code>\/protected-tasks<\/code> endpoint&#8217;ini test edelim:<\/p>\n<ul>\n<li><strong>Yetkilendirme olmadan:<\/strong>\n<div class=\"code-container\">\n<pre><code>\ncurl http:\/\/localhost:8000\/protected-tasks\n          <\/code><\/pre>\n<\/p><\/div>\n<p>        Beklenen Yan\u0131t: <code>{\"error\":\"Yetkilendirme hatas\u0131: Ge\u00e7ersiz token\"}<\/code> ve HTTP 401 Unauthorized durumu.\n    <\/li>\n<li><strong>Ge\u00e7erli token ile:<\/strong>\n<div class=\"code-container\">\n<pre><code>\ncurl -H \"Authorization: Bearer supersecrettoken\" http:\/\/localhost:8000\/protected-tasks\n          <\/code><\/pre>\n<\/p><\/div>\n<p>        Beklenen Yan\u0131t: <code>\"Bu gizli g\u00f6revler listesidir!\"<\/code>.\n    <\/li>\n<\/ul>\n<h3>Hata Y\u00f6netimi: Sa\u011flam Servisler \u0130\u00e7in Kritik<\/h3>\n<p>Her uygulaman\u0131n hatalar\u0131 d\u00fczg\u00fcn bir \u015fekilde y\u00f6netmesi gerekir. GoFr, hatalar\u0131 standart bir \u015fekilde d\u00f6nd\u00fcrmenizi ve istemcilere anlaml\u0131 hata mesajlar\u0131 ile HTTP durum kodlar\u0131 g\u00f6ndermenizi sa\u011flar. Yukar\u0131daki middleware \u00f6rne\u011finde <code>gofr.NewError(\"Mesaj\", http.StatusUnauthorized)<\/code> kullan\u0131m\u0131n\u0131 g\u00f6rd\u00fck. Bu, GoFr&#8217;\u0131n hata i\u015fleme mekanizmas\u0131na entegre olman\u0131n bir yoludur. Kendi \u00f6zel hata tiplerinizi tan\u0131mlayabilir ve GoFr&#8217;\u0131n bunlar\u0131 nas\u0131l i\u015fleyece\u011fini yap\u0131land\u0131rabilirsiniz.<\/p>\n<p>\u00d6rne\u011fin, veritaban\u0131 ba\u011flant\u0131s\u0131 koptu\u011funda veya bir kay\u0131t bulunamad\u0131\u011f\u0131nda olu\u015fan hatalar\u0131 daha anla\u015f\u0131l\u0131r hale getirmek i\u00e7in GoFr&#8217;\u0131n hata y\u00f6netimi olduk\u00e7a etkilidir. GoFr, varsay\u0131lan olarak dahili hatalar i\u00e7in HTTP 500, bulunamayan kaynaklar i\u00e7in HTTP 404 gibi uygun durum kodlar\u0131n\u0131 d\u00f6nd\u00fcr\u00fcr. Bu, API t\u00fcketicileri i\u00e7in tutarl\u0131 bir deneyim sa\u011flar.<\/p>\n<h3>Servisler Aras\u0131 \u0130leti\u015fim: Mikroservislerin Kalbi<\/h3>\n<p>Mikroservis mimarisinin temel ta\u015flar\u0131ndan biri, farkl\u0131 servislerin birbirleriyle ileti\u015fim kurabilmesidir. Genellikle bu ileti\u015fim HTTP REST API&#8217;leri arac\u0131l\u0131\u011f\u0131yla veya daha performansl\u0131 senaryolarda gRPC gibi protokollerle sa\u011flan\u0131r. Mesaj kuyruklar\u0131 (Kafka, RabbitMQ) da e\u015fzamans\u0131z ileti\u015fim i\u00e7in kullan\u0131l\u0131r.<\/p>\n<p>GoFr ile ba\u015fka bir mikroservisle ileti\u015fim kurmak olduk\u00e7a basittir. Go&#8217;nun standart <code>net\/http<\/code> k\u00fct\u00fcphanesini kullanarak bir HTTP istemcisi (client) olu\u015fturabilir ve di\u011fer servisin API&#8217;sine istek g\u00f6nderebilirsiniz. \u00d6rne\u011fin, bir &#8220;Kullan\u0131c\u0131 Servisi&#8221; ile &#8220;G\u00f6rev Servisi&#8221; aras\u0131ndaki ileti\u015fimi d\u00fc\u015f\u00fcnelim:<\/p>\n<div class=\"code-container\">\n<pre><code>\n\/\/ app\/app.go (Ba\u015fka bir servise HTTP iste\u011fi g\u00f6nderme \u00f6rne\u011fi)\n\n\/\/ ... (mevcut kodlar) ...\n\nfunc New() *gofr.App {\n\tapp := gofr.New()\n\n\t\/\/ ... (tablo olu\u015fturma, db-check, tasks CRUD endpoint'leri, protected-tasks endpoint'i ayn\u0131 kalacak) ...\n\n\t\/\/ Ba\u015fka bir servisten kullan\u0131c\u0131 bilgisi alma endpoint'i\n\tapp.GET(\"\/users\/{id}\", func(c *gofr.Context) (interface{}, error) {\n\t\tuserID := c.Param(\"id\")\n\t\t\n\t\t\/\/ Varsay\u0131msal bir Kullan\u0131c\u0131 Servisi'ne istek g\u00f6nderiyoruz\n\t\t\/\/ Ger\u00e7ek bir senaryoda bu URL bir yap\u0131land\u0131rma de\u011fi\u015fkeninden gelmelidir.\n\t\tuserAPIURL := fmt.Sprintf(\"http:\/\/localhost:8001\/api\/users\/%s\", userID) \n\n\t\tresp, err := http.Get(userAPIURL)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"kullan\u0131c\u0131 servisine ba\u011flan\u0131lamad\u0131: %w\", err)\n\t\t}\n\t\tdefer resp.Body.Close()\n\n\t\tif resp.StatusCode != http.StatusOK {\n\t\t\treturn nil, fmt.Errorf(\"kullan\u0131c\u0131 servisi hata d\u00f6nd\u00fcrd\u00fc: %s\", resp.Status)\n\t\t}\n\n\t\tvar userData interface{} \/\/ Kullan\u0131c\u0131 verisini dinamik olarak alal\u0131m\n\t\tif err := json.NewDecoder(resp.Body).Decode(&userData); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"kullan\u0131c\u0131 verisi \u00e7\u00f6z\u00fcmlenirken hata olu\u015ftu: %w\", err)\n\t\t}\n\n\t\treturn userData, nil\n\t})\n\n\treturn app\n}\n  <\/code><\/pre>\n<\/div>\n<p>Bu \u00f6rnekte, <code>\/users\/{id}<\/code> endpoint&#8217;i, varsay\u0131msal bir &#8220;Kullan\u0131c\u0131 Servisi&#8221;nin <code>http:\/\/localhost:8001\/api\/users\/{id}<\/code> adresine HTTP GET iste\u011fi g\u00f6nderir ve yan\u0131t\u0131 i\u015fler. GoFr&#8217;\u0131n <code>Context<\/code> nesnesi, istekleri ve yan\u0131tlar\u0131 kolayca y\u00f6netmenizi sa\u011flarken, Go&#8217;nun standart k\u00fct\u00fcphanesi servisler aras\u0131 ileti\u015fimi sa\u011flamak i\u00e7in yeterli g\u00fcc\u00fc sunar.<\/p>\n<p>G\u00fcvenlik ve sa\u011flaml\u0131k, mikroservislerin uzun \u00f6m\u00fcrl\u00fc olmas\u0131 i\u00e7in temel unsurlard\u0131r. GoFr&#8217;\u0131n middleware ve hata y\u00f6netimi \u00f6zellikleri, bu alanlarda g\u00fc\u00e7l\u00fc bir temel olu\u015ftururken, Go&#8217;nun yerle\u015fik HTTP istemcisi di\u011fer servislerle sorunsuz bir \u015fekilde entegrasyon kurman\u0131z\u0131 sa\u011flar. Bu sayede, karma\u015f\u0131k ve da\u011f\u0131t\u0131k sistemleri daha g\u00fcvenilir ve y\u00f6netilebilir bir \u015fekilde in\u015fa edebilirsiniz.<\/p>\n<h2>\u00d6l\u00e7eklenebilirlik, \u0130zleme ve Da\u011f\u0131t\u0131m Stratejileri<\/h2>\n<p>Bir mikroservis uygulamas\u0131 geli\u015ftirmek sadece kodu yazmakla bitmez; ayn\u0131 zamanda uygulaman\u0131n nas\u0131l da\u011f\u0131t\u0131laca\u011f\u0131, performans\u0131n\u0131n nas\u0131l izlenece\u011fi ve gerekti\u011finde nas\u0131l \u00f6l\u00e7eklenece\u011fi de b\u00fcy\u00fck \u00f6nem ta\u015f\u0131r. GoFr ile geli\u015ftirilen mikroservisler, Go&#8217;nun do\u011fal avantajlar\u0131 sayesinde bu alanlarda g\u00fc\u00e7l\u00fc bir temel sunar. Bu b\u00f6l\u00fcmde, GoFr uygulamalar\u0131n\u0131z\u0131 \u00f6l\u00e7eklendirme, izleme ve da\u011f\u0131t\u0131m i\u00e7in yayg\u0131n olarak kullan\u0131lan stratejilere ve ara\u00e7lara g\u00f6z ataca\u011f\u0131z.<\/p>\n<h3>\u00d6l\u00e7eklenebilirlik: Yatay \u00d6l\u00e7ekleme ve Go<\/h3>\n<p>Go ile yaz\u0131lm\u0131\u015f mikroservisler, d\u00fc\u015f\u00fck bellek ayak izi ve y\u00fcksek e\u015fzamanl\u0131l\u0131k kapasiteleri sayesinde do\u011fal olarak \u00f6l\u00e7eklenebilirdir. &#8220;Yatay \u00f6l\u00e7ekleme&#8221; (horizontal scaling), uygulaman\u0131z\u0131n daha fazla iste\u011fi i\u015fleyebilmesi i\u00e7in ayn\u0131 servisin birden fazla kopyas\u0131n\u0131 (instance) \u00e7al\u0131\u015ft\u0131rmak anlam\u0131na gelir. Go uygulamalar\u0131, bu t\u00fcr bir \u00f6l\u00e7eklendirme i\u00e7in m\u00fckemmel adaylard\u0131r \u00e7\u00fcnk\u00fc her bir Go servisi, genellikle tek bir \u00e7al\u0131\u015ft\u0131r\u0131labilir dosya olarak da\u011f\u0131t\u0131labilir ve minimum kaynak t\u00fcketir.<\/p>\n<p>GoFr&#8217;\u0131n stateless (durumsuz) yap\u0131s\u0131 da yatay \u00f6l\u00e7eklemeyi kolayla\u015ft\u0131r\u0131r. Bir servisin herhangi bir kopyas\u0131, gelen iste\u011fi i\u015fleyebilmeli ve daha \u00f6nceki bir kopyan\u0131n durumuna ba\u011f\u0131ml\u0131 olmamal\u0131d\u0131r. Bu, y\u00fck dengeleyicilerin (load balancer) gelen istekleri mevcut herhangi bir servis kopyas\u0131na y\u00f6nlendirmesini sa\u011flar, b\u00f6ylece i\u015f y\u00fck\u00fc e\u015fit \u015fekilde da\u011f\u0131t\u0131l\u0131r ve uygulaman\u0131z\u0131n performans\u0131 artar.<\/p>\n<h3>\u0130zleme (Monitoring) ve Loglama (Logging)<\/h3>\n<p>Da\u011f\u0131t\u0131k sistemlerde, uygulamalar\u0131n\u0131z\u0131n ne yapt\u0131\u011f\u0131n\u0131, nerede performans sorunlar\u0131 ya\u015fad\u0131\u011f\u0131n\u0131 veya hangi hatalar\u0131n olu\u015ftu\u011funu anlamak hayati \u00f6nem ta\u015f\u0131r. Bu nedenle, kapsaml\u0131 izleme ve loglama stratejileri geli\u015ftirmek gerekir.<\/p>\n<ul>\n<li><strong>Loglama:<\/strong> GoFr, yerle\u015fik bir loglama mekanizmas\u0131na sahiptir (<code>app.Logger<\/code>). Bu logger, farkl\u0131 seviyelerde (Info, Warn, Error, Debug) log mesajlar\u0131 \u00fcretmenizi sa\u011flar. \u00dcretim ortamlar\u0131nda, bu loglar\u0131 merkezi bir log toplama sistemine (\u00f6rne\u011fin, ELK Stack &#8211; Elasticsearch, Logstash, Kibana veya Grafana Loki) g\u00f6ndermek yayg\u0131n bir yakla\u015f\u0131md\u0131r. Bu sayede, t\u00fcm servislerinizin loglar\u0131n\u0131 tek bir yerden inceleyebilir, hata ay\u0131klama s\u00fcre\u00e7lerini h\u0131zland\u0131rabilirsiniz.<\/li>\n<li><strong>Metrikler ve \u0130zleme:<\/strong> Uygulaman\u0131z\u0131n performans\u0131n\u0131 (istek say\u0131s\u0131, yan\u0131t s\u00fcreleri, hata oranlar\u0131, CPU\/bellek kullan\u0131m\u0131) izlemek i\u00e7in metrikler toplamak gerekir. Prometheus, bu alanda end\u00fcstri standard\u0131 haline gelmi\u015f a\u00e7\u0131k kaynakl\u0131 bir izleme sistemidir. Go uygulamalar\u0131, Prometheus metriklerini kolayca d\u0131\u015fa aktarabilir. Grafana ise, Prometheus&#8217;tan toplanan metrikleri g\u00f6rselle\u015ftirmek i\u00e7in kullan\u0131lan g\u00fc\u00e7l\u00fc bir g\u00f6sterge paneli (dashboard) arac\u0131d\u0131r. GoFr, Prometheus entegrasyonu i\u00e7in gerekli altyap\u0131y\u0131 sa\u011flayarak, servislerinizin metriklerini kolayca a\u00e7\u0131\u011fa \u00e7\u0131karman\u0131za olanak tan\u0131r.<\/li>\n<\/ul>\n<h3>Da\u011f\u0131t\u0131m Stratejileri: Docker ve Kubernetes<\/h3>\n<p>Mikroservislerin da\u011f\u0131t\u0131m\u0131, karma\u015f\u0131k bir s\u00fcre\u00e7 olabilir. Ancak Docker ve Kubernetes gibi ara\u00e7lar, bu s\u00fcreci b\u00fcy\u00fck \u00f6l\u00e7\u00fcde basitle\u015ftirir ve standartla\u015ft\u0131r\u0131r.<\/p>\n<ul>\n<li><strong>Docker ile Konteynerizasyon:<\/strong> Docker, uygulaman\u0131z\u0131 ve t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 izole edilmi\u015f bir ortamda (konteyner) paketlemenizi sa\u011flar. Go&#8217;nun statik olarak derlenmi\u015f tek bir \u00e7al\u0131\u015ft\u0131r\u0131labilir dosya \u00fcretme yetene\u011fi, Docker imajlar\u0131n\u0131 (image) son derece k\u00fc\u00e7\u00fck ve verimli hale getirir. Bir GoFr uygulamas\u0131n\u0131 Dockerize etmek i\u00e7in basit bir <code>Dockerfile<\/code> yeterlidir:\n<div class=\"code-container\">\n<pre><code>\n# Dockerfile\n# Derleme a\u015famas\u0131\nFROM golang:1.22-alpine AS builder\nWORKDIR \/app\nCOPY go.mod go.sum .\/\nRUN go mod download\nCOPY . .\nRUN go build -o \/app\/main main.go\n\n# \u00c7al\u0131\u015ft\u0131rma a\u015famas\u0131\nFROM alpine:latest\nWORKDIR \/app\nCOPY --from=builder \/app\/main .\nCOPY config.dev.toml . # Yap\u0131land\u0131rma dosyas\u0131n\u0131 da kopyalayal\u0131m\nEXPOSE 8000\nCMD [\"\/app\/main\"]\n          <\/code><\/pre>\n<\/p><\/div>\n<p>        Bu <code>Dockerfile<\/code>, \u00e7ok a\u015famal\u0131 bir derleme (multi-stage build) kullanarak nihai imaj boyutunu minimumda tutar. \u0130lk a\u015famada Go uygulamas\u0131 derlenir, ikinci a\u015famada ise sadece derlenmi\u015f \u00e7al\u0131\u015ft\u0131r\u0131labilir dosya ve yap\u0131land\u0131rma dosyas\u0131 minimalist bir Alpine Linux imaj\u0131na kopyalan\u0131r.\n    <\/li>\n<li><strong>Kubernetes ile Orkestrasyon:<\/strong> Docker konteynerleri olu\u015fturduktan sonra, bu konteynerleri b\u00fcy\u00fck \u00f6l\u00e7ekte y\u00f6netmek ve orkestrasyonunu sa\u011flamak i\u00e7in Kubernetes devreye girer. Kubernetes, konteynerli uygulamalar\u0131 otomatik olarak da\u011f\u0131tmak, \u00f6l\u00e7eklendirmek, y\u00f6netmek ve iyile\u015ftirmek i\u00e7in bir platformdur. Bir GoFr mikroservisini Kubernetes&#8217;e da\u011f\u0131tmak i\u00e7in, genellikle <code>Deployment<\/code>, <code>Service<\/code> ve <code>Ingress<\/code> gibi Kubernetes kaynaklar\u0131n\u0131 tan\u0131mlayan YAML dosyalar\u0131 kullan\u0131l\u0131r. Kubernetes, servislerinizin y\u00fcksek eri\u015filebilirlik (high availability) ile \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar, otomatik olarak yeniden ba\u015flat\u0131r ve y\u00fck dengeleme yapar.<\/li>\n<\/ul>\n<p>Bu stratejiler ve ara\u00e7lar, GoFr ile geli\u015ftirilen mikroservislerinizin sadece h\u0131zl\u0131 ve verimli olmas\u0131n\u0131 sa\u011flamakla kalmaz, ayn\u0131 zamanda \u00fcretim ortam\u0131nda g\u00fcvenilir bir \u015fekilde \u00e7al\u0131\u015fmas\u0131n\u0131 ve kolayca y\u00f6netilmesini de temin eder. Go&#8217;nun basitli\u011fi ve performans\u0131, bu modern da\u011f\u0131t\u0131m ve izleme yakla\u015f\u0131mlar\u0131yla birle\u015fti\u011finde, geli\u015ftiricilere g\u00fc\u00e7l\u00fc bir mikroservis ekosistemi kurma imkan\u0131 sunar.<\/p>\n<h2>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<p>Bu makale boyunca, mikroservis mimarisinin temel prensiplerinden, Go programlama dilinin bu mimari i\u00e7in neden ideal bir se\u00e7im oldu\u011fundan ve GoFr framework&#8217;\u00fcn\u00fcn mikroservis geli\u015ftirme s\u00fcrecini nas\u0131l basitle\u015ftirdi\u011finden bahsettik. \u0130lk &#8220;Hello World&#8221; mikroservisimizi olu\u015fturmaktan, veritaban\u0131 entegrasyonu ve CRUD operasyonlar\u0131na, g\u00fcvenlik i\u00e7in middleware kullan\u0131m\u0131na ve nihayetinde \u00f6l\u00e7eklenebilirlik, izleme ve da\u011f\u0131t\u0131m stratejilerine kadar geni\u015f bir yelpazede konular\u0131 ele ald\u0131k.<\/p>\n<p>GoFr, Go&#8217;nun e\u015fzamanl\u0131l\u0131k, performans ve basitlik gibi g\u00fc\u00e7l\u00fc \u00f6zelliklerini alarak, geli\u015ftiricilere h\u0131zl\u0131 ve verimli mikroservisler olu\u015fturmak i\u00e7in kapsaml\u0131 bir ara\u00e7 seti sunar. Yap\u0131land\u0131rma y\u00f6netimi, HTTP y\u00f6nlendirme, hata i\u015fleme ve ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu gibi temel bile\u015fenleri kutudan \u00e7\u0131kar \u00e7\u0131kmaz sunmas\u0131, geli\u015ftiricilerin tekrarlayan g\u00f6revler yerine i\u015f mant\u0131\u011f\u0131na odaklanmas\u0131na olanak tan\u0131r. Bu sayede, daha az kodla daha fazla i\u015f yapabilir, uygulamalar\u0131n\u0131z\u0131 daha h\u0131zl\u0131 pazara sunabilir ve bak\u0131m maliyetlerini d\u00fc\u015f\u00fcrebilirsiniz.<\/p>\n<p>Mikroservis mimarisi, b\u00fcy\u00fck ve karma\u015f\u0131k sistemlerin geli\u015ftirilmesi ve y\u00f6netilmesi i\u00e7in g\u00fc\u00e7l\u00fc bir yakla\u015f\u0131m sunar. Go ve GoFr ikilisi ise, bu mimarinin sundu\u011fu faydalar\u0131 en \u00fcst d\u00fczeye \u00e7\u0131karmak i\u00e7in m\u00fckemmel bir kombinasyondur. \u00d6l\u00e7eklenebilir, dayan\u0131kl\u0131 ve bak\u0131m\u0131 kolay mikroservisler in\u015fa etmek isteyen her geli\u015ftirici i\u00e7in GoFr, kesinlikle de\u011ferlendirilmesi gereken bir framework&#8217;t\u00fcr. Gelecekte, GoFr&#8217;\u0131n topluluk deste\u011fiyle daha da geli\u015fmesi ve yeni entegrasyonlarla zenginle\u015fmesi beklenmektedir. Bu rehber, GoFr ile mikroservis d\u00fcnyas\u0131na ad\u0131m atman\u0131z i\u00e7in sa\u011flam bir ba\u015flang\u0131\u00e7 noktas\u0131 sunmay\u0131 ama\u00e7lamaktad\u0131r. \u015eimdi \u00f6\u011frendiklerinizi kendi projelerinizde uygulama zaman\u0131!<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<h4>1. GoFr di\u011fer Go web framework&#8217;lerinden (Gin, Echo vb.) fark\u0131 nedir?<\/h4>\n<p>GoFr, sadece bir web framework&#8217;\u00fc olman\u0131n \u00f6tesine ge\u00e7erek, mikroservislerin t\u00fcm ya\u015fam d\u00f6ng\u00fcs\u00fc i\u00e7in daha kapsaml\u0131 bir \u00e7\u00f6z\u00fcm sunar. Gin veya Echo gibi framework&#8217;ler genellikle HTTP y\u00f6nlendirme ve istek\/yan\u0131t i\u015fleme katman\u0131na odaklan\u0131rken, GoFr; yap\u0131land\u0131rma y\u00f6netimi, ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu, loglama, hata y\u00f6netimi ve veritaban\u0131 entegrasyonu gibi mikroservislerin temel ihtiya\u00e7lar\u0131n\u0131 tek bir \u00e7at\u0131 alt\u0131nda birle\u015ftirir. Bu sayede, geli\u015ftiricilerin farkl\u0131 k\u00fct\u00fcphaneleri manuel olarak entegre etme y\u00fck\u00fcn\u00fc azalt\u0131r ve daha tutarl\u0131 bir geli\u015ftirme deneyimi sa\u011flar.<\/p>\n<h4>2. GoFr&#8217;\u0131 \u00fcretim ortam\u0131nda kullanmak g\u00fcvenli midir?<\/h4>\n<p>Evet, GoFr aktif olarak geli\u015ftirilen ve kullan\u0131lan bir framework&#8217;t\u00fcr. G\u00fcvenilir Go standart k\u00fct\u00fcphaneleri ve kan\u0131tlanm\u0131\u015f tasar\u0131m desenleri \u00fczerine in\u015fa edilmi\u015ftir. Ancak her framework&#8217;te oldu\u011fu gibi, uygulaman\u0131z\u0131n g\u00fcvenli\u011fi b\u00fcy\u00fck \u00f6l\u00e7\u00fcde sizin kodlama pratiklerinize, ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131z\u0131 g\u00fcncel tutman\u0131za ve g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 d\u00fczenli olarak kontrol etmenize ba\u011fl\u0131d\u0131r. GoFr, g\u00fcvenli bir temel sunar, ancak uygulaman\u0131z\u0131n \u00f6zel g\u00fcvenlik ihtiya\u00e7lar\u0131 i\u00e7in ek \u00f6nlemler alman\u0131z gerekebilir (\u00f6rne\u011fin, daha geli\u015fmi\u015f kimlik do\u011frulama\/yetkilendirme \u00e7\u00f6z\u00fcmleri, veri \u015fifreleme vb.).<\/p>\n<h4>3. GoFr ile gRPC servisleri olu\u015fturabilir miyim?<\/h4>\n<p>GoFr, \u00f6ncelikli olarak HTTP\/REST API&#8217;leri i\u00e7in tasarlanm\u0131\u015f olsa da, Go&#8217;nun standart k\u00fct\u00fcphanesini kullanarak gRPC servisleri olu\u015fturman\u0131za engel de\u011fildir. GoFr uygulaman\u0131z\u0131n yan\u0131nda ayr\u0131 bir gRPC sunucusu \u00e7al\u0131\u015ft\u0131rabilir ve bu iki servisi birlikte y\u00f6netebilirsiniz. GoFr&#8217;\u0131n ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu veya yap\u0131land\u0131rma y\u00f6netimi gibi \u00f6zelliklerini gRPC servisinizde de kullanmak isterseniz, bu bile\u015fenleri GoFr&#8217;\u0131n <code>gofr.App<\/code> nesnesinden alarak gRPC servisinizde de de\u011ferlendirebilirsiniz.<\/p>\n<h4>4. GoFr&#8217;da veritaban\u0131 migration (g\u00f6\u00e7) y\u00f6netimi nas\u0131l yap\u0131l\u0131r?<\/h4>\n<p>GoFr, kutudan \u00e7\u0131kar \u00e7\u0131kmaz yerle\u015fik bir veritaban\u0131 migration arac\u0131 sunmaz. Ancak, Go ekosisteminde pop\u00fcler olan <code>golang-migrate\/migrate<\/code> veya <code>pressly\/goose<\/code> gibi \u00fc\u00e7\u00fcnc\u00fc taraf k\u00fct\u00fcphaneleri GoFr projenize kolayca entegre edebilirsiniz. Bu ara\u00e7lar, veritaban\u0131 \u015feman\u0131zdaki de\u011fi\u015fiklikleri (tablo olu\u015fturma, s\u00fctun ekleme vb.) s\u00fcr\u00fcm kontrol\u00fc alt\u0131nda tutman\u0131z\u0131 ve \u00fcretim ortamlar\u0131na g\u00fcvenli bir \u015fekilde uygulaman\u0131z\u0131 sa\u011flar. Genellikle, uygulaman\u0131z\u0131n ba\u015flat\u0131lmas\u0131ndan \u00f6nce migration&#8217;lar\u0131 \u00e7al\u0131\u015ft\u0131ran ayr\u0131 bir komut veya betik olu\u015fturulur.<\/p>\n<h4>5. GoFr&#8217;\u0131n performans a\u00e7\u0131s\u0131ndan avantajlar\u0131 nelerdir?<\/h4>\n<p>GoFr, Go dilinin do\u011fal performans avantajlar\u0131n\u0131 devral\u0131r. Go, derlenmi\u015f bir dil oldu\u011fu i\u00e7in yorumlanan dillere g\u00f6re \u00e7ok daha h\u0131zl\u0131 \u00e7al\u0131\u015f\u0131r. Ayr\u0131ca, Go&#8217;nun goroutine&#8217;leri ve channel&#8217;lar\u0131 sayesinde y\u00fcksek e\u015fzamanl\u0131l\u0131k (concurrency) kapasitesine sahiptir, bu da GoFr servislerinin ayn\u0131 anda binlerce iste\u011fi verimli bir \u015fekilde i\u015fleyebilmesini sa\u011flar. GoFr&#8217;\u0131n kendisi de hafif ve minimalist bir tasar\u0131ma sahip oldu\u011fu i\u00e7in, gereksiz y\u00fck bindirmez ve uygulaman\u0131z\u0131n performans\u0131n\u0131 olumsuz etkilemez. Bu \u00f6zellikler, GoFr&#8217;\u0131 y\u00fcksek performans gerektiren mikroservisler i\u00e7in ideal bir se\u00e7enek haline getirir.<\/p>\n<p>#GoFr #GoLang #Mikroservis #WebGeli\u015ftirme #API #Teknoloji<\/p>\n<div class=\"github-example-link\"><strong>\u00d6rnek kod:<\/strong> <a href=\"https:\/\/github.com\/fatihsoysalcom\/gofr-basic-microservice-example\" target=\"_blank\" rel=\"noopener noreferrer\">github.com\/fatihsoysalcom\/gofr-basic-microservice-example<\/a><\/div>\n","protected":false},"excerpt":{"rendered":"Modern yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda \u00f6l\u00e7eklenebilirlik, esneklik ve h\u0131zl\u0131 da\u011f\u0131t\u0131m giderek daha kritik hale gelmektedir.","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-44188","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Go ile Mikroservisler Olu\u015fturmaya Pratik Bir Giri\u015f: GoFr ile Tan\u0131\u015f\u0131n - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/go-ile-mikroservisler-olusturmaya-pratik-bir-giris-gofr-ile-tanisin\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Go ile Mikroservisler Olu\u015fturmaya Pratik Bir Giri\u015f: GoFr ile Tan\u0131\u015f\u0131n\" \/>\n<meta property=\"og:description\" content=\"Modern yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda \u00f6l\u00e7eklenebilirlik, esneklik ve h\u0131zl\u0131 da\u011f\u0131t\u0131m giderek daha kritik hale gelmektedir.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/go-ile-mikroservisler-olusturmaya-pratik-bir-giris-gofr-ile-tanisin\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-19T06:10:27+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-19T06:10:45+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"32 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/go-ile-mikroservisler-olusturmaya-pratik-bir-giris-gofr-ile-tanisin\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/go-ile-mikroservisler-olusturmaya-pratik-bir-giris-gofr-ile-tanisin\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Go ile Mikroservisler Olu\u015fturmaya Pratik Bir Giri\u015f: GoFr ile Tan\u0131\u015f\u0131n\",\"datePublished\":\"2026-08-19T06:10:27+00:00\",\"dateModified\":\"2026-08-19T06:10:45+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/go-ile-mikroservisler-olusturmaya-pratik-bir-giris-gofr-ile-tanisin\/\"},\"wordCount\":4956,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/go-ile-mikroservisler-olusturmaya-pratik-bir-giris-gofr-ile-tanisin\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/go-ile-mikroservisler-olusturmaya-pratik-bir-giris-gofr-ile-tanisin\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/go-ile-mikroservisler-olusturmaya-pratik-bir-giris-gofr-ile-tanisin\/\",\"name\":\"Go ile Mikroservisler Olu\u015fturmaya Pratik Bir Giri\u015f: GoFr ile Tan\u0131\u015f\u0131n - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-08-19T06:10:27+00:00\",\"dateModified\":\"2026-08-19T06:10:45+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/go-ile-mikroservisler-olusturmaya-pratik-bir-giris-gofr-ile-tanisin\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/go-ile-mikroservisler-olusturmaya-pratik-bir-giris-gofr-ile-tanisin\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/go-ile-mikroservisler-olusturmaya-pratik-bir-giris-gofr-ile-tanisin\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Go ile Mikroservisler Olu\u015fturmaya Pratik Bir Giri\u015f: GoFr ile Tan\u0131\u015f\u0131n\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Go ile Mikroservisler Olu\u015fturmaya Pratik Bir Giri\u015f: GoFr ile Tan\u0131\u015f\u0131n - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/go-ile-mikroservisler-olusturmaya-pratik-bir-giris-gofr-ile-tanisin\/","og_locale":"tr_TR","og_type":"article","og_title":"Go ile Mikroservisler Olu\u015fturmaya Pratik Bir Giri\u015f: GoFr ile Tan\u0131\u015f\u0131n","og_description":"Modern yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda \u00f6l\u00e7eklenebilirlik, esneklik ve h\u0131zl\u0131 da\u011f\u0131t\u0131m giderek daha kritik hale gelmektedir.","og_url":"https:\/\/fatihsoysal.com\/blog\/go-ile-mikroservisler-olusturmaya-pratik-bir-giris-gofr-ile-tanisin\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-08-19T06:10:27+00:00","article_modified_time":"2026-08-19T06:10:45+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"32 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/go-ile-mikroservisler-olusturmaya-pratik-bir-giris-gofr-ile-tanisin\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/go-ile-mikroservisler-olusturmaya-pratik-bir-giris-gofr-ile-tanisin\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Go ile Mikroservisler Olu\u015fturmaya Pratik Bir Giri\u015f: GoFr ile Tan\u0131\u015f\u0131n","datePublished":"2026-08-19T06:10:27+00:00","dateModified":"2026-08-19T06:10:45+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/go-ile-mikroservisler-olusturmaya-pratik-bir-giris-gofr-ile-tanisin\/"},"wordCount":4956,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/go-ile-mikroservisler-olusturmaya-pratik-bir-giris-gofr-ile-tanisin\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/go-ile-mikroservisler-olusturmaya-pratik-bir-giris-gofr-ile-tanisin\/","url":"https:\/\/fatihsoysal.com\/blog\/go-ile-mikroservisler-olusturmaya-pratik-bir-giris-gofr-ile-tanisin\/","name":"Go ile Mikroservisler Olu\u015fturmaya Pratik Bir Giri\u015f: GoFr ile Tan\u0131\u015f\u0131n - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-08-19T06:10:27+00:00","dateModified":"2026-08-19T06:10:45+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/go-ile-mikroservisler-olusturmaya-pratik-bir-giris-gofr-ile-tanisin\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/go-ile-mikroservisler-olusturmaya-pratik-bir-giris-gofr-ile-tanisin\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/go-ile-mikroservisler-olusturmaya-pratik-bir-giris-gofr-ile-tanisin\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Go ile Mikroservisler Olu\u015fturmaya Pratik Bir Giri\u015f: GoFr ile Tan\u0131\u015f\u0131n"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/44188","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=44188"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/44188\/revisions"}],"predecessor-version":[{"id":44189,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/44188\/revisions\/44189"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=44188"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=44188"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=44188"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}