﻿
{"id":27398,"date":"2024-12-17T09:07:34","date_gmt":"2024-12-17T09:07:34","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=27398"},"modified":"2024-12-17T09:07:34","modified_gmt":"2024-12-17T09:07:34","slug":"net-aspire-dapr-distributed-uygulamalarda-bu-araclar-birbirlerini-nasil-tamamlarlar","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/net-aspire-dapr-distributed-uygulamalarda-bu-araclar-birbirlerini-nasil-tamamlarlar\/","title":{"rendered":".NET Aspire &#038; Dapr | Distributed Uygulamalarda Bu Ara\u00e7lar Birbirlerini Nas\u0131l Tamamlarlar?"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Bu i\u00e7eri\u011fimizde en son klavyeye ald\u0131\u011f\u0131m\u0131z <a href=\"https:\/\/www.gencayyildiz.com\/blog\/net-aspire-nedir-nasil-kullanilir-detaylica-inceleyelim\/\" rel=\"noopener\" target=\"_blank\">.NET Aspire<\/a> arac\u0131yla birlikte <a href=\"https:\/\/www.gencayyildiz.com\/blog\/distributed-application-runtimedapr-nedir-teorik-ve-pratikte-inceleyelim\/\" rel=\"noopener\" target=\"_blank\">Distributed Application Runtime(Dapr)<\/a> arac\u0131n\u0131 masaya yat\u0131racak ve bu ikisinin \u00e7\u00f6zd\u00fc\u011f\u00fc sorunlarla birlikte aralar\u0131ndaki farklara ve \u00f6zellikle neden bu iki arac\u0131n birlikte kullan\u0131lmas\u0131 gerekti\u011fine dair bir isti\u015farede bulunuyor olaca\u011f\u0131z.<\/p>\n<p>.NET Aspire&#8217;\u0131n \u00f6\u011frenim s\u00fcrecinde bir\u00e7o\u011funuzun akl\u0131na Dapr&#8217;\u0131n geldi\u011fini biliyorum. Ve davran\u0131\u015fsal olarak .NET Aspire&#8217;\u0131n Dapr&#8217;\u0131n yerine ge\u00e7ti\u011fini d\u00fc\u015f\u00fcnd\u00fc\u011f\u00fcn\u00fcz\u00fc de&#8230; Ama \u00f6yle de\u011fil. Dapr, uygulama geli\u015ftiricilerine, \u00f6zellikle microservice mimarilerinde, servisler aras\u0131 s\u0131k kullan\u0131lan i\u015flevsellikleri basit ve ta\u015f\u0131nabilir bir \u015fekilde sunan <em>building block<\/em> dedi\u011fimiz mod\u00fcler ve standart API&#8217;ler \u00fczerinden \u00e7al\u0131\u015fan \u00f6zelliklere sahip olan ve hem local development s\u0131ras\u0131nda hem de production ortam\u0131nda \u00e7al\u0131\u015fan bir runtime&#8217;d\u0131r. .NET Aspire ise sadece local development i\u00e7in bir ara\u00e7 setidir. Dolay\u0131s\u0131yla .NET Aspire&#8217;\u0131n, Dapr&#8217;\u0131n yerini alamad\u0131\u011f\u0131 bu sat\u0131rlarca a\u015fikarken, bu sat\u0131rlardan sonra Dapr ile birlikte kullan\u0131lmas\u0131n\u0131n ne kadar g\u00fc\u00e7l\u00fc bir kombinasyon yarataca\u011f\u0131 bizler i\u00e7in e\u011flenceli bir ke\u015fif olacakt\u0131r. Hadi ba\u015flayal\u0131m&#8230;<\/p>\n<h4>.NET Aspire&#8217;\u0131n \u00c7\u00f6z\u00fcm Getirdi\u011fi Sorunlar Nelerdir?<\/h4>\n<p>.NET Aspire, distributed sistemlerde birden fazla cloud native uygulamay\u0131 local olarak \u00e7al\u0131\u015ft\u0131rmak ve debug etmek i\u00e7in olu\u015fturulmu\u015f bir ara\u00e7 setidir. Bu ara\u00e7 setiyle, .NET geli\u015ftiricilerinin hakim olduklar\u0131 C# diliyle micro service&#8217;leri ve bunlar\u0131n kullanacaklar\u0131 altyap\u0131 ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 merkezi bir noktadan yap\u0131land\u0131rabilmek ve bu yap\u0131land\u0131rma neticesinde olduk\u00e7a h\u0131zl\u0131 bir \u015fekilde sistemi aya\u011fa kald\u0131rarak, debug edebilmek m\u00fcmk\u00fcnd\u00fcr.<\/p>\n<p>.NET Aspire, bu \u00e7al\u0131\u015fmay\u0131 a\u015fa\u011f\u0131daki mant\u0131kla ger\u00e7ekle\u015ftirmektedir;<div id=\"attachment_27404\" style=\"width: 4666px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/12\/NET-Aspire-Dapr-Distributed-Uygulamalarda-Bu-Araclar-Birbirlerini-Nasil-Tamamlarlar.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-27404\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/12\/NET-Aspire-Dapr-Distributed-Uygulamalarda-Bu-Araclar-Birbirlerini-Nasil-Tamamlarlar.png\" alt=\".NET Aspire &amp; Dapr | Distributed Uygulamalarda Bu Ara\u00e7lar Birbirlerini Nas\u0131l Tamamlarlar?\" width=\"4656\" height=\"1795\" class=\"size-full wp-image-27404\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/12\/NET-Aspire-Dapr-Distributed-Uygulamalarda-Bu-Araclar-Birbirlerini-Nasil-Tamamlarlar.png 4656w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/12\/NET-Aspire-Dapr-Distributed-Uygulamalarda-Bu-Araclar-Birbirlerini-Nasil-Tamamlarlar-300x116.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/12\/NET-Aspire-Dapr-Distributed-Uygulamalarda-Bu-Araclar-Birbirlerini-Nasil-Tamamlarlar-1024x395.png 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/12\/NET-Aspire-Dapr-Distributed-Uygulamalarda-Bu-Araclar-Birbirlerini-Nasil-Tamamlarlar-768x296.png 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/12\/NET-Aspire-Dapr-Distributed-Uygulamalarda-Bu-Araclar-Birbirlerini-Nasil-Tamamlarlar-1536x592.png 1536w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/12\/NET-Aspire-Dapr-Distributed-Uygulamalarda-Bu-Araclar-Birbirlerini-Nasil-Tamamlarlar-2048x790.png 2048w\" sizes=\"auto, (max-width: 4656px) 100vw, 4656px\" \/><\/a><p id=\"caption-attachment-27404\" class=\"wp-caption-text\"><span style=\"font-size:12px;\">Kaynak : <a href=\"https:\/\/learn.microsoft.com\/en-us\/dotnet\/aspire\/fundamentals\/app-host-overview?tabs=docker\" target=\"_blank\">https:\/\/learn.microsoft.com\/en-us\/dotnet\/aspire\/fundamentals\/app-host-overview?tabs=docker<\/a><\/span><\/p><\/div>Yukar\u0131daki g\u00f6rselden de anla\u015f\u0131laca\u011f\u0131 \u00fczere birden fazla .NET uygulamas\u0131n\u0131 local olarak \u00e7al\u0131\u015ft\u0131rmak ve debug edebilmek i\u00e7in geli\u015ftiricilerin t\u00fcm uygulamalar\u0131\/servisleri ve bu uygulamalar\u0131n kulland\u0131klar\u0131 altyap\u0131 ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 yap\u0131land\u0131rman\u0131n bir yoluna ihtiya\u00e7lar\u0131 vard\u0131r. .NET Aspire&#8217;da bu, <em>AppHost<\/em> ad\u0131 verilen ve tek g\u00f6revi t\u00fcm kaynaklar\u0131(resource) d\u00fczenlemekten ibaret olan bir merkezi proje \u00fczerinden ger\u00e7ekle\u015ftirilir.<\/p>\n<h4>Dapr(Distributed Application Runtime)&#8217;\u0131n \u00c7\u00f6z\u00fcm Getirdi\u011fi Sorunlar Nelerdir?<\/h4>\n<p>Dapr ise, geli\u015ftiricilerin distributed uygulamalar\u0131 h\u0131zla olu\u015fturmas\u0131 i\u00e7in tasarlanm\u0131\u015f bir API k\u00fcmesi sa\u011flayan runtime&#8217;d\u0131r. Bu API k\u00fcmesi sayesinde, geli\u015ftiricilerin uygulamalar\u0131n kaynak kodlar\u0131na m\u00fcdahale etmelerine gerek kalmaks\u0131z\u0131n farkl\u0131 altyap\u0131lar aras\u0131nda ge\u00e7i\u015fler yapabilmesi sa\u011flanmaktad\u0131r.<\/p>\n<p>Ayr\u0131ca Dapr, uygulaman\u0131n yan\u0131nda sidecar mimarisi ile \u00e7al\u0131\u015fan bir geli\u015ftirme framework&#8217;\u00fc olarak davran\u0131\u015f sergilemektedir. Yani bu uygulamadaki her bir servis i\u00e7in ayr\u0131 bir Dapr sidecar ba\u015flat\u0131l\u0131r anlam\u0131na gelmektedir. Bu sidecar&#8217;lar, servislerin Dapr&#8217;\u0131n sundu\u011fu \u00f6zellikleri kullanmas\u0131n\u0131 sa\u011flarlar. Misal olarak; 4 servisin oldu\u011fu bir uygulamada her biri i\u00e7in birer Dapr sidecar aya\u011fa kalkacakt\u0131r. Yani toplamda 4 servise ve 4 Dapr sidecar e\u015flik edecektir. Bunlar ayn\u0131 a\u011fa dahil olduklar\u0131 i\u00e7in birbirleriyle haberle\u015febilecektirler. Burada \u00f6zellikle vurgulanmas\u0131 gereken nokta \u015fudur ki; Dapr&#8217;\u0131n bir merkezi sunucu yahut mikro servis olmad\u0131\u011f\u0131, bilakis her servisle birlikte aya\u011fa kalkan, \u00e7al\u0131\u015fan ve onun i\u015flevselli\u011fini art\u0131ran bir yap\u0131 oldu\u011fudur.<\/p>\n<p>Dapr&#8217;\u0131n \u00e7\u00f6z\u00fcm getirdi\u011fi sorunlara gelirsek e\u011fer; kullan\u0131lan programlama dili ve cloud provider&#8217;\u0131ndan ba\u011f\u0131ms\u0131z olarak g\u00fcvenli ve g\u00fcvenilir distributed uygulamalar geli\u015ftirmeyi kolayla\u015ft\u0131rmaktad\u0131r. Geli\u015ftiriciler Dapr sayesinde h\u0131zla microservice mimarileri olu\u015fturabilmekte ve HTTP\/gRPC veya bir\u00e7ok farkl\u0131 dil SDK arac\u0131l\u0131\u011f\u0131yla Dapr API paketini kullanabilmektedirler. Ayr\u0131ca Dapr yaln\u0131zca geli\u015ftirme s\u0131ras\u0131nda kullan\u0131lmamakta, production ortam\u0131nda da \u00e7al\u0131\u015fmakta ve herhangi bir cloud yahut \u015firket i\u00e7i s\u00fcre\u00e7lerde servisler ve kaynaklar aras\u0131nda g\u00fcvenli ileti\u015fim ama\u00e7l\u0131 da kullan\u0131lmaktad\u0131r.<\/p>\n<blockquote><p><em>Geli\u015ftiricilerden al\u0131nan geri bildirimlere g\u00f6re, Dapr sayesinde geli\u015ftirme s\u00fcre\u00e7lerindeki olas\u0131 kodsal ve mimarisel maliyetlerden %30 tasarruf edildi\u011fi iddia edilmektedir.<\/em><\/p><\/blockquote>\n<p>Bunun nedeni, built-in cross-cutting concerns dedi\u011fimiz belli durumlardaki kodsal endi\u015felerin y\u00f6netilmesi ve sistemi in\u015fa ederken kurgulanan altyap\u0131n\u0131n yap\u0131land\u0131r\u0131lma s\u00fcrecindeki olas\u0131 de\u011fi\u015fikliklerin yarataca\u011f\u0131 maliyetlerin bir YAML dosyas\u0131yla soyutlanmas\u0131d\u0131r.<\/p>\n<p>\u0130\u00e7eri\u011fimizin mahiyetini tam yans\u0131tabilmek i\u00e7in Dapr&#8217;\u0131n nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131 ve kullan\u0131ld\u0131\u011f\u0131na dair k\u00fc\u00e7\u00fck bir \u00f6rnek dokunu\u015fu faydal\u0131 g\u00f6rmekteyim&#8230; Tabi \u00f6ncelikle Dapr CLI&#8217;\u0131n y\u00fcklenmesi ve aya\u011fa kald\u0131r\u0131lmas\u0131 gerekmektedir. Bunun i\u00e7in <a href=\"https:\/\/www.gencayyildiz.com\/blog\/distributed-application-runtimedapr-nedir-teorik-ve-pratikte-inceleyelim\/\" target=\"_blank\">Distributed Application Runtime(Dapr) Nedir? Teorik ve Pratikte \u0130nceleyelim<\/a> ba\u015fl\u0131kl\u0131 makalemizdeki &#8216;Dapr Nas\u0131l Y\u00fcklenir?&#8217; k\u0131sm\u0131na g\u00f6z atman\u0131z\u0131 tavsiye ederim.<\/p>\n<p>\u015eimdi, diyelim ki iki servis kendi aras\u0131nda Redis ve RabbitMQ teknolojilerini kullanarak haberle\u015fme sa\u011flayacaklar. Bunun i\u00e7in \u00f6ncelikle Dapr&#8217;\u0131n Pub\/Sub modelini tan\u0131mlayacak olan a\u015fa\u011f\u0131daki component dosyalar\u0131n\u0131n olu\u015fturulmas\u0131 gerekmektedir;<\/p>\n<p><em>rabbitmq-pubsub.yaml<\/em>;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\napiVersion: dapr.io\/v1alpha1\r\nkind: Component\r\nmetadata:\r\n  name: rabbitmq-pubsub\r\nspec:\r\n  type: pubsub.rabbitmq\r\n  version: v1\r\n  metadata:\r\n  - name: host\r\n    value: &quot;amqps:\/\/xearmc***Z@beaver.rmq.cloudamqp.com\/xearmcdi&quot;\r\n  - name: durable\r\n    value: &quot;true&quot;\r\n  - name: deletedWhenUnused\r\n    value: &quot;false&quot;\r\n<\/pre>\n<\/div>\n<p><em>redis-pubsub.yaml<\/em>;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\napiVersion: dapr.io\/v1alpha1\r\nkind: Component\r\nmetadata:\r\n  name: redis-pubsub\r\nspec:\r\n  type: pubsub.redis\r\n  version: v1\r\n  metadata:\r\n  - name: redisHost\r\n    value: localhost:6379\r\n  - name: redisPassword\r\n    value: &quot;&quot;\r\n<\/pre>\n<\/div>\n<p><span style=\"font-size:12px;\">(Dikkat! Bu dosyalar\u0131n hangi dizinde olu\u015fturuldu\u011fu vs. gibi teferruatl\u0131 bilgilere Dapr&#8217;a dair referans etti\u011fim ana makalede de\u011findi\u011fim i\u00e7in burada temas etmeksizin h\u0131zl\u0131ca ge\u00e7iyorum)<\/span><\/p>\n<p>Ard\u0131ndan servislerin a\u015fa\u011f\u0131daki gibi yap\u0131land\u0131r\u0131lmalar\u0131 gerekmektedir;<br \/>\n<em>ServiceA<\/em>;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nusing Dapr.Client;\r\nusing Shared;\r\n\r\nvar builder = WebApplication.CreateBuilder(args);\r\n\r\nbuilder.Services.AddDaprClient();\r\n\r\nvar app = builder.Build();\r\n\r\napp.MapGet(&quot;\/publish\/rabbitmq&quot;, async (DaprClient daprClient) =&gt;\r\n{\r\n    await daprClient.PublishEventAsync(\r\n        pubsubName: &quot;rabbitmq-pubsub&quot;,\r\n        topicName: &quot;example.queue&quot;,\r\n        new Message(&quot;Message...&quot;));\r\n\r\n    Console.WriteLine(&quot;Sent message...&quot;);\r\n});\r\n\r\napp.MapGet(&quot;\/publish\/redis&quot;, async (DaprClient daprClient) =&gt;\r\n{\r\n    await daprClient.PublishEventAsync(\r\n        pubsubName: &quot;redis-pubsub&quot;,\r\n        topicName: &quot;example.queue&quot;,\r\n        new Message(&quot;Message...&quot;));\r\n\r\n    Console.WriteLine(&quot;Sent message...&quot;);\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\nusing Shared;\r\n\r\nvar builder = WebApplication.CreateBuilder(args);\r\n\r\nvar app = builder.Build();\r\napp.MapSubscribeHandler();\r\n\r\napp.MapPost(&quot;\/subscribe\/rabbitmq&quot;, (DaprMessage&lt;Message&gt; message) =&gt;\r\n{\r\n    Console.WriteLine(&quot;RabbitMQ subscriber received : &quot; + message);\r\n    return Results.Ok(message);\r\n}).WithTopic(&quot;rabbitmq-pubsub&quot;, &quot;example.queue&quot;);\r\n\r\napp.MapPost(&quot;\/subscribe\/redis&quot;, (DaprMessage&lt;Message&gt; message) =&gt;\r\n{\r\n    Console.WriteLine(&quot;Redis subscriber received : &quot; + message);\r\n    return Results.Ok(message);\r\n}).WithTopic(&quot;redis-pubsub&quot;, &quot;example.queue&quot;);\r\n\r\napp.Run();\r\n\r\n<\/pre>\n<\/div>\n<p>Ve nihai olarak da a\u015fa\u011f\u0131daki dapr talimatlar\u0131yla servisler aya\u011fa kald\u0131r\u0131l\u0131p, kullan\u0131labilir hale getirilmelidir;<\/p>\n<div style=\"text-align:center;\">\ndapr run &#8211;app-id servicea &#8211;app-port 1000 &#8212; dotnet run\n<\/div>\n<div style=\"text-align:center;\">\ndapr run &#8211;app-id serviceb &#8211;app-port 2000 &#8212; dotnet run\n<\/div>\n<p>Ve \u00fcst\u00fcne a\u015fa\u011f\u0131daki g\u00f6rselde oldu\u011fu gibi &#8216;ServiceA&#8217;dan ilgili endpoint&#8217;leri tetikleyerek subscriber olan &#8216;ServiceB&#8217;ye mesajlar iletilebilir.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/12\/NET-Aspire-Dapr-Distributed-Uygulamalarda-Bu-Araclar-Birbirlerini-Nasil-Tamamlarlar-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/12\/NET-Aspire-Dapr-Distributed-Uygulamalarda-Bu-Araclar-Birbirlerini-Nasil-Tamamlarlar-1.png\" alt=\".NET Aspire &amp; Dapr | Distributed Uygulamalarda Bu Ara\u00e7lar Birbirlerini Nas\u0131l Tamamlarlar?\" width=\"887\" height=\"195\" class=\"aligncenter size-full wp-image-27409\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/12\/NET-Aspire-Dapr-Distributed-Uygulamalarda-Bu-Araclar-Birbirlerini-Nasil-Tamamlarlar-1.png 887w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/12\/NET-Aspire-Dapr-Distributed-Uygulamalarda-Bu-Araclar-Birbirlerini-Nasil-Tamamlarlar-1-300x66.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/12\/NET-Aspire-Dapr-Distributed-Uygulamalarda-Bu-Araclar-Birbirlerini-Nasil-Tamamlarlar-1-768x169.png 768w\" sizes=\"auto, (max-width: 887px) 100vw, 887px\" \/><\/a>Burada yap\u0131lan \u00f6rnek \u00e7al\u0131\u015fman\u0131n kaynak kodlar\u0131na i\u00e7eri\u011fimizin sonlar\u0131ndaki github adresinden g\u00f6zlemde bulunabilirsiniz. \u015eimdi bizler bu kadar\u0131yla yetinip Dapr&#8217;\u0131n kullan\u0131m\u0131n\u0131 (bilenlerine ve merakl\u0131s\u0131na) an\u0131msatabildiysek art\u0131k .NET Aspire ile Dapr aras\u0131ndaki benzerliklerle birlikte farklar\u0131 masaya yat\u0131rarak fark\u0131ndal\u0131k do\u011furmaya devam edelim ve g\u00fcn\u00fcn sonunda birlikte nas\u0131l kullan\u0131labileceklerini de\u011ferlendirmeye do\u011fru zemini geni\u015fletelim.<\/p>\n<h4>.NET Aspire ve Dapr Aras\u0131ndaki Benzerlikler &#038; Farkl\u0131l\u0131klar Nelerdir?<\/h4>\n<p>Esas\u0131nda .NET Aspire ile Dapr&#8217;\u0131n amac\u0131 olduk\u00e7a benzerdir. Evet, her ikisi de geli\u015ftiriciler a\u00e7\u0131s\u0131ndan cloud native distributed uygulamalar\u0131 olu\u015fturma s\u00fcrecini kolayla\u015ft\u0131rmak ve h\u0131zland\u0131rmak derdindedir. Tabi ki de her iki arac\u0131n bu vizyonu ger\u00e7ekle\u015ftirme s\u00fcrecindeki yol ve yordam\u0131 farkl\u0131l\u0131k arz etse de esas\u0131nda bu perspektifte Dapr&#8217;\u0131n kapsam\u0131 .NET Aspire&#8217;a nazaran daha geni\u015ftir diyebilir. .NET Aspire, local development s\u00fcrecindeki deneyime odaklan\u0131rken, Dapr ise hem local development hem de production&#8217;a deploy edilmi\u015f uygulamalar\u0131n \u00e7al\u0131\u015fma s\u00fcre\u00e7lerine odaklanmaktad\u0131r. \u015eimdi gelin, k\u0131smen .NET Aspire ile Dapr aras\u0131nda bir kar\u015f\u0131la\u015ft\u0131rma yaparak kapsamlar\u0131 do\u011frultusunda benzerlikleri ve teknik a\u00e7\u0131dan farklar\u0131n\u0131 masaya yat\u0131ral\u0131m. <u style=\"color:green;\">Tabi bunu yaparken de .NET Aspire&#8217;\u0131n bir yerel geli\u015ftirme arac\u0131, Dapr&#8217;\u0131n da bir runtime oldu\u011funu tekrar hat\u0131rlayarak ve esas\u0131nda bu ikisini kar\u015f\u0131la\u015ft\u0131rman\u0131n hi\u00e7te adil olmad\u0131\u011f\u0131n\u0131 unutmayacak \u015fekilde vurgulayarak ba\u015flayal\u0131m&#8230;<\/u><\/p>\n<h6>Benzerlikleri<\/h6>\n<p><strong><em>Service Discovery<\/em><\/strong>;<br \/>\n.NET Aspire, AppHost projesine referans edilmi\u015f servislere do\u011fal olarak service discovery hizmeti sa\u011flamaktad\u0131r. Dapr&#8217;da ayn\u0131 \u015fekilde microservice&#8217;ler aras\u0131ndaki ileti\u015fimi kolayla\u015ft\u0131rmak i\u00e7in benzersiz servis isimleri \u00fczerinden service discovery hizmeti sunmaktad\u0131r.<\/p>\n<p><strong><em>Observability<\/em><\/strong>;<br \/>\nBiliyorsunuz ki; .NET Aspire, uygulamalar\u0131m\u0131z i\u00e7in OpenTelemetry SDK&#8217;s\u0131n\u0131 kulland\u0131\u011f\u0131 \u00e7ok ciddi bir observability altyap\u0131s\u0131 sunmaktad\u0131r. Dapr&#8217;da ise ister OpenTelemetry isterseniz de Zipkin gibi izleme sistemleriyle entegrasyon h\u0131zl\u0131ca sa\u011flan\u0131p, yap\u0131land\u0131r\u0131labilir.<\/p>\n<p><strong><em>Resiliency<\/em><\/strong>;<br \/>\nResiliency&#8217;de ise .NET Aspire ve Dapr ayn\u0131 gayeyle planlanm\u0131\u015f ara\u00e7lard\u0131r, ancak her ikisinde uygulama olduk\u00e7a farkl\u0131d\u0131r. .NET Aspire&#8217;da <em>Microsoft.Extensions.Http.Resilience<\/em> NuGet paketi \u00fczerinden yap\u0131land\u0131r\u0131l\u0131rken, Dapr&#8217;da ise Dapr sidecar \u00fczerinden do\u011fal bir \u015fekilde resiliency sa\u011flanmaktad\u0131r. Yani uygulaman\u0131n esnekli\u011fi i\u00e7in varsay\u0131lan bir davran\u0131\u015ft\u0131r diyebiliriz.<\/p>\n<p>T\u00fcm bunlar\u0131n d\u0131\u015f\u0131nda her iki ara\u00e7ta da teknik yakla\u015f\u0131mlar ve kapsamlar tamamen farkl\u0131 olsa da, component&#8217;lerin y\u00f6netim mant\u0131\u011f\u0131 birbirine benzemektedir. Yani demek istedi\u011fim .NET Aspire ile NuGet paketleri \u00fczerinden bir yap\u0131land\u0131rma ger\u00e7ekle\u015ftirilirken, Dapr&#8217;da ise .yaml dosyalar\u0131 \u00fczerinden ger\u00e7ekle\u015ftirilmektedir. Tabi burada k\u00fc\u00e7\u00fck bir n\u00fcansta s\u00f6z konusudur, o da; .NET Aspire&#8217;\u0131n component&#8217;leri Dapr&#8217;da oldu\u011fu gibi kullan\u0131labilir API sunmazlar. \u00c7\u00fcnk\u00fc NuGet k\u00fct\u00fcphaneleridirler. \u0130\u015fte bu nedenle, .NET Aspire&#8217;da kayna\u011fa \u00f6zel SDK&#8217;lerin(resource-specific SDK) kullan\u0131lmas\u0131 gerekmektedir. Bu durumdan dolay\u0131 da .NET Aspire&#8217;da bir component de\u011fi\u015fimi uygulaman\u0131n kaynak koduna m\u00fcdahale gerektirmekte, aksi taktirde de\u011fi\u015ftirilememektedir.<\/p>\n<h6>Farkl\u0131l\u0131klar\u0131<\/h6>\n<p><strong><em>API&#8217;ler<\/em><\/strong>;<br \/>\nDapr, altyap\u0131dan ba\u011f\u0131ms\u0131z olarak bir\u00e7ok building blocks API&#8217;si sunmaktad\u0131r. Bu API&#8217;ler sayesinde bizler; RabbitMQ veya Redis gibi teknolojilere i\u015flevsel aray\u00fczler ve entegrasyon noktalar\u0131 arac\u0131l\u0131\u011f\u0131yla h\u0131zl\u0131ca yap\u0131land\u0131rma sa\u011flayabilmekte ve kullan\u0131m ger\u00e7ekle\u015ftirebilmekteyiz. Ayr\u0131ca geli\u015ftiriciler a\u00e7\u0131s\u0131ndan da bu API&#8217;lerin distributed uygulamalar\u0131 h\u0131zl\u0131 bir \u015fekilde olu\u015fturmak i\u00e7in de kullan\u0131ld\u0131\u011f\u0131n\u0131 s\u00f6yleyebiliriz. \u0130\u015fte bu \u00f6zellik .NET Aspire taraf\u0131ndan sunulmamaktad\u0131r. .NET Aspire&#8217;da, ad\u0131 ge\u00e7en teknolojilerle uygulama \u00fczerinden bir etkile\u015fim kurabilmek i\u00e7in kaynak kodu \u00fczerinden SDK&#8217;lerin kullan\u0131lmas\u0131n\u0131 gerekmektedir.<\/p>\n<p><strong><em>Playform &#038; Dil<\/em><\/strong>;<br \/>\nBir di\u011fer \u00f6nemli fark ise Dapr&#8217;\u0131n bir sidecar olarak API&#8217;leri HTTP\/gRPC interface&#8217;i \u00fczerinden sunmas\u0131 nedeniyle herhangi bir programlama diliyle kullan\u0131labilmesidir. .NET Aspire ise ad\u0131ndan da anla\u015f\u0131laca\u011f\u0131 \u00fczere ger\u00e7ekten .NET&#8217;e odakl\u0131 bir yap\u0131 sunmaktad\u0131r. Ha React, Vue ya da Angular frontend yap\u0131lanmalar\u0131 ile .NET Aspire uygulamalar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rmak m\u00fcmk\u00fcnd\u00fcr ancak her daim bir AppHost .NET projesi gerektirece\u011finden dolay\u0131 dil ve platform zenginli\u011fi a\u00e7\u0131s\u0131ndan daha k\u0131s\u0131tl\u0131d\u0131r.<\/p>\n<p><strong><em>G\u00fcvenlik Politikalar\u0131<\/em><\/strong>;<br \/>\nDapr, yaml dosyalar\u0131 arac\u0131l\u0131\u011f\u0131yla \u00f6zelle\u015ftirilebilen yerle\u015fik g\u00fcvenlik politikalar\u0131na sahiptir. Ancak .NET Aspire&#8217;da service-to-service ya da service-to-resource ileti\u015fimini kontrol etmek i\u00e7in herhangi bir g\u00fcvenlik politikas\u0131 sa\u011flanamamaktad\u0131r.<\/p>\n<p><strong><em>Deploy<\/em><\/strong>;<br \/>\n.NET Aspire, Visual Studio \u00fczerinden yahut Azure Developer CLI(azd) arac\u0131l\u0131\u011f\u0131yla h\u0131zl\u0131 bir deploy s\u00fcreci sunmaktad\u0131r. Bu s\u00fcre\u00e7te, sistemde kullan\u0131lan t\u00fcm kaynaklar\u0131 tan\u0131mlayan json format\u0131ndaki manifest\/bildiri dosyalar\u0131 olu\u015fturulmaktad\u0131r. Dapr&#8217;da ise herhangi bir IDE ile entegre uygulama deploy se\u00e7ene\u011fi s\u00f6z konusu de\u011fildir.<\/p>\n<p><strong><em>Dashboard<\/em><\/strong>;<br \/>\nHem .NET Aspire hem de Dapr dashboard servisi sunmaktad\u0131r. Ancak .NET Aspire&#8217;\u0131n dashboard&#8217;u Dapr&#8217;\u0131nkine nazaran kan\u0131mca bin basmaktad\u0131r. Panonun kapsam\u0131 ve \u015f\u0131kl\u0131\u011f\u0131 a\u00e7\u0131s\u0131ndan tart\u0131\u015fmas\u0131z .NET Aspire \u00f6n plandad\u0131r.<\/p>\n<h4>.NET Aspire \u0130le Birlikte Neden Dapr&#8217;\u0131 Kullanmal\u0131y\u0131z?<\/h4>\n<p>Evet, art\u0131k .NET Aspire ile Dapr aras\u0131ndaki benzerlikleri ve farklar\u0131 ele ald\u0131\u011f\u0131m\u0131za g\u00f6re art\u0131k bu iki arac\u0131 neden birlikte kullanmam\u0131z gerekti\u011finin isti\u015faresine gelebiliriz.<\/p>\n<p>.NET Aspire ile Dapr&#8217;\u0131n birlikte kullan\u0131lmas\u0131n\u0131n ana gerek\u00e7esi Dapr&#8217;\u0131 yeni tecr\u00fcbe edecek olan geli\u015ftiricilerin i\u015fini kolayla\u015ft\u0131rmas\u0131 olabilir. \u015e\u00f6yle ki; Dapr&#8217;a yeni ba\u015flayacak biri \u00f6ncelikle temel kavramlara odaklanacak, ard\u0131ndan bu kavramlar \u00e7er\u00e7evesinde g\u00f6rsel ya da metinsel kaynaklardan gerekli ara\u015ft\u0131rmalar do\u011frultusunda bilgiler edinmeye \u00e7al\u0131\u015facakt\u0131r. SDK&#8217;yi uygulamalar\u0131na h\u0131zla entegre etmeyi umacak ve bunun i\u00e7in CLI ve gerekli dependency&#8217;leri y\u00fckleyecektir. Tabi ki de t\u00fcm bunlar biraz zaman alacakt\u0131r. Belki fark\u0131na varmadan g\u00fcnlerinin \u00e7o\u011funu buna harcayacak, hatta \u00e7o\u011fu rehberde oldu\u011fu gibi t\u00fcm ad\u0131mlar\u0131 yapt\u0131\u011f\u0131 halde onlarca deneme neticesinde uygulamay\u0131 \u00e7al\u0131\u015ft\u0131ramay\u0131p gerekirse say\u0131s\u0131z kere a\u011fz\u0131n\u0131 bozacakt\u0131r.<\/p>\n<p>Evet, siz \u00e7ok zeki ve h\u0131zl\u0131 ilerliyor olabilirsiniz belki ama \u00e7o\u011fu ki\u015fi s\u00fcreci a\u015fa\u011f\u0131 yukar\u0131 bu \u015fekilde ge\u00e7irecektir. Ancak biliyorsunuz ki zaman s\u0131n\u0131rl\u0131d\u0131r ve daha ilk ad\u0131mlar\u0131n bu kadar yo\u011fun zaman almas\u0131 israf olmasa da ger\u00e7ek bir maliyettir diyebiliriz. Dikkat ederseniz bu maliyete daha Dapr tecr\u00fcbe edilmemi\u015f, ancak ilk ad\u0131mlar at\u0131lm\u0131\u015f olunacakt\u0131r. Daha bunun local development deneyimi \u00fczerindeki sorun gidermelere, debuginge vs. gibi s\u00fcre\u00e7lere dair hen\u00fcz bilgi edinimi zerre kadar s\u00f6z konusu olmayacakt\u0131r. Daha gidilecek yol \u00e7oktur ve belki de kimi meslekta\u015flar taraf\u0131ndan &#8216;bu ne lan&#8217; \u015feklinde isteksiz davran\u0131\u015flar s\u00f6z konusu olacakt\u0131r ve Dapr&#8217;\u0131n daha ne oldu\u011fu anla\u015f\u0131lmaks\u0131z\u0131n, i\u015fleri oldu\u011fundan daha karma\u015f\u0131k hale getiren bi z\u0131mb\u0131rt\u0131lar y\u0131\u011f\u0131n\u0131 oldu\u011funa inan\u0131lacakt\u0131r.<\/p>\n<p>\u0130\u015fte Dapr&#8217;a at\u0131lacak ilk kazmay\u0131 .NET Aspire ile vurmak, bahsedilen t\u00fcm bu hantal durumlar\u0131 s\u00fcre\u00e7ten soyutlayacak ve yeni geli\u015ftirici tayfan\u0131n ilgili teknolojiye kat\u0131l\u0131m s\u00fcresini ve vak\u0131f olmas\u0131n\u0131 olduk\u00e7a azaltacakt\u0131r. \u015eimdi gelin bunun nas\u0131l yap\u0131laca\u011f\u0131n\u0131 incelemeye ba\u015flayal\u0131m&#8230;<\/p>\n<h4>.NET Aspire \u0130le Birlikte Dapr&#8217;\u0131n Kullan\u0131m\u0131<\/h4>\n<p>\u0130lk olarak yukar\u0131daki sat\u0131rlarda Dapr i\u00e7in sunulan \u00f6rnekteki servislere .NET Aspire deste\u011fi olu\u015fturulmal\u0131 ve a\u015fa\u011f\u0131daki referans \u00e7al\u0131\u015fmalar\u0131 ger\u00e7ekle\u015ftirilmelidir.<\/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\nvar _stateStore = builder.AddDaprStateStore(&quot;statestore&quot;);\r\n\r\nvar _rabbitmqPubsub = builder.AddDaprPubSub(&quot;rabbitmq-pubsub&quot;, new Aspire.Hosting.Dapr.DaprComponentOptions { LocalPath = &quot;..\/rabbitmq-pubsub.yaml&quot; });\r\n\r\nvar _redisPubsub = builder.AddDaprPubSub(&quot;redis-pubsub&quot;, new Aspire.Hosting.Dapr.DaprComponentOptions { LocalPath = &quot;..\/redis-pubsub.yaml&quot; });\r\n\r\n_servicea.WithDaprSidecar()\r\n         .WithReference(_stateStore)\r\n         .WithReference(_rabbitmqPubsub);\r\n\r\n_serviceb.WithDaprSidecar()\r\n         .WithReference(_stateStore)\r\n         .WithReference(_redisPubsub);\r\n\r\nbuilder.Build().Run();\r\n<\/pre>\n<\/div>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere solution&#8217;a eklenen AppHost uygulamas\u0131 \u00fczerinde her iki servis referans edilmekte ve bir yandan da <code>AddDaprPubSub<\/code> metodu ile Dapr Pub\/Sub component&#8217;leri s\u00fcrece dahil edilmektedir. Tabi bunun i\u00e7in AppHost uygulamas\u0131na <a href=\"https:\/\/www.nuget.org\/packages\/Aspire.Hosting.Dapr\/\" target=\"_blank\">Aspire.Hosting.Dapr<\/a> NuGet paketiyle hosting entegrasyonunda bulunulmas\u0131 gerekmektedir. Ayr\u0131ca servis referanslar\u0131 da <code>WithDaprSidecar<\/code> metoduyla Dapr sidecar&#8217;\u0131na eklenmektedirler.<\/p>\n<p>Burada \u00f6zellikle Dapr component&#8217;leri i\u00e7in yaml dosyalar\u0131n\u0131n do\u011fru dizinle referans edilmesi gerekti\u011finin \u00f6nemini vurgulamak istiyorum. Evet, her ne kadar .NET Aspire ile Dapr&#8217;\u0131 daha efektif kullanacak olsak da, Dapr&#8217;\u0131n do\u011fas\u0131 gere\u011fi ihtiya\u00e7 duyaca\u011f\u0131 yaml dosyalar\u0131n\u0131 da yine fiziksel olarak olu\u015fturmak ve bunu .NET Aspire&#8217;a sunmak biz geli\u015ftiricilerin g\u00f6revidir.<\/p>\n<p>Ha tabi sizler isterseniz a\u015fa\u011f\u0131daki gibi de herhangi bir yaml yap\u0131land\u0131rmas\u0131 kullanmaks\u0131z\u0131n da direkt <code>AddDaprPubSub<\/code> metodunu kullanabilir ve operasyonlar\u0131n\u0131z\u0131 y\u00fcr\u00fctebilirsiniz;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n.\r\n.\r\n.\r\nvar _rabbitmqPubsub = builder.AddDaprPubSub(&quot;rabbitmq-pubsub&quot;);\r\nya da\r\nvar _redisPubsub = builder.AddDaprPubSub(&quot;redis-pubsub&quot;);\r\n.\r\n.\r\n.\r\n<\/pre>\n<\/div>\n<p>B\u00f6yle bir durumda gerekli olan yaml kodu ge\u00e7ici bir klas\u00f6rde otomatik olarak olu\u015fturulacakt\u0131r.<\/p>\n<p>Velhas\u0131l&#8230;<\/p>\n<p>\u0130\u015fte bu \u00e7al\u0131\u015fma neticesinde .NET Aspire ile herhangi bir yap\u0131land\u0131rma gerekmeksizin Dapr rahatl\u0131kla kullan\u0131labilmektedir. Uygulama derlenip \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131nda a\u015fa\u011f\u0131daki g\u00f6rseldeki gibi .NET Aspire&#8217;\u0131n dashboard&#8217;u a\u00e7\u0131lacakt\u0131r.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/12\/NET-Aspire-Dapr-Distributed-Uygulamalarda-Bu-Araclar-Birbirlerini-Nasil-Tamamlarlar-2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/12\/NET-Aspire-Dapr-Distributed-Uygulamalarda-Bu-Araclar-Birbirlerini-Nasil-Tamamlarlar-2.png\" alt=\".NET Aspire &amp; Dapr | Distributed Uygulamalarda Bu Ara\u00e7lar Birbirlerini Nas\u0131l Tamamlarlar?\" width=\"1767\" height=\"376\" class=\"aligncenter size-full wp-image-27415\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/12\/NET-Aspire-Dapr-Distributed-Uygulamalarda-Bu-Araclar-Birbirlerini-Nasil-Tamamlarlar-2.png 1767w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/12\/NET-Aspire-Dapr-Distributed-Uygulamalarda-Bu-Araclar-Birbirlerini-Nasil-Tamamlarlar-2-300x64.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/12\/NET-Aspire-Dapr-Distributed-Uygulamalarda-Bu-Araclar-Birbirlerini-Nasil-Tamamlarlar-2-1024x218.png 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/12\/NET-Aspire-Dapr-Distributed-Uygulamalarda-Bu-Araclar-Birbirlerini-Nasil-Tamamlarlar-2-768x163.png 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/12\/NET-Aspire-Dapr-Distributed-Uygulamalarda-Bu-Araclar-Birbirlerini-Nasil-Tamamlarlar-2-1536x327.png 1536w\" sizes=\"auto, (max-width: 1767px) 100vw, 1767px\" \/><\/a>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere servislere dair Dapr CLI&#8217;ler aya\u011fa kald\u0131r\u0131lm\u0131\u015f ve port de\u011ferleri otomatik atanm\u0131\u015f vaziyettedir. B\u00f6ylece .NET Aspire ile birlikte Dapr entegrasyonu ba\u015far\u0131yla sa\u011flanm\u0131\u015ft\u0131r ve uygulamam\u0131z kullan\u0131labilir vaziyette ayaktad\u0131r.<\/p>\n<h4>Daha Karma\u015f\u0131k Dapr Senaryolar\u0131n\u0131 Ele Al\u0131rsak<\/h4>\n<p>.NET Aspire ile varsay\u0131lan olarak desteklenen Dapr component&#8217;lerinin d\u0131\u015f\u0131nda<span style=\"font-size:12px;\">(state store i\u00e7in <code>AddDaprStateStore<\/code>,pub\/sub i\u00e7in <code>AddDaprPubSub<\/code>)<\/span> yap\u0131land\u0131r\u0131lm\u0131\u015f component&#8217;leri sisteme y\u00fcklemek istiyorsak <code>AddDaprComponent<\/code> metodu a\u015fa\u011f\u0131daki gibi kullan\u0131labilir;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nvar _localsecretstore = builder.AddDaprComponent(&quot;localsecretstore&quot;, &quot;secretstores.local.file&quot;, new DaprComponentOptions\r\n{\r\n    LocalPath = &quot;\/path\/to\/component-config.yaml&quot;\r\n});\r\n<\/pre>\n<\/div>\n<p>Benzer mant\u0131kla varsa resilience politikalar\u0131 gibi kaynaklar bunlar\u0131nda a\u015fa\u011f\u0131daki gibi sidecar&#8217;a atanmas\u0131 m\u00fcmk\u00fcnd\u00fcr;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n_servicea.WithDaprSidecar(new DaprSidecarOptions\r\n{\r\n    ResourcesPaths = &#x5B;&quot;\/path\/to\/resources-directory&quot;]\r\n})\r\n         .WithReference(_stateStore)\r\n         .WithReference(_rabbitmqPubsub)\r\n         .WithReference(_redisPubsub);\r\n<\/pre>\n<\/div>\n<p>Nihai olarak;<br \/>\n.NET ile distributed uygulamalar geli\u015ftirirken .NET Aspire ile local development i\u00e7in ger\u00e7ekten ak\u0131c\u0131 bir deneyim s\u00f6z konusu olmaktad\u0131r. Ve i\u00e7eri\u011fimiz s\u00fcrecinde deneyimlendi\u011fi \u00fczere .NET Aspire ile Dapr birbirlerini tamamlamakta ve biz geli\u015ftiricilere daha az eforla ciddi yol katetme imkan\u0131 sa\u011flamaktad\u0131r.<\/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.vs.Dapr.Example\" target=\"_blank\">https:\/\/github.com\/gncyyldz\/NetAspire.vs.Dapr.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 en son klavyeye ald\u0131\u011f\u0131m\u0131z .NET Aspire arac\u0131yla birlikte Distributed Application Runtime(Dapr) arac\u0131n\u0131 masaya yat\u0131racak ve bu ikisinin \u00e7\u00f6zd\u00fc\u011f\u00fc sorunlarla birlikte aralar\u0131ndaki farklara ve \u00f6zellikle neden bu iki arac\u0131n birlikte kullan\u0131lmas\u0131 gerekti\u011fine&#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":27416,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5183,4698],"tags":[5184,4699],"class_list":["post-27398","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-aspire","category-dapr","tag-net-aspire","tag-dapr"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/27398","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=27398"}],"version-history":[{"count":13,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/27398\/revisions"}],"predecessor-version":[{"id":27417,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/27398\/revisions\/27417"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/27416"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=27398"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=27398"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=27398"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}