{"id":4251,"date":"2023-02-01T20:54:50","date_gmt":"2023-02-01T19:54:50","guid":{"rendered":"https:\/\/gokhan-gokalp.com\/?p=4251"},"modified":"2023-02-01T22:46:09","modified_gmt":"2023-02-01T21:46:09","slug":"building-microservices-by-using-dapr-and-net-with-minimum-effort-02-azure-container-apps","status":"publish","type":"post","link":"https:\/\/gokhan-gokalp.com\/tr\/building-microservices-by-using-dapr-and-net-with-minimum-effort-02-azure-container-apps\/","title":{"rendered":"Dapr ve .NET Kullanarak Minimum Efor ile Microservice&#8217;ler Geli\u015ftirmek &#8211; 02 (Azure Container Apps)"},"content":{"rendered":"<p>Bir \u00f6nceki makale serisinde <strong><em>Dapr<\/em><\/strong> projesinden ve faydalar\u0131ndan bahsedip, local ortamda self-hosted mode olarak <em>.NET 6<\/em> ile iki adet \u00f6rnek microservice geli\u015ftirmi\u015ftik. (E\u011fer ilk seriyi okumad\u0131 iseniz, <em><a href=\"https:\/\/gokhan-gokalp.com\/building-microservices-by-using-dapr-and-net-with-minimum-effort-01\/\">buradan<\/a> <\/em>ula\u015fabilirsiniz.)<\/p>\n<p>Bu makale kapsam\u0131nda ise bir \u00f6nceki makalede geli\u015ftirmi\u015f oldu\u011fumuz \u00f6rnek <em>ShoppingCart<\/em> ve <em>Recommendation<\/em> microservice&#8217;lerinin default olan <em>Dapr<\/em> component&#8217;lerini <em><strong>Azure<\/strong><\/em> resource&#8217;lar\u0131 ile de\u011fi\u015ftirerek, <em><strong>Azure Container Apps<\/strong><\/em> \u00fczerine deployment i\u015flemini ger\u00e7ekle\u015ftirece\u011fiz.<\/p>\n<p>\u00d6ncelikle konuya <em>Azure Container Apps<\/em> ile ilgili k\u00fc\u00e7\u00fck bir giri\u015f yaparak ba\u015flayal\u0131m.<\/p>\n<h2>Azure Container Apps<\/h2>\n<p><em>Azure Container Apps<\/em>, <em>Microsoft<\/em>&#8216;un May\u0131s 2022&#8217;de <em>GA<\/em> olarak duyurdu\u011fu uygulama odakl\u0131 olarak geli\u015ftirilmi\u015f bir fully managed serverless container runtime&#8217;\u0131d\u0131r.<\/p>\n<p><em>Azure Kubernetes Service<\/em> \u00fczerinde \u00e7al\u0131\u015f\u0131yor olup, temelinde <strong><em>KEDA<\/em><\/strong>, <strong><em>Envoy<\/em><\/strong> ve <strong><em>Dapr<\/em><\/strong> gibi g\u00fc\u00e7l\u00fc projeler bulunmaktad\u0131r. Yani <em>Azure Container Apps<\/em> kullanarak, t\u00fcm <em>Dapr API<\/em>&#8216;lar\u0131ndan <strong>managed<\/strong> bir \u015fekilde yararlanabilmekteyiz. Bu sayede bizlere <strong>g\u00fcvenli<\/strong>, <strong>mod\u00fcler<\/strong> ve <strong>\u00f6l\u00e7eklenebilir<\/strong> bir alt yap\u0131 sa\u011flayarak, bizlerin daha \u00e7ok uygulama taraf\u0131na odaklanabilmesini sa\u011flamaktad\u0131r. Ayr\u0131ca <em>KEDA<\/em> sayesinde bizlere <strong>event-driven auto scaling<\/strong> ve <strong>zero-scaling<\/strong> sa\u011flayarak cost optimizasyonu yapabilmemize de olanak tan\u0131maktad\u0131r.<\/p>\n<p>Bildi\u011fimiz gibi <em>kubernetes<\/em> taraf\u0131nda <em>HPA<\/em>, <strong>CPU<\/strong> ve <strong>memory<\/strong> gibi resource metriclerine dayanarak horizontally auto scaling sa\u011flamaktad\u0131r. <em>KEDA<\/em> ile ise birden \u00e7ok metri\u011fi baz alarak horizontally auto scaling ger\u00e7ekle\u015ftirebilmekteyiz. <em>KEDA<\/em> hakk\u0131nda bilgi edinebilmek i\u00e7in ise, daha \u00f6nce <em><a href=\"https:\/\/gokhan-gokalp.com\/kubernetes-based-event-driven-autoscaling-with-keda-rabbitmq-and-net-core\/\" target=\"_blank\" rel=\"noopener\">burada<\/a> <\/em>ele alm\u0131\u015f oldu\u011fum makaleye bir g\u00f6z atabilirsiniz.<\/p>\n<p>E\u011fer sizlerde benim gibi aktif olarak uygulamalar\u0131n\u0131z\u0131 <em>kubernetes<\/em> ortam\u0131nda manage ediyorsan\u0131z, g\u00fczel noktalar\u0131n\u0131 es ge\u00e7ersek, infrastructure management ve configuration k\u0131sm\u0131n\u0131n u\u011fra\u015ft\u0131r\u0131c\u0131 oldu\u011funu biliyorsunuzdur. <em>Azure Container Apps<\/em> ise <em>kubernetes<\/em> taraf\u0131ndaki complexity&#8217;i ve gereken learning curve minimize edilerek, bizlere microservice-based uygulamalar\u0131m\u0131z\u0131 kolayca build ve host edebilece\u011fimiz fully managed bir ortam sa\u011flamaktad\u0131r.<\/p>\n<p><em>Azure Container Apps<\/em>&#8216;i bir <em>kubernetes<\/em> pod&#8217;u gibi d\u00fc\u015f\u00fcnebiliriz asl\u0131nda. Her bir <em>Azure Container App <\/em>i\u00e7erisinde ayn\u0131 life-cycle&#8217;\u0131 payla\u015fan birden \u00e7ok container bar\u0131nd\u0131r\u0131labilmektedir. Ayr\u0131ca revision&#8217;lar ile de versioning sa\u011flanmaktad\u0131r. K\u0131sacas\u0131 bir container app deploy etti\u011fimizde, otomatik olarak bir revision olu\u015fturulmaktad\u0131r. Ayr\u0131ca herhangi bir de\u011fi\u015fiklik veya update i\u015flemi ger\u00e7ekle\u015ftirdi\u011fimizde de revision&#8217;lar olu\u015fturulmaktad\u0131r. Olu\u015fturulan revision&#8217;lar ise immutable&#8217;d\u0131r. Birden \u00e7ok farkl\u0131 revision&#8217;\u0131 ayn\u0131 anda \u00e7al\u0131\u015ft\u0131rabilmek ve trafi\u011fi istedi\u011fimiz gibi aralar\u0131nda b\u00f6lebilmek de m\u00fcmk\u00fcnd\u00fcr. Default olarak ise single revision mode&#8217;unda \u00e7al\u0131\u015fmaktad\u0131r.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2023\/01\/azure-container-apps-revisions.png\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-4256 lazyload\" data-src=\"\/wp-content\/uploads\/2023\/01\/azure-container-apps-revisions.png\" alt=\"\" width=\"900\" height=\"610\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/01\/azure-container-apps-revisions.png 900w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/01\/azure-container-apps-revisions-300x203.png 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/01\/azure-container-apps-revisions-768x521.png 768w\" data-sizes=\"(max-width: 900px) 100vw, 900px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 900px; --smush-placeholder-aspect-ratio: 900\/610;\" \/><\/a><\/p>\n<p>Ayr\u0131ca monitoring ve observability ise <em>Log Analytics<\/em> arac\u0131l\u0131\u011f\u0131yla kolay bir \u015fekilde ger\u00e7ekle\u015ftirilebilmektedir. \u00d6zetle <em>Azure Container Apps<\/em> kullanarak cloud infra management veya container orchestration gibi konulara kafa yormadan, microservice-based uygulamalar\u0131m\u0131z\u0131 kolay bir \u015fekilde build ve host edebiliriz.<\/p>\n<h2>Component&#8217;ler ile Ba\u015flayal\u0131m<\/h2>\n<p>Bir \u00f6nceki makalede <strong>state-store<\/strong> ve <strong>pub\/sub<\/strong> i\u00e7in default gelen component&#8217;leri kullanm\u0131\u015ft\u0131k. <em>Dapr<\/em>&#8216;\u0131n pluggable bir yap\u0131ya sahip oldu\u011fundan ve component&#8217;leri herhangi bir kod de\u011fi\u015fikli\u011fi yapmadan bir ba\u015fka component ile de\u011fi\u015ftirebilmece\u011fimizden de bahsetmi\u015ftik.<\/p>\n<p>\u015eimdi ise state-store i\u00e7in <em>Azure Cosmos DB<\/em>&#8216;yi, pub\/sub i\u00e7in ise <em>Azure Service Bus<\/em>&#8216;\u0131 kullanaca\u011f\u0131z. <em>Azure Service Bus<\/em>&#8216;\u0131 olu\u015fturabilmek i\u00e7in <em><a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/service-bus-messaging\/service-bus-quickstart-portal#create-a-namespace-in-the-azure-portal\" target=\"_blank\" rel=\"noopener\">buray\u0131<\/a><\/em>, <em>Azure<\/em> <em>Cosmos DB<\/em>&#8216;yi olu\u015fturabilmek i\u00e7in ise <em><a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/cosmos-db\/nosql\/quickstart-portal#create-account\" target=\"_blank\" rel=\"noopener\">buray\u0131<\/a><\/em> takip edebilirsiniz. <em>Azure Cosmos DB<\/em>&#8216;yi olu\u015ftururken &#8220;<em>NoSQL API&#8217;<\/em>&#8221; se\u00e7ene\u011fini se\u00e7elim ve ard\u0131ndan &#8220;<em>DaprShop<\/em>&#8221; database&#8217;ini ve &#8220;<em>ShoppingCart<\/em>&#8221; container&#8217;\u0131n\u0131 da olu\u015ftural\u0131m. Ayr\u0131ca partition key olarak ise &#8220;\/id&#8221; se\u00e7ti\u011fimizden emin olal\u0131m. Ayr\u0131ca <em>Dapr<\/em>&#8216;\u0131n pub\/sub component&#8217;i i\u00e7in topic&#8217;lere ihtiyac\u0131m\u0131z olaca\u011f\u0131 i\u00e7in, <em>Azure Service Bus<\/em>&#8216;\u0131 olu\u015ftururken ise tier olarak &#8220;standard&#8221; \u0131 se\u00e7memiz gerekmektedir.<\/p>\n<p><em>Azure<\/em> service&#8217;lerini olu\u015fturduktan sonra \u00f6ncelikle \u00f6rnek projenin root klas\u00f6r\u00fc olan &#8220;<em>DaprShop<\/em>&#8221; klas\u00f6r\u00fc alt\u0131nda &#8220;<em>Components<\/em>&#8221; ad\u0131nda bir yeni klas\u00f6r olu\u015ftural\u0131m. Bu klas\u00f6r i\u00e7erisinde microservice&#8217;lerimiz \u00f6zelinde ihtiyac\u0131m\u0131z olan component&#8217;leri tan\u0131mlayaca\u011f\u0131z.<\/p>\n<p>\u0130lk olarak pub\/sub component&#8217;i ile ba\u015flayal\u0131m. Bunun i\u00e7in klas\u00f6r i\u00e7erisinde &#8220;<em>pubsub.yaml<\/em>&#8221; ad\u0131nda a\u015fa\u011f\u0131daki gibi bir dosya olu\u015ftural\u0131m.<\/p>\n<pre>componentType: pubsub.azure.servicebus\r\nversion: v1\r\nmetadata:\r\n  - name: connectionString\r\n    secretRef: connection-string-key\r\nsecrets:\r\n- name: connection-string-key\r\n  value: \"Endpoint=sb:\/\/dapr-poc-sbus.servicebus.windows.net\/;SharedAccessKeyName=YOUR_SHARED_ACCESS_KEU_NAME;SharedAccessKey=YOUR_SHARED_ACCESS_KEY\"<\/pre>\n<p>E\u011fer <em>Dapr<\/em> component schema&#8217;s\u0131n\u0131 bir \u00f6nceki makaleden hala hat\u0131rl\u0131yorsak, bu sefer schema&#8217;n\u0131n biraz daha sade oldu\u011funu fark etmi\u015fizdir. <em>Azure Container Apps<\/em> daha sadele\u015ftirilmi\u015f bir component schema&#8217;s\u0131 kullanmaktad\u0131r.<\/p>\n<blockquote><p><em><strong>NOT<\/strong>: <\/em>Schema ile ilgili daha detayl\u0131 kullan\u0131m bilgilerine ise, <em><a href=\"https:\/\/learn.microsoft.com\/en-gb\/azure\/container-apps\/dapr-overview?tabs=bicep1%2Cyaml#component-schema\" target=\"_blank\" rel=\"noopener\">buradan<\/a><\/em> eri\u015febilirsiniz.<\/p><\/blockquote>\n<p>Olu\u015fturmu\u015f oldu\u011fumuz bu pub\/sub component&#8217;i i\u00e7erisinde tek g\u00fcncellememiz gereken nokta, <em>Azure Service Bus<\/em>&#8216;\u0131n &#8220;<em>connectionStringKey<\/em>&#8221; bilgisidir.<\/p>\n<p>Ayr\u0131ca <em>Azure-hosted<\/em> resource&#8217;lara eri\u015firken dilersek <strong>managed identity<\/strong> de kullanabiliriz. <em>Azure-hosted<\/em> olmayan resource&#8217;lar i\u00e7in ise, <em>Dapr<\/em> secret store component&#8217;inden yararlanabilir ve <em>Azure Key Vault<\/em> integration&#8217;\u0131 ile birlikte secret&#8217;lar\u0131 kolay bir \u015fekilde y\u00f6netebiliriz. B\u00f6ylece secret bilgilerini component i\u00e7erisinde a\u00e7\u0131k bir \u015fekilde tan\u0131mlamam\u0131za gerek kalmayacakt\u0131r.<\/p>\n<p>\u015eimdi ise &#8220;<em>statestore.yaml<\/em>&#8221; ad\u0131nda bir dosya olu\u015ftural\u0131m.<\/p>\n<pre>componentType: state.azure.cosmosdb\r\nversion: v1\r\nmetadata:\r\n- name: url\r\n  value: https:\/\/dapr-poc-cosmosstate.documents.azure.com:443\/\r\n- name: masterkey\r\n  secretRef: cosmos-master-key\r\n- name: database\r\n  value: DaprShop\r\n- name: collection\r\n  value: ShoppingCart\r\nsecrets:\r\n- name: cosmos-master-key\r\n  value: \"YOUR_COSMOS_MASTER_KEY\"<\/pre>\n<p>Burada ise olu\u015fturmu\u015f oldu\u011fumuz <em>Azure Cosmos DB<\/em>&#8216;nin ilgili &#8220;<em>url<\/em>&#8220;, &#8220;<em>masterKey<\/em>&#8220;, &#8220;<em>database<\/em>&#8221; ve &#8220;<em>collection<\/em>&#8221; gibi bilgilerini belirtmemiz, state-store olarak kullanabilmemiz i\u00e7in yeterli olacakt\u0131r.<\/p>\n<p>G\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi farkl\u0131 component&#8217;leri tan\u0131mlayabilmek bu kadar kolay. Ayr\u0131ca component&#8217;ler \u00f6zelinde &#8220;scope&#8221; lar belirleyebilmek de m\u00fcmk\u00fcnd\u00fcr. B\u00f6ylece <em>Dapr<\/em> sidecar sadece ilgili scope&#8217;daki container app&#8217;ler i\u00e7in ilgili component&#8217;leri load etmektedir. Bu i\u015flemi ise a\u015fa\u011f\u0131daki \u015fekilde ger\u00e7ekle\u015ftirebiliriz.<\/p>\n<pre>scopes:\r\n  - [DAPR-APP-ID-1]\r\n  - [DAPR-APP-ID-2]<\/pre>\n<p>Scope belirtilmedi\u011finde ise ayn\u0131 environment i\u00e7erisindeki <em>Azure Container App&#8217;ler<\/em> deploy edilmi\u015f t\u00fcm component&#8217;leri default olarak load etmektedir.<\/p>\n<p>\u015eimdi <em>Azure Container Apps<\/em> environment ve <em>Azure Container App<\/em> olu\u015fturma i\u015flemlerine ge\u00e7ebiliriz ve ard\u0131ndan olu\u015fturmu\u015f oldu\u011fumuz component&#8217;lerin ve microservice&#8217;lerimizin deployment i\u015flemlerini ger\u00e7ekle\u015ftirece\u011fiz.<\/p>\n<h2>Azure Container Apps Env ve Container App Olu\u015ftural\u0131m<\/h2>\n<p>Deployment&#8217;a ba\u015flamadan \u00f6nce ilk olarak bir <em>Azure Container Apps<\/em> environment&#8217;\u0131 olu\u015fturmam\u0131z gerekmektedir. <em>Azure Container Apps<\/em> environment&#8217;\u0131 birden \u00e7ok <em>Azure Container App<\/em> bar\u0131nd\u0131ran bir secure boundary olarak d\u00fc\u015f\u00fcnebiliriz. Ayn\u0131 environment i\u00e7erisine deploy edilen <em>Azure Container App<\/em>&#8216;ler, ayn\u0131 virtual network i\u00e7erisine deploy olmaktad\u0131rlar ve ayn\u0131 <em>Azure Log Analytics<\/em> workspace&#8217;ini payla\u015fmaktad\u0131rlar.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2023\/01\/dapr-azure-container-app-env.jpg\"><img decoding=\"async\" class=\"size-full wp-image-4260 aligncenter lazyload\" data-src=\"\/wp-content\/uploads\/2023\/01\/dapr-azure-container-app-env.jpg\" alt=\"\" width=\"592\" height=\"402\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/01\/dapr-azure-container-app-env.jpg 592w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/01\/dapr-azure-container-app-env-300x204.jpg 300w\" data-sizes=\"(max-width: 592px) 100vw, 592px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 592px; --smush-placeholder-aspect-ratio: 592\/402;\" \/><\/a>\u015eimdi \u00f6ncelikle a\u015fa\u011f\u0131daki gibi <em>CLI<\/em> \u00fczerinden bir resource grup olu\u015ftural\u0131m.<\/p>\n<pre>az group create --name daprshop-rg --location \"westeurope\"<\/pre>\n<p>Ard\u0131ndan <em>Azure Container Apps<\/em> environment&#8217;\u0131n\u0131 olu\u015ftural\u0131m.<\/p>\n<pre>az containerapp env create \\\r\n--name daprshop-env \\\r\n--resource-group daprshop-rg \\\r\n--location \"westeurope\"<\/pre>\n<blockquote><p><em><strong>NOT<\/strong><\/em>: E\u011fer daha \u00f6nce &#8220;<em>containerapp<\/em>&#8221; extension&#8217;\u0131na sahip olmad\u0131ysan\u0131z, yukar\u0131daki komut \u00f6ncelikle bu extension&#8217;\u0131n kurulumunu ger\u00e7ekle\u015ftirecektir. Dilerseniz bu i\u015flemi \u00f6ncesinde de ger\u00e7ekle\u015ftirebilirsiniz. &#8220;<em>az extension add &#8211;name containerapp &#8211;upgrade<\/em>&#8220;<\/p><\/blockquote>\n<p><a href=\"\/wp-content\/uploads\/2023\/01\/container-app-env.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-4262 lazyload\" data-src=\"\/wp-content\/uploads\/2023\/01\/container-app-env.jpg\" alt=\"\" width=\"2006\" height=\"760\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/01\/container-app-env.jpg 2006w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/01\/container-app-env-300x114.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/01\/container-app-env-1024x388.jpg 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/01\/container-app-env-768x291.jpg 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/01\/container-app-env-1536x582.jpg 1536w\" data-sizes=\"(max-width: 2006px) 100vw, 2006px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 2006px; --smush-placeholder-aspect-ratio: 2006\/760;\" \/><\/a><\/p>\n<p>\u015eimdi olu\u015fturmu\u015f oldu\u011fumuz &#8220;<em>daprshop-env<\/em>&#8221; isimli <em>Azure Container Apps<\/em> environment&#8217;\u0131 i\u00e7erisinde yukar\u0131da tan\u0131mlam\u0131\u015f oldu\u011fumuz pub\/sub ve state-store component&#8217;lerini configure edelim.<\/p>\n<p>Bunun i\u00e7in <em>CLI<\/em> \u00fczerinden &#8220;<em>DaprShop<\/em>&#8221; klas\u00f6r\u00fc alt\u0131nda bulunan &#8220;<em>Components<\/em>&#8221; path&#8217;ine gidelim ve a\u015fa\u011f\u0131daki komutlar\u0131 kullanarak ilgili component&#8217;leri olu\u015fturmu\u015f oldu\u011fumuz environment i\u00e7in configure edelim.<\/p>\n<pre>az containerapp env dapr-component set \\\r\n--name daprshop-env \\\r\n--resource-group daprshop-rg \\\r\n--dapr-component-name statestore \\\r\n--yaml statestore.yaml<\/pre>\n<pre>az containerapp env dapr-component set \\\r\n--name daprshop-env \\\r\n--resource-group daprshop-rg \\\r\n--dapr-component-name pubsub \\\r\n--yaml pubsub.yaml<\/pre>\n<p>Ayr\u0131ca daha \u00f6nce \u00f6rnek projemiz i\u00e7erisinde bu component&#8217;lere eri\u015firken default olan &#8220;<em>statestore<\/em>&#8221; ve &#8220;<em>pubsub<\/em>&#8221; isimlerini kulland\u0131\u011f\u0131m\u0131z i\u00e7in, bu environment i\u00e7erisinde de isimlerini &#8220;<em>statestore<\/em>&#8221; ve &#8220;<em>pubsub<\/em>&#8221; olarak ayn\u0131 \u015fekilde koruyoruz.<\/p>\n<p>\u0130lgili env i\u00e7in configure edilen component&#8217;lere ister a\u015fa\u011f\u0131daki komutu kullanarak, istersek de <em>Azure<\/em> portal \u00fczerinden <em>Container Apps Environment<\/em> resource&#8217;una giderek eri\u015febiliriz.<\/p>\n<pre>az containerapp env dapr-component list  \\\r\n--name \"daprshop-env\" \\\r\n--resource-group \"daprshop-rg\"<\/pre>\n<p>Bu noktaya kadar <em>Azure Container Apps<\/em> environment&#8217;\u0131n\u0131 kullanmak istedi\u011fimiz <em>Dapr<\/em> component&#8217;leri ile birlikte haz\u0131rlam\u0131\u015f olduk. \u015eimdi ise geriye sadece \u00f6rnek projelerimiz olan <em>ShoppingCart<\/em> ve <em>Recommendation <\/em>microservice&#8217;lerinin <em>Azure Container App<\/em>&#8216;e deployment i\u015flemleri kald\u0131.<\/p>\n<p>Deployment i\u015flemine ge\u00e7meden \u00f6nce \u00f6rnek microservice&#8217;lerimizi containerize bir hale getirmemiz ve bir container registry&#8217;e push etmemiz gerekmektedir. Ben bu i\u015flemi daha \u00f6nce olu\u015fturmu\u015f oldu\u011fum <em>Azure Container Registry<\/em> \u00fczerinden ger\u00e7ekle\u015ftirece\u011fim. E\u011fer sizde bir container registry olu\u015fturmak isterseniz, <em><a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/container-registry\/container-registry-get-started-portal?tabs=azure-cli\" target=\"_blank\" rel=\"noopener\">buraya<\/a><\/em> g\u00f6z atabilirsiniz.<\/p>\n<p>Ek olarak <em>ShoppingCart<\/em> ve <em>Recommendation<\/em> microservice&#8217;lerinin &#8220;<em>Program.cs<\/em>&#8221; dosyas\u0131na gidelim ve &#8220;app.Run();&#8221; komutu i\u00e7erisinde daha \u00f6nce yazd\u0131\u011f\u0131m\u0131z specific portlar\u0131 silelim ve microservice&#8217;lerin default port 80 \u00fczerinden \u00e7al\u0131\u015fabilmelerine izin verelim.<\/p>\n<p>Ayr\u0131ca kullanacak oldu\u011fum <em>Dockerfile&#8217;lar<\/em> ise a\u015fa\u011f\u0131daki gibidir.<\/p>\n<p><strong>Recommendation.API<\/strong><\/p>\n<pre>FROM mcr.microsoft.com\/dotnet\/aspnet:6.0 AS base\r\nWORKDIR \/app\r\nEXPOSE 80\r\n\r\nFROM mcr.microsoft.com\/dotnet\/sdk:6.0 AS build\r\nWORKDIR \/src\r\nCOPY [\"DaprShop.Recommendation.API\/DaprShop.Recommendation.API.csproj\", \"DaprShop.Recommendation.API\/\"]\r\nCOPY [\"DaprShop.Contracts\/DaprShop.Contracts.csproj\", \"DaprShop.Contracts\/\"]\r\nRUN dotnet restore \"DaprShop.Recommendation.API\/DaprShop.Recommendation.API.csproj\"\r\nCOPY . .\r\nWORKDIR \"\/src\/DaprShop.Recommendation.API\"\r\nRUN dotnet build \"DaprShop.Recommendation.API.csproj\" -c Release -o \/app\/build\r\n\r\nFROM build AS publish\r\nRUN dotnet publish \"DaprShop.Recommendation.API.csproj\" -c Release -o \/app\/publish \/p:UseAppHost=false\r\n\r\nFROM base AS final\r\nWORKDIR \/app\r\nCOPY --from=publish \/app\/publish .\r\nENTRYPOINT [\"dotnet\", \"DaprShop.Recommendation.API.dll\"]\r\n<\/pre>\n<p><strong>ShoppingCart.API<\/strong><\/p>\n<pre>FROM mcr.microsoft.com\/dotnet\/aspnet:6.0 AS base\r\nWORKDIR \/app\r\nEXPOSE 80\r\n\r\nFROM mcr.microsoft.com\/dotnet\/sdk:6.0 AS build\r\nWORKDIR \/src\r\nCOPY [\"DaprShop.ShoppingCart.API\/DaprShop.ShoppingCart.API.csproj\", \"DaprShop.ShoppingCart.API\/\"]\r\nCOPY [\"DaprShop.Contracts\/DaprShop.Contracts.csproj\", \"DaprShop.Contracts\/\"]\r\nRUN dotnet restore \"DaprShop.ShoppingCart.API\/DaprShop.ShoppingCart.API.csproj\"\r\nCOPY . .\r\nWORKDIR \"\/src\/DaprShop.ShoppingCart.API\"\r\nRUN dotnet build \"DaprShop.ShoppingCart.API.csproj\" -c Release -o \/app\/build\r\n\r\nFROM build AS publish\r\nRUN dotnet publish \"DaprShop.ShoppingCart.API.csproj\" -c Release -o \/app\/publish \/p:UseAppHost=false\r\n\r\nFROM base AS final\r\nWORKDIR \/app\r\nCOPY --from=publish \/app\/publish .\r\nENTRYPOINT [\"dotnet\", \"DaprShop.ShoppingCart.API.dll\"]<\/pre>\n<p>Containerization i\u015flemini her iki \u00f6rnek microservice i\u00e7in ger\u00e7ekle\u015ftirdikten sonra, a\u015fa\u011f\u0131daki gibi s\u0131ras\u0131yla <em>Azure Container App<\/em> &#8216;e deployment i\u015flemlerini ger\u00e7ekle\u015ftirebiliriz.<\/p>\n<pre>az containerapp create \\\r\n  --name \"recommendation-api\"  \\\r\n  --resource-group \"daprshop-rg\" \\\r\n  --environment \"daprshop-env\" \\\r\n  --image \"YOUR_ACR_NAME.azurecr.io\/daprshop.recommendationapi:01\" \\\r\n  --registry-server \"YOUR_ACR_NAME.azurecr.io\" \\\r\n  --target-port 80 \\\r\n  --ingress 'external' \\\r\n  --min-replicas 1 \\\r\n  --max-replicas 1 \\\r\n  --enable-dapr \\\r\n  --cpu 0.25 \\\r\n  --memory 0.5Gi \\\r\n  --dapr-app-id recommendationapi \\\r\n  --dapr-app-port 80<\/pre>\n<pre>  az containerapp create \\\r\n  --name \"shoppingcart-api\"  \\\r\n  --resource-group \"daprshop-rg\" \\\r\n  --environment \"daprshop-env\" \\\r\n  --image \"YOUR_ACR_NAME.azurecr.io\/daprshop.shoppingcartapi:01\" \\\r\n  --registry-server \"YOUR_ACR_NAME.azurecr.io\" \\\r\n  --target-port 80 \\\r\n  --ingress 'external' \\\r\n  --min-replicas 1 \\\r\n  --max-replicas 1 \\\r\n  --enable-dapr \\\r\n  --cpu 0.25 \\\r\n  --memory 0.5Gi \\\r\n  --dapr-app-id shoppingcartapi \\\r\n  --dapr-app-port 80<\/pre>\n<p>Yukar\u0131daki parametrelerin baz\u0131lar\u0131n\u0131 k\u0131saca a\u00e7\u0131klamak gerekirse;<\/p>\n<ul>\n<li>&#8220;<em>environment<\/em>&#8221; parametresi ile <em>Azure Container App<\/em>&#8216;in hangi <em>Azure Container Apps Env<\/em> i\u00e7erisinde \u00e7al\u0131\u015fmas\u0131 gerekti\u011fini belirtiyoruz.<\/li>\n<li>&#8220;<em>registry-server<\/em>&#8221; parametresi ile ise ilgili image&#8217;in hangi repository&#8217;den \u00e7ekilece\u011fini belirtiyoruz. Default olarak dockerhub&#8217;a bakmaktad\u0131r.<\/li>\n<li>&#8220;<em>ingress<\/em>&#8221; microservice&#8217;lerimizi d\u0131\u015far\u0131ya expose edece\u011fimiz i\u00e7in external olarak belirtiyoruz. E\u011fer expose etmeye gerek yoksa, &#8220;internal&#8221; olarak da set edebiliriz.<\/li>\n<li>&#8220;<em>*-port<\/em>&#8221; parametreleri ile ise microservice&#8217;lerimizin dinliyor oldu\u011fu port&#8217;u belirtiyoruz.<\/li>\n<li>Ayr\u0131ca &#8220;<em>min-replicas<\/em>&#8221; se\u00e7ene\u011fini de 0 olarak set edebiliriz.<\/li>\n<\/ul>\n<p>Bunlar\u0131n d\u0131\u015f\u0131nda kullanabilece\u011fimiz farkl\u0131 parametreler de bulunmaktad\u0131r. Detayl\u0131 listeye ise <em><a href=\"https:\/\/learn.microsoft.com\/en-us\/cli\/azure\/containerapp?view=azure-cli-latest#az-containerapp-create\" target=\"_blank\" rel=\"noopener\">buradan<\/a><\/em> eri\u015febilirsiniz.<\/p>\n<p>Deployment i\u015flemlerinin ard\u0131ndan ilgili microservice&#8217;lerin <em>URL<\/em> bilgilerine ister <em>Azure<\/em> portal \u00fczerinden istersek de a\u015fa\u011f\u0131daki gibi bir komut ile eri\u015fim sa\u011flayabiliriz.<\/p>\n<pre>az containerapp show -n shoppingcart-api -g daprshop-rg --query properties.configuration.ingress.fqdn<\/pre>\n<pre>az containerapp show -n recommendation-api -g daprshop-rg --query properties.configuration.ingress.fqdn<\/pre>\n<p><a href=\"\/wp-content\/uploads\/2023\/01\/query-of-aca-fqdn.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-4270 lazyload\" data-src=\"\/wp-content\/uploads\/2023\/01\/query-of-aca-fqdn.jpg\" alt=\"\" width=\"2420\" height=\"216\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/01\/query-of-aca-fqdn.jpg 2420w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/01\/query-of-aca-fqdn-300x27.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/01\/query-of-aca-fqdn-1024x91.jpg 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/01\/query-of-aca-fqdn-768x69.jpg 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/01\/query-of-aca-fqdn-1536x137.jpg 1536w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/01\/query-of-aca-fqdn-2048x183.jpg 2048w\" data-sizes=\"(max-width: 2420px) 100vw, 2420px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 2420px; --smush-placeholder-aspect-ratio: 2420\/216;\" \/><\/a><\/p>\n<p>G\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi <em>Azure Container App <\/em>&#8216;e deploy edebilmek i\u015fte bu kadar kolay.<\/p>\n<h2>Test Edelim<\/h2>\n<p>Test edebilmek i\u00e7in bir \u00f6nceki makalede de yapt\u0131\u011f\u0131m\u0131z gibi yine <em>ShoppingCart API<\/em> \u2018\u0131n\u0131n\u00a0<em>Swagger UI<\/em>\u2018\u0131na eri\u015felim ve sepet\u2019e bir adet \u00fcr\u00fcn ekleyelim veya a\u015fa\u011f\u0131daki\u00a0<em>cURL<\/em> komutunu \u00e7al\u0131\u015ft\u0131ral\u0131m.<\/p>\n<pre>curl -X 'POST' \\\r\n  'https:\/\/YOUR_AZURE_CONTAINER_APP_URL\/api\/shopping-cart\/123456\/items' \\\r\n  -H 'accept: text\/plain' \\\r\n  -H 'Content-Type: application\/json' \\\r\n  -d '{\r\n  \"productId\": \"1\",\r\n  \"productName\": \"Samsung Z Fold 5\",\r\n  \"price\": 1400,\r\n  \"quantity\": 1\r\n}'<\/pre>\n<p>Ard\u0131ndan <em>Azure<\/em> portal \u00fczerinden ilgili <em>Azure<\/em> <em>Cosmos DB<\/em> collection&#8217;\u0131na giderek, \u00fcr\u00fcn&#8217;\u00fcn ilgili kullan\u0131c\u0131 i\u00e7in sepet&#8217;e eklendi\u011fini g\u00f6rebiliriz.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2023\/01\/dapr-cosmosdb.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-4273 lazyload\" data-src=\"\/wp-content\/uploads\/2023\/01\/dapr-cosmosdb.jpg\" alt=\"\" width=\"2386\" height=\"1168\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/01\/dapr-cosmosdb.jpg 2386w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/01\/dapr-cosmosdb-300x147.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/01\/dapr-cosmosdb-1024x501.jpg 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/01\/dapr-cosmosdb-768x376.jpg 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/01\/dapr-cosmosdb-1536x752.jpg 1536w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/01\/dapr-cosmosdb-2048x1003.jpg 2048w\" data-sizes=\"(max-width: 2386px) 100vw, 2386px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 2386px; --smush-placeholder-aspect-ratio: 2386\/1168;\" \/><\/a><\/p>\n<p>Ard\u0131ndan a\u015fa\u011f\u0131daki komut ile de <em>Recommendation API<\/em> loglar\u0131na eri\u015felim.<\/p>\n<pre>az containerapp logs show -n recommendation-api -g daprshop-rg --tail 100<\/pre>\n<p><a href=\"\/wp-content\/uploads\/2023\/01\/dapr-containerapp-logs.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-4274 lazyload\" data-src=\"\/wp-content\/uploads\/2023\/01\/dapr-containerapp-logs.jpg\" alt=\"\" width=\"2104\" height=\"478\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/01\/dapr-containerapp-logs.jpg 2104w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/01\/dapr-containerapp-logs-300x68.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/01\/dapr-containerapp-logs-1024x233.jpg 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/01\/dapr-containerapp-logs-768x174.jpg 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/01\/dapr-containerapp-logs-1536x349.jpg 1536w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/01\/dapr-containerapp-logs-2048x465.jpg 2048w\" data-sizes=\"(max-width: 2104px) 100vw, 2104px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 2104px; --smush-placeholder-aspect-ratio: 2104\/478;\" \/><\/a><\/p>\n<p>En alttaki log mesaj\u0131ndan g\u00f6rebildi\u011fimiz gibi \u00fcr\u00fcn&#8217;\u00fcn sepet&#8217;e eklenme i\u015flemi ard\u0131ndan <em>Azure Service Bus<\/em> \u00fczerine bir event publish edildi ve <em>Recommendation API<\/em> taraf\u0131ndan ba\u015far\u0131yla consume edildi.<\/p>\n<p>G\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi microservice&#8217;lerimiz <em>Azure Container Apps<\/em> \u00fczerine deployment i\u015flemleri s\u0131ras\u0131nda <em>Dapr<\/em> component&#8217;leri olarak farkl\u0131 teknolojiler kullanmam\u0131za ra\u011fmen, uygulama taraf\u0131nda herhangi bir de\u011fi\u015fiklik yapmad\u0131k.<\/p>\n<h2>Ek Bilgiler<\/h2>\n<h3>G\u00fcncelleme<\/h3>\n<p>Ayr\u0131ca yeni bir revision olu\u015fturaca\u011f\u0131m\u0131zda ise tek yapmam\u0131z gereken, a\u015fa\u011f\u0131daki update komutu ile birlikte de\u011fi\u015ftirmek istedi\u011fimiz parametreleri set etmek.<\/p>\n<pre>az containerapp update \\\r\n--name \"shoppingcart-api\"  \\\r\n--resource-group \"daprshop-rg\" \\\r\n--image \"YOUR_ACR_NAME.azurecr.io\/daprshop.shoppingcartapi:02\"<\/pre>\n<p>Ek olarak &#8220;<em>revision-suffix<\/em>&#8221; parametresini de kullanarak, revision isimlerini istedi\u011fimiz gibi customize edebiliriz. Default olarak unique bir revision name olu\u015fturulmaktad\u0131r.<\/p>\n<h3>Monitoring &amp; Observability<\/h3>\n<p>Log&#8217;lar ise daha \u00f6nce bahsetti\u011fimiz gibi <em>Azure Monitor Log Analytics<\/em>\u00a0\u00fczeride store edilmektedir. <em>Azure Container App <\/em>environment&#8217;\u0131n\u0131 olu\u015ftururken e\u011fer daha \u00f6nceden olu\u015fturu\u015fmu\u015f bir logs workspace id belirtmiyorsak, otomatik olarak bir <em>Log Analytics<\/em> <em>workspace<\/em> olu\u015fturulmaktad\u0131r. Log&#8217;lara ise ilgili <em>Log Analytics<\/em> i\u00e7erisinde bulunan custom log&#8217;lar sekmesinden eri\u015febilmekteyiz. System log&#8217;lar\u0131 i\u00e7in &#8220;<em>ContainerAppSystemlogs_CL<\/em>&#8220;, container log&#8217;lar\u0131 i\u00e7in ise &#8220;<em>ContainerAppConsoleLogs_CL<\/em>&#8221; table&#8217;lar\u0131na bakmam\u0131z gerekmektedir.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2023\/01\/logs-dapr-aca.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-4276 lazyload\" data-src=\"\/wp-content\/uploads\/2023\/01\/logs-dapr-aca.jpg\" alt=\"\" width=\"2188\" height=\"854\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/01\/logs-dapr-aca.jpg 2188w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/01\/logs-dapr-aca-300x117.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/01\/logs-dapr-aca-1024x400.jpg 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/01\/logs-dapr-aca-768x300.jpg 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/01\/logs-dapr-aca-1536x600.jpg 1536w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/01\/logs-dapr-aca-2048x799.jpg 2048w\" data-sizes=\"(max-width: 2188px) 100vw, 2188px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 2188px; --smush-placeholder-aspect-ratio: 2188\/854;\" \/><\/a><\/p>\n<p>Ayr\u0131ca <em>CLI<\/em> \u00fczerinden de container app ve environment log&#8217;lar\u0131na eri\u015febilmekteyiz.<\/p>\n<pre>az containerapp logs show -n YOUR_CONTAINERAPP_NAME -g YOUR_RG_NAME --tail 100<\/pre>\n<pre>az containerapp env logs show -n YOUR_ENV_NAME -g YOUR_RG_NAME<\/pre>\n<p>Performans monitoring i\u00e7in ise <em>Azure Container Apps<\/em> environment&#8217;\u0131n\u0131 olu\u015ftururken &#8220;<em>&#8211;dapr-instrumentation-key<\/em>&#8221; parametresini set etmemiz gerekmektedir. Bu \u015fekilde Dapr, service-to-service communication telemetry verilerini <em><strong>Azure Application Insight<\/strong><\/em>&#8216;a aktarabilmektedir.<\/p>\n<pre>az containerapp env create \\\r\n--name daprshop-env \\\r\n--resource-group daprshop-rg \\\r\n--location \"westeurope\" \\\r\n--dapr-instrumentation-key YOUR_APP_INSIGHT_INSTRUMENTATION_KEY<\/pre>\n<p>\u00d6zellikle <em>Application Insight<\/em>&#8216;\u0131n &#8220;<em>Transaction search<\/em>&#8221; ve &#8220;Application map&#8221; \u00f6zelli\u011fini kullanarak, uygulamalar\u0131m\u0131z aras\u0131ndaki performans sorunlar\u0131n\u0131 veya hatal\u0131 noktalar\u0131 kolayl\u0131kla adresleyebiliriz.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2023\/01\/appinsight-dapr-aca-scaled.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-4281 lazyload\" data-src=\"\/wp-content\/uploads\/2023\/01\/appinsight-dapr-aca-scaled.jpg\" alt=\"\" width=\"2560\" height=\"1550\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/01\/appinsight-dapr-aca-scaled.jpg 2560w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/01\/appinsight-dapr-aca-300x182.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/01\/appinsight-dapr-aca-1024x620.jpg 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/01\/appinsight-dapr-aca-768x465.jpg 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/01\/appinsight-dapr-aca-1536x930.jpg 1536w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/01\/appinsight-dapr-aca-2048x1240.jpg 2048w\" data-sizes=\"(max-width: 2560px) 100vw, 2560px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 2560px; --smush-placeholder-aspect-ratio: 2560\/1550;\" \/><\/a><\/p>\n<h3>Storage Mount<\/h3>\n<p>Bunlar\u0131n d\u0131\u015f\u0131nda bir storage mount etmek istiyorsak da, <em>kubernetes<\/em> taraf\u0131nda da oldu\u011fu gibi bu i\u015flemi <em>Azure Container Apps<\/em> ile de ger\u00e7ekle\u015ftirebiliriz. \u00d6rne\u011fin bir <strong><em>Azure Files<\/em><\/strong> share mount edebilmek i\u00e7in <em>Azure Container Apps<\/em> environment&#8217;\u0131n\u0131 olu\u015fturduktan sonra ilk olarak ilgili <em>Azure Files<\/em>&#8216;\u0131 olu\u015fturmu\u015f oldu\u011fumuz environment i\u00e7erisinde a\u015fa\u011f\u0131daki gibi link&#8217;lememiz gerekmektedir. Bunu i\u015flemi <em>kubernetes<\/em> taraf\u0131nda bir storage class eklemek gibi d\u00fc\u015f\u00fcnebiliriz san\u0131r\u0131m.<\/p>\n<pre>az containerapp env storage set --name YOUR_ENV_NAME --resource-group YOUR_RG_NAME \\\r\n    --storage-name YOUR_STORAGE_NAME \\\r\n    --azure-file-account-name YOUR_STORAGE_ACCOUNT_NAME \\\r\n    --azure-file-account-key YOUR_STORAGE_ACCOUNT_KEY \\\r\n    --azure-file-share-name YOUR_FILESHARE_NAME \\\r\n    --access-mode ReadWrite<\/pre>\n<p>Ard\u0131ndan tan\u0131mlam\u0131\u015f oldu\u011fumuz bu storage account&#8217;u mount etmek i\u00e7in ilgili <em>Azure Container App<\/em> i\u00e7erisinde bir volume olarak tan\u0131mlamam\u0131z gerekiyor. T\u0131pk\u0131 <em>kubernetes<\/em> pod&#8217;lar\u0131\u00a0i\u00e7in yapt\u0131\u011f\u0131m\u0131z gibi.<\/p>\n<p>Bu i\u015flemi ger\u00e7ekle\u015ftirebilmek i\u00e7in ise \u00f6ncelikle deploy etmi\u015f oldu\u011fumuz ilgili <em>Azure Container App<\/em>&#8216;in <em>YAML<\/em> file&#8217;\u0131n\u0131 CLI \u00fczerinden download edip, ard\u0131ndan gerekli d\u00fczenlemeleri yapt\u0131ktan sonra update etmemiz gerekmektedir.<\/p>\n<p>\u00d6rne\u011fin <em>ShoppingCart API &#8216;<\/em>\u0131n configuration bilgilerini <em>YAML<\/em> file olarak export edelim.<\/p>\n<pre>az containerapp show \\\r\n  --name shoppingcart-api \\\r\n  --resource-group daprshop-rg \\\r\n  --output yaml &gt; app.yaml<\/pre>\n<blockquote><p><em><strong>NOT<\/strong><\/em>: Configuration file&#8217;\u0131 i\u00e7erisinde &#8220;secrets&#8221; section&#8217;\u0131 varsa, bu k\u0131sm\u0131 silelim. Aksi takdirde mevcut secretler s\u00fcrece override edilecektir.<\/p><\/blockquote>\n<p>Bu configuration file&#8217;\u0131 i\u00e7erisinde ise volume ve volume mount tan\u0131mlama i\u015flemini &#8220;template&#8221; section&#8217;\u0131 alt\u0131nda a\u015fa\u011f\u0131daki gibi ger\u00e7ekle\u015ftirebiliriz.<\/p>\n<pre>template:\r\n  containers:\r\n  - image: lodoonl.azurecr.io\/daprshop.shoppingcartapi:005\r\n    name: shoppingcart-api\r\n    volumeMounts:\r\n    - volumeName: my-daprshop-storage\r\n      mountPath: \/mytodofolder\r\n    resources:\r\n      cpu: 0.25\r\n      ephemeralStorage: 1Gi\r\n      memory: 0.5Gi\r\n  initContainers: null\r\n  revisionSuffix: ''\r\n  scale:\r\n    maxReplicas: 1\r\n    minReplicas: 1\r\n    rules: null\r\n  volumes:\r\n  - name: my-daprshop-storage\r\n    storageName: YOUR_STORAGE_NAME\r\n    storageType: AzureFile<\/pre>\n<p>D\u00fczenlemelerin ard\u0131ndan ilgili <em>Azure Container App<\/em> &#8216;i bu configuration file&#8217;\u0131n\u0131 kullanarak a\u015fa\u011f\u0131daki gibi update etmemiz gerekmektedir.<\/p>\n<pre>az containerapp update \\\r\n  --name shoppingcart-api \\\r\n  --resource-group daprshop-rg \\\r\n  --yaml app.yaml \\\r\n  --output table<\/pre>\n<p>Umar\u0131m bu i\u015flemleri ilerleyen d\u00f6nemlerde bir ka\u00e7 parametre set ederek kolay bir \u015fekilde halledebilece\u011fimiz <em>Az CLI API<\/em>&#8216;lar\u0131 sa\u011flan\u0131r. Fakat \u015fimdilik <em>Az CLI<\/em> ile bu i\u015flemleri bu \u015fekilde manuel olarak ger\u00e7ekle\u015ftirmemiz gerekmektedir. Neyseki <em>ARM<\/em> template kullanarak deployment an\u0131nda bu i\u015flemleri ger\u00e7ekle\u015ftirebilmekteyiz. <em>ARM<\/em> template detaylar\u0131 i\u00e7in ise <em><a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/container-apps\/storage-mounts?pivots=aca-arm#azure-files\" target=\"_blank\" rel=\"noopener\">buraya<\/a><\/em> bir g\u00f6z atabilirsiniz.<\/p>\n<h2>Son S\u00f6zler<\/h2>\n<p>G\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi <em>Dapr<\/em> ile uyumlu bir \u015fekilde \u00e7al\u0131\u015fan <em>Azure Container Apps<\/em>, bizlere eforsuz bir \u015fekilde microservice-based uygulamalar\u0131m\u0131z\u0131 build ve host edebilme imkan\u0131 sa\u011flamaktad\u0131r. <em>Dapr<\/em> d\u0131\u015f\u0131nda arka plan\u0131nda bulundurdu\u011fu\u00a0<em>KEDA<\/em> ve <em>Envoy<\/em> gibi g\u00fc\u00e7l\u00fc projeler sayesinde de event-driven auto scaling gibi zengin yetenekleri de bizlere sunmaktad\u0131r. Fully managed bir service olmas\u0131 sayesinde de bizleri infrastructure\/cluster management ve configuration&#8217;\u0131 gibi i\u015flere harcayaca\u011f\u0131m\u0131z vakitten kurtarmaktad\u0131r.<\/p>\n<p>\u00d6zellikle sekt\u00f6r\u00fcn cloud&#8217;a ve cloud-native uygulama geli\u015ftirmelerine do\u011fru h\u0131zla kayd\u0131\u011f\u0131 bu son bir ka\u00e7 y\u0131lda, kurumlar\u0131n daha h\u0131zl\u0131 markete at\u0131labilmeleri ve m\u00fc\u015fterilerine daha h\u0131zl\u0131 value \u00fcretebilmeleri a\u00e7\u0131s\u0131ndan optimize edilmi\u015f best practice&#8217;ler i\u00e7eren fully managed bir service&#8217;i kullanmalar\u0131, olduk\u00e7a avantajl\u0131 olacakt\u0131r.<\/p>\n<h2>References<\/h2>\n<blockquote><p><em>https:\/\/learn.microsoft.com\/en-us\/azure\/container-apps\/get-started?tabs=bash<\/em><br \/>\n<em>https:\/\/learn.microsoft.com\/en-us\/azure\/container-apps\/storage-mounts?pivots=aca-cli<\/em><br \/>\n<em>https:\/\/learn.microsoft.com\/en-us\/azure\/architecture\/example-scenario\/serverless\/microservices-with-container-apps-dapr<\/em><br \/>\n<em>https:\/\/docs.dapr.io\/operations\/monitoring\/tracing\/otel-collector\/open-telemetry-collector-appinsights\/<\/em><\/p><\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>Bir \u00f6nceki makale serisinde Dapr projesinden ve faydalar\u0131ndan bahsedip, local ortamda self-hosted mode olarak .NET 6 ile iki adet \u00f6rnek microservice geli\u015ftirmi\u015ftik. (E\u011fer ilk seriyi okumad\u0131 iseniz, buradan ula\u015fabilirsiniz.) Bu makale kapsam\u0131nda ise bir \u00f6nceki makalede geli\u015ftirmi\u015f oldu\u011fumuz \u00f6rnek ShoppingCart ve Recommendation microservice&#8217;lerinin default olan&#8230;<\/p>\n<div class=\"more-link-wrapper\"><a class=\"more-link\" href=\"https:\/\/gokhan-gokalp.com\/tr\/building-microservices-by-using-dapr-and-net-with-minimum-effort-02-azure-container-apps\/\">Devam\u0131n\u0131 okuyun<span class=\"screen-reader-text\">Dapr ve .NET Kullanarak Minimum Efor ile Microservice&#8217;ler Geli\u015ftirmek &#8211; 02 (Azure Container Apps)<\/span><\/a><\/div>\n","protected":false},"author":1,"featured_media":4299,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,505,418,434,285,368],"tags":[635,662,661,660,649,659,532,259],"class_list":["post-4251","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-net","category-net-core","category-azure","category-containerizing","category-messaging","category-microservices","tag-net-6","tag-auto-scaling","tag-azure-cosmos-db","tag-azure-service-bus","tag-dapr","tag-dotnet","tag-keda","tag-microservice","entry"],"translation":{"provider":"WPGlobus","version":"3.0.2","language":"tr","enabled_languages":["en","tr"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"tr":{"title":true,"content":true,"excerpt":false}}},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Dapr ve .NET Kullanarak Minimum Efor ile Microservice&#039;ler Geli\u015ftirmek - 02 (Azure Container Apps) - G\u00f6khan G\u00f6kalp<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/gokhan-gokalp.com\/building-microservices-by-using-dapr-and-net-with-minimum-effort-02-azure-container-apps\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Dapr ve .NET Kullanarak Minimum Efor ile Microservice&#039;ler Geli\u015ftirmek - 02 (Azure Container Apps) - G\u00f6khan G\u00f6kalp\" \/>\n<meta property=\"og:url\" content=\"https:\/\/gokhan-gokalp.com\/building-microservices-by-using-dapr-and-net-with-minimum-effort-02-azure-container-apps\/\" \/>\n<meta property=\"og:site_name\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n<meta property=\"article:published_time\" content=\"2023-02-01T19:54:50+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-02-01T21:46:09+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/02\/dapr-aca-gokhan-gokalp.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"675\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"29 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/building-microservices-by-using-dapr-and-net-with-minimum-effort-02-azure-container-apps\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/building-microservices-by-using-dapr-and-net-with-minimum-effort-02-azure-container-apps\\\/\"},\"author\":{\"name\":\"G\u00f6khan G\u00f6kalp\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"headline\":\"Dapr ve .NET Kullanarak Minimum Efor ile Microservice&#8217;ler Geli\u015ftirmek &#8211; 02 (Azure Container Apps)\",\"datePublished\":\"2023-02-01T19:54:50+00:00\",\"dateModified\":\"2023-02-01T21:46:09+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/building-microservices-by-using-dapr-and-net-with-minimum-effort-02-azure-container-apps\\\/\"},\"wordCount\":4705,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"image\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/building-microservices-by-using-dapr-and-net-with-minimum-effort-02-azure-container-apps\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2023\\\/02\\\/dapr-aca-gokhan-gokalp.jpg\",\"keywords\":[\".net 6\",\"auto scaling\",\"azure cosmos db\",\"azure service bus\",\"dapr\",\"dotnet\",\"keda\",\"MicroService\"],\"articleSection\":[\".NET\",\".NET Core\",\"Azure\",\"Containerizing\",\"Messaging\",\"Microservices\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/gokhan-gokalp.com\\\/building-microservices-by-using-dapr-and-net-with-minimum-effort-02-azure-container-apps\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/building-microservices-by-using-dapr-and-net-with-minimum-effort-02-azure-container-apps\\\/\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/building-microservices-by-using-dapr-and-net-with-minimum-effort-02-azure-container-apps\\\/\",\"name\":\"Dapr ve .NET Kullanarak Minimum Efor ile Microservice'ler Geli\u015ftirmek - 02 (Azure Container Apps) - G\u00f6khan G\u00f6kalp\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/building-microservices-by-using-dapr-and-net-with-minimum-effort-02-azure-container-apps\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/building-microservices-by-using-dapr-and-net-with-minimum-effort-02-azure-container-apps\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2023\\\/02\\\/dapr-aca-gokhan-gokalp.jpg\",\"datePublished\":\"2023-02-01T19:54:50+00:00\",\"dateModified\":\"2023-02-01T21:46:09+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/building-microservices-by-using-dapr-and-net-with-minimum-effort-02-azure-container-apps\\\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/gokhan-gokalp.com\\\/building-microservices-by-using-dapr-and-net-with-minimum-effort-02-azure-container-apps\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/building-microservices-by-using-dapr-and-net-with-minimum-effort-02-azure-container-apps\\\/#primaryimage\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2023\\\/02\\\/dapr-aca-gokhan-gokalp.jpg\",\"contentUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2023\\\/02\\\/dapr-aca-gokhan-gokalp.jpg\",\"width\":1200,\"height\":675},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/building-microservices-by-using-dapr-and-net-with-minimum-effort-02-azure-container-apps\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/gokhan-gokalp.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Building Microservices by Using Dapr and .NET with Minimum Effort &#8211; 02 (Azure Container Apps)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#website\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/\",\"name\":\"G\u00f6khan G\u00f6kalp\",\"description\":\"C# &amp; Python lover\",\"publisher\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/gokhan-gokalp.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\",\"name\":\"G\u00f6khan G\u00f6kalp\",\"pronouns\":\"he\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"contentUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"caption\":\"G\u00f6khan G\u00f6kalp\"},\"logo\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\"},\"sameAs\":[\"https:\\\/\\\/gokhan-gokalp.com\"],\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/tr\\\/author\\\/gok-gokalp\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Dapr ve .NET Kullanarak Minimum Efor ile Microservice'ler Geli\u015ftirmek - 02 (Azure Container Apps) - G\u00f6khan G\u00f6kalp","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/gokhan-gokalp.com\/building-microservices-by-using-dapr-and-net-with-minimum-effort-02-azure-container-apps\/","og_locale":"tr_TR","og_type":"article","og_title":"Dapr ve .NET Kullanarak Minimum Efor ile Microservice'ler Geli\u015ftirmek - 02 (Azure Container Apps) - G\u00f6khan G\u00f6kalp","og_url":"https:\/\/gokhan-gokalp.com\/building-microservices-by-using-dapr-and-net-with-minimum-effort-02-azure-container-apps\/","og_site_name":"G\u00f6khan G\u00f6kalp","article_published_time":"2023-02-01T19:54:50+00:00","article_modified_time":"2023-02-01T21:46:09+00:00","og_image":[{"width":1200,"height":675,"url":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/02\/dapr-aca-gokhan-gokalp.jpg","type":"image\/jpeg"}],"author":"G\u00f6khan G\u00f6kalp","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"G\u00f6khan G\u00f6kalp","Tahmini okuma s\u00fcresi":"29 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/gokhan-gokalp.com\/building-microservices-by-using-dapr-and-net-with-minimum-effort-02-azure-container-apps\/#article","isPartOf":{"@id":"https:\/\/gokhan-gokalp.com\/building-microservices-by-using-dapr-and-net-with-minimum-effort-02-azure-container-apps\/"},"author":{"name":"G\u00f6khan G\u00f6kalp","@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"headline":"Dapr ve .NET Kullanarak Minimum Efor ile Microservice&#8217;ler Geli\u015ftirmek &#8211; 02 (Azure Container Apps)","datePublished":"2023-02-01T19:54:50+00:00","dateModified":"2023-02-01T21:46:09+00:00","mainEntityOfPage":{"@id":"https:\/\/gokhan-gokalp.com\/building-microservices-by-using-dapr-and-net-with-minimum-effort-02-azure-container-apps\/"},"wordCount":4705,"commentCount":0,"publisher":{"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"image":{"@id":"https:\/\/gokhan-gokalp.com\/building-microservices-by-using-dapr-and-net-with-minimum-effort-02-azure-container-apps\/#primaryimage"},"thumbnailUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/02\/dapr-aca-gokhan-gokalp.jpg","keywords":[".net 6","auto scaling","azure cosmos db","azure service bus","dapr","dotnet","keda","MicroService"],"articleSection":[".NET",".NET Core","Azure","Containerizing","Messaging","Microservices"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/gokhan-gokalp.com\/building-microservices-by-using-dapr-and-net-with-minimum-effort-02-azure-container-apps\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/gokhan-gokalp.com\/building-microservices-by-using-dapr-and-net-with-minimum-effort-02-azure-container-apps\/","url":"https:\/\/gokhan-gokalp.com\/building-microservices-by-using-dapr-and-net-with-minimum-effort-02-azure-container-apps\/","name":"Dapr ve .NET Kullanarak Minimum Efor ile Microservice'ler Geli\u015ftirmek - 02 (Azure Container Apps) - G\u00f6khan G\u00f6kalp","isPartOf":{"@id":"https:\/\/gokhan-gokalp.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/gokhan-gokalp.com\/building-microservices-by-using-dapr-and-net-with-minimum-effort-02-azure-container-apps\/#primaryimage"},"image":{"@id":"https:\/\/gokhan-gokalp.com\/building-microservices-by-using-dapr-and-net-with-minimum-effort-02-azure-container-apps\/#primaryimage"},"thumbnailUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/02\/dapr-aca-gokhan-gokalp.jpg","datePublished":"2023-02-01T19:54:50+00:00","dateModified":"2023-02-01T21:46:09+00:00","breadcrumb":{"@id":"https:\/\/gokhan-gokalp.com\/building-microservices-by-using-dapr-and-net-with-minimum-effort-02-azure-container-apps\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/gokhan-gokalp.com\/building-microservices-by-using-dapr-and-net-with-minimum-effort-02-azure-container-apps\/"]}]},{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/gokhan-gokalp.com\/building-microservices-by-using-dapr-and-net-with-minimum-effort-02-azure-container-apps\/#primaryimage","url":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/02\/dapr-aca-gokhan-gokalp.jpg","contentUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/02\/dapr-aca-gokhan-gokalp.jpg","width":1200,"height":675},{"@type":"BreadcrumbList","@id":"https:\/\/gokhan-gokalp.com\/building-microservices-by-using-dapr-and-net-with-minimum-effort-02-azure-container-apps\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/gokhan-gokalp.com\/"},{"@type":"ListItem","position":2,"name":"Building Microservices by Using Dapr and .NET with Minimum Effort &#8211; 02 (Azure Container Apps)"}]},{"@type":"WebSite","@id":"https:\/\/gokhan-gokalp.com\/#website","url":"https:\/\/gokhan-gokalp.com\/","name":"G\u00f6khan G\u00f6kalp","description":"C# &amp; Python lover","publisher":{"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/gokhan-gokalp.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe","name":"G\u00f6khan G\u00f6kalp","pronouns":"he","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","url":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","contentUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","caption":"G\u00f6khan G\u00f6kalp"},"logo":{"@id":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659"},"sameAs":["https:\/\/gokhan-gokalp.com"],"url":"https:\/\/gokhan-gokalp.com\/tr\/author\/gok-gokalp\/"}]}},"_links":{"self":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/4251","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/comments?post=4251"}],"version-history":[{"count":38,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/4251\/revisions"}],"predecessor-version":[{"id":4301,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/4251\/revisions\/4301"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/media\/4299"}],"wp:attachment":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/media?parent=4251"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/categories?post=4251"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/tags?post=4251"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}