{"id":31411,"date":"2025-10-09T17:32:59","date_gmt":"2025-10-09T14:32:59","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/giris-quarkus-3-ve-aws-lambdanin-gucunu-rest-apilerle-birlestirmek-neden-akillica-bir-secim\/"},"modified":"2025-10-09T17:32:59","modified_gmt":"2025-10-09T14:32:59","slug":"giris-quarkus-3-ve-aws-lambdanin-gucunu-rest-apilerle-birlestirmek-neden-akillica-bir-secim","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/giris-quarkus-3-ve-aws-lambdanin-gucunu-rest-apilerle-birlestirmek-neden-akillica-bir-secim\/","title":{"rendered":"Giri\u015f: Quarkus 3 ve AWS Lambda&#8217;n\u0131n G\u00fcc\u00fcn\u00fc REST API&#8217;lerle Birle\u015ftirmek Neden Ak\u0131ll\u0131ca Bir Se\u00e7im?"},"content":{"rendered":"<h1>Quarkus 3 ve AWS Lambda ile Y\u00fcksek Performansl\u0131 REST API&#8217;ler<\/h1>\n<p>Modern uygulama geli\u015ftirme d\u00fcnyas\u0131nda h\u0131z, \u00f6l\u00e7eklenebilirlik ve maliyet etkinli\u011fi kritik \u00f6neme sahiptir. Quarkus 3&#8217;\u00fc AWS Lambda \u00fczerinde bir REST API uygulamas\u0131 olarak \u00e7al\u0131\u015ft\u0131rmak, sunucusuz mimarinin g\u00fcc\u00fcn\u00fc Quarkus&#8217;un h\u0131z ve verimlili\u011fiyle birle\u015ftirerek bu ihtiya\u00e7lar\u0131 kar\u015f\u0131lar. Bu kapsaml\u0131 rehber, ad\u0131m ad\u0131m pratik uygulamalarla bu g\u00fc\u00e7l\u00fc entegrasyonu detayland\u0131r\u0131yor.<\/p>\n<hr>\n<p>G\u00fcn\u00fcm\u00fcz dijital \u00e7a\u011f\u0131nda, kullan\u0131c\u0131 beklentileri hi\u00e7 olmad\u0131\u011f\u0131 kadar y\u00fcksek. Uygulamalar\u0131m\u0131z\u0131n anl\u0131k tepki vermesi, milyonlarca kullan\u0131c\u0131ya hizmet verebilmesi ve ayn\u0131 zamanda uygun maliyetli olmas\u0131 bekleniyor. Geleneksel monolitik veya dahi sanal sunucular \u00fczerinde \u00e7al\u0131\u015fan mikroservis mimarileri, bu dinamik talepleri kar\u015f\u0131lamakta bazen zorlanabilir. \u00d6zellikle trafik dalgalanmalar\u0131 ya\u015fayan uygulamalar i\u00e7in kaynak y\u00f6netimi, \u00f6l\u00e7eklendirme ve operasyonel y\u00fck ciddi bir sorun haline gelebilir. \u0130\u015fte tam da bu noktada sunucusuz mimariler ve Quarkus gibi yenilik\u00e7i teknolojiler devreye giriyor.<\/p>\n<p>AWS Lambda, geli\u015ftiricilerin sunucu provision etme, \u00f6l\u00e7eklendirme veya y\u00f6netme zorunlulu\u011fu olmadan kod \u00e7al\u0131\u015ft\u0131rmalar\u0131na olanak tan\u0131yan, olay g\u00fcd\u00fcml\u00fc bir sunucusuz i\u015flem hizmetidir. Uygulaman\u0131z yaln\u0131zca ihtiya\u00e7 duyuldu\u011funda \u00e7al\u0131\u015f\u0131r ve yaln\u0131zca kulland\u0131\u011f\u0131n\u0131z i\u015flem s\u00fcresi i\u00e7in \u00f6deme yapars\u0131n\u0131z. Bu, \u00f6zellikle \u00f6ng\u00f6r\u00fclemeyen veya dalgal\u0131 trafik desenlerine sahip REST API&#8217;ler i\u00e7in b\u00fcy\u00fck bir maliyet avantaj\u0131 sunar. Ancak Lambda&#8217;n\u0131n bir dezavantaj\u0131 vard\u0131: Java uygulamalar\u0131n\u0131n &#8220;cold start&#8221; s\u00fcreleri, yani ilk iste\u011fe yan\u0131t vermeleri i\u00e7in ge\u00e7en s\u00fcre, di\u011fer dillere g\u00f6re daha uzun olabiliyordu. Bu durum, anl\u0131k tepki beklenen REST API&#8217;ler i\u00e7in performans\u0131 olumsuz etkileyebilirdi.<\/p>\n<p>\u0130\u015fte Quarkus, bu sorunu \u00e7\u00f6zmek i\u00e7in tasarlanm\u0131\u015f &#8220;s\u00fcpersonik subatomik Java&#8221; \u00e7er\u00e7evesidir. Geleneksel Java sanal makinesi (JVM) tabanl\u0131 uygulamalar\u0131n ba\u015flang\u0131\u00e7 s\u00fcresini ve bellek t\u00fcketimini \u00f6nemli \u00f6l\u00e7\u00fcde azaltmak i\u00e7in optimize edilmi\u015ftir. \u00d6zellikle GraalVM ile native executable (yerel \u00e7al\u0131\u015ft\u0131r\u0131labilir) derleme yetene\u011fi sayesinde, Quarkus uygulamalar\u0131 saniyeler hatta milisaniyeler i\u00e7inde ba\u015flar. Bu, AWS Lambda&#8217;n\u0131n cold start sorununu b\u00fcy\u00fck \u00f6l\u00e7\u00fcde ortadan kald\u0131rarak Java geli\u015ftiricilerine sunucusuz alanda y\u00fcksek performansl\u0131 REST API&#8217;ler olu\u015fturma imkan\u0131 sunar.<\/p>\n<p>Bu makalede, bu iki g\u00fc\u00e7l\u00fc teknolojinin nas\u0131l bir araya getirildi\u011fini, s\u0131f\u0131rdan bir Quarkus 3 REST API uygulamas\u0131n\u0131n AWS Lambda&#8217;ya nas\u0131l da\u011f\u0131t\u0131laca\u011f\u0131n\u0131 ve nas\u0131l optimize edilece\u011fini ad\u0131m ad\u0131m inceleyece\u011fiz. Odak noktam\u0131z, bir e-ticaret platformu i\u00e7in \u00fcr\u00fcn y\u00f6netimi REST API&#8217;si geli\u015ftirmek olacak. Bu API, \u00fcr\u00fcn listeleme, ekleme, g\u00fcncelleme ve silme gibi temel i\u015flemleri sunucusuz bir ortamda, Quarkus&#8217;un y\u00fcksek performans\u0131yla ger\u00e7ekle\u015ftirecek. B\u00f6ylece, hem \u00f6\u011frenim deneyimini zenginle\u015ftirecek hem de ger\u00e7ek d\u00fcnya senaryolar\u0131nda kar\u015f\u0131la\u015fabilece\u011finiz zorluklara pratik \u00e7\u00f6z\u00fcmler sunaca\u011f\u0131z. \u00d6nceki b\u00f6l\u00fcmlerde Quarkus&#8217;un temellerini ve Lambda entegrasyonunu ele alm\u0131\u015ft\u0131k; bu b\u00f6l\u00fcmde ise \u00f6zellikle REST API yeteneklerine odaklanarak bilgimizi derinle\u015ftirece\u011fiz.<\/p>\n<h2>Temel Mimari: AWS Lambda, Quarkus ve REST API&#8217;lerin Senkronizasyonu Nas\u0131l Sa\u011flan\u0131r?<\/h2>\n<p>Quarkus ve AWS Lambda&#8217;y\u0131 bir araya getirdi\u011fimizde, ortaya \u00e7\u0131kan mimari desen hem esneklik hem de verimlilik a\u00e7\u0131s\u0131ndan dikkat \u00e7ekicidir. Bu g\u00fc\u00e7l\u00fc kombinasyonun nas\u0131l i\u015fledi\u011fini anlamak i\u00e7in her bir bile\u015fenin rol\u00fcn\u00fc ve aralar\u0131ndaki etkile\u015fimi detayland\u0131rmam\u0131z gerekiyor.<\/p>\n<p>\u00d6ncelikle, <strong>AWS Lambda<\/strong>, bulutta &#8220;fonksiyon olarak servis&#8221; (Function as a Service &#8211; FaaS) prensibiyle \u00e7al\u0131\u015fan bir hizmettir. Kodunuzu olaylara yan\u0131t olarak \u00e7al\u0131\u015ft\u0131r\u0131r. Bir REST API ba\u011flam\u0131nda, bu olay genellikle bir HTTP iste\u011fidir. Bu HTTP iste\u011fi, bir <strong>API Gateway<\/strong> \u00fczerinden Lambda fonksiyonumuza ula\u015f\u0131r. API Gateway, gelen istekleri Lambda fonksiyonlar\u0131na y\u00f6nlendiren, yetkilendirme, h\u0131z s\u0131n\u0131rlama gibi \u00f6zellikler sunan y\u00f6netilen bir servistir. Fonksiyonunuz \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131nda, Lambda bir konteyner ba\u015flat\u0131r (veya mevcut bir s\u0131cak konteyneri kullan\u0131r), kodunuzu bu konteyner i\u00e7inde \u00e7al\u0131\u015ft\u0131r\u0131r ve yan\u0131t\u0131 API Gateway arac\u0131l\u0131\u011f\u0131yla istemciye geri g\u00f6nderir. \u0130\u015flem tamamland\u0131\u011f\u0131nda, konteyner bir sonraki istek i\u00e7in haz\u0131r bekleyebilir veya bellekten kald\u0131r\u0131labilir. Bu &#8220;cold start&#8221; ve &#8220;warm start&#8221; d\u00f6ng\u00fcs\u00fc, sunucusuz mimarinin temel dinamiklerindendir.<\/p>\n<p>Ard\u0131ndan, <strong>Quarkus<\/strong> devreye giriyor. Geleneksel Java uygulamalar\u0131n\u0131n aksine, Quarkus ba\u015ftan sona bulut yerel (cloud-native) ve konteynerize edilmi\u015f ortamlar i\u00e7in tasarlanm\u0131\u015ft\u0131r. Bu, \u00f6zellikle h\u0131zl\u0131 ba\u015flang\u0131\u00e7 s\u00fcreleri ve d\u00fc\u015f\u00fck bellek t\u00fcketimi demektir. Quarkus, hem klasik JVM modunda hem de GraalVM ile derlenmi\u015f native executable (yerel \u00e7al\u0131\u015ft\u0131r\u0131labilir) modunda \u00e7al\u0131\u015fabilir. AWS Lambda ortam\u0131nda, native executable mod, cold start s\u00fcrelerini milisaniyelerin alt\u0131na indirerek \u00fcst\u00fcn performans sa\u011flar. Quarkus, JAX-RS (RESTful Web Servisleri i\u00e7in Java API&#8217;si) gibi standartlar\u0131 destekleyerek REST API&#8217;leri geli\u015ftirmeyi son derece kolayla\u015ft\u0131r\u0131r. Ayr\u0131ca, Dependency Injection (CDI) ve yap\u0131land\u0131rma y\u00f6netimi gibi modern Java \u00f6zelliklerini de b\u00fcnyesinde bar\u0131nd\u0131r\u0131r.<\/p>\n<p><strong>REST API<\/strong> ise, kaynak tabanl\u0131, durumsuz bir mimari stilidir. Kaynaklar (\u00f6rne\u011fin, &#8220;\/products&#8221; veya &#8220;\/users\/{id}&#8221;) URI&#8217;lar ile tan\u0131mlan\u0131r ve HTTP metodlar\u0131 (GET, POST, PUT, DELETE) bu kaynaklar \u00fczerinde ger\u00e7ekle\u015ftirilecek i\u015flemleri belirtir. JSON veya XML gibi standart formatlar veri de\u011fi\u015fimi i\u00e7in kullan\u0131l\u0131r. REST API&#8217;lerin durumsuz yap\u0131s\u0131, her iste\u011fin sunucu taraf\u0131nda bir oturum bilgisi tutulmas\u0131n\u0131 gerektirmemesi anlam\u0131na gelir, bu da \u00f6l\u00e7eklenebilirli\u011fi \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r. AWS Lambda gibi sunucusuz ortamlarda, her istek ayr\u0131 bir fonksiyon \u00e7a\u011fr\u0131s\u0131 olarak ele al\u0131nd\u0131\u011f\u0131ndan ve fonksiyonun ya\u015fam d\u00f6ng\u00fcs\u00fc k\u0131sa oldu\u011fundan, durumsuzluk prensibi do\u011fal olarak uyum sa\u011flar.<\/p>\n<p>Bu \u00fc\u00e7 bile\u015fen bir araya geldi\u011finde, Quarkus uygulaman\u0131z bir Lambda fonksiyonu olarak paketlenir ve da\u011f\u0131t\u0131l\u0131r. Gelen bir HTTP iste\u011fi (REST API \u00e7a\u011fr\u0131s\u0131), API Gateway taraf\u0131ndan yakalan\u0131r ve ilgili Lambda fonksiyonuna iletilir. Lambda fonksiyonu, Quarkus uygulaman\u0131z\u0131 \u00e7al\u0131\u015ft\u0131r\u0131r, iste\u011fi i\u015fler, yan\u0131t\u0131 \u00fcretir ve API Gateway \u00fczerinden istemciye geri g\u00f6nderir. \u00d6zellikle Quarkus&#8217;un <code>quarkus-amazon-lambda-rest<\/code> uzant\u0131s\u0131, API Gateway&#8217;den gelen istekleri otomatik olarak JAX-RS kaynaklar\u0131n\u0131za y\u00f6nlendirmek ve yan\u0131tlar\u0131 API Gateway&#8217;in anlayabilece\u011fi formata d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in k\u00f6pr\u00fc g\u00f6revi g\u00f6r\u00fcr. Bu sayede, geli\u015ftiriciler standart JAX-RS anotasyonlar\u0131n\u0131 kullanarak kolayca REST API&#8217;leri olu\u015fturabilirken, alttaki sunucusuz karma\u015f\u0131kl\u0131klardan soyutlanm\u0131\u015f olurlar. Bu entegrasyon, geli\u015ftiricilere hem tan\u0131d\u0131k bir geli\u015ftirme deneyimi sunar hem de sunucusuz mimarinin t\u00fcm avantajlar\u0131ndan faydalanmalar\u0131n\u0131 sa\u011flar.<\/p>\n<h2>Quarkus 3 REST API Projesi Olu\u015fturma ve Geli\u015ftirme Ad\u0131mlar\u0131: \u0130lk Fonksiyonunuzu Kodlay\u0131n<\/h2>\n<p>Quarkus 3 ve AWS Lambda \u00fczerinde bir REST API uygulamas\u0131 geli\u015ftirmeye ba\u015flamak olduk\u00e7a basittir. \u0130lk ad\u0131m\u0131m\u0131z, Quarkus projesini olu\u015fturmak ve gerekli ba\u011f\u0131ml\u0131l\u0131klar\u0131 eklemektir. Ard\u0131ndan, basit bir REST kayna\u011f\u0131 tan\u0131mlayacak ve Lambda ortam\u0131nda \u00e7al\u0131\u015fabilmesi i\u00e7in bir handler s\u0131n\u0131f\u0131 olu\u015fturaca\u011f\u0131z.<\/p>\n<h3>Proje Olu\u015fturma ve Ba\u011f\u0131ml\u0131l\u0131klar<\/h3>\n<p>Yeni bir Quarkus projesi olu\u015fturmak i\u00e7in Maven veya Gradle kullanabiliriz. Genellikle Quarkus CLI veya Maven&#8217;\u0131n <code>quarkus:create<\/code> hedefi tercih edilir. Projemizi olu\u015ftururken, REST API deste\u011fi ve AWS Lambda entegrasyonu i\u00e7in gerekli uzant\u0131lar\u0131 eklemeliyiz. \u00d6zellikle <code>quarkus-resteasy-reactive-jackson<\/code> (JSON deste\u011fi i\u00e7in modern RESTEasy reaktif versiyonu) ve <code>quarkus-amazon-lambda-rest<\/code> uzant\u0131lar\u0131 kritik \u00f6neme sahiptir.<\/p>\n<pre><code class=\"language-bash\">\nmvn io.quarkus.platform:quarkus-maven-plugin:3.8.3:create \\\n    -DprojectGroupId=com.example \\\n    -DprojectArtifactId=quarkus-lambda-rest-api \\\n    -Dextensions=\"resteasy-reactive-jackson,amazon-lambda-rest\" \\\n    -DnoCode\n<\/pre>\n<p><\/code><\/p>\n<p>Bu komut, <code>quarkus-lambda-rest-api<\/code> ad\u0131nda yeni bir proje dizini olu\u015fturacak ve i\u00e7ine temel Quarkus yap\u0131s\u0131n\u0131 ekleyecektir. <code>noCode<\/code> parametresi, varsay\u0131lan \u00f6rnek kodlar\u0131 olu\u015fturmamas\u0131n\u0131 sa\u011flar, b\u00f6ylece kendi kodumuzu ba\u015ftan yazabiliriz. Projenin <code>pom.xml<\/code> dosyas\u0131na bakt\u0131\u011f\u0131n\u0131zda, ekledi\u011fimiz uzant\u0131lar\u0131n yan\u0131 s\u0131ra Quarkus'un temel ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 da g\u00f6receksiniz. E\u011fer elle eklemek isterseniz, <code>pom.xml<\/code>'inizin <code>dependencies<\/code> b\u00f6l\u00fcm\u00fc a\u015fa\u011f\u0131daki gibi g\u00f6r\u00fcnecektir:<\/p>\n<pre><code class=\"language-xml\">\n<dependency>\n    <groupId>io.quarkus<\/groupId>\n    <artifactId>quarkus-resteasy-reactive-jackson<\/artifactId>\n<\/dependency>\n<dependency>\n    <groupId>io.quarkus<\/groupId>\n    <artifactId>quarkus-amazon-lambda-rest<\/artifactId>\n<\/dependency>\n<!-- Lambda Native Image i\u00e7in Gerekli -->\n<dependency>\n    <groupId>io.quarkus<\/groupId>\n    <artifactId>quarkus-amazon-lambda-rest-deployment<\/artifactId>\n    <scope>test<\/scope> <!-- Test kapsam\u0131nda olmal\u0131 -->\n<\/dependency>\n<\/pre>\n<p><\/code><\/p>\n<p>Bu ba\u011f\u0131ml\u0131l\u0131klar, RESTful servislerimizi JSON format\u0131nda sunmam\u0131z\u0131 ve bu servislerin AWS Lambda ortam\u0131nda API Gateway ile sorunsuz bir \u015fekilde entegre olmas\u0131n\u0131 sa\u011flar. \u00d6zellikle <code>quarkus-amazon-lambda-rest<\/code> uzant\u0131s\u0131, Lambda'n\u0131n olay modelini (APIGatewayProxyRequestEvent) JAX-RS'in standart HTTP iste\u011fi modeline \u00e7evirir ve tam tersini de yapar, b\u00f6ylece standart JAX-RS anotasyonlar\u0131n\u0131 kullanmaya devam edebiliriz.<\/p>\n<h3>Basit Bir REST Kayna\u011f\u0131 Geli\u015ftirme: \u0130lk Lambda Fonksiyonumuz<\/h3>\n<p>\u015eimdi <code>src\/main\/java\/com\/example<\/code> dizini alt\u0131nda <code>GreetingResource.java<\/code> ad\u0131nda basit bir REST kayna\u011f\u0131 olu\u015ftural\u0131m. Bu kaynak, \"\/hello\" yoluna yap\u0131lan GET isteklerine \"Merhaba, Quarkus Lambda!\" yan\u0131t\u0131n\u0131 d\u00f6nd\u00fcrecektir.<\/p>\n<pre><code class=\"language-java\">\npackage com.example;\n\nimport jakarta.ws.rs.GET;\nimport jakarta.ws.rs.Path;\nimport jakarta.ws.rs.Produces;\nimport jakarta.ws.rs.core.MediaType;\n\n@Path(\"\/hello\")\npublic class GreetingResource {\n\n    @GET\n    @Produces(MediaType.TEXT_PLAIN)\n    public String hello() {\n        return \"Merhaba, Quarkus Lambda!\";\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu kod olduk\u00e7a standart bir JAX-RS kayna\u011f\u0131d\u0131r. <code>@Path(\"\/hello\")<\/code> bu kayna\u011f\u0131n \"\/hello\" yoluyla eri\u015filece\u011fini belirtir. <code>@GET<\/code> HTTP GET metoduna yan\u0131t verece\u011fini, <code>@Produces(MediaType.TEXT_PLAIN)<\/code> ise yan\u0131t\u0131n d\u00fcz metin olaca\u011f\u0131n\u0131 g\u00f6sterir. Quarkus, bu standard\u0131 AWS Lambda ortam\u0131nda da kusursuz bir \u015fekilde destekler.<\/p>\n<h3>Lambda i\u00e7in Handler S\u0131n\u0131f\u0131<\/h3>\n<p>Quarkus uygulaman\u0131z\u0131n AWS Lambda taraf\u0131ndan \u00e7a\u011fr\u0131labilmesi i\u00e7in \u00f6zel bir \"handler\" s\u0131n\u0131f\u0131na ihtiyac\u0131n\u0131z vard\u0131r. <code>quarkus-amazon-lambda-rest<\/code> uzant\u0131s\u0131, bu handler'\u0131 sizin i\u00e7in otomatik olarak sa\u011flar ve <code>StreamLambdaHandler<\/code> ad\u0131n\u0131 kullan\u0131r. Bu s\u0131n\u0131f, API Gateway'den gelen ham HTTP olay\u0131n\u0131 al\u0131r, Quarkus'un RESTful kaynaklar\u0131na y\u00f6nlendirir ve geri d\u00f6nen yan\u0131t\u0131 API Gateway'in anlayaca\u011f\u0131 bir formata d\u00f6n\u00fc\u015ft\u00fcr\u00fcr. Bu sayede, sizin ayr\u0131ca bir Lambda handler kodu yazman\u0131za gerek kalmaz; tek yapman\u0131z gereken bu handler s\u0131n\u0131f\u0131n\u0131 Lambda fonksiyonunuzun giri\u015f noktas\u0131 olarak belirtmektir.<\/p>\n<p>Yerel ortamda uygulaman\u0131z\u0131 test etmek i\u00e7in <code>mvn quarkus:dev<\/code> komutunu \u00e7al\u0131\u015ft\u0131rabilirsiniz. Ard\u0131ndan bir web taray\u0131c\u0131s\u0131nda veya <code>curl<\/code> ile <code>http:\/\/localhost:8080\/hello<\/code> adresine giderek \"Merhaba, Quarkus Lambda!\" yan\u0131t\u0131n\u0131 almal\u0131s\u0131n\u0131z. Bu, REST API'nizin do\u011fru \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 g\u00f6sterir.<\/p>\n<pre><code class=\"language-bash\">\n# Proje dizininde\nmvn quarkus:dev\n\n# Yeni bir terminalde\ncurl http:\/\/localhost:8080\/hello\n# \u00c7\u0131kt\u0131: Merhaba, Quarkus Lambda!\n<\/pre>\n<p><\/code><\/p>\n<p>Bu temel ad\u0131mlarla, AWS Lambda \u00fczerinde \u00e7al\u0131\u015fmaya haz\u0131r, ilk Quarkus REST API'nizi olu\u015fturmu\u015f oluyorsunuz. Gelecek ad\u0131mlarda, bu temeli daha karma\u015f\u0131k senaryolar i\u00e7in nas\u0131l geni\u015fletece\u011fimizi ve AWS'ye nas\u0131l da\u011f\u0131taca\u011f\u0131m\u0131z\u0131 inceleyece\u011fiz. \u00d6zellikle de, bir e-ticaret uygulamas\u0131nda \u00fcr\u00fcn y\u00f6netimi i\u00e7in gerekli CRUD (Create, Read, Update, Delete) operasyonlar\u0131n\u0131 sunacak bir API geli\u015ftirece\u011fiz.<\/p>\n<div class=\"tip\">\n  Uzman \u0130pucu: Quarkus'un geli\u015ftirme modu (<code>quarkus:dev<\/code>) sadece h\u0131zl\u0131 geli\u015ftirme i\u00e7in de\u011fil, ayn\u0131 zamanda canl\u0131 kod de\u011fi\u015fikliklerini an\u0131nda yans\u0131tma (live coding) yetene\u011fi sayesinde \u00e7ok verimlidir. De\u011fi\u015fikliklerinizi kaydetti\u011finiz anda uygulama otomatik olarak yeniden derlenir ve de\u011fi\u015fiklikler uygulan\u0131r, bu da geli\u015ftirme d\u00f6ng\u00fcs\u00fcn\u00fc inan\u0131lmaz h\u0131zland\u0131r\u0131r.\n<\/div>\n<h2>Pratik Uygulama: E-ticaret \u00dcr\u00fcn Y\u00f6netimi \u0130\u00e7in Kapsaml\u0131 Bir REST API Tasar\u0131m\u0131<\/h2>\n<p>\u015eimdiye kadar temel bir \"Merhaba D\u00fcnya\" REST API'si olu\u015fturduk. Ancak ger\u00e7ek d\u00fcnya uygulamalar\u0131, genellikle veri depolama, veri do\u011frulama ve birden fazla HTTP metodunu y\u00f6netme gibi daha karma\u015f\u0131k gereksinimlere sahiptir. E-ticaret platformu \u00f6rne\u011fimiz i\u00e7in, bir \u00fcr\u00fcn katalo\u011funu y\u00f6neten bir REST API geli\u015ftirece\u011fiz. Bu API, \u00fcr\u00fcn ekleme (POST), \u00fcr\u00fcnleri listeleme (GET), belirli bir \u00fcr\u00fcn\u00fc alma (GET), bir \u00fcr\u00fcn\u00fc g\u00fcncelleme (PUT) ve bir \u00fcr\u00fcn\u00fc silme (DELETE) gibi temel CRUD i\u015flemlerini destekleyecek.<\/p>\n<h3>\u00dcr\u00fcn Modeli ve Veri Yap\u0131s\u0131<\/h3>\n<p>\u00d6ncelikle, temsil edece\u011fimiz \u00fcr\u00fcn i\u00e7in bir Java s\u0131n\u0131f\u0131 (POJO - Plain Old Java Object) tan\u0131mlamal\u0131y\u0131z. Bu s\u0131n\u0131f, \u00fcr\u00fcn\u00fcn kimli\u011fi, ad\u0131, a\u00e7\u0131klamas\u0131, fiyat\u0131 ve stok adedi gibi \u00f6zelliklerini i\u00e7erecektir. Basitlik ad\u0131na, \u015fimdilik verileri kal\u0131c\u0131 bir veritaban\u0131nda saklamak yerine uygulaman\u0131n belle\u011finde (\u00f6rne\u011fin, bir <code>Map<\/code> kullanarak) tutaca\u011f\u0131z. Ger\u00e7ek bir senaryoda bu k\u0131s\u0131m bir veritaban\u0131 (DynamoDB, PostgreSQL vb.) entegrasyonu ile de\u011fi\u015ftirilirdi.<\/p>\n<p><code>src\/main\/java\/com\/example\/Product.java<\/code> dosyas\u0131:<\/p>\n<pre><code class=\"language-java\">\npackage com.example;\n\nimport java.math.BigDecimal;\nimport java.util.Objects;\n\npublic class Product {\n    private String id;\n    private String name;\n    private String description;\n    private BigDecimal price;\n    private int stock;\n\n    public Product() {\n    }\n\n    public Product(String id, String name, String description, BigDecimal price, int stock) {\n        this.id = id;\n        this.name = name;\n        this.description = description;\n        this.price = price;\n        this.stock = stock;\n    }\n\n    \/\/ Getter ve Setter metotlar\u0131\n    public String getId() { return id; }\n    public void setId(String id) { this.id = id; }\n    public String getName() { return name; }\n    public void setName(String name) { this.name = name; }\n    public String getDescription() { return description; }\n    public void setDescription(String description) { this.description = description; }\n    public BigDecimal getPrice() { return price; }\n    public void setPrice(BigDecimal price) { this.price = price; }\n    public int getStock() { return stock; }\n    public void setStock(int stock) { this.stock = stock; }\n\n    @Override\n    public boolean equals(Object o) {\n        if (this == o) return true;\n        if (o == null || getClass() != o.getClass()) return false;\n        Product product = (Product) o;\n        return Objects.equals(id, product.id);\n    }\n\n    @Override\n    public int hashCode() {\n        return Objects.hash(id);\n    }\n\n    @Override\n    public String toString() {\n        return \"Product{\" +\n               \"id='\" + id + '\\'' +\n               \", name='\" + name + '\\'' +\n               \", price=\" + price +\n               '}';\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<h3><code>ProductResource.java<\/code>: CRUD Operasyonlar\u0131<\/h3>\n<p>\u015eimdi <code>src\/main\/java\/com\/example\/ProductResource.java<\/code> ad\u0131nda yeni bir JAX-RS kaynak s\u0131n\u0131f\u0131 olu\u015ftural\u0131m. Bu s\u0131n\u0131f, <code>Product<\/code> nesneleri \u00fczerinde CRUD operasyonlar\u0131n\u0131 sa\u011flayacak.<\/p>\n<pre><code class=\"language-java\">\npackage com.example;\n\nimport jakarta.ws.rs.*;\nimport jakarta.ws.rs.core.MediaType;\nimport jakarta.ws.rs.core.Response;\nimport java.math.BigDecimal;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.stream.Collectors;\nimport java.util.UUID;\n\n@Path(\"\/products\")\n@Produces(MediaType.APPLICATION_JSON)\n@Consumes(MediaType.APPLICATION_JSON)\npublic class ProductResource {\n\n    \/\/ Ge\u00e7ici bellek i\u00e7i depolama\n    private static Map<String, Product> products = Collections.synchronizedMap(new HashMap<>());\n\n    static {\n        \/\/ Ba\u015flang\u0131\u00e7 i\u00e7in birka\u00e7 \u00f6rnek \u00fcr\u00fcn ekleyelim\n        products.put(\"1\", new Product(\"1\", \"Laptop Pro\", \"G\u00fc\u00e7l\u00fc i\u015flemci, 16GB RAM\", new BigDecimal(\"1200.00\"), 50));\n        products.put(\"2\", new Product(\"2\", \"Gaming Mouse\", \"Ergonomik tasar\u0131m, RGB \u0131\u015f\u0131kland\u0131rma\", new BigDecimal(\"75.50\"), 200));\n    }\n\n    @GET\n    public List<Product> getAllProducts() {\n        \/\/ T\u00fcm \u00fcr\u00fcnleri listele\n        return products.values().stream().collect(Collectors.toList());\n    }\n\n    @GET\n    @Path(\"\/{id}\")\n    public Response getProductById(@PathParam(\"id\") String id) {\n        Product product = products.get(id);\n        if (product != null) {\n            return Response.ok(product).build();\n        } else {\n            return Response.status(Response.Status.NOT_FOUND).entity(\"\u00dcr\u00fcn bulunamad\u0131: \" + id).build();\n        }\n    }\n\n    @POST\n    public Response createProduct(Product product) {\n        if (product.getName() == null || product.getName().trim().isEmpty()) {\n            return Response.status(Response.Status.BAD_REQUEST).entity(\"\u00dcr\u00fcn ad\u0131 bo\u015f olamaz.\").build();\n        }\n        String newId = UUID.randomUUID().toString();\n        product.setId(newId);\n        products.put(newId, product);\n        return Response.status(Response.Status.CREATED).entity(product).build();\n    }\n\n    @PUT\n    @Path(\"\/{id}\")\n    public Response updateProduct(@PathParam(\"id\") String id, Product updatedProduct) {\n        if (products.containsKey(id)) {\n            updatedProduct.setId(id); \/\/ ID'nin URL'den geldi\u011finden emin ol\n            products.put(id, updatedProduct);\n            return Response.ok(updatedProduct).build();\n        } else {\n            return Response.status(Response.Status.NOT_FOUND).entity(\"G\u00fcncellenecek \u00fcr\u00fcn bulunamad\u0131: \" + id).build();\n        }\n    }\n\n    @DELETE\n    @Path(\"\/{id}\")\n    public Response deleteProduct(@PathParam(\"id\") String id) {\n        if (products.containsKey(id)) {\n            products.remove(id);\n            return Response.noContent().build();\n        } else {\n            return Response.status(Response.Status.NOT_FOUND).entity(\"Silinecek \u00fcr\u00fcn bulunamad\u0131: \" + id).build();\n        }\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu <code>ProductResource<\/code> s\u0131n\u0131f\u0131, temel JAX-RS anotasyonlar\u0131n\u0131 (<code>@GET<\/code>, <code>@POST<\/code>, <code>@PUT<\/code>, <code>@DELETE<\/code>, <code>@Path<\/code>, <code>@PathParam<\/code>, <code>@Produces<\/code>, <code>@Consumes<\/code>) kullanarak bir RESTful API'yi tan\u0131mlar. <code>Response<\/code> objesi, HTTP durum kodlar\u0131n\u0131 ve yan\u0131t g\u00f6vdesini daha esnek bir \u015fekilde kontrol etmemizi sa\u011flar. Bellek i\u00e7i <code>Map<\/code> kullan\u0131m\u0131 sayesinde, h\u0131zl\u0131ca test edebiliriz. Ger\u00e7ek bir uygulamada, bu <code>Map<\/code> yerine bir veritaban\u0131 ba\u011flant\u0131s\u0131 ve ORM (Object-Relational Mapping) \u00e7\u00f6z\u00fcm\u00fc (\u00f6rne\u011fin Panache ile Hibernate ORM) kullan\u0131lacakt\u0131r. \u015eu anda bu, Lambda'n\u0131n durumsuz do\u011fas\u0131n\u0131 anlamak ve entegrasyonu h\u0131zla test etmek i\u00e7in yeterlidir.<\/p>\n<div class=\"tip\">\n  Uzman \u0130pucu: Bellek i\u00e7i depolama (<code>static Map<\/code>) kullanmak, Lambda'n\u0131n \"cold start\" ve \"warm start\" davran\u0131\u015f\u0131n\u0131 daha iyi anlaman\u0131za yard\u0131mc\u0131 olur. Bir Lambda \u00f6rne\u011fi s\u0131cak kald\u0131\u011f\u0131nda, <code>static<\/code> veriler korunur. Ancak yeni bir cold start oldu\u011funda, bu <code>Map<\/code> s\u0131f\u0131rlan\u0131r. Bu nedenle, kal\u0131c\u0131 veri depolama i\u00e7in her zaman bir veritaban\u0131 veya ba\u015fka bir kal\u0131c\u0131 depolama hizmeti (\u00f6rn. S3) kullan\u0131lmal\u0131d\u0131r.\n<\/div>\n<p>Bu API'yi yerel olarak test etmek i\u00e7in yine <code>mvn quarkus:dev<\/code> komutunu \u00e7al\u0131\u015ft\u0131rabilir ve a\u015fa\u011f\u0131daki <code>curl<\/code> komutlar\u0131n\u0131 kullanabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">\n# T\u00fcm \u00fcr\u00fcnleri listele\ncurl http:\/\/localhost:8080\/products\n\n# Yeni \u00fcr\u00fcn ekle (POST)\ncurl -X POST -H \"Content-Type: application\/json\" -d '{\"name\":\"Wireless Keyboard\",\"description\":\"Mekanik hisli, uzun pil \u00f6mr\u00fc\",\"price\":89.99,\"stock\":150}' http:\/\/localhost:8080\/products\n\n# Belirli bir \u00fcr\u00fcn\u00fc al (ID'yi yukar\u0131daki POST yan\u0131t\u0131ndan almal\u0131s\u0131n\u0131z)\ncurl http:\/\/localhost:8080\/products\/<\u00fcr\u00fcn_id>\n\n# \u00dcr\u00fcn g\u00fcncelle (PUT)\ncurl -X PUT -H \"Content-Type: application\/json\" -d '{\"id\":\"<\u00fcr\u00fcn_id>\",\"name\":\"Wireless Keyboard Pro\",\"description\":\"Mekanik hisli, uzun pil \u00f6mr\u00fc, RGB\",\"price\":99.99,\"stock\":145}' http:\/\/localhost:8080\/products\/<\u00fcr\u00fcn_id>\n\n# \u00dcr\u00fcn sil (DELETE)\ncurl -X DELETE http:\/\/localhost:8080\/products\/<\u00fcr\u00fcn_id>\n<\/pre>\n<p><\/code><\/p>\n<p>Bu ad\u0131mlarla, kapsaml\u0131 bir e-ticaret \u00fcr\u00fcn\u00fc y\u00f6netimi REST API'sini Quarkus 3 \u00fczerinde olu\u015fturmu\u015f oluyoruz. Bir sonraki b\u00f6l\u00fcmde, bu API'yi AWS Lambda'ya nas\u0131l da\u011f\u0131taca\u011f\u0131m\u0131z\u0131 ve performans\u0131n\u0131 nas\u0131l optimize edece\u011fimizi inceleyece\u011fiz.<\/p>\n<h2>AWS Lambda'ya Da\u011f\u0131t\u0131m Stratejileri: Native Image, Container Image ve API Gateway Entegrasyonu<\/h2>\n<p>Quarkus uygulaman\u0131z\u0131 AWS Lambda'ya da\u011f\u0131tman\u0131n birden fazla yolu vard\u0131r. En yayg\u0131n ve performans odakl\u0131 iki yakla\u015f\u0131m Native Image (GraalVM ile derlenmi\u015f yerel \u00e7al\u0131\u015ft\u0131r\u0131labilir) ve Container Image (Docker\/OCI uyumlu konteyner g\u00f6r\u00fcnt\u00fcs\u00fc) stratejileridir. Her ikisi de kendine \u00f6zg\u00fc avantajlar sunar ve API Gateway ile entegrasyonlar\u0131 benzerdir.<\/p>\n<h3>JVM vs. Native Image Derlemesi<\/h3>\n<p>Quarkus, hem geleneksel JVM \u00fczerinde \u00e7al\u0131\u015fan JAR dosyalar\u0131 olarak hem de GraalVM kullan\u0131larak derlenmi\u015f native executable olarak paketlenebilir. AWS Lambda ba\u011flam\u0131nda bu iki modun \u00f6nemli farklar\u0131 vard\u0131r:<\/p>\n<ul>\n<li><strong>JVM Modu (JAR):<\/strong> Uygulaman\u0131z standart bir JAR dosyas\u0131 olarak paketlenir. Lambda, bu JAR'\u0131 bir Java runtime ortam\u0131nda \u00e7al\u0131\u015ft\u0131r\u0131r. Avantaj\u0131, derleme s\u00fcresinin daha k\u0131sa olmas\u0131d\u0131r. Dezavantaj\u0131 ise, Java'n\u0131n do\u011fas\u0131 gere\u011fi cold start s\u00fcrelerinin daha uzun olmas\u0131 ve bellek t\u00fcketiminin native image'e g\u00f6re daha y\u00fcksek olmas\u0131d\u0131r. K\u00fc\u00e7\u00fck, nadiren \u00e7a\u011fr\u0131lan fonksiyonlar i\u00e7in kabul edilebilir olabilir.<\/li>\n<li><strong>Native Image Modu (Yerel \u00c7al\u0131\u015ft\u0131r\u0131labilir):<\/strong> GraalVM'in Substrate VM'si kullan\u0131larak uygulaman\u0131z do\u011frudan makine koduna derlenir. Bu, JAR dosyas\u0131ndan \u00e7ok daha k\u00fc\u00e7\u00fck bir \u00e7al\u0131\u015ft\u0131r\u0131labilir dosya \u00fcretir. En b\u00fcy\u00fck avantajlar\u0131, inan\u0131lmaz h\u0131zl\u0131 cold start s\u00fcreleri (milisaniyeler i\u00e7inde) ve \u00e7ok d\u00fc\u015f\u00fck bellek t\u00fcketimidir. Bu, Lambda'n\u0131n kaynak k\u0131s\u0131tl\u0131 ortamlar\u0131 i\u00e7in idealdir ve maliyetleri \u00f6nemli \u00f6l\u00e7\u00fcde d\u00fc\u015f\u00fcrebilir. Tek dezavantaj\u0131, native image derleme s\u00fcrecinin daha uzun s\u00fcrmesi ve derleme i\u00e7in daha fazla kaynak (bellek ve CPU) gerektirmesidir.<\/li>\n<\/ul>\n<p>Quarkus, native image derlemesini kolayla\u015ft\u0131rmak i\u00e7in yerle\u015fik destek sunar. Proje dizininizde a\u015fa\u011f\u0131daki Maven komutunu kullanarak native executable olu\u015fturabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">\nmvn clean package -Dquarkus.lambda.native=true\n# Veya Docker kuruluysa:\nmvn clean package -Pnative -Dquarkus.native.container-build=true\n<\/pre>\n<p><\/code><\/p>\n<p>\u0130lk komut, sisteminizde GraalVM kurulu olmas\u0131 durumunda do\u011frudan native executable olu\u015fturmaya \u00e7al\u0131\u015f\u0131r. \u0130kinci komut ise, e\u011fer Docker kuruluysa, derleme i\u015flemini bir Docker konteyneri i\u00e7inde yapar, bu da sisteminizde GraalVM'in kurulu olmas\u0131n\u0131 gerektirmez.<\/p>\n<h3>Da\u011f\u0131t\u0131m Paketleri ve AWS CLI\/SAM\/CDK<\/h3>\n<p>Quarkus Lambda uygulamalar\u0131n\u0131z\u0131 AWS'ye da\u011f\u0131tmak i\u00e7in birka\u00e7 farkl\u0131 ara\u00e7 kullanabilirsiniz:<\/p>\n<ul>\n<li><strong>AWS CLI:<\/strong> En temel y\u00f6ntemdir. <code>aws lambda update-function-code<\/code> gibi komutlarla JAR veya native executable dosyan\u0131z\u0131 do\u011frudan y\u00fckleyebilirsiniz.<\/li>\n<li><strong>AWS Serverless Application Model (SAM):<\/strong> Sunucusuz uygulamalar\u0131 tan\u0131mlamak i\u00e7in CloudFormation'\u0131n bir uzant\u0131s\u0131d\u0131r. Bir <code>template.yaml<\/code> dosyas\u0131 ile Lambda fonksiyonunuzu, API Gateway'i ve di\u011fer AWS kaynaklar\u0131n\u0131 bildirimsel olarak tan\u0131mlayabilirsiniz. SAM CLI, bu \u015fablonlar\u0131 derleme ve da\u011f\u0131tma i\u015flemlerini basitle\u015ftirir.<\/li>\n<li><strong>AWS Cloud Development Kit (CDK):<\/strong> Kod kullanarak bulut altyap\u0131s\u0131 tan\u0131mlaman\u0131z\u0131 sa\u011flayan bir \u00e7er\u00e7evedir. Java, TypeScript, Python gibi dillerde CDK uygulamalar\u0131 yazarak Lambda ve API Gateway kaynaklar\u0131n\u0131z\u0131 programatik olarak olu\u015fturabilir ve da\u011f\u0131tabilirsiniz.<\/li>\n<\/ul>\n<p>SAM CLI ile native image da\u011f\u0131t\u0131m\u0131 i\u00e7in \u00f6rnek bir <code>template.yaml<\/code> fragment'\u0131:<\/p>\n<pre><code class=\"language-yaml\">\nAWSTemplateFormatVersion: '2010-09-09'\nTransform: AWS::Serverless-2016-10-31\nDescription: Quarkus Lambda REST API\n\nResources:\n  QuarkusLambdaApiFunction:\n    Type: AWS::Serverless::Function\n    Properties:\n      Handler: com.example.StreamLambdaHandler::handleRequest\n      Runtime: java17 # Veya provided.al2023 native image i\u00e7in\n      CodeUri: target\/function.zip # Native image paketlendi\u011fi yer\n      MemorySize: 256\n      Timeout: 30\n      Architectures:\n        - x86_64\n      Events:\n        Api:\n          Type: Api\n          Properties:\n            Path: \/{proxy+}\n            Method: any\n<\/pre>\n<p><\/code><\/p>\n<div class=\"tip\">\n  Uzman \u0130pucu: Native Image kullan\u0131rken <code>Runtime: provided.al2023<\/code> veya <code>provided.al2<\/code> se\u00e7ene\u011fini kullan\u0131n. Bu, AWS'nin kendi runtime'\u0131n\u0131 kullanmak yerine, i\u015fletim sistemi d\u00fczeyinde do\u011frudan \u00e7al\u0131\u015ft\u0131r\u0131labilir dosyan\u0131z\u0131 \u00e7al\u0131\u015ft\u0131rmas\u0131na olanak tan\u0131r, bu da daha fazla kontrol ve potansiyel olarak daha d\u00fc\u015f\u00fck maliyet sa\u011flar. Quarkus genellikle bunu otomatik olarak yap\u0131land\u0131r\u0131r.\n<\/div>\n<h3>Container Image ile Da\u011f\u0131t\u0131m<\/h3>\n<p>AWS Lambda, Docker uyumlu konteyner g\u00f6r\u00fcnt\u00fclerini de destekler. Bu yakla\u015f\u0131m, derleme ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 y\u00f6netmek, belirli runtime k\u00fct\u00fcphanelerini dahil etmek veya daha karma\u015f\u0131k build s\u00fcre\u00e7lerine sahip olmak isteyenler i\u00e7in avantajl\u0131d\u0131r. Quarkus, uygulaman\u0131z\u0131 bir konteyner g\u00f6r\u00fcnt\u00fcs\u00fc olarak derlemeyi de destekler.<\/p>\n<p>Proje dizininizde olu\u015fturulan <code>src\/main\/docker\/Dockerfile.native-micro<\/code> gibi bir <code>Dockerfile<\/code> genellikle native executable'\u0131 bir AWS Lambda katman\u0131na (base image) paketleyerek konteyner g\u00f6r\u00fcnt\u00fcs\u00fc olu\u015fturur. \u00d6rnek bir <code>Dockerfile<\/code> i\u00e7eri\u011fi:<\/p>\n<pre><code class=\"language-dockerfile\">\nFROM public.ecr.aws\/lambda\/provided:al2023\n\nCOPY target\/function.zip ${LAMBDA_TASK_ROOT}\n\nCMD [ \"com.example.StreamLambdaHandler::handleRequest\" ]\n<\/pre>\n<p><\/code><\/p>\n<p>Bu <code>Dockerfile<\/code> ile bir Docker g\u00f6r\u00fcnt\u00fcs\u00fc olu\u015fturup AWS ECR (Elastic Container Registry) \u00fczerine g\u00f6nderebilir, ard\u0131ndan Lambda fonksiyonunuzu bu g\u00f6r\u00fcnt\u00fcden \u00e7al\u0131\u015facak \u015fekilde yap\u0131land\u0131rabilirsiniz. Bu y\u00f6ntem, ba\u011f\u0131ml\u0131l\u0131klar\u0131 daha iyi y\u00f6netmek ve CI\/CD s\u00fcre\u00e7lerini standartla\u015ft\u0131rmak i\u00e7in harikad\u0131r.<\/p>\n<h3>API Gateway Entegrasyonu<\/h3>\n<p>REST API'lerinizin internetten eri\u015filebilir olmas\u0131 i\u00e7in API Gateway ile entegrasyon \u015fartt\u0131r. SAM \u015fablonunda da g\u00f6r\u00fcld\u00fc\u011f\u00fc gibi, <code>Events<\/code> b\u00f6l\u00fcm\u00fcnde bir <code>Api<\/code> tipi tan\u0131mlayarak Lambda fonksiyonunuzu API Gateway ile kolayca entegre edebilirsiniz. <code>Path: \/{proxy+}<\/code> ve <code>Method: any<\/code> ayarlar\u0131, API Gateway'in gelen t\u00fcm HTTP isteklerini do\u011frudan Lambda fonksiyonunuza ileten bir \"proxy entegrasyonu\" kurmas\u0131n\u0131 sa\u011flar. Bu sayede, Quarkus uygulaman\u0131zdaki JAX-RS anotasyonlar\u0131 do\u011frudan devreye girer ve API Gateway herhangi bir \u00f6zel rota veya e\u015fleme yap\u0131land\u0131rmas\u0131na ihtiya\u00e7 duymaz.<\/p>\n<p>Bu da\u011f\u0131t\u0131m stratejilerini do\u011fru bir \u015fekilde uygulayarak, y\u00fcksek performansl\u0131 ve maliyet etkin Quarkus REST API'lerinizi AWS Lambda \u00fczerinde g\u00fcvenle \u00e7al\u0131\u015ft\u0131rabilirsiniz. \u00d6zellikle native image ve container image yakla\u015f\u0131mlar\u0131, sunucusuz mimarinin sundu\u011fu esneklik ve \u00f6l\u00e7eklenebilirlik avantajlar\u0131ndan tam olarak yararlanman\u0131z\u0131 sa\u011flar.<\/p>\n<h2>Performans Optimizasyonu ve G\u00fcvenlik: \u00d6l\u00e7eklenebilir ve Sa\u011flam API'ler \u0130\u00e7in \u0130pu\u00e7lar\u0131<\/h2>\n<p>Quarkus 3 ve AWS Lambda ile olu\u015fturdu\u011fumuz REST API'lerin sadece \u00e7al\u0131\u015fmas\u0131 yetmez, ayn\u0131 zamanda y\u00fcksek performansl\u0131, g\u00fcvenli ve dayan\u0131kl\u0131 olmas\u0131 da kritik \u00f6neme sahiptir. Bu b\u00f6l\u00fcmde, uygulamalar\u0131n\u0131z\u0131 optimize etmek ve potansiyel sorunlara kar\u015f\u0131 korumak i\u00e7in kullanabilece\u011finiz stratejileri inceleyece\u011fiz.<\/p>\n<h3>Performans Optimizasyonu: Cold Start ve Kaynak Y\u00f6netimi<\/h3>\n<p>AWS Lambda'n\u0131n en \u00e7ok tart\u0131\u015f\u0131lan konular\u0131ndan biri \"cold start\" (so\u011fuk ba\u015flang\u0131\u00e7) s\u00fcresidir. Fonksiyonunuz uzun s\u00fcre kullan\u0131lmad\u0131\u011f\u0131nda veya trafik aniden artt\u0131\u011f\u0131nda, Lambda yeni bir \u00e7al\u0131\u015fma ortam\u0131 (konteyner) ba\u015flat\u0131r ve kodunuzu y\u00fckler. Bu s\u00fcre\u00e7 zaman alabilir. Quarkus, native image derlemesi sayesinde bu s\u00fcreyi zaten \u00f6nemli \u00f6l\u00e7\u00fcde k\u0131salt\u0131r, ancak daha da ileri gidebiliriz:<\/p>\n<ol>\n<li><strong>Native Image Kullan\u0131m\u0131:<\/strong> Bu zaten varsay\u0131lan ve en etkili optimizasyondur. Geleneksel JVM tabanl\u0131 Java uygulamalar\u0131na g\u00f6re milisaniyelerle ifade edilen cold start s\u00fcreleri sunar.<\/li>\n<li><strong>Provisioned Concurrency (Haz\u0131rl\u0131kl\u0131 E\u015fzamanl\u0131l\u0131k):<\/strong> Belirli bir miktarda Lambda \u00f6rne\u011fini \"s\u0131cak\" tutmak i\u00e7in kullanabilirsiniz. Bu, kritik i\u015f y\u00fckleri i\u00e7in cold start'\u0131 tamamen ortadan kald\u0131r\u0131r ancak maliyeti art\u0131rabilir, \u00e7\u00fcnk\u00fc bu \u00f6rnekler s\u00fcrekli \u00e7al\u0131\u015f\u0131r durumda tutuldu\u011fu i\u00e7in \"kullan\u0131m ba\u015f\u0131na\" de\u011fil, \"tutulan s\u00fcre ba\u015f\u0131na\" \u00fccretlendirilir.<\/li>\n<li><strong>Lambda SnapStart:<\/strong> Java tabanl\u0131 Lambda fonksiyonlar\u0131 i\u00e7in \u00f6zel olarak tasarlanm\u0131\u015f bir \u00f6zelliktir. Fonksiyonunuzun ba\u015flat\u0131lmas\u0131n\u0131 ve ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131n y\u00fcklenmesini h\u0131zland\u0131rmak i\u00e7in bir ba\u015flang\u0131\u00e7 anl\u0131k g\u00f6r\u00fcnt\u00fcs\u00fc (snapshot) al\u0131r. Bu anl\u0131k g\u00f6r\u00fcnt\u00fc, yeni bir cold start oldu\u011funda yeniden kullan\u0131l\u0131r, b\u00f6ylece initialization s\u00fcresi k\u0131sal\u0131r.<\/li>\n<li><strong>Bellek ve CPU Ayarlar\u0131:<\/strong> Lambda fonksiyonunuza atad\u0131\u011f\u0131n\u0131z bellek miktar\u0131, ayn\u0131 zamanda CPU g\u00fcc\u00fcn\u00fc de etkiler. Performans testleri yaparak ve CloudWatch metriklerini izleyerek en uygun bellek ayar\u0131n\u0131 bulmak \u00f6nemlidir. A\u015f\u0131r\u0131 bellek tahsis etmek maliyeti art\u0131r\u0131rken, yetersiz bellek performans d\u00fc\u015f\u00fc\u015f\u00fcne yol a\u00e7abilir. Genellikle Native Image Quarkus uygulamalar\u0131 128MB-256MB gibi d\u00fc\u015f\u00fck bellek miktarlar\u0131yla bile olduk\u00e7a iyi \u00e7al\u0131\u015f\u0131r.<\/li>\n<li><strong>Veritaban\u0131 Ba\u011flant\u0131lar\u0131 ve Havuzlama:<\/strong> E\u011fer API'niz bir veritaban\u0131na ba\u011flan\u0131yorsa, ba\u011flant\u0131 havuzlama (connection pooling) hayati \u00f6neme sahiptir. Lambda'n\u0131n k\u0131sa \u00f6m\u00fcrl\u00fc do\u011fas\u0131 nedeniyle her fonksiyon \u00e7a\u011fr\u0131s\u0131nda yeni bir ba\u011flant\u0131 a\u00e7\u0131p kapatmak performans\u0131 d\u00fc\u015f\u00fcr\u00fcr ve veritaban\u0131 kaynaklar\u0131n\u0131 zorlar. HikariCP gibi lightweight havuzlama k\u00fct\u00fcphanelerini Quarkus ile entegre ederek, fonksiyon \u00f6rnekleri s\u0131cak kald\u0131\u011f\u0131nda ba\u011flant\u0131lar\u0131 yeniden kullanabilirsiniz. Ancak cold start durumunda ba\u011flant\u0131lar\u0131n yeniden kurulmas\u0131 ka\u00e7\u0131n\u0131lmazd\u0131r. AWS RDS Proxy gibi \u00e7\u00f6z\u00fcmler, Lambda ve veritaban\u0131 aras\u0131ndaki ba\u011flant\u0131 y\u00f6netimini daha verimli hale getirebilir.<\/li>\n<li><strong>Lambda Katmanlar\u0131 (Layers):<\/strong> S\u0131k\u00e7a kullan\u0131lan ba\u011f\u0131ml\u0131l\u0131klar\u0131 veya yard\u0131mc\u0131 kodlar\u0131 Lambda katmanlar\u0131 olarak paketlemek, ana fonksiyon da\u011f\u0131t\u0131m paketinizin boyutunu k\u00fc\u00e7\u00fclt\u00fcr ve derleme s\u00fcre\u00e7lerini h\u0131zland\u0131rabilir.<\/li>\n<\/ol>\n<h3>G\u00fcvenlik ve Hata Y\u00f6netimi: Sa\u011flam Bir API Olu\u015fturma<\/h3>\n<p>Bir REST API'nin g\u00fcvenli\u011fi ve hatalar\u0131 d\u00fczg\u00fcn bir \u015fekilde y\u00f6netebilmesi, kullan\u0131c\u0131 g\u00fcvenini kazanmak ve uygulaman\u0131n istikrar\u0131n\u0131 sa\u011flamak i\u00e7in elzemdir.<\/p>\n<ol>\n<li><strong>API Gateway Yetkilendirme:<\/strong>\n<ul>\n<li><strong>IAM Yetkilendiriciler:<\/strong> AWS kimlik ve eri\u015fim y\u00f6netimi (IAM) politikalar\u0131 kullanarak API'nize eri\u015fimi k\u0131s\u0131tlayabilirsiniz. Bu, genellikle di\u011fer AWS hizmetleri veya g\u00fcvenli i\u00e7 uygulamalar taraf\u0131ndan \u00e7a\u011fr\u0131lan API'ler i\u00e7in uygundur.<\/li>\n<li><strong>Lambda Authorizer (\u00d6zel Yetkilendiriciler):<\/strong> Kendi \u00f6zel yetkilendirme mant\u0131\u011f\u0131n\u0131z\u0131 bir Lambda fonksiyonu i\u00e7inde uygulayabilirsiniz. \u00d6rne\u011fin, JWT (JSON Web Token) do\u011frulamas\u0131n\u0131 burada yapabilir ve kullan\u0131c\u0131n\u0131n rol\u00fcne g\u00f6re API eri\u015fimini kontrol edebilirsiniz.<\/li>\n<li><strong>Amazon Cognito User Pools:<\/strong> Kullan\u0131c\u0131 y\u00f6netimi ve kimlik do\u011frulamas\u0131 i\u00e7in tam y\u00f6netilen bir hizmettir. Mobil ve web uygulamalar\u0131 i\u00e7in kullan\u0131c\u0131 oturum a\u00e7ma, kaydolma ve eri\u015fim kontrol\u00fcn\u00fc kolayla\u015ft\u0131r\u0131r.<\/li>\n<\/ul>\n<p>        API Gateway'in bu yetenekleri sayesinde, Quarkus uygulaman\u0131z i\u00e7inde ek bir yetkilendirme katman\u0131 yazman\u0131za gerek kalmaz, i\u015f y\u00fck\u00fcn\u00fc API Gateway'e devretmi\u015f olursunuz.\n    <\/li>\n<li><strong>Giri\u015f Do\u011frulama (Input Validation):<\/strong> Gelen isteklerdeki verilerin beklenen formatta ve ge\u00e7erli oldu\u011fundan emin olmak, g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 \u00f6nlemek ve uygulaman\u0131n kararl\u0131l\u0131\u011f\u0131n\u0131 sa\u011flamak i\u00e7in kritik \u00f6neme sahiptir. Quarkus, Bean Validation (JSR 380) standard\u0131n\u0131 destekler. Model s\u0131n\u0131flar\u0131n\u0131za <code>@NotNull<\/code>, <code>@Size<\/code>, <code>@Min<\/code>, <code>@Max<\/code>, <code>@Pattern<\/code> gibi anotasyonlar ekleyerek otomatik do\u011frulama yapabilirsiniz.<\/li>\n<pre><code class=\"language-java\">\nimport jakarta.validation.constraints.DecimalMin;\nimport jakarta.validation.constraints.NotBlank;\nimport jakarta.validation.constraints.Min;\n\npublic class Product {\n    private String id;\n    @NotBlank(message = \"\u00dcr\u00fcn ad\u0131 bo\u015f olamaz\")\n    private String name;\n    private String description;\n    @DecimalMin(value = \"0.01\", message = \"Fiyat s\u0131f\u0131rdan b\u00fcy\u00fck olmal\u0131\")\n    private BigDecimal price;\n    @Min(value = 0, message = \"Stok adedi negatif olamaz\")\n    private int stock;\n    \/\/ ... getter\/setter\/constructor\n}\n<\/pre>\n<p><\/code><\/p>\n<li><strong>Hata \u0130\u015fleme:<\/strong> API'nizin beklenmedik durumlar\u0131 zarif bir \u015fekilde ele almas\u0131 \u00f6nemlidir. JAX-RS, <code>@Provider<\/code> anotasyonu ile <code>ExceptionMapper<\/code> s\u0131n\u0131flar\u0131 olu\u015fturarak \u00f6zel hata yan\u0131tlar\u0131 d\u00f6nd\u00fcrmenize olanak tan\u0131r. \u00d6rne\u011fin, belirli bir t\u00fcrde hata f\u0131rlat\u0131ld\u0131\u011f\u0131nda, istemciye okunabilir bir hata mesaj\u0131 ve uygun bir HTTP durum kodu (400 Bad Request, 404 Not Found, 500 Internal Server Error) d\u00f6nd\u00fcrebilirsiniz.<\/li>\n<li><strong>Logging ve \u0130zleme:<\/strong> Uygulaman\u0131z\u0131n davran\u0131\u015f\u0131n\u0131 anlamak ve sorunlar\u0131 gidermek i\u00e7in kapsaml\u0131 loglama ve izleme \u015fartt\u0131r. Quarkus loglar\u0131n\u0131 otomatik olarak AWS CloudWatch Logs'a g\u00f6nderir. Log seviyelerini (DEBUG, INFO, WARN, ERROR) do\u011fru ayarlamak, gereksiz log kalabal\u0131\u011f\u0131n\u0131 \u00f6nlerken kritik bilgileri yakalaman\u0131za yard\u0131mc\u0131 olur. AWS X-Ray ile fonksiyon \u00e7a\u011fr\u0131lar\u0131 aras\u0131ndaki gecikmeleri ve ba\u011f\u0131ml\u0131l\u0131klar\u0131 g\u00f6rselle\u015ftirebilir, performans darbo\u011fazlar\u0131n\u0131 kolayca tespit edebilirsiniz.<\/li>\n<\/ol>\n<p>Bu optimizasyon ve g\u00fcvenlik stratejilerini uygulayarak, Quarkus ve AWS Lambda tabanl\u0131 REST API'lerinizi yaln\u0131zca h\u0131zl\u0131 de\u011fil, ayn\u0131 zamanda g\u00fcvenilir ve y\u00f6netilebilir hale getirebilirsiniz. Unutmay\u0131n ki g\u00fcvenlik ve performans, s\u00fcrekli bir \u00e7aba gerektiren ve uygulaman\u0131z evrildik\u00e7e g\u00f6zden ge\u00e7irilmesi gereken alanlard\u0131r.<\/p>\n<h2>Sonu\u00e7: Quarkus ve AWS Lambda ile Gelece\u011fin Sunucusuz REST API'lerini \u0130n\u015fa Etmek<\/h2>\n<p>Bu makale boyunca, Quarkus 3 ve AWS Lambda'n\u0131n bir araya gelerek nas\u0131l g\u00fc\u00e7l\u00fc, y\u00fcksek performansl\u0131 ve maliyet etkin REST API'leri olu\u015fturabilece\u011fimizi detayl\u0131ca inceledik. Modern bulut yerel uygulama geli\u015ftirme paradigmalar\u0131na m\u00fckemmel bir \u015fekilde uyan bu kombinasyon, Java geli\u015ftiricilerinin sunucusuz mimarinin avantajlar\u0131ndan tam olarak faydalanmas\u0131n\u0131 sa\u011fl\u0131yor. Geleneksel Java uygulamalar\u0131n\u0131n cold start sorunlar\u0131n\u0131 Quarkus'un native image yetenekleriyle a\u015farak, milisaniyeler i\u00e7inde tepki veren API'ler geli\u015ftirebiliriz.<\/p>\n<p>Ba\u015flang\u0131\u00e7ta bir Quarkus projesi olu\u015fturmaktan, gerekli uzant\u0131lar\u0131 eklemeye, basit bir \"Merhaba D\u00fcnya\" REST kayna\u011f\u0131 yazmaktan, daha karma\u015f\u0131k e-ticaret \u00fcr\u00fcn y\u00f6netimi API'si tasarlamaya kadar ad\u0131m ad\u0131m ilerledik. Bellek i\u00e7i depolama ile CRUD operasyonlar\u0131n\u0131 nas\u0131l yap\u0131land\u0131raca\u011f\u0131m\u0131z\u0131 g\u00f6rd\u00fck. Ard\u0131ndan, uygulamalar\u0131m\u0131z\u0131 AWS Lambda'ya da\u011f\u0131tmak i\u00e7in Native Image ve Container Image stratejilerini, API Gateway ile entegrasyonu ve bu s\u00fcre\u00e7teki kritik ad\u0131mlar\u0131 ele ald\u0131k. Son olarak, performans optimizasyonlar\u0131 (SnapStart, Provisioned Concurrency) ve g\u00fcvenlik \u00f6nlemleri (API Gateway yetkilendirme, giri\u015f do\u011frulama, hata i\u015fleme, loglama) \u00fczerinde durarak, API'lerimizin sadece h\u0131zl\u0131 de\u011fil, ayn\u0131 zamanda sa\u011flam ve g\u00fcvenilir olmas\u0131n\u0131 nas\u0131l sa\u011flayaca\u011f\u0131m\u0131z\u0131 inceledik.<\/p>\n<p>Quarkus 3 ve AWS Lambda birlikteli\u011fi, \u00f6zellikle mikroservis mimarileri ve olay g\u00fcd\u00fcml\u00fc sistemler i\u00e7in ideal bir \u00e7\u00f6z\u00fcmd\u00fcr. Geli\u015ftiricilere esneklik, \u00f6l\u00e7eklenebilirlik ve operasyonel y\u00fck\u00fc azaltma f\u0131rsat\u0131 sunar. Bu teknolojileri kullanarak, sadece bug\u00fcn\u00fcn de\u011fil, gelece\u011fin de ihtiya\u00e7lar\u0131na yan\u0131t verebilecek \u00e7evik ve g\u00fc\u00e7l\u00fc uygulamalar in\u015fa edebilirsiniz. Gelecekte, bu t\u00fcr API'leri daha karma\u015f\u0131k veritaban\u0131 entegrasyonlar\u0131 (DynamoDB, Aurora Serverless), mesaj kuyruklar\u0131 (SQS, Kafka), \u00f6nbellekleme (ElastiCache) ve hatta GraphQL API'leri ile geni\u015fleterek daha zengin ve dinamik \u00e7\u00f6z\u00fcmler \u00fcretebilirsiniz.<\/p>\n<p>Mobil uyumlu tasar\u0131mlar geli\u015ftirirken, bu API'lerin t\u00fcketilece\u011fi frontend uygulamalar\u0131 i\u00e7in responsive prensiplerin uygulanmas\u0131 kritik \u00f6neme sahiptir. API'lerimiz, herhangi bir platformdan eri\u015filebilir ve \u00f6l\u00e7eklenebilir oldu\u011fu i\u00e7in, mobil uygulamalar, web siteleri veya di\u011fer hizmetler taraf\u0131ndan kolayca kullan\u0131labilir. \u00d6rne\u011fin, CSS media query'ler ile frontend uygulaman\u0131z farkl\u0131 ekran boyutlar\u0131na adaptasyon sa\u011flayabilir:<\/p>\n<pre><code class=\"language-css\">\n<style>\n  .container {\n    width: 90%;\n    margin: 0 auto;\n    padding: 15px;\n  }\n\n  @media (min-width: 768px) {\n    .container {\n      width: 70%;\n      max-width: 960px;\n    }\n    h2 {\n      font-size: 2.5em;\n    }\n  }\n\n  @media (min-width: 1200px) {\n    .container {\n      width: 60%;\n      max-width: 1100px;\n    }\n    p {\n      line-height: 1.8;\n    }\n  }\n<\/style>\n<\/pre>\n<p><\/code><\/p>\n<p>Bu CSS kodu, HTML i\u00e7eri\u011finizin farkl\u0131 cihazlarda okunabilir ve kullan\u0131c\u0131 dostu olmas\u0131n\u0131 sa\u011flamak i\u00e7in bir \u00f6rnektir. API'mizin kendisi bu t\u00fcr g\u00f6rsel ayarlamalardan ba\u011f\u0131ms\u0131z \u00e7al\u0131\u015fsa da, sundu\u011fu verinin u\u00e7 noktalarda nas\u0131l g\u00f6r\u00fcnt\u00fclendi\u011fi, genel kullan\u0131c\u0131 deneyimi i\u00e7in ayr\u0131lmaz bir par\u00e7ad\u0131r.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<dl>\n<dt><strong>Quarkus Native Image'in Lambda'daki en b\u00fcy\u00fck avantaj\u0131 nedir?<\/strong><\/dt>\n<dd>En b\u00fcy\u00fck avantaj\u0131, milisaniyelerle ifade edilen ultra d\u00fc\u015f\u00fck cold start s\u00fcreleri ve \u00e7ok d\u00fc\u015f\u00fck bellek t\u00fcketimidir. Bu, hem son kullan\u0131c\u0131 deneyimini iyile\u015ftirir hem de AWS maliyetlerini d\u00fc\u015f\u00fcr\u00fcr.<\/dd>\n<dt><strong>Lambda'da durum bilgisi (state) nas\u0131l y\u00f6netilir?<\/strong><\/dt>\n<dd>Lambda fonksiyonlar\u0131 durumsuz olmal\u0131d\u0131r. Kal\u0131c\u0131 durum bilgisi i\u00e7in DynamoDB, RDS, S3 veya Redis gibi harici depolama hizmetleri kullan\u0131lmal\u0131d\u0131r. Fonksiyonun yerel belle\u011finde tutulan <code>static<\/code> de\u011fi\u015fkenler, fonksiyon \u00f6rne\u011fi s\u0131cak kald\u0131\u011f\u0131 s\u00fcrece kal\u0131r, ancak yeni bir cold start'ta s\u0131f\u0131rlan\u0131r.<\/dd>\n<dt><strong>API Gateway proxy entegrasyonu ne anlama gelir?<\/strong><\/dt>\n<dd>Proxy entegrasyonu, API Gateway'in gelen t\u00fcm istekleri (ba\u015fl\u0131klar, sorgu parametreleri, g\u00f6vde) do\u011frudan Lambda fonksiyonunuza hi\u00e7bir d\u00f6n\u00fc\u015f\u00fcm yapmadan iletmesi anlam\u0131na gelir. Lambda fonksiyonunuz (bu durumda <code>StreamLambdaHandler<\/code>), bu ham iste\u011fi ayr\u0131\u015ft\u0131r\u0131r ve Quarkus REST kaynaklar\u0131n\u0131za y\u00f6nlendirir. Bu, geli\u015ftirme esnekli\u011fini art\u0131r\u0131r.<\/dd>\n<dt><strong>Quarkus Lambda uygulamalar\u0131nda veri taban\u0131 ba\u011flant\u0131 havuzlama nas\u0131l yap\u0131l\u0131r?<\/strong><\/dt>\n<dd>Quarkus, Hibernate ORM ve Panache ile HikariCP gibi pop\u00fcler ba\u011flant\u0131 havuzlama k\u00fct\u00fcphanelerini destekler. Ba\u011flant\u0131 havuzu konfig\u00fcrasyonunu <code>application.properties<\/code> dosyas\u0131na ekleyerek Lambda \u00f6rnekleri s\u0131cak kald\u0131\u011f\u0131 s\u00fcrece ba\u011flant\u0131lar\u0131n yeniden kullan\u0131lmas\u0131n\u0131 sa\u011flayabilirsiniz. Ancak cold start durumlar\u0131nda havuzun yeniden ba\u015flat\u0131lmas\u0131 gerekecektir. AWS RDS Proxy, bu zorlu\u011fu y\u00f6netmek i\u00e7in ba\u015fka bir \u00e7\u00f6z\u00fcmd\u00fcr.<\/dd>\n<dt><strong>G\u00fcvenlik i\u00e7in API anahtarlar\u0131 yeterli midir?<\/strong><\/dt>\n<dd>API anahtarlar\u0131, basit eri\u015fim kontrol\u00fc ve kullan\u0131m s\u0131n\u0131rlamalar\u0131 i\u00e7in faydal\u0131 olabilir ancak kimlik do\u011frulama veya yetkilendirme i\u00e7in tek ba\u015f\u0131na yeterli de\u011fildir. Daha sa\u011flam g\u00fcvenlik i\u00e7in IAM yetkilendiricileri, Lambda Authorizerlar veya Amazon Cognito gibi daha geli\u015fmi\u015f mekanizmalar kullan\u0131lmal\u0131d\u0131r. API anahtarlar\u0131 genellikle DDoS sald\u0131r\u0131lar\u0131na kar\u015f\u0131 temel bir koruma veya kullan\u0131m oranlar\u0131n\u0131 kontrol etmek i\u00e7in kullan\u0131l\u0131r.<\/dd>\n<\/dl>\n","protected":false},"excerpt":{"rendered":"Quarkus 3 ve AWS Lambda ile Y\u00fcksek Performansl\u0131 REST API&#8217;ler Modern uygulama geli\u015ftirme d\u00fcnyas\u0131nda h\u0131z, \u00f6l\u00e7eklenebilirlik ve maliyet&hellip;","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":[1406],"tags":[],"class_list":{"0":"post-31411","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-aws","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>Giri\u015f: Quarkus 3 ve AWS Lambda&#039;n\u0131n G\u00fcc\u00fcn\u00fc REST API&#039;lerle Birle\u015ftirmek Neden Ak\u0131ll\u0131ca Bir Se\u00e7im?<\/title>\n<meta name=\"description\" content=\"Modern uygulama geli\u015ftirme d\u00fcnyas\u0131nda h\u0131z, \u00f6l\u00e7eklenebilirlik ve maliyet etkinli\u011fi kritik \u00f6neme sahiptir. Quarkus 3&#039;\u00fc AWS Lambda \u00fczerinde bir REST API uygulamas\u0131 olarak \u00e7al\u0131\u015ft\u0131rmak, sunucusuz mimarinin g\u00fcc\u00fcn\u00fc Quarkus&#039;un h\u0131z ve verimlili\u011fiyle birle\u015ftirerek bu ihtiya\u00e7lar\u0131 kar\u015f\u0131lar. Bu kapsaml\u0131 rehber, ad\u0131m ad\u0131m pratik uygulamalarla bu g\u00fc\u00e7l\u00fc entegrasyonu detayland\u0131r\u0131yor.\" \/>\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\/giris-quarkus-3-ve-aws-lambdanin-gucunu-rest-apilerle-birlestirmek-neden-akillica-bir-secim\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Giri\u015f: Quarkus 3 ve AWS Lambda&#039;n\u0131n G\u00fcc\u00fcn\u00fc REST API&#039;lerle Birle\u015ftirmek Neden Ak\u0131ll\u0131ca Bir Se\u00e7im?\" \/>\n<meta property=\"og:description\" content=\"Modern uygulama geli\u015ftirme d\u00fcnyas\u0131nda h\u0131z, \u00f6l\u00e7eklenebilirlik ve maliyet etkinli\u011fi kritik \u00f6neme sahiptir. Quarkus 3&#039;\u00fc AWS Lambda \u00fczerinde bir REST API uygulamas\u0131 olarak \u00e7al\u0131\u015ft\u0131rmak, sunucusuz mimarinin g\u00fcc\u00fcn\u00fc Quarkus&#039;un h\u0131z ve verimlili\u011fiyle birle\u015ftirerek bu ihtiya\u00e7lar\u0131 kar\u015f\u0131lar. Bu kapsaml\u0131 rehber, ad\u0131m ad\u0131m pratik uygulamalarla bu g\u00fc\u00e7l\u00fc entegrasyonu detayland\u0131r\u0131yor.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/giris-quarkus-3-ve-aws-lambdanin-gucunu-rest-apilerle-birlestirmek-neden-akillica-bir-secim\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-09T14:32:59+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=\"29 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/giris-quarkus-3-ve-aws-lambdanin-gucunu-rest-apilerle-birlestirmek-neden-akillica-bir-secim\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/giris-quarkus-3-ve-aws-lambdanin-gucunu-rest-apilerle-birlestirmek-neden-akillica-bir-secim\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Giri\u015f: Quarkus 3 ve AWS Lambda&#8217;n\u0131n G\u00fcc\u00fcn\u00fc REST API&#8217;lerle Birle\u015ftirmek Neden Ak\u0131ll\u0131ca Bir Se\u00e7im?\",\"datePublished\":\"2025-10-09T14:32:59+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/giris-quarkus-3-ve-aws-lambdanin-gucunu-rest-apilerle-birlestirmek-neden-akillica-bir-secim\/\"},\"wordCount\":4805,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"AWS\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/giris-quarkus-3-ve-aws-lambdanin-gucunu-rest-apilerle-birlestirmek-neden-akillica-bir-secim\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/giris-quarkus-3-ve-aws-lambdanin-gucunu-rest-apilerle-birlestirmek-neden-akillica-bir-secim\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/giris-quarkus-3-ve-aws-lambdanin-gucunu-rest-apilerle-birlestirmek-neden-akillica-bir-secim\/\",\"name\":\"Giri\u015f: Quarkus 3 ve AWS Lambda'n\u0131n G\u00fcc\u00fcn\u00fc REST API'lerle Birle\u015ftirmek Neden Ak\u0131ll\u0131ca Bir Se\u00e7im?\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-09T14:32:59+00:00\",\"description\":\"Modern uygulama geli\u015ftirme d\u00fcnyas\u0131nda h\u0131z, \u00f6l\u00e7eklenebilirlik ve maliyet etkinli\u011fi kritik \u00f6neme sahiptir. Quarkus 3'\u00fc AWS Lambda \u00fczerinde bir REST API uygulamas\u0131 olarak \u00e7al\u0131\u015ft\u0131rmak, sunucusuz mimarinin g\u00fcc\u00fcn\u00fc Quarkus'un h\u0131z ve verimlili\u011fiyle birle\u015ftirerek bu ihtiya\u00e7lar\u0131 kar\u015f\u0131lar. Bu kapsaml\u0131 rehber, ad\u0131m ad\u0131m pratik uygulamalarla bu g\u00fc\u00e7l\u00fc entegrasyonu detayland\u0131r\u0131yor.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/giris-quarkus-3-ve-aws-lambdanin-gucunu-rest-apilerle-birlestirmek-neden-akillica-bir-secim\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/giris-quarkus-3-ve-aws-lambdanin-gucunu-rest-apilerle-birlestirmek-neden-akillica-bir-secim\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/giris-quarkus-3-ve-aws-lambdanin-gucunu-rest-apilerle-birlestirmek-neden-akillica-bir-secim\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Giri\u015f: Quarkus 3 ve AWS Lambda&#8217;n\u0131n G\u00fcc\u00fcn\u00fc REST API&#8217;lerle Birle\u015ftirmek Neden Ak\u0131ll\u0131ca Bir Se\u00e7im?\"}]},{\"@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":"Giri\u015f: Quarkus 3 ve AWS Lambda'n\u0131n G\u00fcc\u00fcn\u00fc REST API'lerle Birle\u015ftirmek Neden Ak\u0131ll\u0131ca Bir Se\u00e7im?","description":"Modern uygulama geli\u015ftirme d\u00fcnyas\u0131nda h\u0131z, \u00f6l\u00e7eklenebilirlik ve maliyet etkinli\u011fi kritik \u00f6neme sahiptir. Quarkus 3'\u00fc AWS Lambda \u00fczerinde bir REST API uygulamas\u0131 olarak \u00e7al\u0131\u015ft\u0131rmak, sunucusuz mimarinin g\u00fcc\u00fcn\u00fc Quarkus'un h\u0131z ve verimlili\u011fiyle birle\u015ftirerek bu ihtiya\u00e7lar\u0131 kar\u015f\u0131lar. Bu kapsaml\u0131 rehber, ad\u0131m ad\u0131m pratik uygulamalarla bu g\u00fc\u00e7l\u00fc entegrasyonu detayland\u0131r\u0131yor.","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\/giris-quarkus-3-ve-aws-lambdanin-gucunu-rest-apilerle-birlestirmek-neden-akillica-bir-secim\/","og_locale":"tr_TR","og_type":"article","og_title":"Giri\u015f: Quarkus 3 ve AWS Lambda'n\u0131n G\u00fcc\u00fcn\u00fc REST API'lerle Birle\u015ftirmek Neden Ak\u0131ll\u0131ca Bir Se\u00e7im?","og_description":"Modern uygulama geli\u015ftirme d\u00fcnyas\u0131nda h\u0131z, \u00f6l\u00e7eklenebilirlik ve maliyet etkinli\u011fi kritik \u00f6neme sahiptir. Quarkus 3'\u00fc AWS Lambda \u00fczerinde bir REST API uygulamas\u0131 olarak \u00e7al\u0131\u015ft\u0131rmak, sunucusuz mimarinin g\u00fcc\u00fcn\u00fc Quarkus'un h\u0131z ve verimlili\u011fiyle birle\u015ftirerek bu ihtiya\u00e7lar\u0131 kar\u015f\u0131lar. Bu kapsaml\u0131 rehber, ad\u0131m ad\u0131m pratik uygulamalarla bu g\u00fc\u00e7l\u00fc entegrasyonu detayland\u0131r\u0131yor.","og_url":"https:\/\/fatihsoysal.com\/blog\/giris-quarkus-3-ve-aws-lambdanin-gucunu-rest-apilerle-birlestirmek-neden-akillica-bir-secim\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-09T14:32:59+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"29 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/giris-quarkus-3-ve-aws-lambdanin-gucunu-rest-apilerle-birlestirmek-neden-akillica-bir-secim\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/giris-quarkus-3-ve-aws-lambdanin-gucunu-rest-apilerle-birlestirmek-neden-akillica-bir-secim\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Giri\u015f: Quarkus 3 ve AWS Lambda&#8217;n\u0131n G\u00fcc\u00fcn\u00fc REST API&#8217;lerle Birle\u015ftirmek Neden Ak\u0131ll\u0131ca Bir Se\u00e7im?","datePublished":"2025-10-09T14:32:59+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/giris-quarkus-3-ve-aws-lambdanin-gucunu-rest-apilerle-birlestirmek-neden-akillica-bir-secim\/"},"wordCount":4805,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["AWS"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/giris-quarkus-3-ve-aws-lambdanin-gucunu-rest-apilerle-birlestirmek-neden-akillica-bir-secim\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/giris-quarkus-3-ve-aws-lambdanin-gucunu-rest-apilerle-birlestirmek-neden-akillica-bir-secim\/","url":"https:\/\/fatihsoysal.com\/blog\/giris-quarkus-3-ve-aws-lambdanin-gucunu-rest-apilerle-birlestirmek-neden-akillica-bir-secim\/","name":"Giri\u015f: Quarkus 3 ve AWS Lambda'n\u0131n G\u00fcc\u00fcn\u00fc REST API'lerle Birle\u015ftirmek Neden Ak\u0131ll\u0131ca Bir Se\u00e7im?","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-09T14:32:59+00:00","description":"Modern uygulama geli\u015ftirme d\u00fcnyas\u0131nda h\u0131z, \u00f6l\u00e7eklenebilirlik ve maliyet etkinli\u011fi kritik \u00f6neme sahiptir. Quarkus 3'\u00fc AWS Lambda \u00fczerinde bir REST API uygulamas\u0131 olarak \u00e7al\u0131\u015ft\u0131rmak, sunucusuz mimarinin g\u00fcc\u00fcn\u00fc Quarkus'un h\u0131z ve verimlili\u011fiyle birle\u015ftirerek bu ihtiya\u00e7lar\u0131 kar\u015f\u0131lar. Bu kapsaml\u0131 rehber, ad\u0131m ad\u0131m pratik uygulamalarla bu g\u00fc\u00e7l\u00fc entegrasyonu detayland\u0131r\u0131yor.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/giris-quarkus-3-ve-aws-lambdanin-gucunu-rest-apilerle-birlestirmek-neden-akillica-bir-secim\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/giris-quarkus-3-ve-aws-lambdanin-gucunu-rest-apilerle-birlestirmek-neden-akillica-bir-secim\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/giris-quarkus-3-ve-aws-lambdanin-gucunu-rest-apilerle-birlestirmek-neden-akillica-bir-secim\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Giri\u015f: Quarkus 3 ve AWS Lambda&#8217;n\u0131n G\u00fcc\u00fcn\u00fc REST API&#8217;lerle Birle\u015ftirmek Neden Ak\u0131ll\u0131ca Bir Se\u00e7im?"}]},{"@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\/31411","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=31411"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31411\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=31411"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=31411"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=31411"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}