﻿
{"id":25814,"date":"2022-11-15T10:18:03","date_gmt":"2022-11-15T10:18:03","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=25814"},"modified":"2022-11-15T10:18:36","modified_gmt":"2022-11-15T10:18:36","slug":"distributed-application-runtimedapr-nedir-teorik-ve-pratikte-inceleyelim","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/distributed-application-runtimedapr-nedir-teorik-ve-pratikte-inceleyelim\/","title":{"rendered":"Distributed Application Runtime(Dapr) Nedir? Teorik ve Pratikte \u0130nceleyelim"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Bu i\u00e7eri\u011fimizde microservice uygulamalar\u0131 geli\u015ftirirken cloud&#8217;da <em>resilient<\/em> ve <em>portable<\/em> bir \u015fekilde \u00e7e\u015fitli dillerde \u00e7al\u0131\u015fma olana\u011f\u0131 sa\u011flayan event-driven runtime olan Dapr(Distributed Application Runtime)&#8217;\u0131n ne oldu\u011fu, microservice uygulamalar\u0131 geli\u015ftirme s\u00fcre\u00e7lerindeki ya\u015fan\u0131lan zorluklar\u0131n \u00fcstesinden gelinmesi i\u00e7in ne gibi yard\u0131mlarda bulundu\u011fu ve nas\u0131l kullan\u0131labilece\u011fi hakk\u0131nda uzun ve detayl\u0131 bir irdelemede bulunuyor olaca\u011f\u0131z.<\/p>\n<h4>Dapr(Distributed Application Runtime) Nedir?<\/h4>\n<p>Dapr, microservice uygulamalar\u0131 olu\u015fturmaya y\u00f6nelik bir \u00e7ok bile\u015fenden olu\u015fan bir ara\u00e7 k\u00fct\u00fcphanesidir. Dapr&#8217;\u0131 kullanarak, mevcut uygulamalar\u0131n\u0131z\u0131 a\u015famal\u0131 olarak microservice mimarisine ge\u00e7irebilir yahut s\u0131f\u0131rdan ba\u015flayaca\u011f\u0131n\u0131z microservice projelerinizde Redis, RabbitMQ vs. gibi ba\u011f\u0131ml\u0131l\u0131klara kar\u015f\u0131 olu\u015fturulmu\u015f encapsulation sayesinde olduk\u00e7a esnek, geni\u015fletilebilir ve ba\u011f\u0131ms\u0131z bir geli\u015ftirme s\u00fcreci benimseyebilirsiniz.<\/p>\n<p>T\u00fcm bunlar\u0131n yan\u0131nda Dapr&#8217;\u0131n platformdan ba\u011f\u0131ms\u0131z olmas\u0131 herhangi bir Kubernetes cluster&#8217;\u0131nda yahut sanal veya fiziksel makinelerde ya da Dapr&#8217;\u0131n entegre olabilece\u011fi di\u011fer bar\u0131nma ortamlar\u0131nda(<em>hosting environments<\/em>) \u00e7al\u0131\u015ft\u0131r\u0131labilmesini sa\u011flamaktad\u0131r.<\/p>\n<p>Dapr, Go dili kullan\u0131larak Microsoft taraf\u0131ndan geli\u015ftirilmektedir ve ilk olarak 2019 y\u0131l\u0131nda duyurulmu\u015ftur.<\/p>\n<h4>Dapr&#8217;la Hedeflenenler Nelerdir?<\/h4>\n<p>Dapr, modern da\u011f\u0131t\u0131lm\u0131\u015f uygulamalar\u0131n do\u011fas\u0131nda bulunan b\u00fcy\u00fck bir zorlu\u011fu ele al\u0131yor. Karma\u015f\u0131kl\u0131k&#8230; Pluggable Components mimarisi sayesinde da\u011f\u0131t\u0131lm\u0131\u015f uygulamalardaki ba\u011f\u0131ml\u0131l\u0131klar\u0131n koordinasyonunu b\u00fcy\u00fck \u00f6l\u00e7\u00fcde basitle\u015ftirerek \u00e7al\u0131\u015fma imkan\u0131 sa\u011flamaktad\u0131r.<\/p>\n<p>Misal olarak; bir servisin stateful olmas\u0131n\u0131 hedefleseydiniz muhtemelen Redis Cache gibi state&#8217;i store edebilece\u011finiz \u00f6zel bir \u00e7al\u0131\u015fma ger\u00e7ekle\u015ftirirdiniz. Dapr ise direkt kullan\u0131ma haz\u0131r durum y\u00f6netimi sa\u011flayabilecek bir yetene\u011fe sahiptir. Ve tabi arkaplanda Redis dahil olmak \u00fczere farkl\u0131 state store edilebilir componentleri de desteklemektedir.<\/p>\n<h4>Microservice Building Blocks<\/h4>\n<p>Dapr ile microservice geli\u015ftirme s\u00fcre\u00e7lerinde istifade edebilece\u011fimiz yap\u0131ta\u015flar\u0131 a\u015fa\u011f\u0131daki gibidir.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Dapr-Ile-Microservice-Uygulama-Gelistirme.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Dapr-Ile-Microservice-Uygulama-Gelistirme.jpg\" alt=\"Dapr \u0130le Microservice Uygulama Geli\u015ftirme\" width=\"2530\" height=\"794\" class=\"aligncenter size-full wp-image-25820\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Dapr-Ile-Microservice-Uygulama-Gelistirme.jpg 2530w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Dapr-Ile-Microservice-Uygulama-Gelistirme-300x94.jpg 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Dapr-Ile-Microservice-Uygulama-Gelistirme-1024x321.jpg 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Dapr-Ile-Microservice-Uygulama-Gelistirme-768x241.jpg 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Dapr-Ile-Microservice-Uygulama-Gelistirme-1536x482.jpg 1536w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Dapr-Ile-Microservice-Uygulama-Gelistirme-2048x643.jpg 2048w\" sizes=\"auto, (max-width: 2530px) 100vw, 2530px\" \/><\/a>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere Dapr, microservice uygulamalar\u0131 geli\u015ftirirken, standart bir \u015fekilde kullan\u0131labilecek ve herhangi bir ortama deploy edilebilecek yetenekler sa\u011flamaktad\u0131r. Dapr, geli\u015ftiricilerin uygulama s\u00fcrecinde sadece Dapr building block&#8217;lar\u0131 \u00fczerinden i\u015flem yapmas\u0131n\u0131 sa\u011flayacak ve b\u00f6ylece herhangi bir external library&#8217;e ihtiya\u00e7 duyurmayaca\u011f\u0131 i\u00e7in ba\u011f\u0131ml\u0131l\u0131klar s\u00f6z konusu olmayacakt\u0131r.<\/p>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Dapr-Ile-Microservice-Uygulama-Gelistirme.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Dapr-Ile-Microservice-Uygulama-Gelistirme-265x300.png\" alt=\"Dapr \u0130le Microservice Uygulama Geli\u015ftirme\" width=\"265\" height=\"300\" class=\"alignleft size-medium wp-image-25823\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Dapr-Ile-Microservice-Uygulama-Gelistirme-265x300.png 265w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Dapr-Ile-Microservice-Uygulama-Gelistirme.png 522w\" sizes=\"auto, (max-width: 265px) 100vw, 265px\" \/><\/a>Building Block kavram\u0131n\u0131 biraz daha a\u00e7mam\u0131z gerekirse e\u011fer yandaki g\u00f6r\u00fcnt\u00fcy\u00fc inceleyebilirsiniz. Dikkat ederseniz bir building block i\u00e7erisinde bir veya birden fazla component bar\u0131nd\u0131ran bir HTTP ya da gRPC API&#8217;\u0131d\u0131r. Bizler building block&#8217;lar sayesinde microservice uygulamalar olu\u015ftururken ya\u015fanabilecek olan yayg\u0131n zorluklar\u0131 esnek ve best practice&#8217;lere uygun bir \u015fekilde ele alarak i\u015fleyebilmekteyiz.<\/p>\n<blockquote><p><em>Dapr, yeni building block&#8217;lar eklenerek geni\u015fletilebilir bir yap\u0131ya sahiptir.<\/em><\/p><\/blockquote>\n<p>Building block&#8217;lar\u0131, uygulamalar taraf\u0131ndan kullan\u0131lan mod\u00fcler i\u015flevsellikler olarak de\u011ferlendirebiliriz. Her bir i\u015flevselli\u011fi ise bir <strong>component<\/strong> olarak de\u011ferlendirmekteyiz. <\/p>\n<h4>Dapr Components<\/h4>\n<p>Dapr, her i\u015flevselli\u011fin bir bili\u015fen olarak sunuldu\u011fu mod\u00fcler bir tasar\u0131m kullanmaktad\u0131r.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-1024x582.jpg\" alt=\"Distributed Application Runtime(Dapr) Nedir Teorik Olarak \u0130nceleyelim\" width=\"1024\" height=\"582\" class=\"aligncenter size-large wp-image-25826\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-1024x582.jpg 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-300x171.jpg 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-768x437.jpg 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-1536x873.jpg 1536w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-2048x1164.jpg 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a>Yukar\u0131daki g\u00f6rseli incelerseniz e\u011fer Dapr&#8217;\u0131n pluggable yap\u0131s\u0131 sayesinde her bir component&#8217;i i\u015flevine g\u00f6re farkl\u0131 bir component&#8217;le rahatl\u0131kla de\u011fi\u015ftirebilmekteyiz. Misal olarak; &#8216;State Stores&#8217; operasyonu i\u00e7in default olarak &#8216;Redis&#8217; component&#8217;i kullan\u0131l\u0131rken sizler isterseniz &#8216;Azure CosmosDB&#8217; yahut &#8216;Cassandra&#8217;y\u0131 tercih ederek, rahatl\u0131kla ve hi\u00e7 zahmet etmeksizin ge\u00e7i\u015f sa\u011flayabilir ve operasyonlar\u0131n\u0131za yeni component&#8217;ten devam edebilirsiniz. Dapr, uygulamalar\u0131 ve dolay\u0131s\u0131yla geli\u015ftiricileri buradaki component&#8217;lerin konfig\u00fcrasyonlar\u0131ndan soyutlayarak b\u00fcy\u00fck \u00f6l\u00e7\u00fcde esneklik sa\u011flamaktad\u0131r.<\/p>\n<p><strong>Component&#8217;lerin \u00d6zellikleri<\/strong><br \/>\nHer bile\u015fenin a\u015fa\u011f\u0131daki formatta bir \u015fartnamesi(specification) vard\u0131r.<\/p>\n<div style=\"font-size:15px;\">\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\napiVersion: dapr.io\/v1alpha1\r\nkind: Component\r\nmetadata:\r\n  name: &#x5B;COMPONENT-NAME]\r\n  namespace: &#x5B;COMPONENT-NAMESPACE]\r\nspec:\r\n  type: &#x5B;COMPONENT-TYPE]\r\n  version: v1\r\n  initTimeout: &#x5B;TIMEOUT-DURATION]\r\n  ignoreErrors: &#x5B;BOOLEAN]\r\n  metadata:\r\n  - name: &#x5B;METADATA-NAME]\r\n    value: &#x5B;METADATA-VALUE]\r\n<\/pre>\n<\/div>\n<p>Bu \u015fartnamedeki alanlar a\u015fa\u011f\u0131daki i\u015flevselliklere sahiptirler:<\/p>\n<ul>\n<li><em>apiVersion<\/em>, Dapr s\u00fcr\u00fcm\u00fcn\u00fc ifade eder.<\/li>\n<li><em>kind<\/em>, CRD t\u00fcr\u00fcn\u00fc ifade eder. (Component&#8217;ler i\u00e7in her daim tan\u0131mlanmal\u0131d\u0131r)<\/li>\n<li><em>metadata<\/em>, Component hakk\u0131nda bilgileri ifade eder.<\/li>\n<li><em>name<\/em>, Component&#8217;in ad\u0131n\u0131 ifade eder.<\/li>\n<li><em>namespace<\/em>, Component&#8217;lerin namespace&#8217;ini ifade eder.<\/li>\n<li><em>spec<\/em>, Component hakk\u0131nda ayr\u0131nt\u0131l\u0131 bilgileri ifade eder.<\/li>\n<li><em>type<\/em>, Component&#8217;in t\u00fcr\u00fcn\u00fc ifade eder.<\/li>\n<li><em>version<\/em>, Component&#8217;in s\u00fcr\u00fcm\u00fcn\u00fc ifade eder.<\/li>\n<li><em>initTimeout<\/em>, Component&#8217;in ba\u015flat\u0131lmas\u0131 i\u00e7in zaman a\u015f\u0131m\u0131 s\u00fcresini ifade eder. Varsay\u0131lan olarak 5 saniyedir.<\/li>\n<li><em>ignoreErrors<\/em>, Component y\u00fcklenemezse hatalar\u0131 g\u00f6rmezden gelerek Dapr&#8217;\u0131n \u00e7al\u0131\u015fmas\u0131n\u0131 devam ettirir. Varsay\u0131lan olarak false de\u011ferindedir.<\/li>\n<li><em>metadata<\/em>, Component&#8217;e \u00f6zel key\/value \u00e7ift yap\u0131land\u0131rma de\u011ferlerini ifade eder.<\/li>\n<\/ul>\n<p><strong>Built-in Components<\/strong><br \/>\nDapr, yukar\u0131daki g\u00f6rselde de anla\u015f\u0131laca\u011f\u0131 \u00fczere community&#8217;ler taraf\u0131ndan geli\u015ftirilip hizmetimize sunulan dahili component&#8217;lere sahiptir. Bunlar\u0131n d\u0131\u015f\u0131nda Dapr, kendimize \u00f6zel olarak(custom) component&#8217;ler de geli\u015ftirip kullanmam\u0131za olanak tan\u0131maktad\u0131r.<\/p>\n<p>\u015eimdi dahili olan ve haz\u0131r bulunan, kullan\u0131labilir component t\u00fcrlerini inceleyerek genel anlamda fikir edinmeye \u00e7al\u0131\u015fal\u0131m.<\/p>\n<table>\n<thead>\n<tr>\n<th>Component Types<\/th>\n<th>Detail<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td width=\"20%\" style=\"vertical-align: text-top;\"><strong>State stores<\/strong><\/td>\n<td style=\"text-align: left;\">Veri depolar\u0131d\u0131r.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim.png\" alt=\"Distributed Application Runtime(Dapr) Nedir Teorik Olarak \u0130nceleyelim\" width=\"620\" height=\"908\" class=\"aligncenter size-full wp-image-25830\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim.png 620w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-205x300.png 205w\" sizes=\"auto, (max-width: 620px) 100vw, 620px\" \/><\/a>\n<\/td>\n<\/tr>\n<tr>\n<td width=\"20%\" style=\"vertical-align: text-top;\"><strong>Name resolution<\/strong><\/td>\n<td style=\"text-align: left;\">\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-1.png\" alt=\"Distributed Application Runtime(Dapr) Nedir Teorik Olarak \u0130nceleyelim\" width=\"309\" height=\"248\" class=\"alignleft size-full wp-image-25831\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-1.png 309w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-1-300x241.png 300w\" sizes=\"auto, (max-width: 309px) 100vw, 309px\" \/><\/a>\n<\/td>\n<\/tr>\n<tr>\n<td width=\"20%\" style=\"vertical-align: text-top;\"><strong>Pub\/sub brokers<\/strong><\/td>\n<td style=\"text-align: left;\">Pub\/sub i\u015flemlerini y\u00fcr\u00fcten message broker&#8217;lard\u0131r.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-2.png\" alt=\"Distributed Application Runtime(Dapr) Nedir Teorik Olarak \u0130nceleyelim\" width=\"307\" height=\"600\" class=\"alignleft size-full wp-image-25832\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-2.png 307w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-2-154x300.png 154w\" sizes=\"auto, (max-width: 307px) 100vw, 307px\" \/><\/a>\n<\/td>\n<\/tr>\n<tr>\n<td width=\"20%\" style=\"vertical-align: text-top;\"><strong>Bindings<\/strong><\/td>\n<td style=\"text-align: left;\"><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-3.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-3.png\" alt=\"Distributed Application Runtime(Dapr) Nedir Teorik Olarak \u0130nceleyelim\" width=\"494\" height=\"509\" class=\"alignleft size-full wp-image-25833\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-3.png 494w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-3-291x300.png 291w\" sizes=\"auto, (max-width: 494px) 100vw, 494px\" \/><\/a>\n<\/td>\n<\/tr>\n<tr>\n<td width=\"20%\" style=\"vertical-align: text-top;\"><strong>Secret stores<\/strong><\/td>\n<td style=\"text-align: left;\">Gizli bilgileri depolamak i\u00e7in kullan\u0131l\u0131r.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-4.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-4.png\" alt=\"Distributed Application Runtime(Dapr) Nedir Teorik Olarak \u0130nceleyelim\" width=\"509\" height=\"524\" class=\"alignleft size-full wp-image-25834\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-4.png 509w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-4-291x300.png 291w\" sizes=\"auto, (max-width: 509px) 100vw, 509px\" \/><\/a>\n<\/td>\n<\/tr>\n<tr>\n<td width=\"20%\" style=\"vertical-align: text-top;\"><strong>Configuration stores<\/strong><\/td>\n<td style=\"text-align: left;\">Uygulama konfig\u00fcrasyonel verilerini depolamak i\u00e7in kullan\u0131l\u0131rlar. De\u011fi\u015fiklik meydana geldi\u011finde bildirimde bulunurlar.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-5.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-5.png\" alt=\"Distributed Application Runtime(Dapr) Nedir Teorik Olarak \u0130nceleyelim\" width=\"332\" height=\"123\" class=\"alignleft size-full wp-image-25835\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-5.png 332w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-5-300x111.png 300w\" sizes=\"auto, (max-width: 332px) 100vw, 332px\" \/><\/a>\n<\/td>\n<\/tr>\n<tr>\n<td width=\"20%\" style=\"vertical-align: text-top;\"><strong>Locks<\/strong><\/td>\n<td style=\"text-align: left;\">Distributed lock.\n<\/td>\n<\/tr>\n<tr>\n<td width=\"20%\" style=\"vertical-align: text-top;\"><strong>Middleware<\/strong><\/td>\n<td style=\"text-align: left;\"><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-6.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-6.png\" alt=\"Distributed Application Runtime(Dapr) Nedir Teorik Olarak \u0130nceleyelim\" width=\"609\" height=\"278\" class=\"alignleft size-full wp-image-25836\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-6.png 609w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-6-300x137.png 300w\" sizes=\"auto, (max-width: 609px) 100vw, 609px\" \/><\/a>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>Dapr Yap\u0131land\u0131rma<\/h4>\n<p>Dapr bir YAML dosyas\u0131 \u00fczerinden kolayca yap\u0131land\u0131r\u0131labilmektedir. Misal olarak a\u015fa\u011f\u0131da Dapr&#8217;\u0131n metrik bilgilerinin nereye g\u00f6nderilece\u011fine ili\u015fkin bir endpoint konfig\u00fcrasyonu \u00f6rneklendirilmektedir.<\/p>\n<div style=\"font-size:15px;\">\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\napiVersion: dapr.io\/v1alpha1\r\nkind: Configuration\r\nmetadata:\r\n  name: daprConfig\r\n  namespace: default\r\nspec:\r\n  tracing:\r\n    samplingRate: &quot;1&quot;\r\n    zipkin:\r\n      endpointAddress: &quot;http:\/\/localhost:9411\/api\/v2\/spans&quot;\r\n<\/pre>\n<\/div>\n<p>Ayr\u0131ca a\u015fa\u011f\u0131daki &#8216;dapr-system&#8217; namespace&#8217;inde &#8216;daprsystem&#8217; olarak isimlendirilen Dapr konfig\u00fcrasyon \u00f6rne\u011fini de inceleyebilirsiniz.<\/p>\n<div style=\"font-size:15px;\">\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\napiVersion: dapr.io\/v1alpha1\r\nkind: Configuration\r\nmetadata:\r\n  name: daprsystem\r\n  namespace: dapr-system\r\nspec:\r\n  mtls:\r\n    enabled: true\r\n    workloadCertTTL: &quot;24h&quot;\r\n    allowedClockSkew: &quot;15m&quot;\r\n<\/pre>\n<\/div>\n<h4>Dapr Observability\/\u0130zleme\/G\u00f6zlenebilirlik<\/h4>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-1.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-1-1024x551.jpg\" alt=\"Distributed Application Runtime(Dapr) Nedir Teorik Olarak \u0130nceleyelim\" width=\"1024\" height=\"551\" class=\"aligncenter size-large wp-image-25837\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-1-1024x551.jpg 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-1-300x162.jpg 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-1-768x414.jpg 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-1-1536x827.jpg 1536w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-1.jpg 1887w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a>Bir uygulaman\u0131n, en hayati noktalar\u0131ndan birisi \u00e7al\u0131\u015fma zaman\u0131nda nas\u0131l davrand\u0131\u011f\u0131n\u0131 izleyebilmektir. \u00d6zellikle uygulama \u00e7a\u011fr\u0131lar\u0131n\u0131n g\u00f6zlenebilmesi, performans durumunun \u00f6l\u00e7\u00fcmlenebilmesi yahut meydana gelen beklenmeyen problemlerin an\u0131nda \u00e7\u00f6z\u00fclebilmesi, hatalar\u0131n ay\u0131klanabilmesi veya olu\u015facak darbo\u011fazlar\u0131n(bottlenecks) anla\u015f\u0131labilmesi i\u00e7in g\u00f6zlenebilirlik olduk\u00e7a \u00f6nem arz etmektedir. Evet, biliyorsunuz ki bu herhangi bir sistem i\u00e7in zordur lakin bir istek neticesinde k\u00fc\u00e7\u00fck mikro servisler aras\u0131nda ak\u0131\u015f silsilesinin s\u00f6z konusu oldu\u011fu distributed bir sistem i\u00e7in daha da zordur.<\/p>\n<p>Bir uygulamayla ilgili bellek t\u00fcketimi, CPU kullan\u0131m\u0131 vs. gibi temel seviyedeki metrikler rahatl\u0131kla al\u0131nabiliyor olsa da as\u0131l \u00f6nemli olan bir \u00e7a\u011fr\u0131 s\u00fcrecinde uygulaman\u0131n davran\u0131\u015f\u0131na dair anlaml\u0131 bilgilerin toplanmas\u0131d\u0131r. Ve bu da geli\u015ftirici a\u00e7\u0131s\u0131ndan ihtiya\u00e7 noktalar\u0131na kodsal m\u00fcdahalelerde bulunulmas\u0131 gerekti\u011fi anlam\u0131na gelmektedir. \u00c7o\u011fu zaman toplanan bu metrikler t\u00fcrl\u00fc ara\u00e7larla g\u00f6rselle\u015ftirilerek monit\u00f6r edilirler.<\/p>\n<p>\u015eimdi mant\u0131ken olaya bakt\u0131\u011f\u0131m\u0131zda uygulamalar\u0131n business logic&#8217;inin bir par\u00e7as\u0131 olmayan bu \u00e7al\u0131\u015fmalar\u0131 ger\u00e7ekle\u015ftirmek geli\u015ftiriciler a\u00e7\u0131s\u0131ndan ciddi bir y\u00fckt\u00fcr ve hatta bu y\u00fck bu ara\u00e7lar\u0131n SDK&#8217;lerini kullanma, API&#8217;lerini anlama vs. gibi durumlar\u0131 gerektirdik\u00e7e daha da ciddi hale gelebilmektedir.<\/p>\n<p>Bir \u00e7a\u011fr\u0131m sonucu mikro servisler aras\u0131nda ak\u0131\u015f\u0131n ba\u015flad\u0131\u011f\u0131 durumlarda Dapr bu distributed senaryolarda g\u00f6zlenebilirlik a\u00e7\u0131s\u0131ndan avantaj sa\u011flamakta ve yayg\u0131n olarak kabul g\u00f6ren Open Telemetry (OTEL) veya Zipkin protokolleri ile metrikleri toplayabildi\u011fi i\u00e7in bir\u00e7ok g\u00f6rselle\u015ftirme arac\u0131yla kolayca entegre edilebilmektedir.<\/p>\n<p>Ayr\u0131ca Dapr, kullan\u0131c\u0131lar\u0131n sorunlar\u0131n\u0131 tan\u0131mlamas\u0131na ve hata ay\u0131klama yapmas\u0131na yard\u0131mc\u0131 olmak i\u00e7in i\u00e7erisinde uyar\u0131, hata ve bilgi mesajlar\u0131 bar\u0131nd\u0131ran <strong>log<\/strong>&#8216;larla birlikte, sistemin durumunu kontrol edebilmek i\u00e7in bir <strong>Health Check<\/strong> mekanizmas\u0131 da bar\u0131nd\u0131rmaktad\u0131r.<\/p>\n<h4>Dapr Nas\u0131l Y\u00fcklenir?<\/h4>\n<p>Dapr&#8217;\u0131 kullanabilmek i\u00e7in \u00f6ncelikle Dapr CLI&#8217;\u0131 bilgisayar\u0131n\u0131za kurman\u0131z gerekmektedir. Bunun i\u00e7in <a href=\"https:\/\/docs.dapr.io\/getting-started\/install-dapr-cli\/\" rel=\"noopener\" target=\"_blank\">\u015fu adresteki<\/a> \u00f6nergeleri s\u0131ras\u0131yla takip etmeniz yeterlidir.<\/p>\n<p>Powershell \u00fczerinden Dapr&#8217;\u0131 y\u00fckleyiniz.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-7.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-7.png\" alt=\"Distributed Application Runtime(Dapr) Nedir Teorik Olarak \u0130nceleyelim\" width=\"964\" height=\"460\" class=\"aligncenter size-full wp-image-25839\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-7.png 964w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-7-300x143.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-7-768x366.png 768w\" sizes=\"auto, (max-width: 964px) 100vw, 964px\" \/><\/a>Ard\u0131ndan <code>dapr<\/code> komutuyla y\u00fcklenip, y\u00fcklenmedi\u011fini do\u011frulay\u0131n\u0131z.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-8.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-8.png\" alt=\"Distributed Application Runtime(Dapr) Nedir Teorik Olarak \u0130nceleyelim\" width=\"258\" height=\"179\" class=\"aligncenter size-full wp-image-25840\" \/><\/a>Self-hosted modda Dapr&#8217;\u0131 \u00e7al\u0131\u015ft\u0131r\u0131n\u0131z.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-9.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-9.png\" alt=\"Distributed Application Runtime(Dapr) Nedir Teorik Olarak \u0130nceleyelim\" width=\"747\" height=\"217\" class=\"aligncenter size-full wp-image-25841\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-9.png 747w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-9-300x87.png 300w\" sizes=\"auto, (max-width: 747px) 100vw, 747px\" \/><\/a>Ve Dapr container&#8217;lar\u0131n\u0131 listeleyip nihai kontrolde bulununuz.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-10.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-10.png\" alt=\"Distributed Application Runtime(Dapr) Nedir Teorik Olarak \u0130nceleyelim\" width=\"906\" height=\"71\" class=\"aligncenter size-full wp-image-25842\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-10.png 906w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-10-300x24.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-10-768x60.png 768w\" sizes=\"auto, (max-width: 906px) 100vw, 906px\" \/><\/a>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere Dapr temel olarak &#8216;Redis&#8217;, &#8216;Openzipkin\/Zipkin&#8217; ve &#8216;Daprio\/Dapr&#8217; olmak \u00fczere \u00fc\u00e7 container ile ba\u015flang\u0131\u00e7 sa\u011flamaktad\u0131r. &#8216;Openzipkin\/Zipkin&#8217; container&#8217;\u0131 ile metrikleri toplarken, &#8216;Redis&#8217; ile state-store ve messaging operasyonlar\u0131n\u0131 y\u00fcr\u00fctmektedir. Ayr\u0131ca bu component&#8217;lerin Windows i\u015fletim sistemlerinde <code>C:\\Users\\[name]\\.dapr<\/code> klas\u00f6r\u00fc alt\u0131nda tan\u0131mland\u0131klar\u0131n\u0131 bilmenizde fayda vard\u0131r. (Linux&#8217;da ise <code>$HOME\/.dapr<\/code> dizininde tan\u0131mlanmaktad\u0131r)<\/p>\n<h4>Dapr \u0130le Basit D\u00fczeyde Servislerin Haberle\u015fmesi<\/h4>\n<p>\u015eimdi ise son olarak Dapr ile basit seviyede iki servisin haberle\u015fmesini inceleyerek i\u00e7eri\u011fimizi nihayete erdirelim istiyorum. Bunun i\u00e7in bo\u015f bir solution&#8217;da &#8216;Dapr.Basic.ServiceA&#8217; ve &#8216;Dapr.Basic.ServiceB&#8217; isimlerinde olmak \u00fczere iki Asp.NET Core API uygulamas\u0131n\u0131 a\u015fa\u011f\u0131daki gibi olu\u015fturunuz.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-11.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-11.png\" alt=\"Distributed Application Runtime(Dapr) Nedir Teorik Olarak \u0130nceleyelim\" width=\"221\" height=\"348\" class=\"alignleft size-full wp-image-25845\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-11.png 221w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-11-191x300.png 191w\" sizes=\"auto, (max-width: 221px) 100vw, 221px\" \/><\/a><br \/>\n\u015eimdi bu servisler aras\u0131nda publish edilmi\u015f event \u00fczerinden haberle\u015fmeyi sa\u011flayabilmek i\u00e7in herhangi bir k\u00fct\u00fcphane, teknoloji vs. d\u00fc\u015f\u00fcnmeksizin direkt olarak Dapr ile bu i\u015flemi ger\u00e7ekle\u015ftirebilece\u011fiz.<\/p>\n<p>Burada &#8216;Dapr.Basic.ServiceA&#8217; servisi ile event publish edilirken &#8216;Dapr.Basic.ServiceB&#8217; servisi ile de bu event&#8217;i dinleyecek ve gerekli i\u015flemleri ger\u00e7ekle\u015ftirece\u011fiz.<\/p>\n<p>Tabi bu i\u015flemi <strong>SDK<\/strong> kullanarak yahut <strong>HTTP<\/strong> \u00fczerinden istekte bulunarak iki farkl\u0131 \u015fekilde ger\u00e7ekle\u015ftirebiliriz. \u015eimdi gelin her iki y\u00f6ntemle de nas\u0131l \u00e7al\u0131\u015fma sa\u011flayabiliriz s\u0131ras\u0131yla inceleyelim;<\/p>\n<ul>\n<li><strong>SDK<\/strong><br \/>\nSDK \u00fczerinden geli\u015ftirmeyi sa\u011flayabilmek i\u00e7in event publish edecek olan &#8216;Dapr.Basic.ServiceA&#8217; isimli servise <a href=\"https:\/\/www.nuget.org\/packages\/Dapr.Client\" rel=\"noopener\" target=\"_blank\">Dapr.Client<\/a> ve <a href=\"https:\/\/www.nuget.org\/packages\/Dapr.AspNetCore\" rel=\"noopener\" target=\"_blank\">Dapr.AspNetCore<\/a> library&#8217;lerini, t\u00fcketici olan &#8216;Dapr.Basic.ServiceB&#8217; isimli servise ise sadece <a href=\"https:\/\/www.nuget.org\/packages\/Dapr.AspNetCore\" rel=\"noopener\" target=\"_blank\">Dapr.AspNetCore<\/a> library&#8217;sini y\u00fckleyiniz.<\/p>\n<p>Ard\u0131ndan &#8216;Dapr.Basic.ServiceA&#8217;da a\u015fa\u011f\u0131daki \u00e7al\u0131\u015fmay\u0131 ger\u00e7ekle\u015ftiriniz.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nusing Dapr.Client;\r\nusing Shared.Events;\r\n\r\nvar builder = WebApplication.CreateBuilder(args);\r\n\r\nbuilder.Services.AddControllers();\r\nbuilder.Services.AddEndpointsApiExplorer();\r\nbuilder.Services.AddDaprClient();\r\n\r\nvar app = builder.Build();\r\n\r\napp.MapGet(&quot;\/send-event\/{eventText}&quot;, async (string eventText, DaprClient client) =&gt;\r\n{\r\n    await client.PublishEventAsync(pubsubName: &quot;pubsub&quot;, topicName: &quot;example.event&quot;, new Event(eventText));\r\n    Console.WriteLine(eventText);\r\n});\r\n\r\napp.UseHttpsRedirection();\r\napp.MapControllers();\r\napp.Run(&quot;https:\/\/localhost:1000&quot;);\r\n<\/pre>\n<\/div>\n<p>Yukar\u0131daki kod blo\u011funda, <strong>8.<\/strong> sat\u0131rda &#8216;AddDaprClient&#8217; servisi uygulamaya dahil edilmekte ve <strong>12<\/strong> ile <strong>16.<\/strong> sat\u0131r aral\u0131\u011f\u0131nda ise <code>\/send-event\/{eventText}<\/code> endpoint&#8217;i i\u00e7erisinde &#8216;Event&#8217; t\u00fcr\u00fcnden bir event publish edilmektedir. Burada &#8216;pubsubName&#8217;e <code>C:\\Users\\[name]\\.dapr<\/code> dizininde bulunan &#8216;components&#8217; klas\u00f6r\u00fc i\u00e7erisindeki &#8216;pubsub.yaml&#8217; dosyas\u0131n\u0131n &#8216;metadata:name&#8217; bilgisinin verildi\u011fine dikkatinizi \u00e7ekerim.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-12.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-12.png\" alt=\"Distributed Application Runtime(Dapr) Nedir Teorik Olarak \u0130nceleyelim\" width=\"417\" height=\"290\" class=\"aligncenter size-full wp-image-25846\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-12.png 417w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim-12-300x209.png 300w\" sizes=\"auto, (max-width: 417px) 100vw, 417px\" \/><\/a>&#8216;Dapr.Basic.ServiceB&#8217; servisinde ise a\u015fa\u011f\u0131daki \u00e7al\u0131\u015fmay\u0131 ger\u00e7ekle\u015ftiriniz.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nusing Dapr;\r\nusing Shared.Events;\r\n\r\nvar builder = WebApplication.CreateBuilder(args);\r\n\r\nbuilder.Services.AddControllers().AddDapr();\r\nbuilder.Services.AddEndpointsApiExplorer();\r\n\r\nvar app = builder.Build();\r\n\r\napp.MapPost(&quot;\/get-event&quot;, &#x5B;Topic(&quot;pubsub&quot;, &quot;example.event&quot;)] (Event @event) =&gt;\r\n{\r\n    Console.WriteLine(@event.Text);\r\n});\r\n\r\napp.UseHttpsRedirection();\r\napp.UseCloudEvents();\r\napp.MapControllers();\r\napp.MapSubscribeHandler();\r\napp.Run(&quot;https:\/\/localhost:2000&quot;);\r\n<\/pre>\n<\/div>\n<p>Burada da <strong>6.<\/strong> sat\u0131rda Dapr &#8216;AddDapr&#8217; extension&#8217;\u0131 sayesinde MVC pipeline&#8217;\u0131na dahil edilmektedir. <strong>17.<\/strong> ve <strong>19.<\/strong> sat\u0131rlarda ise s\u0131ras\u0131yla &#8216;UseCloudEvents&#8217; ve &#8216;MapSubscribeHandler&#8217; middleware&#8217;leri \u00e7a\u011fr\u0131lmaktad\u0131r. Dapr, publish edilen event&#8217;lar\u0131 CloudEvent format\u0131na \u00e7evirdi\u011fi i\u00e7in ayn\u0131 \u015fekilde event&#8217;i ilgili t\u00fcre d\u00f6n\u00fc\u015ft\u00fcrebilmek amac\u0131yla &#8216;UseCloudEvents&#8217; middleware&#8217;i kullan\u0131lmaktad\u0131r. &#8216;MapSubscribeHandler&#8217; middleware&#8217;i ise <strong>11.<\/strong> sat\u0131rda yay\u0131nlanm\u0131\u015f olan event&#8217;i dinleyebilmek i\u00e7in kulland\u0131\u011f\u0131m\u0131z <code>Topic<\/code> attribute&#8217;unu i\u015flevsel hale getirebilmek i\u00e7in \u00e7a\u011fr\u0131lmaktad\u0131r.<\/p>\n<p>Bu i\u015flemlerden sonra a\u015fa\u011f\u0131daki talimatlar e\u015fli\u011finde Dapr \u00fczerinden servisleri aya\u011fa kald\u0131r\u0131n\u0131z ve ekran g\u00f6r\u00fcnt\u00fcs\u00fcndeki gibi teste tabi tutunuz.<br \/>\n<code><strong>dapr run --app-id servicea <span style=\"color:green;\">--app-ssl<\/span> --app-port 1000 -- dotnet run<\/strong><\/code><br \/>\n<code><strong>dapr run --app-id serviceb <span style=\"color:green;\">--app-ssl<\/span> --app-port 2000 -- dotnet run<\/strong><\/code><br \/>\n<span style=\"font-size:12px;color:gray;\">(SSL connection kullanan uygulamalarda <span style=\"color:green;\">&#8211;app-ssl<\/span> parametresi ile Dapr&#8217;a g\u00fcvenli olmayan bir SSL ba\u011flant\u0131s\u0131  \u00fczerinden uygulamalar\u0131 aya\u011fa kald\u0131rmas\u0131 gerekti\u011fini s\u00f6ylemi\u015f oluyoruz.)<\/span><br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-Olarak-Inceleyelim.gif\" alt=\"Distributed Application Runtime(Dapr) Nedir Teorik Olarak \u0130nceleyelim\" width=\"800\" height=\"408\" class=\"aligncenter size-full wp-image-25847\" \/><\/a>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere Dapr sayesinde publish etti\u011fimiz event herhangi bir harici k\u00fct\u00fcphaneye ihtiya\u00e7 duymaks\u0131z\u0131n direkt subscribe olan bir consumer taraf\u0131ndan ba\u015far\u0131yla i\u015flenmektedir.\n<\/li>\n<li><strong>HTTP<\/strong><br \/>\nBenzer \u015fekilde iki servis aras\u0131ndaki haberle\u015fmeyi HTTP \u00fczerinden sa\u011flamak istiyorsan\u0131z burada birazc\u0131k farkl\u0131 davran\u0131\u015f sergilemeniz gerekmektedir.<\/p>\n<p>&#8216;Dapr.Basic.ServiceA&#8217; servisinde a\u015fa\u011f\u0131daki gibi bir \u00e7al\u0131\u015fma ger\u00e7ekle\u015ftiriniz;<\/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.Services.AddControllers();\r\nbuilder.Services.AddEndpointsApiExplorer();\r\nbuilder.Services.AddDaprClient();\r\n\r\nvar app = builder.Build();\r\n\r\napp.MapGet(&quot;\/send-event\/{eventText}&quot;, async (string eventText, DaprClient client) =&gt;\r\n{\r\n    HttpClient httpClient = new();\r\n\r\n    Event @event = new(eventText);\r\n    string jsonData = JsonSerializer.Serialize(@event, options: new JsonSerializerOptions() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase });\r\n\r\n    httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(MediaTypeNames.Application.Json));\r\n    StringContent body = new(jsonData, Encoding.UTF8, MediaTypeNames.Application.Json);\r\n    var response = await httpClient.PostAsync($&quot;http:\/\/localhost:2001\/v1.0\/publish\/pubsub\/example.event&quot;, body);\r\n\r\n    return Results.Ok($&quot;Status Code : {response.StatusCode} | Event : {@event.Text}\\&quot;&quot;);\r\n});\r\n\r\napp.UseHttpsRedirection();\r\napp.MapControllers();\r\napp.Run(&quot;https:\/\/localhost:1000&quot;);\r\n<\/pre>\n<\/div>\n<p>Yukar\u0131daki kod blo\u011funu incelerseniz e\u011fer <strong>11<\/strong> ile <strong>20.<\/strong> sat\u0131r aral\u0131\u011f\u0131nda HTTP protokol\u00fc \u00fczerinden bir event yay\u0131nlama i\u015flemi ger\u00e7ekle\u015ftirilmektedir. Bu i\u015flem i\u00e7in <strong>18.<\/strong> sat\u0131rda <code>http:\/\/localhost:2001\/v1.0\/publish\/pubsub\/example.event<\/code> adresine POST iste\u011fi g\u00f6nderilmektedir. <strong>Bu adreste nerden \u00e7\u0131kt\u0131 hoca la?<\/strong> diye sordu\u011funuzu duyar gibiyim&#8230; Tabi ki de kafam\u0131za g\u00f6re bir adres yaz\u0131p istekte bulunmad\u0131\u011f\u0131m\u0131z a\u015fikar. Dapr, HTTP \u00fczerinden ger\u00e7ekle\u015ftirilecek pub\/sub i\u015flemleri i\u00e7in a\u015fa\u011f\u0131daki formatta bir url&#8217;e istek g\u00f6ndermemiz gerekti\u011fini bizlere s\u00f6ylemektedir.<br \/>\n<code style=\"font-size:15px;color:red;\"><strong>http:\/\/localhost:<span style=\"color:green;\">&lt;daprPort&gt;<\/span>\/v1.0\/publish\/<span style=\"color:green;\">&lt;pubsubname&gt;<\/span>\/<span style=\"color:green;\">&lt;topic&gt;<\/span>[?&lt;metadata&gt;]<\/strong><\/code><br \/>\nBu adres \u015femas\u0131ndaki <span style=\"color:green;\">&lt;daprPort&gt;<\/span>, haberle\u015fme sa\u011flanmak istenen servisin birazdan nas\u0131l tan\u0131mlanabilece\u011fini g\u00f6rece\u011fimiz Dapr HTTP Port&#8217;una kar\u015f\u0131l\u0131k gelmektedir. <span style=\"color:green;\">&lt;pubsubname&gt;<\/span>, hangi pub\/sub component&#8217;i kullan\u0131l\u0131yorsa onun ad\u0131na kar\u015f\u0131l\u0131k gelmektedir. Ve son olarak <span style=\"color:green;\">&lt;topic&gt;<\/span> ise event&#8217;in publish edildi\u011fi topic ad\u0131na kar\u015f\u0131l\u0131k gelmektedir.<\/p>\n<p>HTTP protokol\u00fc \u00fczerinden \u00e7al\u0131\u015fma s\u00fcrecinde, yukar\u0131daki gibi bir event publish edildi\u011fi taktirde; Dapr, consumer g\u00f6revi g\u00f6ren serviste<br \/>\n<code>http:\/\/localhost:&lt;appPort&gt;<span style=\"color:green;\">\/dapr\/subscribe<\/span><\/code> endpoint&#8217;ini GET request&#8217;i ile tetiklemektedir. B\u00f6ylece ilgili serviste bir event&#8217;in publish edildi\u011fine dair bilgilenilmi\u015f olunacakt\u0131r. \u015eimdi bu mant\u0131k do\u011frultusunda &#8216;Dapr.Basic.ServiceB&#8217; servisini ise a\u015fa\u011f\u0131daki gibi geli\u015ftiriniz.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nvar builder = WebApplication.CreateBuilder(args);\r\nvar app = builder.Build();\r\n\r\napp.MapGet(&quot;\/dapr\/subscribe&quot;, () =&gt;\r\n{\r\n    return Results.Json(new&#x5B;] {new\r\n    {\r\n        PubSubName = &quot;pubsub&quot;,\r\n        Topic = &quot;example.event&quot;,\r\n        Route = &quot;\/get-event&quot;\r\n    } });\r\n});\r\n\r\napp.MapPost(&quot;\/get-event&quot;, (DaprData&lt;Event&gt; @event) =&gt;\r\n{\r\n    Console.WriteLine(@event.Data.Text);\r\n});\r\n\r\napp.Run(&quot;https:\/\/localhost:2000&quot;);\r\nrecord DaprData&lt;T&gt;(T Data);\r\n<\/pre>\n<\/div>\n<p>Yukar\u0131daki \u00e7al\u0131\u015fmaya dikkat ederseniz, <strong>4<\/strong> ile <strong>12.<\/strong> sat\u0131r aral\u0131\u011f\u0131nda herhangi bir event yay\u0131nland\u0131\u011f\u0131 taktirde Dapr taraf\u0131ndan tetiklenecek olan <code>\/dapr\/subscribe<\/code> endpoint&#8217;ine kar\u015f\u0131l\u0131k bir minimal api tan\u0131mlanm\u0131\u015ft\u0131r. Bu action i\u00e7erisinde, JSON olarak &#8216;PubSubName&#8217;, &#8216;Topic&#8217; ve &#8216;Route&#8217; bilgilerini bar\u0131nd\u0131ran bir obje, \u00fcretilmi\u015f bir koleksiyona dahil olacak \u015fekilde geriye return edilmektedir. Burada &#8216;Route&#8217;ta tan\u0131ml\u0131 olan <code>\/get-event<\/code> de\u011feri sayesinde publish edilmi\u015f olan event&#8217;\u0131n hangi endpoint i\u00e7erisinde handle edilece\u011fi ifade edilmektedir. Dolay\u0131s\u0131yla bu a\u015famadan sonra <strong>14<\/strong> ile <strong>17.<\/strong> sat\u0131r aral\u0131\u011f\u0131ndaki action tetiklenecektir.<\/p>\n<p>\u0130lgili action&#8217;a g\u00f6z atarsan\u0131z e\u011fer <strong>20.<\/strong> sat\u0131rda tan\u0131mlanm\u0131\u015f olan &#8216;DaprData&lt;T&gt;&#8217; record t\u00fcr\u00fcnden bir parametre almaktad\u0131r. Burada T yerine &#8216;Event&#8217; yaz\u0131larak gelen de\u011fer tam olarak elde edilmi\u015f olmaktad\u0131r. Bu tarz bir \u00e7al\u0131\u015fman\u0131n nedenini sorarsan\u0131z e\u011fer bu metota gelen verinin yap\u0131s\u0131n\u0131n a\u015fa\u011f\u0131daki gibi olmas\u0131d\u0131r.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n{\r\n  &quot;data&quot;: {\r\n    &quot;text&quot;: &quot;nevin&quot;\r\n  },\r\n  &quot;datacontenttype&quot;: &quot;application\/json; charset=utf-8&quot;,\r\n  &quot;id&quot;: &quot;dfd6a336-b99f-4cc7-a384-b8a31ca4f791&quot;,\r\n  &quot;pubsubname&quot;: &quot;pubsub&quot;,\r\n  &quot;source&quot;: &quot;serviceb&quot;,\r\n  &quot;specversion&quot;: &quot;1.0&quot;,\r\n  &quot;time&quot;: &quot;2022-11-14T01:26:03+03:00&quot;,\r\n  &quot;topic&quot;: &quot;example.event&quot;,\r\n  &quot;traceid&quot;: &quot;00-97ecee8642fbcf8549f43db6f9d7074c-4b255f63bafe0b31-01&quot;,\r\n  &quot;traceparent&quot;: &quot;00-97ecee8642fbcf8549f43db6f9d7074c-4b255f63bafe0b31-01&quot;,\r\n  &quot;tracestate&quot;: &quot;&quot;,\r\n  &quot;type&quot;: &quot;com.dapr.event.sent&quot;\r\n}\r\n<\/pre>\n<\/div>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere bir\u00e7ok bilgi tek bir json datas\u0131 i\u00e7erisinde k\u00fcm\u00fclatif olarak gelmektedir. Haliyle burada publish edilmi\u015f event&#8217;i temsil edebilmek i\u00e7in bu json datas\u0131n\u0131n i\u00e7erisindeki &#8216;data&#8217; parametresini alabilecek bir \u00e7al\u0131\u015fma yapmam\u0131z gerekecekti. Bunun i\u00e7in generic bir record ile gayet efektif bir \u00e7\u00f6z\u00fcm getirebildik kanaatindeyim \ud83d\ude42 Action tetiklendi\u011finde deserialize s\u00fcreci ba\u015flat\u0131lacak ve &#8216;DaprData&lt;T&gt;&#8217; t\u00fcr\u00fcne g\u00f6re bir \u00e7\u0131kt\u0131 al\u0131nacakt\u0131r. Ee &#8216;DaprData&lt;T&gt;&#8217; t\u00fcr\u00fc de i\u00e7erisinde &#8216;Data&#8217; parametresi ald\u0131\u011f\u0131 i\u00e7in ilgili json i\u00e7erisindeki &#8216;data&#8217; bu parametreyle e\u015fle\u015fecek ve bizlere direkt T parametresine verilen t\u00fcrde de\u011feri getirecektir.<\/p>\n<p>\u0130\u015fte bu kadar&#8230;<\/p>\n<p>Son olarak a\u015fa\u011f\u0131daki talimatlar e\u015fli\u011finde uygulamalar\u0131 Dapr \u00fczerinden aya\u011fa kald\u0131r\u0131p, testlerinizi ger\u00e7ekle\u015ftiriniz.<br \/>\n<code><strong>dapr run --app-id servicea <span style=\"color:green;\">--app-ssl<\/span> --app-port 1000 <span style=\"color:green;\">--dapr-http-port 1001<\/span> -- dotnet run<\/strong><\/code><br \/>\n<code><strong>dapr run --app-id serviceb <span style=\"color:green;\">--app-ssl<\/span> --app-port 2000 <span style=\"color:green;\">--dapr-http-port 2001<\/span> -- dotnet run<\/strong><\/code><br \/>\n<span style=\"font-size:12px;color:gray;\">(<span style=\"color:green;\">&#8211;dapr-http-port &#8230;<\/span> parametresi aya\u011fa kald\u0131r\u0131lan uygulaman\u0131n Dapr&#8217;da HTTP \u00fczerinden eri\u015filebilen port&#8217;unu ifade etmektedir. Yukar\u0131larda bahsi ge\u00e7en <span style=\"color:green;\">&lt;daprPort&gt;<\/span> alan\u0131na ilgili servisin &#8211;dapr-http-port bilgisi verilmelidir.)<\/span><br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-ve-Pratikte-Inceleyelim.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-ve-Pratikte-Inceleyelim.gif\" alt=\"Distributed Application Runtime(Dapr) Nedir? Teorik ve Pratikte \u0130nceleyelim\" width=\"800\" height=\"426\" class=\"aligncenter size-full wp-image-25857\" \/><\/a>Evet, b\u00f6ylece yine herhangi bir k\u00fct\u00fcphane kullanmaks\u0131z\u0131n Dapr ile HTTP \u00fczerinden iki servisin haberle\u015fmesini sa\u011flayabilmi\u015f bulunuyoruz.\n<\/li>\n<\/ul>\n<h4>Component De\u011fi\u015ftirme<\/h4>\n<p>Dapr&#8217;\u0131n component&#8217;leri bar\u0131nd\u0131rd\u0131\u011f\u0131 default path&#8217;inin Windows i\u00e7in <code>C:\\Users\\[name]\\.dapr<\/code>, Linux i\u00e7in ise <code>$HOME\/.dapr<\/code> oldu\u011funu daha \u00f6nceki sat\u0131rlar\u0131m\u0131zda bildirmi\u015ftik.<\/p>\n<p>Bir component&#8217;i de\u011fi\u015ftirmek istedi\u011fimizde tek yap\u0131lmas\u0131 gereken ilgili YAML dosyas\u0131n\u0131n istenilen component i\u00e7eri\u011fi ile de\u011fi\u015ftirilmesidir. Misal olarak, i\u00e7eri\u011fimiz s\u00fcrecinde default olarak gelen ve pub\/sub componenti olarak kullanm\u0131\u015f oldu\u011fumuz Redis&#8217;i RabbitMQ component&#8217;i ile de\u011fi\u015ftirmek istiyorsak e\u011fer yapmam\u0131z gereken <a href=\"https:\/\/docs.dapr.io\/reference\/components-reference\/supported-pubsub\/setup-rabbitmq\/\" rel=\"noopener\" target=\"_blank\">\u015furadan<\/a> RabbitMQ component&#8217;ine ait format\u0131 al\u0131p ilgili dizindeki &#8216;pubsub.yaml&#8217; dosyas\u0131 i\u00e7erisindekilerle de\u011fi\u015ftirmektir.<\/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:\/\/xfj***.rmq.cloudamqp.co**hzhsq&quot;\r\n  - name: consumerID\r\n    value: myapp\r\n  - name: durable\r\n    value: false\r\n  - name: deletedWhenUnused\r\n    value: false\r\n  - name: autoAck\r\n    value: false\r\n  - name: deliveryMode\r\n    value: 0\r\n  - name: requeueInFailure\r\n    value: false\r\n  - name: prefetchCount\r\n    value: 0\r\n  - name: reconnectWait\r\n    value: 0\r\n  - name: concurrencyMode\r\n    value: parallel\r\n  - name: publisherConfirm\r\n    value: false\r\n  - name: backOffPolicy\r\n    value: exponential\r\n  - name: backOffInitialInterval\r\n    value: 100\r\n  - name: backOffMaxRetries\r\n    value: 16\r\n  - name: enableDeadLetter # Optional enable dead Letter or not\r\n    value: true\r\n  - name: maxLen # Optional max message count in a queue\r\n    value: 3000\r\n  - name: maxLenBytes # Optional maximum length in bytes of a queue.\r\n    value: 10485760\r\n  - name: exchangeKind\r\n    value: fanout\r\n<\/pre>\n<\/div>\n<p>Tabi burada RabbitMQ sunucusu cloud yahut docker ortamlar\u0131ndan hangisindeyse ona g\u00f6re host yolunun ve di\u011fer konfig\u00fcrasyonlar\u0131n yap\u0131n\u0131za g\u00f6re \u00f6zelle\u015ftirilmesi gerekmektedir.<\/p>\n<p>Velhas\u0131l kelam, component de\u011fi\u015fikli\u011fini yapt\u0131ktan sonra Dapr&#8217;\u0131 kald\u0131r\u0131p Self-hosted modda tekrardan aya\u011fa kald\u0131rman\u0131z gerekmektedir.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-ve-Pratikte-Inceleyelim.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-ve-Pratikte-Inceleyelim.png\" alt=\"Distributed Application Runtime(Dapr) Nedir? Teorik ve Pratikte \u0130nceleyelim\" width=\"840\" height=\"323\" class=\"aligncenter size-full wp-image-25863\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-ve-Pratikte-Inceleyelim.png 840w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-ve-Pratikte-Inceleyelim-300x115.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-ve-Pratikte-Inceleyelim-768x295.png 768w\" sizes=\"auto, (max-width: 840px) 100vw, 840px\" \/><\/a><\/p>\n<p><strong>Component Dizinini De\u011fi\u015ftirme<\/strong><br \/>\nComponent dosyalar\u0131n\u0131(YAML) bulunduklar\u0131 default dizinin d\u0131\u015f\u0131nda istedi\u011fimiz herhangi bir path&#8217;e de ta\u015f\u0131yabiliriz. Misal olarak solution ile ayn\u0131 dizinde olan &#8216;Components&#8217; isimli bir klas\u00f6r i\u00e7erisine koymak istedi\u011fimizi varsayarsak e\u011fer bunun i\u00e7in Dapr ile uygulamalar\u0131 aya\u011fa kald\u0131r\u0131rken a\u015fa\u011f\u0131daki gibi talimat s\u00fcrecinde <span style=\"color:red;\">&#8211;components-path<\/span> parametresi ile de\u011fer olarak ilgili path&#8217;i ge\u00e7meliyiz.<\/p>\n<p><code><strong>dapr run --app-id servicea <span style=\"color:green;\">--app-ssl<\/span> --app-port 1000 <span style=\"color:green;\">--dapr-http-port 1001<\/span> <span style=\"color:red;\">--components-path ..\/components<\/span> -- dotnet run<\/strong><\/code><br \/>\n<code><strong>dapr run --app-id serviceb <span style=\"color:green;\">--app-ssl<\/span> --app-port 2000 <span style=\"color:green;\">--dapr-http-port 2001<\/span> <span style=\"color:red;\">--components-path ..\/components<\/span> -- dotnet run<\/strong><\/code><\/p>\n<h4>Dapr Dashboard<\/h4>\n<p>Dapr, yap\u0131lan t\u00fcm \u00e7al\u0131\u015fmalar\u0131 sa\u011flam\u0131\u015f oldu\u011fu dashboard \u00fczerinden g\u00f6rselle\u015ftirerek bizlere sunmaktad\u0131r. Bunun i\u00e7in <code>dapr dashboard<\/code> talimat\u0131n\u0131 vererek dashboard&#8217;u 8080 portunda aya\u011fa kald\u0131rabilir ve <a href=\"http:\/\/localhost:8080\" rel=\"noopener\" target=\"_blank\">http:\/\/localhost:8080<\/a> adresi \u00fczerinden direkt eri\u015fim g\u00f6sterebilirsiniz.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-ve-Pratikte-Inceleyelim-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-ve-Pratikte-Inceleyelim-1.png\" alt=\"Distributed Application Runtime(Dapr) Nedir? Teorik ve Pratikte \u0130nceleyelim\" width=\"434\" height=\"42\" class=\"aligncenter size-full wp-image-25868\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-ve-Pratikte-Inceleyelim-1.png 434w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-ve-Pratikte-Inceleyelim-1-300x29.png 300w\" sizes=\"auto, (max-width: 434px) 100vw, 434px\" \/><\/a><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-ve-Pratikte-Inceleyelim-1.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-ve-Pratikte-Inceleyelim-1.gif\" alt=\"Distributed Application Runtime(Dapr) Nedir? Teorik ve Pratikte \u0130nceleyelim\" width=\"800\" height=\"431\" class=\"aligncenter size-full wp-image-25867\" \/><\/a><\/p>\n<h4>Dapr Observability\/Zipkin UI<\/h4>\n<p>Dapr, toplam\u0131\u015f oldu\u011fu \u00e7e\u015fitli metrikleri farkl\u0131 UI teknolojilerini de destekleyecek \u015fekilde default olarak Zipkin ile g\u00f6rselle\u015ftirmektedir. Zipkin UI&#8217;\u0131 a\u00e7abilmek i\u00e7in direkt <a href=\"http:\/\/localhost:9411\/\" rel=\"noopener\" target=\"_blank\">localhost:9411<\/a> adresine taray\u0131c\u0131da istek g\u00f6ndermeniz yeterlidir.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-ve-Pratikte-Inceleyelim-2.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-ve-Pratikte-Inceleyelim-2.gif\" alt=\"Distributed Application Runtime(Dapr) Nedir? Teorik ve Pratikte \u0130nceleyelim\" width=\"800\" height=\"431\" class=\"aligncenter size-full wp-image-25869\" \/><\/a>Ekran g\u00f6r\u00fcnt\u00fcs\u00fcnden de anla\u015f\u0131laca\u011f\u0131 \u00fczere servisler aras\u0131 pub\/sub temelli haberle\u015fmelerden tutun, hemen hemen t\u00fcm bilgileri Dapr&#8217;\u0131n observability \u00f6zelli\u011fi sayesinde elde ederek, g\u00f6zlemleyebilmekteyiz.<\/p>\n<h4>Dapr &#8211; Visual Studio Code Extension<\/h4>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-ve-Pratikte-Inceleyelim-2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/11\/Distributed-Application-RuntimeDapr-Nedir-Teorik-ve-Pratikte-Inceleyelim-2.png\" alt=\"\" width=\"225\" height=\"262\" class=\"alignleft size-full wp-image-25871\" \/><\/a>Dapr, uygulamalar\u0131m\u0131z\u0131 daha iyi y\u00f6netmek ve debug edebilmemiz i\u00e7in Visual Studio Code \u00fczerinden bir extension sunmaktad\u0131r.<\/p>\n<p>\u0130lgili extension&#8217;a a\u015fa\u011f\u0131daki adresten eri\u015fim g\u00f6sterebilirsiniz.<br \/>\n<a href=\"https:\/\/docs.dapr.io\/developing-applications\/ides\/vscode\/vscode-dapr-extension\/\" rel=\"noopener\" target=\"_blank\">https:\/\/docs.dapr.io\/developing-applications\/ides\/vscode\/vscode-dapr-extension\/<\/a><\/p>\n<p>Bu extension ile Dapr&#8217;da aya\u011fa kald\u0131r\u0131lm\u0131\u015f uygulamalara HTTP request&#8217;leri atabilir yahut event yay\u0131nlayarak testlerinizi ger\u00e7ekle\u015ftirebilirsiniz. <\/p>\n<p>Nihai olarak,<br \/>\nG\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere, \u00e7a\u011f\u0131n gere\u011fi olarak yaz\u0131l\u0131msal operasyonlarda her ne kadar sorumluluklar\u0131 farkl\u0131 servislere b\u00f6lerek distributed yakla\u015f\u0131mlar sergiliyor olsakta ve bu sergiledi\u011fimiz yakla\u015f\u0131mlar neticesinde b\u00fct\u00fcnsel olarak yaz\u0131l\u0131m\u0131n performans\u0131 ve verimlili\u011fi i\u00e7in en efektif yollar\u0131 bulabilmek maksad\u0131yla t\u00fcrl\u00fc t\u00fcrl\u00fc \u00e7abalara ve teknolojilere ba\u015fvuruyor olsakta dikkat ederseniz bu da\u011f\u0131lm\u0131\u015fl\u0131\u011f\u0131n getirisi olan karma\u015f\u0131kl\u0131\u011f\u0131 y\u00f6netebilmek i\u00e7in yine tek elden \u00e7\u00f6z\u00fcmlere y\u00f6neliyoruz. Evet, ad\u0131na microservice diyoruz ama i\u015fin do\u011fas\u0131 gere\u011fi t\u00fcm bu par\u00e7alanm\u0131\u015f yap\u0131y\u0131 y\u00f6netebilmek i\u00e7in monolitik d\u00fc\u015f\u00fcnceden hala vazge\u00e7emiyoruz \ud83d\ude42 \u00c7\u00fcnk\u00fc dedi\u011fim gibi i\u015fin do\u011fas\u0131nda bu var&#8230; Da\u011f\u0131tmak lakin tek bir standart ile da\u011f\u0131tmak var&#8230;<\/p>\n<p>\u0130\u015fte bu standartlardan biri olan Dapr&#8217;\u0131 m\u00fcmk\u00fcn mertebe teferruatl\u0131 incelemeye ve pratiksel olarak tecr\u00fcbe etmeye \u00e7al\u0131\u015fm\u0131\u015f olduk&#8230;<\/p>\n<p>\u00dc\u015fenmeden okuyup, e\u015flik etti\u011finiz i\u00e7in te\u015fekk\u00fcr ederim&#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\u015fmay\u0131 a\u015fa\u011f\u0131daki github adresinden edinebilirsiniz.<br \/>\n<a href=\"https:\/\/github.com\/gncyyldz\/Dapr_Examining\" rel=\"noopener\" target=\"_blank\">https:\/\/github.com\/gncyyldz\/Dapr_Examining<\/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 microservice uygulamalar\u0131 geli\u015ftirirken cloud&#8217;da resilient ve portable bir \u015fekilde \u00e7e\u015fitli dillerde \u00e7al\u0131\u015fma olana\u011f\u0131 sa\u011flayan event-driven runtime olan Dapr(Distributed Application Runtime)&#8217;\u0131n ne oldu\u011fu, microservice uygulamalar\u0131 geli\u015ftirme s\u00fcre\u00e7lerindeki ya\u015fan\u0131lan zorluklar\u0131n \u00fcstesinden gelinmesi i\u00e7in&#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":25874,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4698],"tags":[4701,4699,4711,4715,4700,4705,4717,4720,4719,4718,4713,4714,4706,4710,4716,4712,4704,4703,4702,4707,4708,4709],"class_list":["post-25814","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dapr","tag-building-blocks","tag-dapr","tag-dapr-api","tag-dapr-bindings","tag-dapr-building-blocks","tag-dapr-component","tag-dapr-configuration-stores","tag-dapr-dashboard","tag-dapr-locks","tag-dapr-middleware","tag-dapr-name-resolution","tag-dapr-pub-sub-brokers","tag-dapr-rabbitmq","tag-dapr-sdk","tag-dapr-secret-stores","tag-dapr-state-stores","tag-dapr-aspnetcore","tag-dapr-client","tag-microservice-dapr","tag-open-telemetry","tag-otel","tag-zipkin"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/25814","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=25814"}],"version-history":[{"count":28,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/25814\/revisions"}],"predecessor-version":[{"id":25873,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/25814\/revisions\/25873"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/25874"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=25814"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=25814"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=25814"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}