﻿
{"id":27346,"date":"2024-12-07T12:38:04","date_gmt":"2024-12-07T12:38:04","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=27346"},"modified":"2024-12-07T12:38:04","modified_gmt":"2024-12-07T12:38:04","slug":"net-aspire-nedir-nasil-kullanilir-detaylica-inceleyelim","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/net-aspire-nedir-nasil-kullanilir-detaylica-inceleyelim\/","title":{"rendered":".NET Aspire Nedir? Nas\u0131l Kullan\u0131l\u0131r? Detayl\u0131ca \u0130nceleyelim&#8230;"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Bu i\u00e7eri\u011fimizde, bulut-yerel(cloud-native) uygulamalar\u0131 olduk\u00e7a efektif ve h\u0131zl\u0131 bir \u015fekilde geli\u015ftirebilmek ve servisler aras\u0131ndaki entegrasyonlar\u0131 docker teknolojisine dayal\u0131 bir \u015fekilde daha h\u0131zl\u0131 \u00e7\u00f6z\u00fcme kavu\u015fturabilmek i\u00e7in tasarlanm\u0131\u015f bir ara\u00e7 seti olan <em>.NET Aspire<\/em>&#8216;\u0131 inceliyor olaca\u011f\u0131z. Bu ara\u00e7 seti ile uygulamalar\u0131m\u0131z daha g\u00f6zlemlenebilir(observable), \u00fcretime(production) haz\u0131r ve y\u00f6netilebilir hale getirilebilmektedir ve bunun i\u00e7in \u00e7e\u015fitli ara\u00e7lar, \u015fablonlar ve NuGet paketleri sunulmaktad\u0131r. \u015eimdi gelin fazla uzatmaks\u0131z\u0131n .NET Aspire&#8217;\u0131n ne oldu\u011funu ve hangi mimarilere, ne gibi niteliklerle katk\u0131da bulundu\u011funu de\u011ferlendirmeye ba\u015flayal\u0131m&#8230;<\/p>\n<h4>.NET Aspire Nedir?<\/h4>\n<p>.NET Aspire, cloud-native uygulamalar geli\u015ftirme s\u00fcre\u00e7lerinde deneyimi iyile\u015ftirmek ve bu s\u00fcre\u00e7lerdeki belirli endi\u015feleri ele almak i\u00e7in tasarlanm\u0131\u015f bir ara\u00e7 setidir. Arkaplanda Docker kullanarak dinamik bir \u015fekilde .NET uygulamalar\u0131m\u0131z\u0131n, i\u00e7erisinde uygulama i\u00e7in gerekli olan t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131, k\u00fct\u00fcphaneleri ve yap\u0131land\u0131rmalar\u0131 bar\u0131nd\u0131ran docker image&#8217;lar\u0131n\u0131 olu\u015fturmakta ve bu olu\u015fturulan image&#8217;lar\u0131 varsay\u0131lan olarak <em>Azure Container Registry(ACR)<\/em>&#8216;e depolayabilsede, istendi\u011fi taktirde <em>Google Container Registry(GCP)<\/em>&#8216;e, <em>Amazon Elastic Container Registry(ECR)<\/em>&#8216;e veyahut <em>Docker Hub<\/em>&#8216;a da depolayabilmektedir.<\/p>\n<p>\u00d6zellikle cloud-native uygulama deyince ak\u0131llara direkt microservice olarak yap\u0131land\u0131r\u0131lm\u0131\u015f bir mimari gelebilir. Haliyle bu zandan yola \u00e7\u0131karak .NET Aspire&#8217;\u0131n en b\u00fcy\u00fck getirisi olarak, \u00f6zellikle birden fazla proje ve dependency&#8217;nin birlikte \u00e7al\u0131\u015fma yetene\u011fini daha da g\u00fc\u00e7lendirmesi oldu\u011funu s\u00f6yleyebiliriz. Tabi biryandan da konteyner mimarisini arka planda otomatik y\u00f6netmesinden ve bundan dolay\u0131 deploy s\u00fcre\u00e7lerini basitle\u015ftirmesinden dolay\u0131 cloud-native uygulamalar\u0131n geli\u015ftirme s\u00fcre\u00e7lerinin bundan b\u00f6yle muhtemel vazge\u00e7ilmezi olaca\u011f\u0131 kanaatindeyim.<\/p>\n<h4>.NET Aspire&#8217;\u0131n Ba\u015fl\u0131ca \u00d6zellikleri Nelerdir?<\/h4>\n<p>.NET Aspire, distributed uygulamalar olu\u015fturulmas\u0131na ve \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131na yard\u0131mc\u0131 olan bir dizi ara\u00e7 ve model sa\u011flamaktad\u0131r. \u00d6zellikle a\u015fa\u011f\u0131daki sat\u0131rlarda detaylar\u0131 verildi\u011fi \u00fczere orkestrasyon, entegrasyon ve ara\u00e7sal zenginlik a\u00e7\u0131s\u0131ndan s\u00fcrece ciddi nitelikler kazand\u0131rmaktad\u0131r;<\/p>\n<ul>\n<li><strong>Orkestrasyon(Orchestration)<\/strong><br \/>\n.NET Aspire, yerel geli\u015ftirme ortamlar\u0131(local development environments) i\u00e7in \u00e7oklu proje uygulamalar\u0131n\u0131 ve bu uygulamalar\u0131n ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131(dependencies) \u00e7al\u0131\u015ft\u0131rmak ve birbirleriyle ba\u011flant\u0131 kurmalar\u0131n\u0131 sa\u011flamak i\u00e7in \u00f6zellikler sa\u011flamaktad\u0131r. Bu \u00f6zelliklerden en \u00f6nemlisi diyebilece\u011fimiz service discovery&#8217;dir. Evet, servisler aras\u0131 ke\u015fif s\u00fcreci .NET Aspire sayesinde olduk\u00e7a basit ve dinamik hale getirilebilmektedir.\n<\/li>\n<li><strong>Entegrasyonlar(Integrations)<\/strong><br \/>\n.NET Aspire; Redis, PostgresSQL, RabbitMQ, Keycloak vs. gibi yayg\u0131n olarak kullan\u0131lan servisler i\u00e7in gerekli olan NuGet paketlerini bar\u0131nd\u0131rmakta ve uygulaman\u0131n tutarl\u0131l\u0131\u011f\u0131n\u0131 sorunsuz bir \u015fekilde sa\u011flayabilmek i\u00e7in de standartla\u015ft\u0131r\u0131lm\u0131\u015f aray\u00fczlerle entegrasyonlar\u0131 ger\u00e7ekle\u015ftirmektedir.\n<\/li>\n<li><strong>Ara\u00e7lar ve \u015eablonlar(Tooling)<\/strong><br \/>\n.NET Aspire; Visual Studio, Visual Studio Code ve .NET CLI i\u00e7in projelerin h\u0131zl\u0131 ve kolay bir \u015fekilde olu\u015fturulmas\u0131na yard\u0131mc\u0131 olacak \u015fablonlar ve ara\u00e7lar i\u00e7ermektedir. Yani, \u00f6nceden tasarlanm\u0131\u015f microservice mimarisine sahip bir \u00e7al\u0131\u015fman\u0131n h\u0131zl\u0131ca .NET Aspire ortam\u0131nda tasarlanmas\u0131 ve gerekli yap\u0131land\u0131rmalar\u0131n standartla\u015ft\u0131r\u0131lmas\u0131 kullan\u0131lan IDE&#8217;nin ara\u00e7 ve \u015fablon deste\u011fine ba\u011fl\u0131 olarak h\u0131zl\u0131ca ger\u00e7ekle\u015ftirilebilmekte ve kal\u0131nd\u0131\u011f\u0131 yerden .NET Aspire deste\u011fiyle yola devam edilebilmektedir.\n<\/li>\n<\/ul>\n<blockquote><p><em>Uzun laf\u0131n k\u0131sas\u0131, .NET Aspire, \u00f6zellikle cloud-native uygulama geli\u015ftirme s\u00fcre\u00e7lerini h\u0131zland\u0131rmak ve kolayla\u015ft\u0131rmak amac\u0131yla tasarlanm\u0131\u015f bir \u00e7\u00f6z\u00fcm paketidir diyebiliriz.<\/em><\/p><\/blockquote>\n<h4>.NET Aspire&#8217;\u0131n Microservice Mimarilerindeki Getirileri Nelerdir?<\/h4>\n<p>.NET Aspire, microservice mimarilerinde geli\u015ftirme ve y\u00f6netim s\u00fcrecini b\u00fcy\u00fck \u00f6l\u00e7\u00fcde basitle\u015ftirmekte ve h\u0131zland\u0131rmaktad\u0131r. \u00d6zellikle birden fazla mikro servisin y\u00f6netilmesi ve \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131 i\u00e7in yard\u0131mc\u0131 ara\u00e7lar sunmaktad\u0131r. Ki bu ara\u00e7lar servislerin birbirleriyle nas\u0131l ileti\u015fim kuraca\u011f\u0131n\u0131 ve birlikte nas\u0131l \u00e7al\u0131\u015faca\u011f\u0131n\u0131 test etmenizi kolayla\u015ft\u0131rmaktad\u0131r. Tabi her mikro servisin performans\u0131n\u0131 ve g\u00fcvenilirli\u011fini izlemek olduk\u00e7a kritik arz edece\u011finden dolay\u0131 .NET Aspire bu a\u00e7\u0131dan da b\u00fcy\u00fck avantajlar sa\u011flamaktad\u0131r. Ve ayr\u0131ca geli\u015ftirilen uygulaman\u0131n Visual Studio ve .NET CLI gibi ara\u00e7larla h\u0131zl\u0131 prototiplenmesini ve deploy edilmesini sa\u011flamas\u0131 da zamansal a\u00e7\u0131dan ciddi maliyetleri t\u00f6rp\u00fclemektedir. \u0130\u015fte bu ve bunlara benzer nedenlerden dolay\u0131 microservice mimarileri a\u00e7\u0131s\u0131ndan .NET Aspire olduk\u00e7a k\u0131ymetli bir geli\u015fmedir diyebiliriz.<\/p>\n<h4>.NET Aspire Orchestration S\u00fcreci<\/h4>\n<p>Biliyorsunuz ki, normal \u015fartlarda local ortamda uygulamalar\u0131 yap\u0131land\u0131rmak ve servisleri aya\u011fa kald\u0131rabilmek i\u00e7in genellikle <em>Docker Compose<\/em> gibi bir nimetten istifade edilmektedir. Ancak bazen basit bir kurulum i\u00e7in bile environment variable&#8217;lardan tutun connection string&#8217;lere kadar bir\u00e7ok metinsel i\u00e7eri\u011fin yap\u0131land\u0131r\u0131lmas\u0131 gerekebilmektedir. Keza docker&#8217;a a\u015final\u0131k s\u00f6z konusu de\u011filse bu durumlar olduk\u00e7a zorlay\u0131c\u0131 ve u\u011fra\u015ft\u0131r\u0131c\u0131 olabilmektedir.<\/p>\n<p>.NET Aspire Orchestration ise uygulaman\u0131n yap\u0131land\u0131rmas\u0131n\u0131 local geli\u015ftirme s\u00fcrecine odakl\u0131 bir \u015fekilde basitle\u015ftirmektedir.<\/p>\n<blockquote><p><em>.NET Aspire Orchestration, production ortamlar\u0131nda kullan\u0131lan Kubernetes gibi daha kapsaml\u0131 sistemlerin yerini almay\u0131 AMA\u00c7LAMAMAKTADIR!<\/em><\/p><\/blockquote>\n<p>Genellikle service discovery, environment variable ve container yap\u0131land\u0131rmalar\u0131n\u0131 kolayla\u015ft\u0131rmakta ve bir yandan da uygulama ayr\u0131nt\u0131lar\u0131yla u\u011fra\u015fma ihtiyac\u0131n\u0131 ortadan kald\u0131racak bir dizi soyutlama sa\u011flamaktad\u0131r.<\/p>\n<p>\u015eimdi bunu temelden tecr\u00fcbe ederek incelemeye ve b\u00f6ylece yava\u015f yava\u015f .NET Aspire&#8217;\u0131n derinliklerine dalmaya ge\u00e7ebiliriz. Tabi bunun i\u00e7in \u00f6ncelikle .NET Aspire deste\u011finin mevcut bir proje yap\u0131s\u0131nda nas\u0131l \u015fekillendirilece\u011fini ele alarak ba\u015flayaca\u011f\u0131z. Ard\u0131ndan s\u0131f\u0131rdan ba\u015flayan projelerde nas\u0131l bir yakla\u015f\u0131m sergilenebilece\u011fini de\u011ferlendirece\u011fiz. Ee haliyle bu s\u00fcre\u00e7te bir yandan da .NET Aspire&#8217;\u0131n proje yap\u0131s\u0131n\u0131 anl\u0131yor olacak, belli ba\u015fl\u0131 metotlar\u0131n neler oldu\u011funa ve .NET Aspire&#8217;\u0131n i\u015f mant\u0131\u011f\u0131ndaki ak\u0131\u015f\u0131n nas\u0131l cereyan etti\u011fine dair ciddi ayd\u0131nlanmalar ya\u015fayaca\u011f\u0131z. Hadi buyurun ba\u015flayal\u0131m&#8230;<\/p>\n<h4>1. Mevcut Bir Mimaride .NET Aspire Deste\u011fini Sa\u011flamak<\/h4>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/11\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/11\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim.png\" alt=\".NET Aspire Nedir? Nas\u0131l Kullan\u0131l\u0131r? Detayl\u0131ca \u0130nceleyelim...\" width=\"191\" height=\"285\" class=\"alignleft size-full wp-image-27362\" \/><\/a>\u015eimdi bir senaryo \u00fczerinden .NET Aspire&#8217;\u0131n kullan\u0131m\u0131n\u0131 \u00f6rneklendirecek, ard\u0131ndan incelemeye devam edece\u011fiz. Senaryomuz \u015f\u00f6yle olacakt\u0131r; <code>ServiceA<\/code> ve <code>ServiceB<\/code> isminde iki adet Asp.NET Core uygulamas\u0131 olu\u015fturaca\u011f\u0131z. Bu uygulamalar aralar\u0131nda a\u015fa\u011f\u0131daki gibi ileti\u015fim modellerine sahip olacakt\u0131r;<\/p>\n<ul>\n<li><code>ServiceA<\/code>, <code>ServiceB<\/code>&#8216;ye http request&#8217;te bulunacak ve cevap alacakt\u0131r.<\/li>\n<li><code>ServiceB<\/code> ise <code>ServiceA<\/code>&#8216;ya message broker(RabbitMQ) \u00fczerinden bir mesaj yollayacakt\u0131r.<\/li>\n<\/ul>\n<p>Bu uygulamalar\u0131n farazi olarak a\u015fa\u011f\u0131daki gibi geli\u015ftirildiklerini varsayabiliriz;<\/p>\n<p><em>&#8216;ServiceA&#8217;;<\/em><\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nusing MassTransit;\r\nusing ServiceA.Consumers;\r\n\r\nvar builder = WebApplication.CreateBuilder(args);\r\nbuilder.Services.AddHttpClient();\r\nbuilder.Services.AddMassTransit(configurator =&gt;\r\n{\r\n    configurator.AddConsumer&lt;ServiceBSentMessageConsumer&gt;();\r\n    configurator.UsingRabbitMq((context, _configure) =&gt;\r\n    {\r\n        _configure.Host(builder.Configuration.GetConnectionString(&quot;RabbitMQ&quot;));\r\n        _configure.ReceiveEndpoint(&quot;servicea-message-queue&quot;, e =&gt; e.ConfigureConsumer&lt;ServiceBSentMessageConsumer&gt;(context));\r\n    });\r\n});\r\n\r\nvar app = builder.Build();\r\n\r\napp.MapGet(&quot;\/&quot;, async (HttpClient httpClient) =&gt;\r\n{\r\n    var response = await httpClient.GetAsync(&quot;https:\/\/localhost:7257\/api\/data&quot;);\r\n    response.EnsureSuccessStatusCode();\r\n    var data = await response.Content.ReadAsStringAsync();\r\n    return Results.Ok(data);\r\n});\r\n\r\napp.Run();\r\n<\/pre>\n<\/div>\n<p><em>&#8216;ServiceB&#8217;;<\/em><\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nusing MassTransit;\r\nusing Shared;\r\n\r\nvar builder = WebApplication.CreateBuilder(args);\r\nbuilder.Services.AddMassTransit(configurator =&gt;\r\n{\r\n    configurator.UsingRabbitMq((context, _configure) =&gt;\r\n    {\r\n        _configure.Host(builder.Configuration.GetConnectionString(&quot;RabbitMQ&quot;));\r\n    });\r\n});\r\n\r\nvar app = builder.Build();\r\n\r\napp.MapGet(&quot;\/send-message&quot;, async (ISendEndpointProvider sendEndpointProvider) =&gt;\r\n{\r\n    var sendEndpoint = await sendEndpointProvider.GetSendEndpoint(new Uri($&quot;queue:servicea-message-queue&quot;));\r\n    await sendEndpoint.Send(new Message { Text = $&quot;Message sent : {DateTime.Now}&quot; });\r\n});\r\n\r\napp.MapGet(&quot;\/api\/data&quot;, () =&gt; &quot;Hello World! : ServiceB&quot;);\r\n\r\napp.Run();\r\n<\/pre>\n<\/div>\n<p>Bu \u015fekilde haz\u0131r\/mevcut bir mimaride .NET Aspire deste\u011fini sa\u011flayabilmek i\u00e7in yap\u0131lmas\u0131 gereken sistemdeki t\u00fcm projeleri tek tek ekleyebilece\u011fimiz bir .NET Aspire yap\u0131s\u0131 olu\u015fturmakt\u0131r. Bunun i\u00e7in servislerden birine sa\u011f t\u0131klayarak a\u015fa\u011f\u0131daki g\u00f6rselde oldu\u011fu gibi <em>&#8216;Add&#8217; -> &#8216;.NET Aspire Orchestrator Support&#8217;<\/em> kombinasyonu e\u015fli\u011finde bu servis ile birlikte .NET Aspire yap\u0131s\u0131n\u0131 genel solution&#8217;a ekleyebilir ve sonras\u0131nda da di\u011fer servisi de yine ayn\u0131 metotla bu olu\u015fturulan .NET Aspire yap\u0131s\u0131na dahil edebiliriz.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/11\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/11\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-1.png\" alt=\".NET Aspire Nedir Nas\u0131l Kullan\u0131l\u0131r Detayl\u0131ca \u0130nceleyelim...\" width=\"515\" height=\"498\" class=\"aligncenter size-full wp-image-27364\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/11\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-1.png 515w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/11\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-1-300x290.png 300w\" sizes=\"auto, (max-width: 515px) 100vw, 515px\" \/><\/a>Bu kombinasyon ile ilk servis e\u015fli\u011finde .NET Aspire&#8217;\u0131 olu\u015fturmaya \u00e7al\u0131\u015ft\u0131\u011f\u0131m\u0131zda a\u015fa\u011f\u0131daki g\u00f6rselde oldu\u011fu gibi olu\u015fturulacak .NET Aspire ile ilgili proje yap\u0131lanmalar\u0131ndan yani bir ba\u015fka deyi\u015fle \u015fablonlar\u0131ndan bahsedildi\u011fini g\u00f6rece\u011fiz.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/11\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/11\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-2.png\" alt=\".NET Aspire Nedir Nas\u0131l Kullan\u0131l\u0131r Detayl\u0131ca \u0130nceleyelim...\" width=\"415\" height=\"261\" class=\"aligncenter size-full wp-image-27365\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/11\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-2.png 415w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/11\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-2-300x189.png 300w\" sizes=\"auto, (max-width: 415px) 100vw, 415px\" \/><\/a>Dizin ve isimlendirme yap\u0131land\u0131rmas\u0131na istenilen dokunu\u015flarda bulunulduktan sonra Ok diyerek .NET Aspire yap\u0131s\u0131n\u0131 in\u015fa ettirebiliriz.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/11\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-3.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/11\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-3.png\" alt=\".NET Aspire Nedir Nas\u0131l Kullan\u0131l\u0131r Detayl\u0131ca \u0130nceleyelim...\" width=\"271\" height=\"115\" class=\"alignleft size-full wp-image-27366\" \/><\/a> Bu i\u015flem neticesinde solution&#8217;a yandaki g\u00f6rselde oldu\u011fu gibi <em style=\"color:green;\">&#8216;NetAspire.Example.AppHost&#8217;<\/em> ve <em style=\"color:green;\">&#8216;NetAspire.Example.ServiceDefaults&#8217;<\/em> isminde iki adet proje eklenecektir. Yani bu i\u015flem neticesinde ilgili solution&#8217;a .NET Aspire deste\u011fi dahil edilmi\u015ftir diyebiliriz.<\/p>\n<p>Bu projelerden \u00f6zellikle <em style=\"color:green;\">&#8216;NetAspire.Example.AppHost&#8217;<\/em>, sistemdeki t\u00fcm projelerin .NET Aspire sayesinde orkestrat\u00f6r edilmesini sa\u011flayacak olan ana projedir. Yani sistemde mevcut olup, .NET Aspire deste\u011fi beklenen t\u00fcm servisler bu uygulaman\u0131n &#8216;Program.cs&#8217; dosyas\u0131nda a\u015fa\u011f\u0131daki gibi y\u00f6netilebilmek i\u00e7in referans edilmektedirler.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nvar builder = DistributedApplication.CreateBuilder(args);\r\n\r\nbuilder.AddProject&lt;Projects.ServiceA&gt;(&quot;servicea&quot;);\r\n\r\nbuilder.AddProject&lt;Projects.ServiceB&gt;(&quot;serviceb&quot;);\r\n\r\nbuilder.Build().Run();\r\n<\/pre>\n<\/div>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/11\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-4.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/11\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-4.png\" alt=\".NET Aspire Nedir Nas\u0131l Kullan\u0131l\u0131r Detayl\u0131ca \u0130nceleyelim...\" width=\"211\" height=\"196\" class=\"alignleft size-full wp-image-27367\" \/><\/a>Tabi referans edilebilmek i\u00e7in bu projeye sistemde .NET Aspire ile kullan\u0131lacak t\u00fcm projeler referans edilmelidir. Bunu tabi ki de manuel yapm\u0131yoruz. Yukar\u0131daki sat\u0131rlarda bahsedilen <em style=\"font-size:12px;\">&#8216;Add&#8217; -> &#8216;.NET Aspire Orchestrator Support&#8217;<\/em> i\u015flevsel kombinasyonu hangi servis i\u00e7in ger\u00e7ekle\u015ftirirsek o servis otomatik olarak bu proje taraf\u0131ndan fiziksel referans edilecek ve biryandan da &#8216;Program.cs&#8217;inde de <code>AddProject<\/code> metodu ile referans ger\u00e7ekle\u015ftirilecektir.<\/p>\n<p><em style=\"color:green;\">&#8216;NetAspire.Example.ServiceDefaults&#8217;<\/em> projesi ise service discovery, telemetry ve health checks gibi yeniden kullan\u0131labilen yap\u0131land\u0131rmalar\u0131 ve ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00f6netmek i\u00e7in gerekli olan extension metotlar\u0131 vs. bar\u0131nd\u0131rmaktad\u0131r. Haliyle kullan\u0131labilir olmas\u0131 i\u00e7in sistemdeki t\u00fcm servisler\/projeler taraf\u0131ndan referans edilmektedir ki bu i\u015flemi de yine .NET Aspire deste\u011fi otomatik sa\u011flayacakt\u0131r.<\/p>\n<p>Burada dikkat edilmesi gereken husus \u015fudur ki; bizler solution i\u00e7erisindeki bir projeyi .NET Aspire deste\u011fine ekledi\u011fimiz vakit o projenin &#8216;Program.cs&#8217; dosyas\u0131nda a\u015fa\u011f\u0131daki de\u011fi\u015fiklikler meydana gelmektedir:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nvar builder = WebApplication.CreateBuilder(args);\r\n\r\nbuilder.AddServiceDefaults();\r\n.\r\n.\r\n.\r\nvar app = builder.Build();\r\n.\r\n.\r\n.\r\napp.MapDefaultEndpoints();\r\n.\r\n.\r\n.\r\napp.Run();\r\n<\/pre>\n<\/div>\n<p>Burada <code>AddServiceDefaults<\/code> servisiyle <code>MapDefaultEndpoints<\/code> middleware&#8217;i g\u00f6ze \u00e7arpmaktad\u0131r.<\/p>\n<ul>\n<li><code>AddServiceDefaults<\/code>; ServiceDefaults projesinden gelen bir extension metottur. Yukar\u0131daki sat\u0131rlarda bahsedildi\u011fi gibi telemetry, health checks, service discovery vs. gibi yap\u0131land\u0131rmalar\u0131 ve gerekli ba\u011f\u0131ml\u0131l\u0131klar\u0131 ilgili proje i\u00e7in konfig\u00fcre etmektedir. A\u015fa\u011f\u0131daki gibi bir i\u00e7eri\u011fe sahiptir:\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public static TBuilder AddServiceDefaults&lt;TBuilder&gt;(this TBuilder builder) where TBuilder : IHostApplicationBuilder\r\n    {\r\n        builder.ConfigureOpenTelemetry();\r\n\r\n        builder.AddDefaultHealthChecks();\r\n\r\n        builder.Services.AddServiceDiscovery();\r\n\r\n        builder.Services.ConfigureHttpClientDefaults(http =&gt;\r\n        {\r\n            \/\/ Turn on resilience by default\r\n            http.AddStandardResilienceHandler();\r\n\r\n            \/\/ Turn on service discovery by default\r\n            http.AddServiceDiscovery();\r\n        });\r\n\r\n        \/\/ Uncomment the following to restrict the allowed schemes for service discovery.\r\n        \/\/ builder.Services.Configure&lt;ServiceDiscoveryOptions&gt;(options =&gt;\r\n        \/\/ {\r\n        \/\/     options.AllowedSchemes = &#x5B;&quot;https&quot;];\r\n        \/\/ });\r\n\r\n        return builder;\r\n    }\r\n<\/pre>\n<\/div>\n<blockquote><p><em>.NET Aspire&#8217;\u0131n getirisi olan ServiceDefaults projesi, i\u00e7erisinde gelen Extensions.cs dosyas\u0131n\u0131 ve i\u015flevselli\u011fini payla\u015fmak i\u00e7in \u00f6zel olarak tasarlanm\u0131\u015f bir yap\u0131ya sahiptir. \u0130lk bak\u0131\u015fta, yap\u0131land\u0131rma faaliyetleri ve zengin i\u015flevsel niteliklerinden dolay\u0131 farkl\u0131 projelerde kullan\u0131labilir hissi do\u011furuyor olsa da b\u00f6yle bir ihtiyaca kar\u015f\u0131n bu davran\u0131\u015ftan ka\u00e7\u0131n\u0131lmas\u0131 gerekti\u011fini \u00f6zellikle vurgulamak ve bu tarz ama\u00e7lar i\u00e7in geleneksel y\u00f6ntemlerin benimsenmesi gerekti\u011finin tavsiye edildi\u011fini ifade etmek isterim.<\/em><\/p><\/blockquote>\n<\/li>\n<li><code>MapDefaultEndpoints<\/code>; health checks endpoint&#8217;lerini <span style=\"font-size:12px;\">(\/health &#8211; \/alive)<\/span> sisteme dahil eder. \u0130\u00e7erik olarak a\u015fa\u011f\u0131daki gibi bir yap\u0131ya sahiptir:\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public static WebApplication MapDefaultEndpoints(this WebApplication app)\r\n    {\r\n        \/\/ Adding health checks endpoints to applications in non-development environments has security implications.\r\n        \/\/ See https:\/\/aka.ms\/dotnet\/aspire\/healthchecks for details before enabling these endpoints in non-development environments.\r\n        if (app.Environment.IsDevelopment())\r\n        {\r\n            \/\/ All health checks must pass for app to be considered ready to accept traffic after starting\r\n            app.MapHealthChecks(&quot;\/health&quot;);\r\n\r\n            \/\/ Only health checks tagged with the &quot;live&quot; tag must pass for app to be considered alive\r\n            app.MapHealthChecks(&quot;\/alive&quot;, new HealthCheckOptions\r\n            {\r\n                Predicate = r =&gt; r.Tags.Contains(&quot;live&quot;)\r\n            });\r\n        }\r\n\r\n        return app;\r\n    }\r\n<\/pre>\n<\/div>\n<\/li>\n<\/ul>\n<blockquote><p>ServiceDefaults projesi i\u00e7erisindeki &#8216;Extensions.cs&#8217; dosyas\u0131n\u0131n i\u00e7eri\u011fini, faaliyetlerini ve kapsam\u0131n\u0131 merak ediyorsan\u0131z e\u011fer <a href=\"https:\/\/github.com\/gncyyldz\/NetAspire.Example\/blob\/master\/NetAspire.Example.ServiceDefaults\/Extensions.cs\" rel=\"noopener\" target=\"_blank\">buradan<\/a> tam olarak g\u00f6zlemde bulunabilirsiniz.<\/p><\/blockquote>\n<p>Evet, b\u00f6ylece bizler mevcut olan bir mimariye .NET Aspire deste\u011fini eklemi\u015f ve art\u0131k hali haz\u0131rda kullan\u0131labilir bir altyap\u0131 olu\u015fturmu\u015f bulunuyoruz. Art\u0131k bundan sonra .NET Aspire&#8217;\u0131n mimariye kazand\u0131rd\u0131\u011f\u0131 avantajlardan istifade etme zaman\u0131 olsa da bizler i\u00e7eri\u011fimizde bu a\u015famaya gelmeden \u00f6nce bir de s\u0131f\u0131rdan bir .NET Aspire projesinin nas\u0131l olu\u015fturulabilece\u011fini inceleyece\u011fiz. B\u00f6ylece altyap\u0131 olu\u015fturman\u0131n t\u00fcm yollar\u0131n\u0131 de\u011ferlendirdikten ve kafalarda bu konuya dair bir soru i\u015fareti b\u0131rakmad\u0131ktan sonra .NET Aspire&#8217;\u0131n kullan\u0131m\u0131na ve \u00f6zellikle servisler aras\u0131 efektif entegrasyon avantajlar\u0131na odaklan\u0131yor olaca\u011f\u0131z. O halde buyurun devam edelim&#8230;<\/p>\n<h4>2. S\u0131f\u0131rdan .NET Aspire Projesi Olu\u015fturmak<\/h4>\n<p>\u015eimdi s\u0131f\u0131rdan bir projeyi direkt olarak .NET Aspire ile temellendirmek istiyorsak e\u011fer bunun i\u00e7in bizlere a\u015fa\u011f\u0131daki ekran g\u00f6r\u00fcnt\u00fcs\u00fcnde oldu\u011fu gibi (\u015fimdilik) 7 farkl\u0131 template sunulmaktad\u0131r;<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/11\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-5.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/11\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-5.png\" alt=\".NET Aspire Nedir Nas\u0131l Kullan\u0131l\u0131r Detayl\u0131ca \u0130nceleyelim...\" width=\"808\" height=\"563\" class=\"aligncenter size-full wp-image-27370\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/11\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-5.png 808w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/11\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-5-300x209.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/11\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-5-768x535.png 768w\" sizes=\"auto, (max-width: 808px) 100vw, 808px\" \/><\/a>Bu template&#8217;leri tek tek izah etmemiz gerekirse e\u011fer;<\/p>\n<ul>\n<li><strong><em>.NET Aspire Starter App<\/em><\/strong><br \/>\nFrontend&#8217;de Blazor ve backend&#8217;de de Web API olan haz\u0131r bir \u015fablon sunmaktad\u0131r. \u0130stenildi\u011fi taktirde Redis ile de cache&#8217;leme yap\u0131labilmektedir.\n<\/li>\n<li><strong><em>.NET Aspire Empty App<\/em><\/strong><br \/>\nBo\u015f bir .NET Aspire uygulamas\u0131 olu\u015fturan \u015fablondur.\n<\/li>\n<li><strong><em>.NET Aspire App Host<\/em><\/strong><br \/>\nYaln\u0131zca .NET Aspire Host uygulamas\u0131n\u0131 yani orkestrat\u00f6r yap\u0131s\u0131n\u0131 olu\u015fturan \u015fablondur.\n<\/li>\n<li><strong><em>.NET Aspire Service Defaults<\/em><\/strong><br \/>\nBenzer mant\u0131kla yaln\u0131zca .NET Aspire ServiceDefaults projesini olu\u015fturan \u015fablondur.\n<\/li>\n<li><strong><em>.NET Aspire Test Project (MSTest)<\/em><\/strong><br \/>\nMSTest entegrasyon testlerini i\u00e7eren bir .NET Aspire projesi olu\u015fturur.\n<\/li>\n<li><strong><em>.NET Aspire Test Project (NUnit)<\/em><\/strong><br \/>\nNUnit entegrasyon testlerini i\u00e7eren bir .NET Aspire projesi olu\u015fturur.\n<\/li>\n<li><strong><em>.NET Aspire Test Project (xUnit)<\/em><\/strong><br \/>\nxUnit.net entegrasyon testlerini i\u00e7eren bir .NET Aspire projesi olu\u015fturur.\n<\/li>\n<\/ul>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/11\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-6.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/11\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-6.png\" alt=\".NET Aspire Nedir Nas\u0131l Kullan\u0131l\u0131r Detayl\u0131ca \u0130nceleyelim...\" width=\"199\" height=\"168\" class=\"alignleft size-full wp-image-27372\" \/><\/a>Bizler \u015fimdilik bo\u015f bir .NET Aspire projesi(.NET Aspire Empty App) olu\u015fturarak yolumuza devam edebiliriz. Yandaki g\u00f6rselden de g\u00f6r\u00fclece\u011fi \u00fczere bu olu\u015fum neticesinde yukar\u0131daki sat\u0131rlarda mevzu bahis olan projeler birebir ayn\u0131 isim ve nitelikte olu\u015fturulacakt\u0131rlar. Tek fark bu .NET Aspire zemininde kullan\u0131lmaya haz\u0131r projelerin olmamas\u0131d\u0131r. Ee bu durumda yap\u0131lmas\u0131 gereken art\u0131k hangi servisler ve projelerle \u00e7al\u0131\u015fma sergilenecekse onlar\u0131n ilgili solution&#8217;a eklenmesidir. <em><strong>Eee hocam AppHost projesinde bu servisleri referans etmeyecek miyiz?<\/strong><\/em> diye sordu\u011funuzu duyar gibiyim&#8230; Evet, edece\u011fiz ama manuel de\u011fil. Gerek yok \ud83d\ude42 Visual Studio sa\u011f olsun, .NET Aspire deste\u011finin oldu\u011fu solution&#8217;a yeni bir proje dahil edildi\u011finde a\u015fa\u011f\u0131daki ekran g\u00f6r\u00fcnt\u00fcs\u00fcnde oldu\u011fu gibi otomatik olarak bunu AppHost projesinde referans etmekte ve bir yandan da o servise de ServiceDefaults projesini referans olarak eklemektedir.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/11\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/11\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim.gif\" alt=\".NET Aspire Nedir Nas\u0131l Kullan\u0131l\u0131r Detayl\u0131ca \u0130nceleyelim...\" width=\"600\" height=\"323\" class=\"aligncenter size-full wp-image-27374\" \/><\/a><\/p>\n<p>\u0130\u015fte, bo\u015f bir .NET Aspire projesi bu \u015fekilde aya\u011fa kald\u0131r\u0131lmaktad\u0131r.<\/p>\n<p>\u015eimdi k\u00e2h mevcut projede olsun k\u00e2h ilk ba\u015flang\u0131\u00e7ta olsun .NET Aspire altyap\u0131s\u0131n\u0131n nas\u0131l kurguland\u0131\u011f\u0131n\u0131 detayl\u0131ca incelemi\u015f bulunuyoruz. Art\u0131k yap\u0131sal olarak .NET Aspire&#8217;\u0131 tan\u0131maya ge\u00e7ebiliriz.<\/p>\n<h4>3. .NET Aspire Davran\u0131\u015fsal Yap\u0131n\u0131n \u0130ncelemesi<\/h4>\n<p>.NET Aspire deste\u011fi y\u00fcr\u00fct\u00fclen bir \u00e7al\u0131\u015fmada ne kadar proje olursa olsun \u00f6nceki sat\u0131rlarda bahsetti\u011fimiz gibi t\u00fcm sorumluluk yani orkestrasyon AppHost projesindedir. Dolay\u0131s\u0131yla \u00f6ncelikle bu projenin servislerle aras\u0131ndaki olan ba\u011f\u0131 incelemeli, nas\u0131l bir \u00e7al\u0131\u015fmayla entegrasyon s\u00fcre\u00e7leri y\u00f6netilebilmekte, hangi metotlar\u0131 kullanmakta ve davran\u0131\u015fsal olarak nelere dikkat edilmesi gerekmekte bunlar\u0131 de\u011ferlendirmeliyiz.<\/p>\n<p>\u015eimdi ilk olarak servisleri .NET Aspire ile yap\u0131land\u0131r\u0131rken en sade haliyle a\u015fa\u011f\u0131daki gibi referans i\u015flemi ger\u00e7ekle\u015ftirilmektedir:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nvar builder = DistributedApplication.CreateBuilder(args);\r\n\r\nbuilder.AddProject&lt;Projects.ServiceA&gt;(&quot;servicea&quot;);\r\n\r\nbuilder.AddProject&lt;Projects.ServiceB&gt;(&quot;serviceb&quot;);\r\n\r\nbuilder.Build().Run();\r\n<\/pre>\n<\/div>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere <code style=\"color:purple;\">AddProject&lt;T&gt;<\/code> metodu ile .NET Aspire&#8217;a bir proje ba\u011flanabilmekte ve b\u00f6ylece ilgili projenin uygulaman\u0131n bir par\u00e7as\u0131 oldu\u011fu ifade edilmektedir. Tabi sonraki s\u00fcre\u00e7lerde bu referans edilen projeler \u00fczerinden entegrasyon s\u00fcre\u00e7lerini y\u00f6netebilmek i\u00e7in bunlar\u0131 a\u015fa\u011f\u0131daki gibi de de\u011fi\u015fkenlerle referans edebilmekteyiz:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nvar builder = DistributedApplication.CreateBuilder(args);\r\n\r\nvar _servicea = builder.AddProject&lt;Projects.ServiceA&gt;(&quot;servicea&quot;);\r\n\r\nvar _serviceb = builder.AddProject&lt;Projects.ServiceB&gt;(&quot;serviceb&quot;);\r\n\r\nbuilder.Build().Run();\r\n<\/pre>\n<\/div>\n<p>Bu referans neticesinde art\u0131k bu projeler \u00fczerinden entegrasyonlar\u0131 istedi\u011fimiz gibi y\u00fcr\u00fctebiliriz. \u015e\u00f6yle ki; hat\u0131rlarsan\u0131z 1. ad\u0131mda tarif etti\u011fimiz senaryoda ne demi\u015ftik, <i style=\"font-size:12px;\">ServiceA, ServiceB\u2018ye http request\u2019te bulunacak ve cevap alacakt\u0131r.<\/i> \u0130\u015fte bu i\u015flemin ger\u00e7ekle\u015ftirilebilmesi i\u00e7in a\u015fa\u011f\u0131daki gibi <em>ServiceA<\/em>&#8216;n\u0131n <em>ServiceB<\/em>&#8216;yi referans etmesi gerekecektir.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nvar builder = DistributedApplication.CreateBuilder(args);\r\n\r\nvar _servicea = builder.AddProject&lt;Projects.ServiceA&gt;(&quot;servicea&quot;);\r\n\r\nvar _serviceb = builder.AddProject&lt;Projects.ServiceB&gt;(&quot;serviceb&quot;);\r\n\r\n_servicea.WithReference(_serviceb);\r\n\r\nbuilder.Build().Run();\r\n<\/pre>\n<\/div>\n<p>Burada <code style=\"color:purple;\">WithReference<\/code> metodu, servisler aras\u0131ndaki service discovery bilgilerini ve connection string yap\u0131land\u0131rmalar\u0131 enjecte etmemizi sa\u011flar. Yani bir nevi servisler aras\u0131 fiziksel olmayan, mant\u0131ksal olan bir referans mant\u0131\u011f\u0131 kurar. Bu referans ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 sayesinde servislerin nas\u0131l etkile\u015fime girece\u011fi .NET Aspire seviyesinde tan\u0131mlanm\u0131\u015f olur. Yani anlayaca\u011f\u0131n\u0131z <em>ServiceA<\/em>&#8216;n\u0131n <em>ServiceB<\/em>&#8216;den bir veri almas\u0131 veya bir API \u00e7a\u011fr\u0131s\u0131nda bulunabilmesi i\u00e7in <code style=\"color:purple;\">WithReference<\/code> metoduyla ili\u015fkilendirmenin yap\u0131lmas\u0131 gereklidir.<\/p>\n<p>\u0130\u015fte bu i\u015flem neticesinde art\u0131k <em>ServiceA<\/em>&#8216;dan a\u015fa\u011f\u0131daki gibi herhangi bir host ve port bilgisini bilmeye gerek duymaks\u0131z\u0131n <em>ServiceB<\/em> tetiklenebilmektedir. Evet&#8230; Bu i\u015flem nihayetinde bir Service Discovery&#8217;dir \ud83d\ude42 <span style=\"font-size:12px;\">(Her ne kadar i\u00e7eri\u011fimizin sonraki sat\u0131rlar\u0131nda Service Discovery&#8217;i<br \/>\n.NET Aspire \u00fczerinden konsantre bir \u015fekilde inceliyor olacak olsak da esas\u0131nda buradakinden pekte farkl\u0131 bir durum s\u00f6z konusu olmayacakt\u0131r \ud83d\ude42 )<\/span><br \/>\n<em>ServiceA<\/em>;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n.\r\n.\r\n.\r\napp.MapGet(&quot;\/&quot;, async (HttpClient httpClient) =&gt;\r\n{\r\n    var response = await httpClient.GetAsync(&quot;https:\/\/serviceb\/api\/data&quot;);\r\n    response.EnsureSuccessStatusCode();\r\n    var data = await response.Content.ReadAsStringAsync();\r\n    return Results.Ok(data);\r\n});\r\n.\r\n.\r\n.\r\n<\/pre>\n<\/div>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/11\/question.webp\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/11\/question.webp\" alt=\"\" width=\"128\" height=\"128\" class=\"alignleft size-full wp-image-27380\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/11\/question.webp 128w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/11\/question-80x80.webp 80w\" sizes=\"auto, (max-width: 128px) 100vw, 128px\" \/><\/a>\u0130\u015fte tam da bu noktada ak\u0131llara \u015f\u00f6yle bir sual gelmi\u015f olabilir;<\/p>\n<p><span style=\"color:gray;\">.NET Aspire ile uygulamay\u0131 geli\u015ftirmek i\u00e7in solution&#8217;daki t\u00fcm projelerin AppHost taraf\u0131ndan referans edilmesi gerekmektedir. Peki projeler tek bir solution alt\u0131nda de\u011fil de farkl\u0131 solution&#8217;lara da\u011f\u0131t\u0131lm\u0131\u015f b\u00fcy\u00fck bir microservice mimarisindeyse ne yapaca\u011f\u0131z?<\/span><\/p>\n<p>El-cevap; harici solution&#8217;lardaki projelerin .NET Aspire&#8217;a aktar\u0131labilmesi i\u00e7in docker image&#8217;lar\u0131ndan istifade edebilir ve b\u00f6ylece bu sorunu a\u015fabiliriz. Burada a\u015fa\u011f\u0131daki \u00f6rnekte oldu\u011fu gibi <code style=\"color:purple;\">AddContainer<\/code> metoduyla container tabanl\u0131 harici bir servisi uygulamaya ekleme ve yap\u0131land\u0131rabilme \u015fans\u0131m\u0131z s\u00f6z konusudur.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nvar builder = DistributedApplication.CreateBuilder(args);\r\n\r\nvar catalogApi = builder.AddContainer(&quot;catalog-api&quot;, &quot;catalog-api&quot;)\r\n                        .WithHttpEndpoint(targetPort: 8080)\r\n                        .WithHttpHealthCheck(&quot;\/health&quot;);\r\n\r\nbuilder.AddProject&lt;Projects.WebApplication1&gt;(&quot;store&quot;)\r\n       .WithReference(catalogApi.GetEndpoint(&quot;http&quot;))\r\n       .WaitFor(catalogApi);\r\n\r\nbuilder.Build().Run();\r\n<\/pre>\n<\/div>\n<p>Evet, bu y\u00f6ntem sayesinde bizler geli\u015ftirme ortamlar\u0131nda veya test a\u015famalar\u0131nda belirli servisleri container olarak .NET Aspire sistemine dahil edip \u00e7al\u0131\u015ft\u0131rabilme olana\u011f\u0131 elde edebiliyoruz. Ancak bu y\u00f6ntem neticesinde eklenen servislerde debugging yap\u0131lamayaca\u011f\u0131 a\u015fikar olsa da yine de bizler ifade etmi\u015f olal\u0131m. Ayr\u0131ca harici servislerin ServiceDefaults projesini referans olarak g\u00f6rmeleri tek ko\u015fuldur. Anlayaca\u011f\u0131n\u0131z .NET Aspire i\u00e7in m\u00fcmk\u00fcn mertebe tek bir solution tasar\u0131m\u0131nda bulunulmas\u0131 en idealidir. Aksi taktirde s\u00fcre\u00e7 ister istemez t\u00fcrl\u00fc zahmetler gerektirebilir.<\/p>\n<p>Velhas\u0131l&#8230; Bu \u015fekilde yap\u0131land\u0131r\u0131p .NET Aspire uygulamas\u0131n\u0131 derleyip \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131m\u0131zda a\u015fa\u011f\u0131daki g\u00f6rselde oldu\u011fu gibi bizleri bir Dashboard kar\u015f\u0131layacakt\u0131r.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/11\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-1.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/11\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-1.gif\" alt=\".NET Aspire Nedir? Nas\u0131l Kullan\u0131l\u0131r? Detayl\u0131ca \u0130nceleyelim...\" width=\"800\" height=\"431\" class=\"aligncenter size-full wp-image-27377\" \/><\/a>Bu dashboard&#8217;daki sekmelere h\u0131zl\u0131ca g\u00f6z atarsak e\u011fer;<\/p>\n<ul>\n<li><strong><em>Resources\/Kaynaklar<\/em><\/strong><br \/>\n.NET Aspire uygulamas\u0131nda referans edilen t\u00fcm projeler, servisler, api&#8217;ler ve RabbitMQ, Redis vs. gibi entegrasyonlar\u0131n container&#8217;lar\u0131yla birlikte bu kaynaklar\u0131n environment variables&#8217;lar\u0131 gibi temel bilgileri bu sekmede listelenir.\n<\/li>\n<li><strong><em>Console\/Konsol<\/em><\/strong><br \/>\nUygulamadaki her projenin konsol \u00e7\u0131kt\u0131lar\u0131 g\u00f6r\u00fcnt\u00fclenir.\n<\/li>\n<li><strong><em>Structured\/Yap\u0131land\u0131r\u0131lm\u0131\u015f<\/em><\/strong><br \/>\n.NET Aspire uygulamas\u0131ndaki t\u00fcm projelerin ve container&#8217;lar\u0131n loglar\u0131 filtrelenebilir bir \u015fekilde listelenir.\n<\/li>\n<li><strong><em>Traces\/\u0130zlemeler<\/em><\/strong><br \/>\nUygulamalarda yap\u0131lan t\u00fcm request&#8217;ler izlenebilir. Bu request&#8217;ler ister i\u00e7 servisler aras\u0131nda olsun, isterse de d\u0131\u015f d\u00fcnyayla haberle\u015fme odakl\u0131 olsun fark etmemektedir. Misal olarak; <em>ServiceA<\/em> <em>ServiceB<\/em>&#8216;ye, <em>ServiceB<\/em>&#8216;de <em>https:\/\/google.com<\/em>&#8216;a istekte bulunuyor diyelim. \u0130\u015fte bu s\u00fcrecin trace&#8217;i a\u015fa\u011f\u0131daki g\u00f6rseldeki gibi olacakt\u0131r.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/11\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-7.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/11\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-7.png\" alt=\".NET Aspire Nedir? Nas\u0131l Kullan\u0131l\u0131r? Detayl\u0131ca \u0130nceleyelim...\" width=\"1823\" height=\"355\" class=\"aligncenter size-full wp-image-27379\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/11\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-7.png 1823w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/11\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-7-300x58.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/11\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-7-1024x199.png 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/11\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-7-768x150.png 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/11\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-7-1536x299.png 1536w\" sizes=\"auto, (max-width: 1823px) 100vw, 1823px\" \/><\/a>\n<\/li>\n<li><strong><em>Metrics\/\u00d6l\u00e7\u00fcmler<\/em><\/strong><br \/>\nUygulamalar\u0131n metrikleri grafiksel olarak listelenir.\n<\/li>\n<\/ul>\n<p>Evet&#8230; B\u00f6ylece yeterince .NET Aspire&#8217;\u0131 davran\u0131\u015fsal olarak inceledi\u011fimize g\u00f6re art\u0131k Redis, PostgreSQL ve RabbitMQ gibi entegrasyonel \u00e7al\u0131\u015fmalar\u0131nda nas\u0131l y\u00fcr\u00fct\u00fcld\u00fc\u011f\u00fcn\u00fc incelemeye ge\u00e7ebiliriz.<\/p>\n<h4>4. .NET Aspire Entegrasyonlar\u0131<\/h4>\n<p>.NET Aspire&#8217;\u0131 avantajl\u0131 k\u0131lan \u00f6nemli \u00f6zelliklerinden birisi de Redis, PostgreSQL, RabbitMQ vs. gibi pop\u00fcler servislerin entegrasyonunu kolayca yapabilmemize olanak tan\u0131mas\u0131d\u0131r. Tabi bu olana\u011f\u0131 \u00fcstteki sat\u0131rlarda ifade etmeye \u00e7al\u0131\u015ft\u0131\u011f\u0131m\u0131z gibi ilgili servislere kar\u015f\u0131n \u00fcretilmi\u015f NuGet paketleri arac\u0131l\u0131\u011f\u0131yla sa\u011flayabilmektedir. E\u011fer ki .NET Aspire&#8217;a dair mevcut olan entegrasyonlar\u0131n listesini merak ediyorsan\u0131z bunun i\u00e7in AppHost projesine sa\u011f t\u0131klayarak a\u015fa\u011f\u0131daki g\u00f6rselde oldu\u011fu gibi <em>&#8216;Add&#8217; -> &#8216;.NET Aspire package&#8230;&#8217;<\/em> kombinasyonunu takip edebilirsiniz.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/11\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-8.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/11\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-8.png\" alt=\".NET Aspire Nedir? Nas\u0131l Kullan\u0131l\u0131r? Detayl\u0131ca \u0130nceleyelim...\" width=\"523\" height=\"518\" class=\"aligncenter size-full wp-image-27381\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/11\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-8.png 523w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/11\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-8-300x297.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/11\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-8-150x150.png 150w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/11\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-8-80x80.png 80w\" sizes=\"auto, (max-width: 523px) 100vw, 523px\" \/><\/a><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/11\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-9.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/11\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-9.png\" alt=\".NET Aspire Nedir? Nas\u0131l Kullan\u0131l\u0131r? Detayl\u0131ca \u0130nceleyelim...\" width=\"985\" height=\"794\" class=\"aligncenter size-full wp-image-27382\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/11\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-9.png 985w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/11\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-9-300x242.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/11\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-9-768x619.png 768w\" sizes=\"auto, (max-width: 985px) 100vw, 985px\" \/><\/a>\u015eimdi burada entegrasyonlarla ilgili olduk\u00e7a \u00f6nemli bir fark\u0131ndal\u0131k olu\u015fturaca\u011f\u0131z. Entegrasyonlar genel anlamda <em style=\"color:red;\">hosting integrations\/bar\u0131nd\u0131rma entegrasyonlar\u0131<\/em> ve <em style=\"color:red;\">client integrations\/istemci entegrasyonlar\u0131<\/em> olarak ikiye ayr\u0131l\u0131rlar. Bu iki entegrasyon yap\u0131s\u0131 aras\u0131ndaki fark\u0131 a\u015fa\u011f\u0131daki tablo \u00fczerinden mukayese edersek e\u011fer;<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"width:50%;\">Hosting Integrations\/Bar\u0131nd\u0131rma Entegrasyonlar\u0131<\/th>\n<th>Client Integrations\/\u0130stemci Entegrasyonlar\u0131<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\nUygulamalar\u0131 yap\u0131land\u0131rmak i\u00e7in AppHost projesi i\u00e7erisindeki kaynaklar\u0131(servisler, projeler, container&#8217;lar ya da cloud resource&#8217;lar vs.) temsil eden entegrasyonlard\u0131r.<\/p>\n<p>Misal olarak;<br \/>\nRabbitMQ&#8217;nun hangi servisler taraf\u0131ndan kullan\u0131laca\u011f\u0131n\u0131 AppHost i\u00e7erisinde ifade edebilmek i\u00e7in tabi ki de hosting integrations yapmal\u0131 ve RabbitMQ&#8217;nun AppHost&#8217;a uygun olan <code>Aspire.Hosting.RabbitMQ<\/code> NuGet paketini kurmal\u0131y\u0131z.\n<\/td>\n<td>\nAppHost&#8217;ta yap\u0131land\u0131r\u0131lm\u0131\u015f kaynaklar\u0131n servislerdeki kar\u015f\u0131 yap\u0131land\u0131rmas\u0131n\u0131 sa\u011flayan entegrasyonlard\u0131r.<\/p>\n<p>Misal olarak;<br \/>\nAppHost i\u00e7erisinde yap\u0131land\u0131r\u0131lm\u0131\u015f RabbitMQ&#8217;nun servisteki kar\u015f\u0131 yap\u0131land\u0131rmas\u0131n\u0131 sa\u011flayabilmek i\u00e7in servise <code>Aspire.RabbitMQ.Client<\/code> NuGet paketini kurmal\u0131y\u0131z.\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>.NET Aspire entegrasyon s\u00fcrecinde hosting&#8217;e kar\u015f\u0131n client entegrasyonlar\u0131n\u0131n\u0131n kullan\u0131lmas\u0131 best practices&#8217;dir. Yap\u0131land\u0131rma hali ve i\u015f mant\u0131\u011f\u0131 gere\u011fi kimi hosting entegrasyonlar\u0131na kar\u015f\u0131l\u0131k client entegrasyonu bulunmad\u0131\u011f\u0131n\u0131 s\u00f6ylemekte fayda vard\u0131r. Hocam nedir bu entegrasyonlar diye sorarsan\u0131z akla direkt API Gateway gelmektedir&#8230; Ayr\u0131ca t\u00fcr\u00fcne g\u00f6re entegrasyon k\u00fct\u00fcphanelerini g\u00f6zlemlemek isteniyorsan\u0131z NuGet penceresinde a\u015fa\u011f\u0131daki keyword&#8217;ler e\u015fli\u011finde araman\u0131n yap\u0131lmas\u0131 yeterlidir;<\/p>\n<ul>\n<li><em style=\"color:blue\">owner:Aspire tags:integration+hosting<\/em> : Hosting entegrasyonlar\u0131n\u0131 getirir. AppHost projesinde <em>&#8216;.NET Aspire package&#8230;&#8217;<\/em> dendi\u011finde de yukar\u0131da son payla\u015f\u0131lan g\u00f6rselde oldu\u011fu gibi varsay\u0131lan olarak bu keyword&#8217;le arama yap\u0131lan bir NuGet penceresi a\u00e7\u0131lacakt\u0131r.<\/li>\n<li><em style=\"color:blue\">owner:Aspire tags:integration+client<\/em> : Client entegrasyonlar\u0131n\u0131 getirir. AppHost d\u0131\u015f\u0131ndaki herhangi bir servis \u00fczerinden <em>&#8216;.NET Aspire package&#8230;&#8217;<\/em> dendi\u011finde bu keyword ile arama yap\u0131lan NuGet penceresi a\u00e7\u0131lacakt\u0131r.<\/li>\n<\/ul>\n<p>Evet&#8230; Art\u0131k entegrasyon terminolojilerini ve mant\u0131\u011f\u0131n\u0131 kavrad\u0131\u011f\u0131m\u0131za g\u00f6re baz\u0131 pop\u00fcler paketler \u00fczerinden entegrasyon s\u00fcre\u00e7lerini hususi olarak tecr\u00fcbe etmeye ba\u015flayabiliriz.<\/p>\n<h4>5. .NET Aspire \u0130le RabbitMQ Entegrasyonu<\/h4>\n<p>Hat\u0131rlarsan\u0131z 1. ad\u0131mda tarif etti\u011fimiz senaryonun ikinci maddesinde <i style=\"font-size:12px;\">ServiceB ise ServiceA\u2018ya message broker(RabbitMQ) \u00fczerinden bir mesaj yollayacakt\u0131r.<\/i> demi\u015ftik. \u015eimdi gelin senaryo gere\u011fi RabbitMQ ile .NET Aspire&#8217;da gerekli \u00e7al\u0131\u015fmay\u0131 ger\u00e7ekle\u015ftirmeye ba\u015flayal\u0131m.<\/p>\n<p>RabbitMQ i\u00e7in \u00f6ncelikle AppHost projesine bir hosting entegrasyonu<span style=\"font-size:12px;\">(<a href=\"https:\/\/www.nuget.org\/packages\/Aspire.Hosting.RabbitMQ\" rel=\"noopener\" target=\"_blank\">Aspire.Hosting.RabbitMQ<\/a>)<\/span> yapmam\u0131z gerekmektedir. Ard\u0131ndan ilgili message broker&#8217;\u0131 kullanacak olan servisler i\u00e7in de ister client entegrasyonu<span style=\"font-size:12px;\">(<a href=\"https:\/\/www.nuget.org\/packages\/Aspire.RabbitMQ.Client\" rel=\"noopener\" target=\"_blank\">Aspire.RabbitMQ.Client<\/a>)<\/span> yapabiliriz, istersek de MassTransit \u00fczerinden \u00e7al\u0131\u015fma ger\u00e7ekle\u015ftirebiliriz. Bizler MassTransit&#8217;i tercih edece\u011fiz.<\/p>\n<p>\u0130lgili projelere gerekli k\u00fct\u00fcphaneleri y\u00fckledikten sonra AppHost&#8217;ta a\u015fa\u011f\u0131daki \u00e7al\u0131\u015fman\u0131n yap\u0131lmas\u0131 gerekmektedir.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nvar builder = DistributedApplication.CreateBuilder(args);\r\n\r\nvar username = builder.AddParameter(&quot;username&quot;, &quot;gncy&quot;, secret: true);\r\nvar password = builder.AddParameter(&quot;password&quot;, &quot;123&quot;, secret: true);\r\nvar rabbitMQ = builder.AddRabbitMQ(&quot;rabbitMQ&quot;, username, password)\r\n    .WithManagementPlugin();\r\n\r\nvar _servicea = builder.AddProject&lt;Projects.ServiceA&gt;(&quot;servicea&quot;);\r\n\r\nvar _serviceb = builder.AddProject&lt;Projects.ServiceB&gt;(&quot;serviceb&quot;);\r\n\r\n_servicea\r\n    .WithReference(rabbitMQ)\r\n    .WithReference(_serviceb);\r\n\r\n_serviceb\r\n    .WithReference(rabbitMQ);\r\n\r\nbuilder.Build().Run();\r\n<\/pre>\n<\/div>\n<p>Yukar\u0131da servislerle RabbitMQ aras\u0131ndaki orkestrasyon yap\u0131land\u0131rmas\u0131n\u0131 g\u00f6r\u00fcyoruz. Burada <code style=\"color:purple;\">AddParameter<\/code> metodu ile RabbitMQ&#8217;da kullan\u0131lacak kullan\u0131c\u0131 ad\u0131 ve parola bilgileri belirlenmekte, &#8216;secret&#8217; parametresiyle de bu verilerin gizli\/kritik veriler oldu\u011fu ifade edilmektedir. <code style=\"color:purple;\">AddRabbitMQ<\/code> metodu ile de .NET Aspire&#8217;a bir RabbitMQ entegrasyonu sa\u011flanmaktad\u0131r. <code style=\"color:purple;\">WithManagementPlugin<\/code> metoduyla da RabbitMQ sunucusunu izlemek ve y\u00f6netmek i\u00e7in HTTP tabanl\u0131 bir API eklenmektedir. Yani bir nevi RabbitMQ&#8217;nun web tabanl\u0131 y\u00f6netim konsolu etkinle\u015ftirilerek kullan\u0131labilir hale getirilmektedir. Ayr\u0131ca dikkat ederseniz RabbitMQ ile haberle\u015fmeyi sa\u011flayacak olan her iki servise de <code style=\"color:purple;\">WithReference<\/code> metoduyla RabbitMQ ili\u015fkilendirilmektedir.<\/p>\n<p>Ard\u0131ndan her iki servisin &#8216;appsettings.json&#8217; dosyas\u0131nda a\u015fa\u011f\u0131daki konfig\u00fcrasyonda bulunal\u0131m.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n{\r\n  .\r\n  .\r\n  .\r\n  &quot;ConnectionStrings&quot;: {\r\n    &quot;RabbitMQ&quot;: &quot;amqp:\/\/gncy:123@localhost:5672&quot;\r\n  }\r\n}\r\n<\/pre>\n<\/div>\n<p>Ve servisleri de a\u015fa\u011f\u0131daki gibi tasarlayal\u0131m:<br \/>\n<em>ServiceA<\/em>;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nvar builder = WebApplication.CreateBuilder(args);\r\n\r\nbuilder.AddServiceDefaults();\r\n.\r\n.\r\n.\r\nbuilder.Services.AddMassTransit(configurator =&gt;\r\n{\r\n    configurator.AddConsumer&lt;ServiceBSentMessageConsumer&gt;();\r\n    configurator.UsingRabbitMq((context, _configure) =&gt;\r\n    {\r\n        _configure.Host(builder.Configuration.GetConnectionString(&quot;RabbitMQ&quot;));\r\n        _configure.ReceiveEndpoint(&quot;servicea-message-queue&quot;, e =&gt; e.ConfigureConsumer&lt;ServiceBSentMessageConsumer&gt;(context));\r\n    });\r\n});\r\n\r\nvar app = builder.Build();\r\n\r\napp.MapDefaultEndpoints();\r\n.\r\n.\r\n.\r\napp.Run();\r\n<\/pre>\n<\/div>\n<p><em>ServiceB<\/em>;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nvar builder = WebApplication.CreateBuilder(args);\r\n\r\nbuilder.AddServiceDefaults();\r\nbuilder.Services.AddMassTransit(configurator =&gt;\r\n{\r\n    configurator.UsingRabbitMq((context, _configure) =&gt;\r\n    {\r\n        _configure.Host(builder.Configuration.GetConnectionString(&quot;RabbitMQ&quot;));\r\n    });\r\n});\r\n\r\nvar app = builder.Build();\r\n\r\napp.MapDefaultEndpoints();\r\n.\r\n.\r\n.\r\napp.Run();\r\n<\/pre>\n<\/div>\n<p>Ve uygulamay\u0131 derleyip \u00e7al\u0131\u015ft\u0131ral\u0131m&#8230;<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/12\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/12\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim.png\" alt=\".NET Aspire Nedir? Nas\u0131l Kullan\u0131l\u0131r? Detayl\u0131ca \u0130nceleyelim...\" width=\"1902\" height=\"330\" class=\"aligncenter size-full wp-image-27384\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/12\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim.png 1902w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/12\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-300x52.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/12\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-1024x178.png 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/12\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-768x133.png 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/12\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-1536x266.png 1536w\" sizes=\"auto, (max-width: 1902px) 100vw, 1902px\" \/><\/a>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere &#8216;rabbitMQ&#8217; container&#8217;\u0131 .NET Aspire sayesinde olu\u015fturulmu\u015f ve kullan\u0131ma haz\u0131r hale getirilmi\u015ftir. \u0130\u015fte .NET Aspire&#8217;\u0131n konteyner mimarisini arka planda otomatik y\u00f6netmesinden kastetti\u011fimiz bu otomatize davran\u0131\u015f\u0131d\u0131r. Evet, Docker Desktop \u00fczerinden de g\u00f6z atarsak e\u011fer s\u0131rf bu \u00e7al\u0131\u015fmaya odakl\u0131 bir rabbitMQ container&#8217;\u0131n\u0131n olu\u015fturuldu\u011funu g\u00f6zlemleyebiliriz.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/12\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/12\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-1.png\" alt=\".NET Aspire Nedir? Nas\u0131l Kullan\u0131l\u0131r? Detayl\u0131ca \u0130nceleyelim...\" width=\"396\" height=\"60\" class=\"aligncenter size-full wp-image-27385\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/12\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-1.png 396w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/12\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-1-300x45.png 300w\" sizes=\"auto, (max-width: 396px) 100vw, 396px\" \/><\/a>Yapt\u0131\u011f\u0131m\u0131z \u00e7al\u0131\u015fmay\u0131 test edebilmek i\u00e7in de <em>ServiceB<\/em> \u00fczerinden <code>https:\/\/localhost:7257\/send-message<\/code> adresini tetikleyerek message broker arac\u0131l\u0131\u011f\u0131yla <em>ServiceA<\/em>&#8216;ya bir mesaj g\u00f6ndermeyi deneyebiliriz. Bu deneme neticesinde a\u015fa\u011f\u0131daki ekran g\u00f6r\u00fcnt\u00fcs\u00fcnde oldu\u011fu gibi mesajlar\u0131n iletildi\u011fini g\u00f6rebiliriz.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/12\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/12\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-2.png\" alt=\".NET Aspire Nedir? Nas\u0131l Kullan\u0131l\u0131r? Detayl\u0131ca \u0130nceleyelim...\" width=\"459\" height=\"107\" class=\"aligncenter size-full wp-image-27386\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/12\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-2.png 459w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/12\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-2-300x70.png 300w\" sizes=\"auto, (max-width: 459px) 100vw, 459px\" \/><\/a>Ayr\u0131ca aya\u011fa kald\u0131r\u0131lm\u0131\u015f bu uygulamay\u0131 sonland\u0131rd\u0131\u011f\u0131m\u0131zda, s\u00fcre\u00e7te olu\u015fturulmu\u015f olan t\u00fcm container&#8217;lar\u0131n silindi\u011fini de g\u00f6rece\u011fiz.<\/p>\n<h4>6. .NET Aspire \u0130le Keycloak Entegrasyonu<\/h4>\n<p>.NET Aspire ile Keycloak entegrasyonunu ger\u00e7ekle\u015ftirebilmek i\u00e7in <span style=\"font-size:12px;\">(<a href=\"https:\/\/www.nuget.org\/packages\/Aspire.Hosting.Keycloak\" rel=\"noopener\" target=\"_blank\">Aspire.Hosting.Keycloak<\/a>)<\/span> hosting entegrasyonunu ve kullan\u0131laca\u011f\u0131 servislerde de <span style=\"font-size:12px;\">(<a href=\"https:\/\/www.nuget.org\/packages\/Aspire.Keycloak.Authentication\" rel=\"noopener\" target=\"_blank\">Aspire.Keycloak.Authentication<\/a>)<\/span> client entegrasyonunu yapmam\u0131z gerekmektedir.<\/p>\n<p>Misal olarak sadece <em>ServiceA<\/em>&#8216;da Keycloak authentication sa\u011flanacaksa AppHost&#8217;ta a\u015fa\u011f\u0131daki yap\u0131land\u0131rmada bulunulmal\u0131;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nvar builder = DistributedApplication.CreateBuilder(args);\r\n\r\nvar username = builder.AddParameter(&quot;username&quot;, &quot;gncy&quot;, secret: true);\r\nvar password = builder.AddParameter(&quot;password&quot;, &quot;123&quot;, secret: true);\r\nvar rabbitMQ = builder.AddRabbitMQ(&quot;rabbitMQ&quot;, username, password)\r\n    .WithManagementPlugin();\r\n\r\nvar keycloak = builder.AddKeycloak(&quot;keycloak&quot;, 1111, username, password);\r\n\r\nvar _servicea = builder.AddProject&lt;Projects.ServiceA&gt;(&quot;servicea&quot;);\r\n\r\nvar _serviceb = builder.AddProject&lt;Projects.ServiceB&gt;(&quot;serviceb&quot;);\r\n\r\n_servicea\r\n    .WithReference(rabbitMQ)\r\n    .WithReference(keycloak)\r\n    .WithReference(_serviceb);\r\n\r\n_serviceb\r\n    .WithReference(rabbitMQ);\r\n\r\nbuilder.Build().Run();\r\n<\/pre>\n<\/div>\n<p>ve <em>ServiceA<\/em>&#8216;da da a\u015fa\u011f\u0131daki \u00e7al\u0131\u015fma ger\u00e7ekle\u015ftirilmelidir.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nvar builder = WebApplication.CreateBuilder(args);\r\n\r\nbuilder.AddServiceDefaults();\r\n\r\n.\r\n.\r\n.\r\nbuilder.Services.AddAuthentication()\r\n    .AddKeycloakJwtBearer(&quot;keycloak&quot;, realm: &quot;example-realm&quot;, options =&gt;\r\n    {\r\n        options.Audience = &quot;aspire.api&quot;;\r\n    });\r\n.\r\n.\r\n.\r\nvar app = builder.Build();\r\n.\r\n.\r\n.\r\napp.Run();\r\n<\/pre>\n<\/div>\n<p>Bu ad\u0131mdan sonra Keycloak sunucusuna <code>http:\/\/localhost:1111\/<\/code> adresi \u00fczerinden girerek belirtilen realm yap\u0131land\u0131rmas\u0131nda bulunulmal\u0131 ve gerekli Keycloak i\u015flemleri y\u00fcr\u00fct\u00fclmelidir.<\/p>\n<h4>7. .NET Aspire \u0130le Redis Entegrasyonu<\/h4>\n<p>.NET Aspire&#8217;da Redis entegrasyonu i\u00e7in de <span style=\"font-size:12px;\">(<a href=\"https:\/\/www.nuget.org\/packages\/Aspirant.Hosting.Redis\" rel=\"noopener\" target=\"_blank\">Aspirant.Hosting.Redis<\/a>)<\/span> hosting entegrasyonunun yap\u0131lmas\u0131 ve ard\u0131ndan AppHost&#8217;a a\u015fa\u011f\u0131daki gibi Redis kayna\u011f\u0131n\u0131n eklenmesi gerekmektedir.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nvar builder = DistributedApplication.CreateBuilder(args);\r\n\r\nvar username = builder.AddParameter(&quot;username&quot;, &quot;gncy&quot;, secret: true);\r\nvar password = builder.AddParameter(&quot;password&quot;, &quot;123&quot;, secret: true);\r\nvar rabbitMQ = builder.AddRabbitMQ(&quot;rabbitMQ&quot;, username, password)\r\n    .WithManagementPlugin();\r\n\r\nvar keycloak = builder.AddKeycloak(&quot;keycloak&quot;, 1111, username, password);\r\n\r\nvar redis = builder.AddRedis(&quot;redis&quot;);\r\n\r\nvar _servicea = builder.AddProject&lt;Projects.ServiceA&gt;(&quot;servicea&quot;);\r\n\r\nvar _serviceb = builder.AddProject&lt;Projects.ServiceB&gt;(&quot;serviceb&quot;);\r\n\r\n_servicea\r\n    .WithReference(rabbitMQ)\r\n    .WithReference(keycloak)\r\n    .WithReference(redis)\r\n    .WithReference(_serviceb);\r\n\r\n_serviceb\r\n    .WithReference(rabbitMQ);\r\n\r\nbuilder.Build().Run();\r\n<\/pre>\n<\/div>\n<p>Ard\u0131ndan Redis&#8217;in kullan\u0131laca\u011f\u0131 servisler de <span style=\"font-size:12px;\">(<a href=\"https:\/\/www.nuget.org\/packages\/Aspire.StackExchange.Redis\" rel=\"noopener\" target=\"_blank\">Aspire.StackExchange.Redis<\/a>)<\/span> client entegrasyonu yap\u0131lmal\u0131 ve a\u015fa\u011f\u0131daki gibi <code style=\"color:purple;\">AddRedisClient<\/code> metoduyla Redis servisi ilgili servislere eklenmeli.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nvar builder = WebApplication.CreateBuilder(args);\r\n\r\nbuilder.AddRedisClient(connectionName: &quot;redis&quot;);\r\n.\r\n.\r\n.\r\napp.Run();\r\n<\/pre>\n<\/div>\n<p>Bu metot sayesinde Redis extension metotlar\u0131 dependency injection arac\u0131l\u0131\u011f\u0131yla <code>IConnectionMultiplexer<\/code> referans\u0131 \u00fczerinden eri\u015filebilir hale getirilmi\u015f olacakt\u0131r. Bu a\u015famadan sonra ilgili servislerde a\u015fa\u011f\u0131daki gibi \u00e7al\u0131\u015fmalar sergilenebilecektir;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n.\r\n.\r\n.\r\napp.MapGet(&quot;cache-the-data&quot;, (IConnectionMultiplexer connectionMultiplexer) =&gt;\r\n{\r\n    var db = connectionMultiplexer.GetDatabase(1);\r\n    db.StringSet(&quot;name&quot;, &quot;gncy&quot;);\r\n});\r\n\r\napp.MapGet(&quot;get-the-data-fron-the-cache&quot;, (IConnectionMultiplexer connectionMultiplexer) =&gt;\r\n{\r\n    var db = connectionMultiplexer.GetDatabase(1);\r\n    var name = db.StringGet(&quot;name&quot;);\r\n    if (!string.IsNullOrEmpty(name))\r\n    {\r\n        return name.ToString();\r\n    }\r\n    return &quot;&quot;;\r\n});\r\n<\/pre>\n<\/div>\n<h4>8. .NET Aspire \u0130le SQL Server Entegrasyonu<\/h4>\n<p>SQL Server entegrasyonu i\u00e7in de <span style=\"font-size:12px;\">(<a href=\"https:\/\/www.nuget.org\/packages\/Aspire.Hosting.SqlServer\" rel=\"noopener\" target=\"_blank\">Aspire.Hosting.SqlServer<\/a>)<\/span> k\u00fct\u00fcphanesiyle hosting entegrasyonu yap\u0131lmal\u0131 ve <span style=\"font-size:12px;\">(<a href=\"https:\/\/www.nuget.org\/packages\/Aspire.Microsoft.Data.SqlClient\" rel=\"noopener\" target=\"_blank\">Aspire.Microsoft.Data.SqlClient<\/a>)<\/span> k\u00fct\u00fcphanesiyle de client entegrasyonu sa\u011flanmal\u0131d\u0131r. Ayr\u0131ca Entity Framework Core kullan\u0131lacaksa da <span style=\"font-size:12px;\">(<a href=\"https:\/\/www.nuget.org\/packages\/Aspire.Microsoft.EntityFrameworkCore.SqlServer\" rel=\"noopener\" target=\"_blank\">Aspire.Microsoft.EntityFrameworkCore.SqlServer<\/a>)<\/span> k\u00fct\u00fcphanesiyle client entegrasyonu desteklenmelidir.<\/p>\n<p>Velhas\u0131l&#8230; Akabinde AppHost&#8217;a a\u015fa\u011f\u0131daki gibi SQL Server kayna\u011f\u0131 eklenmelidir.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nvar builder = DistributedApplication.CreateBuilder(args);\r\n\r\n.\r\n.\r\n.\r\nvar sqlServer = builder.AddSqlServer(&quot;sqlServer&quot;)\r\n    .WithLifetime(ContainerLifetime.Persistent);\r\nvar database = sqlServer.AddDatabase(&quot;exampleDB&quot;);\r\n\r\nvar _servicea = builder.AddProject&lt;Projects.ServiceA&gt;(&quot;servicea&quot;);\r\n.\r\n.\r\n.\r\n_servicea\r\n    .\r\n    .\r\n    .\r\n    .WithReference(database);\r\n.\r\n.\r\n.\r\nbuilder.Build().Run();\r\n<\/pre>\n<\/div>\n<p>Burada g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere <code style=\"color:purple;\">AddSqlServer<\/code> metoduyla SQL Server kayna\u011f\u0131 eklenmekte ve bir yandan da veritaban\u0131 oldu\u011fu i\u00e7in kal\u0131c\u0131l\u0131k beklenece\u011finden dolay\u0131 <code style=\"color:purple;\">WithLifetime<\/code> metoduyla bu container&#8217;\u0131n s\u00fcrekli olarak \u00e7al\u0131\u015fmas\u0131 sa\u011flanmaktad\u0131r. B\u00f6ylece .NET Aspire taraf\u0131ndan t\u00fcm container yap\u0131lanmas\u0131 otomatik y\u00f6netilirken, uygulama kapat\u0131ld\u0131\u011f\u0131 taktirde <code style=\"color:purple;\">.WithLifetime(ContainerLifetime.Persistent)<\/code> \u015feklinde yap\u0131land\u0131r\u0131lanlar kal\u0131c\u0131 olarak \u00e7al\u0131\u015fmaya devam edecektirler. Ayr\u0131ca olu\u015fturulan SQL Server kayna\u011f\u0131na bir veritaban\u0131 ekleyebilmek i\u00e7in de <code style=\"color:purple;\">AddDatabase<\/code> metodundan istifade edilmektedir.<\/p>\n<p>Ard\u0131ndan a\u015fa\u011f\u0131daki gibi <code style=\"color:purple;\">AddSqlServerDbContext<\/code> metodu e\u015fli\u011finde SQL Server dependency&#8217;leri istenilen servise entegre edilebilir;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n.\r\n.\r\n.\r\nbuilder.AddSqlServerDbContext&lt;ExampleDBContext&gt;(connectionName: &quot;exampleDB&quot;);\r\n.\r\n.\r\n.\r\n<\/pre>\n<\/div>\n<h4>9. .NET Aspire \u0130le Service Discovery Nas\u0131l Yap\u0131l\u0131r?<\/h4>\n<p>.NET Aspire&#8217;da AppHost \u00fczerinde yap\u0131lan kaynak tan\u0131mlar\u0131, \u00f6z\u00fcnde Web API&#8217;ler i\u00e7in de bir service discovery yap\u0131land\u0131rmas\u0131 sa\u011flamaktad\u0131r. \u015e\u00f6yle ki;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nvar builder = DistributedApplication.CreateBuilder(args);\r\n \r\nvar _servicea = builder.AddProject&lt;Projects.ServiceA&gt;(&quot;servicea&quot;);\r\n \r\nvar _serviceb = builder.AddProject&lt;Projects.ServiceB&gt;(&quot;serviceb&quot;);\r\n \r\n_servicea.WithReference(_serviceb);\r\n \r\nbuilder.Build().Run();\r\n<\/pre>\n<\/div>\n<p>Yukar\u0131daki kod blo\u011funu ele al\u0131rsak e\u011fer <em>ServiceA<\/em>, <em>ServiceB<\/em>&#8216;ye <code style=\"color:purple;\">WithReference<\/code> metoduyla ili\u015fkilendirildi\u011fi i\u00e7in &#8216;serviceb&#8217; ismi \u00fczerinden host ve port bilgileriyle ilgilenmeksizin rahatl\u0131kla istekte bulunabilir. Yani anlayaca\u011f\u0131n\u0131z .NET Aspire sayesinde servisler aras\u0131ndaki ba\u011f\u0131ml\u0131l\u0131klar bu \u015fekilde, kolayca y\u00f6netilebilmektedir.<\/p>\n<h4>10. .NET Aspire Uygulamalar\u0131n\u0131 Deploy Etme<\/h4>\n<p>.NET Aspire&#8217;\u0131n b\u00fcy\u00fck avantajlar\u0131ndan bir di\u011feri ise \u00e7e\u015fitli cloud ortamlar\u0131nda deploy s\u00fcre\u00e7lerini olduk\u00e7a basitle\u015ftirmesidir. Bir .NET Aspire uygulamas\u0131n\u0131 cloud&#8217;a deploy edebilmek i\u00e7in \u00f6ncelikle AppHost&#8217;ta tan\u0131mlanm\u0131\u015f olan kaynaklar\u0131 \u00f6zetleyecek bir JSON dosyas\u0131 olu\u015fturmam\u0131z gerekmektedir. Terminolojik olarak bu dosyaya manifest file(bildirim\/beyan dosyas\u0131) denmektedir. Bunun i\u00e7in solution dizininde a\u015fa\u011f\u0131daki talimattan istifade edebiliriz.<\/p>\n<div style=\"font-size:11px;text-align:center;color:red;\">\n<em>dotnet run &#8211;project NetAspire.Example.AppHost\\NetAspire.Example.AppHost.csproj &#8211;publisher manifest &#8211;output-path ..\/aspire-manifest.json<br \/>\n<\/em>\n<\/div>\n<p>Bu talimat neticesinde ilgili dizinde <em>aspire-manifest.json<\/em> ad\u0131nda bir manifest dosyas\u0131 olu\u015fturulacakt\u0131r. Bu dosyan\u0131n proje yap\u0131m\u0131za g\u00f6re nas\u0131l bir i\u00e7eri\u011fe sahip oldu\u011funu merak ediyorsan\u0131z <a href=\"https:\/\/github.com\/gncyyldz\/NetAspire.Example\/blob\/master\/aspire-manifest.json\" rel=\"noopener\" target=\"_blank\">\u015furadan<\/a> inceleyebilirsiniz.<\/p>\n<p>Velhas\u0131l kelam, art\u0131k uygulamay\u0131 cloud&#8217;a deploy edebiliriz. Bizler \u015fimdilik \u00f6rneklendirmeyi Azure \u00fczerinden ger\u00e7ekle\u015ftirece\u011fiz. Bunun i\u00e7in <em>Azure Developer CLI (azd)<\/em> component&#8217;ine ihtiyac\u0131m\u0131z olacakt\u0131r. Bu component, uygulaman\u0131n local development ortam\u0131ndan Azure&#8217;a kolayl\u0131kla deploy edilmesi i\u00e7in kullan\u0131lan open source bir ara\u00e7t\u0131r. Bu arac\u0131n y\u00fcklenmesi i\u00e7in terminal \u00fczerinden a\u015fa\u011f\u0131daki talimat\u0131n verilmesi yeterlidir;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nwinget install microsoft.azd\r\n<\/pre>\n<\/div>\n<p>azd&#8217;yi y\u00fckledikten sonra art\u0131k deploy&#8217;u ba\u015flatabiliriz. Bunun i\u00e7in de uygulaman\u0131n AppHost projesinin dizinine odakl\u0131 bir terminal \u00fczerinden a\u015fa\u011f\u0131daki talimat\u0131n verilmesi gerekmektedir;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nazd init\r\n<\/pre>\n<\/div>\n<p>Bu talimat neticesinde sorular soracakt\u0131r. <em>Use code in the current directory<\/em> sekmesinden devam ediniz. G\u00fcn\u00fcn sonunda a\u015fa\u011f\u0131daki ekran g\u00f6r\u00fcnt\u00fcs\u00fcnde oldu\u011fu gibi azd <em>&#8216;.\/azure.yaml&#8217;<\/em> ve <em>&#8216;.\/next-steps.md&#8217;<\/em> isminde bir dizi dosya olu\u015fturacakt\u0131r. <a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/12\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-3.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/12\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-3.png\" alt=\".NET Aspire Nedir? Nas\u0131l Kullan\u0131l\u0131r? Detayl\u0131ca \u0130nceleyelim...\" width=\"394\" height=\"127\" class=\"aligncenter size-full wp-image-27392\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/12\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-3.png 394w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/12\/NET-Aspire-Nedir-Nasil-Kullanilir-Detaylica-Inceleyelim-3-300x97.png 300w\" sizes=\"auto, (max-width: 394px) 100vw, 394px\" \/><\/a>Bu dosyalar\u0131n yap\u0131sal davran\u0131\u015flar\u0131n\u0131 izah etmemiz gerekirse e\u011fer;<\/p>\n<ul>\n<li><em>azure.yaml<\/em><br \/>\nUygulaman\u0131n Azure kaynaklar\u0131na nas\u0131l deploy edilece\u011fini tan\u0131mlayan bir yap\u0131land\u0131rmaya sahiptir. \u0130\u00e7erisinde olu\u015fturulacak kaynaklar (\u00f6rne\u011fin; Azure App Services, Azure Functions, Databases vs.) yap\u0131land\u0131rma ayarlar\u0131 ve deploy s\u00fcre\u00e7leri bulunur.\n<\/li>\n<li><em>next-steps.md<\/em><br \/>\nBu dosya ise, deploy sonras\u0131 yap\u0131lacaklar\u0131n ve izlenmesi gerekenlerin rehberini i\u00e7ermektedir. Misal olarak, uygulaman\u0131n nas\u0131l \u00e7al\u0131\u015faca\u011f\u0131, nas\u0131l test edilece\u011fi ve y\u00f6netilece\u011fi hakk\u0131nda bilgiler i\u00e7erir.\n<\/li>\n<\/ul>\n<p>Evet, art\u0131k deploy&#8217;u ger\u00e7ekle\u015ftirebiliriz. Bunun i\u00e7in a\u015fa\u011f\u0131daki talimat\u0131n verilmesi gerekmektedir;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nazd up\r\n<\/pre>\n<\/div>\n<p>Tabi bu talimat neticesinde <em style=\"color:red;\">ERROR: not logged in, run `azd auth login` to login<\/em> \u015feklinde bir hata al\u0131rsan\u0131z, anla\u015f\u0131lan o ki azd \u00fczerinden oturum gereksinimi s\u00f6z konusudur diyebiliriz. Bunun i\u00e7in de <code style=\"color:red;\">azd auth login<\/code> talimat\u0131yla oturum a\u00e7abilir ve ard\u0131ndan tekrar yukar\u0131daki talimat\u0131 verebilirsiniz.<\/p>\n<p>Devam\u0131nda ise azd, Azure taraf\u0131nda deploy&#8217;un yap\u0131laca\u011f\u0131 bir subscription ve konum bilgisi isteyecek ve ard\u0131ndan deploy s\u00fcreci ba\u015flat\u0131lacakt\u0131r. Tabi bundan sonras\u0131 <a href=\"https:\/\/learn.microsoft.com\/en-us\/dotnet\/aspire\/deployment\/azure\/aca-deployment\" rel=\"noopener\" target=\"_blank\">\u015furadaki<\/a> ad\u0131mlar e\u015fli\u011finde hesaba \u00f6zel \u015fekillenecektir diyebiliriz. Ayr\u0131ca deploy s\u00fcrecine dair tam teferruatl\u0131 bilgi i\u00e7in de <a href=\"https:\/\/learn.microsoft.com\/en-us\/dotnet\/aspire\/deployment\/overview\" rel=\"noopener\" target=\"_blank\">buray\u0131<\/a> inceleyebilirsiniz.<\/p>\n<p>Art\u0131k uygulamay\u0131 nihayete erdirmeyi ve testleri sizlere b\u0131rak\u0131yorum&#8230;<\/p>\n<p>B\u00f6ylece geni\u015f \u00e7apl\u0131 olarak .NET Aspire&#8217;\u0131 incelemi\u015f ve yer yer pratiksel dokunu\u015flarla k\u0131smen tecr\u00fcbe etmi\u015f bulunuyoruz. \u015eahsen son zamanlarda yapt\u0131\u011f\u0131m\u0131z \u00f6zel bir yaz\u0131l\u0131m s\u00fcrecini .NET Aspire kullanarak \u015fekillendirmeye \u00e7al\u0131\u015ft\u0131\u011f\u0131m i\u00e7in olduk\u00e7a etkileyici buldu\u011fumu s\u00f6yleyebilirim. \u00d6zellikle konteyner yap\u0131lanmas\u0131n\u0131 direkt \u00fcstlenmesi, console yap\u0131lanmas\u0131n\u0131 servis odakl\u0131 daha eri\u015filebilir hale getirmesi ve bir yandan da dahili olarak g\u00f6zlemlenebilirlik ve izleme ara\u00e7lar\u0131n\u0131 direkt haz\u0131r sunabilmesi benim i\u00e7in favori \u00f6zellikleridir diyebilirim. Tabi hen\u00fcz h\u0131zl\u0131 entegrasyon yap\u0131lanmas\u0131n\u0131 tam de\u011ferlendirebilece\u011fim bir \u00e7al\u0131\u015fmam olmad\u0131\u011f\u0131 i\u00e7in heyecanla bunu da deneyimlemeyi bekledi\u011fimi itiraf ediyor, e\u015flik etti\u011finiz i\u00e7in te\u015fekk\u00fcr ediyorum&#8230;<\/p>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<p>Not : \u00d6rnek \u00e7al\u0131\u015fmaya a\u015fa\u011f\u0131daki github adresinden eri\u015febilirsiniz.<br \/>\n<a href=\"https:\/\/github.com\/gncyyldz\/NetAspire.Example\" rel=\"noopener\" target=\"_blank\">https:\/\/github.com\/gncyyldz\/NetAspire.Example<\/a><\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, Bu i\u00e7eri\u011fimizde, bulut-yerel(cloud-native) uygulamalar\u0131 olduk\u00e7a efektif ve h\u0131zl\u0131 bir \u015fekilde geli\u015ftirebilmek ve servisler aras\u0131ndaki entegrasyonlar\u0131 docker teknolojisine dayal\u0131 bir \u015fekilde daha h\u0131zl\u0131 \u00e7\u00f6z\u00fcme kavu\u015fturabilmek i\u00e7in tasarlanm\u0131\u015f bir ara\u00e7 seti olan .NET Aspire&#8216;\u0131 inceliyor&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":27395,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2739,5183,3281,3573],"tags":[5184,5186,5185,5194,5193,5192,5190,5191,5188,5187,5189],"class_list":["post-27346","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-net-core","category-aspire","category-docker","category-microservices","tag-net-aspire","tag-net-aspire-orchestration","tag-aspire","tag-azd","tag-azure-developer-cli","tag-client-integrations","tag-docker-compose","tag-hosting-integrations","tag-integrations","tag-orchestration","tag-tooling"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/27346","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=27346"}],"version-history":[{"count":25,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/27346\/revisions"}],"predecessor-version":[{"id":27396,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/27346\/revisions\/27396"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/27395"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=27346"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=27346"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=27346"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}