{"id":2760,"date":"2019-06-27T21:20:16","date_gmt":"2019-06-27T18:20:16","guid":{"rendered":"https:\/\/gokhan-gokalp.com\/?p=2760"},"modified":"2019-06-27T21:20:16","modified_gmt":"2019-06-27T18:20:16","slug":"playing-with-service-mesh-linkerd-ve-azure-kubernetes-service","status":"publish","type":"post","link":"https:\/\/gokhan-gokalp.com\/tr\/playing-with-service-mesh-linkerd-ve-azure-kubernetes-service\/","title":{"rendered":"Playing with Service Mesh &#8211; Linkerd ve Azure Kubernetes Service"},"content":{"rendered":"<p>Bildi\u011fimiz gibi <em>Microsoft<\/em>, bu y\u0131l <em>Barcelona<\/em> <em>KubeCon<\/em>&#8216;da bir \u00e7ok yeniliklerini duyurdu. Bence bunlardan \u00f6nemli bir tanesi ise <em><a href=\"https:\/\/cloudblogs.microsoft.com\/opensource\/2019\/05\/21\/service-mesh-interface-smi-release\/\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>SMI<\/strong><\/a><\/em>(<em>Service Mesh Interface<\/em>) idi.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2019\/06\/smi_logo.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-2763 lazyload\" data-src=\"\/wp-content\/uploads\/2019\/06\/smi_logo.jpg\" alt=\"\" width=\"1170\" height=\"439\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/smi_logo.jpg 1170w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/smi_logo-300x113.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/smi_logo-768x288.jpg 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/smi_logo-1024x384.jpg 1024w\" data-sizes=\"(max-width: 1170px) 100vw, 1170px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1170px; --smush-placeholder-aspect-ratio: 1170\/439;\" \/><\/a><\/p>\n<p>\u0130nceledi\u011fim kadar\u0131yla <em>SMI<\/em>&#8216;\u0131n tan\u0131m\u0131 i\u00e7in k\u0131saca, t\u0131pk\u0131 <em>AMQP<\/em>&#8216;de oldu\u011fu gibi &#8220;<em>interoperability<\/em>&#8221; konusunu service mesh&#8217;ler aras\u0131nda sa\u011flayabilmek diyebilirim. \u00d6z\u00fcnde service mesh&#8217;ler i\u00e7in <em>Kubernetes<\/em> \u00fczerinde standart bir interface sunmaktad\u0131r. B\u00f6ylece service mesh i\u00e7in provider-lock durumuna d\u00fc\u015fmeden, istedi\u011fimiz teknolojiyi kullanabilmemiz i\u00e7in bir olanak, abstraction sa\u011flamaktad\u0131r.<\/p>\n<p><em>SMI<\/em>&#8216;\u0131n duyurulmas\u0131n\u0131n ard\u0131ndan, uzun s\u00fcredir incelemek i\u00e7in akl\u0131mda olan <strong><a href=\"https:\/\/linkerd.io\/\" target=\"_blank\" rel=\"noopener noreferrer\"><em>Linkerd<\/em><\/a><\/strong> service mesh&#8217;i inceleyebilmek i\u00e7in bir f\u0131rsat buldum ve hakk\u0131nda bir \u015feyler yazmak istedim.<\/p>\n<h2>Service Mesh, huh?<\/h2>\n<p>\u0130lk olarak service mesh nedir ve bize neler sa\u011fl\u0131yor, k\u0131saca de\u011finmek istiyorum.<\/p>\n<p>Bildi\u011fimiz gibi bir \u00e7ok organizasyon g\u00fcn\u00fcm\u00fcz teknolojisine ve marketine ayak uydurabilmek ve o marketten b\u00fcy\u00fck bir pay alabilmek i\u00e7in, microservice mimarisine ayak uydurmaya, adapte olmaya \u00e7al\u0131\u015f\u0131yor.<\/p>\n<p>Bu adaptasyon s\u00fcrecinde ise as\u0131l \u00f6nemli olan nokta, birbirlerinden decoupled hale getirilmi\u015f olan servislerin, birbirleriyle nas\u0131l <strong>h\u0131zl\u0131<\/strong>, <strong>resilient<\/strong> ve <strong>secure<\/strong> bir \u015fekilde ileti\u015fim i\u00e7erisinde olacaklar\u0131d\u0131r. Elbette <em>load-balancing<\/em>, <em>traffic management<\/em> ve <em>health monitoring <\/em>de cabas\u0131. Bu gereksinimlerin bir \u00e7o\u011funu, zaten farkl\u0131 tool&#8217;lar vas\u0131tas\u0131yla implemente ediyoruz. \u00d6rne\u011fin resiliency konusunu, gerek <em>API<\/em> Gateway&#8217;ler, gerekse de <em>Polly<\/em> gibi baz\u0131 framework&#8217;ler vas\u0131tas\u0131yla uygulamalar\u0131n i\u00e7erisinde implemente ediyoruz.<\/p>\n<p>Peki, service mesh ne sunuyor?<\/p>\n<p>Service mesh ise, <strong>service-to-service<\/strong> communication&#8217;\u0131n\u0131 manage ederek, &#8220;<em>resiliency<\/em>&#8220;, &#8220;<em>scalability<\/em>&#8220;, &#8220;<em>security<\/em>&#8221; ve &#8220;<em>monitoring<\/em>&#8221; gibi baz\u0131 kavramlar\u0131 farkl\u0131 \u00e7\u00f6z\u00fcmler ile ele almam\u0131z yerine, bu tarz network i\u015flemlerini kodumuzdan decoupled etmemize olanak sa\u011fl\u0131yor. Ayr\u0131ca bu gereksinimleri bize kendisi tek bir elden sunuyor.<\/p>\n<h2>Peki, Linkerd?<\/h2>\n<p><em>Linkerd<\/em>, <em><strong>CNCF<\/strong><\/em> taraf\u0131ndan desteklenen <em>kubernetes<\/em> i\u00e7in open source bir service mesh&#8217;dir.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2019\/06\/service_mesh_linkerd.png\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-2764 lazyload\" data-src=\"\/wp-content\/uploads\/2019\/06\/service_mesh_linkerd.png\" alt=\"\" width=\"1024\" height=\"587\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/service_mesh_linkerd.png 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/service_mesh_linkerd-300x172.png 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/service_mesh_linkerd-768x440.png 768w\" data-sizes=\"(max-width: 1024px) 100vw, 1024px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/587;\" \/><\/a><\/p>\n<p>\u00c7al\u0131\u015fma \u015fekline bakt\u0131\u011f\u0131m\u0131zda ise, transparent bir <strong>sidecar proxy<\/strong> instance&#8217;\u0131 olarak her bir servis&#8217;in yan\u0131nda konumland\u0131\u011f\u0131n\u0131 g\u00f6rebiliriz. A servis&#8217;inden B servisini direkt olarak \u00e7a\u011f\u0131rmak yerine, B servis&#8217;inin local proxy&#8217;sini \u00e7a\u011f\u0131rarak, buradaki &#8220;service-to-service&#8221; communication complexitiy&#8217;lerini bizim i\u00e7in encapsulate etmektedir.<\/p>\n<p><strong>Genel hatlar\u0131yla Linkerd&#8217;nin baz\u0131 key \u00f6zellikleri:<\/strong><\/p>\n<ul>\n<li>Intelligent Load Balancing (<em>HTTP\/HTTP2, gRPC<\/em>): Request&#8217;leri en h\u0131zl\u0131 endpoint&#8217;e g\u00f6nderebilmek i\u00e7in <em>EWMA<\/em> (Exponentially Weighted Moving Average) ad\u0131nda bir algoritma kullanmaktad\u0131r<\/li>\n<li>Automatic Retries and Timeouts<\/li>\n<li>Automatic mTLS<\/li>\n<li>Powerfull Telemetry and Monitoring features: Observability i\u00e7in \u00f6nemli \u00f6zelliklerinden bir tanesi)<\/li>\n<li>Dashboard and Grafana<\/li>\n<\/ul>\n<p>Mimarisi hakk\u0131nda daha detayl\u0131 bilgiye, <em><a href=\"https:\/\/linkerd.io\/2\/reference\/architecture\/index.html\" target=\"_blank\" rel=\"noopener noreferrer\">buradan<\/a><\/em> eri\u015febilirsiniz.<\/p>\n<h2>\u00d6n Haz\u0131rl\u0131k<\/h2>\n<p><em>Linkerd<\/em>&#8216;nin kurulum i\u015flemine ge\u00e7meden, \u00f6ncelikle bir kubernetes cluster&#8217;\u0131na ihtiyac\u0131m\u0131z var. Ben bu noktada, <em>Azure<\/em>&#8216;un managed<em> Kubernetes Service<\/em>&#8216;inden yararlanaca\u011f\u0131m.\u00a0E\u011fer <em>Azure Kubernetes Service<\/em>&#8216;e sahip de\u011filseniz, <em><a href=\"https:\/\/azure.microsoft.com\/en-in\/services\/kubernetes-service\/\" target=\"_blank\" rel=\"noopener noreferrer\">buradan<\/a><\/em> olu\u015fturabilirsiniz.<\/p>\n<p>\u0130lk \u00f6nce a\u015fa\u011f\u0131daki komut sat\u0131r\u0131 ile <em>Azure<\/em>&#8216;a login olal\u0131m.<\/p>\n<pre class=\"lang:default decode:true \">az login<\/pre>\n<blockquote><p><em><strong>NOT<\/strong><\/em>: Bu i\u015flemler i\u00e7in <em>Azure<\/em> <em>CLI<\/em>&#8216;\u0131n kurulu olmas\u0131 gerekmektedir. De\u011filse, <em><a href=\"https:\/\/docs.microsoft.com\/tr-tr\/cli\/azure\/install-azure-cli?view=azure-cli-latest\" target=\"_blank\" rel=\"noopener noreferrer\">buradan<\/a><\/em> eri\u015febilirsiniz.<\/p><\/blockquote>\n<p>Ard\u0131ndan a\u015fa\u011f\u0131daki komut sat\u0131r\u0131 ile de, cluster&#8217;a eri\u015febilmek i\u00e7in gerekli credential&#8217;lar\u0131 alal\u0131m.<\/p>\n<pre class=\"lang:default decode:true\">az aks get-credential --resource-group={YOUR_AKS_RESOURCE_GROUP} --name {YOUR_AKS_NAME}<\/pre>\n<p>\u015eimdi <em>linkerd<\/em>&#8216;nin kurulumu i\u00e7in haz\u0131r\u0131z.<\/p>\n<p>Kurulumu ger\u00e7ekle\u015ftirebilmek i\u00e7in, <em><a href=\"https:\/\/linkerd.io\/2\/getting-started\/\" target=\"_blank\" rel=\"noopener noreferrer\">buradaki<\/a><\/em> ilk 3 ad\u0131m\u0131 tamamlamam\u0131z gerekiyor. Ad\u0131mlar\u0131 tamamlad\u0131ktan sonra her \u015feyin yolunda gitti\u011finden emin olabilmek i\u00e7in ise, a\u015fa\u011f\u0131daki komut sat\u0131r\u0131n\u0131 kullanal\u0131m.<\/p>\n<pre class=\"lang:default decode:true \">linkerd check<\/pre>\n<p>Ard\u0131ndan a\u015fa\u011f\u0131daki gibi bir sonu\u00e7 g\u00f6r\u00fcyor olmal\u0131y\u0131z.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2019\/06\/linkerd_check.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-2769 lazyload\" data-src=\"\/wp-content\/uploads\/2019\/06\/linkerd_check.jpg\" alt=\"\" width=\"996\" height=\"596\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/linkerd_check.jpg 996w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/linkerd_check-300x180.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/linkerd_check-768x460.jpg 768w\" data-sizes=\"(max-width: 996px) 100vw, 996px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 996px; --smush-placeholder-aspect-ratio: 996\/596;\" \/><\/a><\/p>\n<h2>Let&#8217;s Play!<\/h2>\n<p>Art\u0131k mesh&#8217;lemeye haz\u0131r\u0131z. \u00d6rnek ger\u00e7ekle\u015ftirebilmek ad\u0131na, a\u015fa\u011f\u0131daki gibi 3 adet i\u00e7erisinde <em>swagger<\/em> bar\u0131nd\u0131ran basit <em>API&#8217;<\/em>lar geli\u015ftirdim.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2019\/06\/gateway_demo.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-2771 lazyload\" data-src=\"\/wp-content\/uploads\/2019\/06\/gateway_demo.jpg\" alt=\"\" width=\"905\" height=\"259\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/gateway_demo.jpg 905w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/gateway_demo-300x86.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/gateway_demo-768x220.jpg 768w\" data-sizes=\"(max-width: 905px) 100vw, 905px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 905px; --smush-placeholder-aspect-ratio: 905\/259;\" \/><\/a><\/p>\n<p>Yukar\u0131da g\u00f6rm\u00fc\u015f oldu\u011fumuz product response&#8217;unu alabilmemiz i\u00e7in, &#8220;<em>Product.Gateway.API<\/em>&#8221; bizim i\u00e7in hem &#8220;<em>Product.API<\/em>&#8221; a hem de &#8220;<em>Price.API<\/em>&#8221; a request g\u00f6nderecek. \u0130lgili response&#8217;lar\u0131 aggregate ettikten sonra ise bize full product response&#8217;unu d\u00f6n\u00fcyor olacak.<\/p>\n<p><em>API<\/em>&#8216;lara <a href=\"https:\/\/github.com\/GokGokalp\/service-mesh-linkerd-sample\" target=\"_blank\" rel=\"noopener noreferrer\"><em>buradan<\/em><\/a> eri\u015febilirsiniz.<\/p>\n<p>\u0130lk olarak &#8220;<em>Product.Gateway.API<\/em>&#8221; \u0131n &#8220;<em>ProductsController<\/em>&#8221; \u0131n\u0131 inceleyelim.<\/p>\n<pre class=\"lang:default decode:true \">using System.Net.Http;\r\nusing System.Threading.Tasks;\r\nusing Microsoft.AspNetCore.Mvc;\r\nusing Microsoft.Extensions.Configuration;\r\nusing Newtonsoft.Json;\r\n\r\nnamespace ProductGateway.API.Controllers\r\n{\r\n    [Route(\"api\/products\")]\r\n    [ApiController]\r\n    public class ProductsController : ControllerBase\r\n    {\r\n        private readonly IHttpClientFactory _clientFactory;\r\n        private readonly IConfiguration _configuration;\r\n\r\n        public ProductsController(IHttpClientFactory clientFactory, IConfiguration configuration)\r\n        {\r\n            _clientFactory = clientFactory;\r\n            _configuration = configuration;\r\n        }\r\n\r\n        [HttpGet(\"{productId}\")]\r\n        public async Task&lt;ActionResult&lt;GetProductResponse&gt;&gt; Get([FromRoute]int productId)\r\n        {\r\n            var productDetail = GetProductDetailAsync(productId);\r\n            var productPrice = GetProductPriceAsync(productId);\r\n\r\n            await Task.WhenAll(productDetail, productPrice);\r\n\r\n            return Ok(new GetProductResponse\r\n            {\r\n                    ProductId = productDetail.Result.ProductId,\r\n                    Name = productDetail.Result.Name,\r\n                    Description = productDetail.Result.Description,\r\n                    Price = productPrice.Result.Price\r\n            });\r\n        }\r\n\r\n        private async Task&lt;GetProductDetailResponse&gt; GetProductDetailAsync(int productId)\r\n        {\r\n            GetProductDetailResponse productDetailResponse = null;\r\n\r\n            HttpClient client = _clientFactory.CreateClient();\r\n\r\n            string productApiBaseUrl = _configuration.GetValue&lt;string&gt;(\"Product_API_Host\");\r\n\r\n            HttpResponseMessage response = await client.GetAsync(requestUri: $\"{productApiBaseUrl}\/api\/products\/{productId}\");\r\n\r\n            if (response.IsSuccessStatusCode)\r\n            {\r\n                productDetailResponse = JsonConvert.DeserializeObject&lt;GetProductDetailResponse&gt;(await response.Content.ReadAsStringAsync());\r\n            }\r\n\r\n            return productDetailResponse;\r\n        }\r\n\r\n        private async Task&lt;GetPriceResponse&gt; GetProductPriceAsync(int productId)\r\n        {\r\n            GetPriceResponse productPriceResponse = null;\r\n\r\n            HttpClient client = _clientFactory.CreateClient();\r\n\r\n            string priceApiBaseUrl = _configuration.GetValue&lt;string&gt;(\"Price_API_Host\");\r\n\r\n            HttpResponseMessage response = await client.GetAsync(requestUri: $\"{priceApiBaseUrl}\/api\/prices?productId={productId}\");\r\n\r\n            if (response.IsSuccessStatusCode)\r\n            {\r\n                productPriceResponse = JsonConvert.DeserializeObject&lt;GetPriceResponse&gt;(await response.Content.ReadAsStringAsync());\r\n            }\r\n\r\n            return productPriceResponse;\r\n        }\r\n    }\r\n\r\n    public class GetProductResponse\r\n    {\r\n        public int ProductId { get; set; }\r\n        public string Name { get; set; }\r\n        public string Description { get; set; }\r\n        public double Price { get; set; }\r\n    }\r\n\r\n    public class GetProductDetailResponse\r\n    {\r\n        public int ProductId { get; set; }\r\n        public string Name { get; set; }\r\n        public string Description { get; set; }\r\n    }\r\n\r\n    public class GetPriceResponse\r\n    {\r\n        public int ProductId { get; set; }\r\n        public double Price { get; set; }\r\n    }\r\n}<\/pre>\n<p>&#8220;<em>Get<\/em>&#8221; method&#8217;u i\u00e7erisinde basit olarak, product detay&#8217;lar\u0131n\u0131 ve fiyat bilgilerini alabilmek i\u00e7in, ilgili <em>API<\/em>&#8216;lara request g\u00f6nderiyoruz. <em>API<\/em> base <em>URL<\/em>&#8216;lerini ise, configuration \u00fczerinden okuyoruz. Kubernetes \u00fczerine <em>API<\/em>&#8216;lar\u0131 deloy edece\u011fimiz zaman, bu <em>API<\/em> <em>URL<\/em>&#8216;lerini environment variable olarak set ediyoruz olaca\u011f\u0131z.<\/p>\n<p><em>API<\/em>&#8216;lar\u0131 dockerize edebilmek i\u00e7in ise, buradaki ilgili <a href=\"https:\/\/github.com\/GokGokalp\/service-mesh-linkerd-sample\" target=\"_blank\" rel=\"noopener noreferrer\"><em>Dockerfile<\/em><\/a>&#8216;lar\u0131 kullanal\u0131m.<\/p>\n<p>&#8220;<em>Product.Gateway.API<\/em>&#8221; i\u00e7in \u00f6rnek <em>Dockerfile<\/em>:<\/p>\n<pre class=\"lang:default decode:true \">#Build Stage\r\nFROM microsoft\/dotnet:2.2-sdk AS build-env\r\n\r\nWORKDIR \/workdir\r\n\r\nCOPY .\/src\/ProductGateway.API .\/src\/ProductGateway.API\/\r\n\r\nRUN dotnet restore .\/src\/ProductGateway.API\/ProductGateway.API.csproj\r\nRUN dotnet publish .\/src\/ProductGateway.API\/ProductGateway.API.csproj -c Release -o \/publish\r\n\r\nFROM microsoft\/dotnet:2.2-aspnetcore-runtime\r\nCOPY --from=build-env \/publish \/publish\r\nWORKDIR \/publish\r\nEXPOSE 5000\r\nENTRYPOINT [\"dotnet\", \"ProductGateway.API.dll\"]<\/pre>\n<p>Ben container registry olarak <em>Azure Container Registry<\/em> servis&#8217;ini kullanaca\u011f\u0131m.<\/p>\n<p>A\u015fa\u011f\u0131daki komut sat\u0131r\u0131 ile image&#8217;leri olu\u015ftural\u0131m ve container registry&#8217;e push edelim.<\/p>\n<pre class=\"lang:default decode:true\">docker build -f .\/*.Dockerfile . -t {YOUR_CONTAINER_REGISTRY}\/*-api:dev\r\n\r\naz acr login --name {YOUR_CONTAINER_REGISTRY_NAME}\r\n\r\ndocker push {IMAGE_NAME_WITH_TAG}<\/pre>\n<p>Kubernetes \u00fczerine deployment i\u015flemi i\u00e7in ise, <em><a href=\"https:\/\/github.com\/GokGokalp\/service-mesh-linkerd-sample\/tree\/master\/deploy\" target=\"_blank\" rel=\"noopener noreferrer\">buradaki<\/a><\/em> yaml file&#8217;lar\u0131n\u0131 kullanaca\u011f\u0131z.<\/p>\n<p>&#8220;<em>Product.Gateway.API<\/em>&#8221; i\u00e7in \u00f6rnek deployment ve service file&#8217;\u0131:<\/p>\n<pre class=\"lang:default decode:true\">---\r\napiVersion: v1\r\nkind: Namespace\r\nmetadata:\r\n  name: linkerd-test\r\n---\r\napiVersion: apps\/v1\r\nkind: Deployment\r\nmetadata:\r\n  name: product-gateway-api-deploy\r\n  namespace: linkerd-test\r\nspec:\r\n  replicas: 1\r\n  selector:\r\n    matchLabels:\r\n      app: product-gateway-api\r\n  template:\r\n    metadata:\r\n      labels:\r\n        app: product-gateway-api\r\n    spec:\r\n      containers:\r\n      - name: product-gateway-api\r\n        image: ggplayground.azurecr.io\/product-gateway-api:dev\r\n        imagePullPolicy: Always\r\n        ports:\r\n        - containerPort: 5000\r\n          name: http\r\n        resources:\r\n          requests:\r\n            cpu: 100m\r\n            memory: 100Mi\r\n        env:\r\n        - name: Product_API_Host\r\n          value: http:\/\/product-api-svc.linkerd-test:9090\r\n        - name: Price_API_Host\r\n          value: http:\/\/price-api-svc.linkerd-test:8080\r\n---\r\napiVersion: v1\r\nkind: Service\r\nmetadata:\r\n  name: product-gateway-api-svc\r\n  namespace: linkerd-test\r\nspec:\r\n  type: LoadBalancer\r\n  selector:\r\n    app: product-gateway-api\r\n  ports:\r\n  - port: 80\r\n    targetPort: http<\/pre>\n<p><em>API<\/em>&#8216;lar\u0131, &#8220;<em>linkerd-test<\/em>&#8221; isimli namespace alt\u0131na deploy edece\u011fiz. &#8220;<em>Product.Gateway.API<\/em>&#8221; i\u00e7erisinde ilgili <em>API<\/em> <em>URL<\/em>&#8216;lerini environment variable olarak set edece\u011fimizi s\u00f6ylemi\u015ftik. Dikkat edersek &#8220;<em>env<\/em>&#8221; section&#8217;\u0131 alt\u0131nda, hem &#8220;<em>Product<\/em>&#8221; hem de &#8220;<em>Price<\/em>&#8221; <em>API<\/em>&#8216;\u0131n\u0131n service adreslerini set ettik.<\/p>\n<p>\u015eimdi 3 <em>API<\/em>&#8216;\u0131n da deployment i\u015flemlerini, ilgili yaml file&#8217;lar\u0131 ile ger\u00e7ekle\u015ftirelim.<\/p>\n<pre class=\"lang:default decode:true \">kubectl apply -f price-api-deploy.yaml\r\nkubectl apply -f product-api-deploy.yaml\r\nkubectl apply -f product-gateway-api-deploy.yaml<\/pre>\n<p>Deployment&#8217;lar\u0131n ba\u015far\u0131yla ger\u00e7ekle\u015fip ger\u00e7ekle\u015fmedi\u011fini a\u015fa\u011f\u0131daki gibi kontrol edelim.<\/p>\n<pre class=\"lang:default decode:true \">kubectl get deploy -n linkerd-test<\/pre>\n<p><a href=\"\/wp-content\/uploads\/2019\/06\/kubectl_get_deploy.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-2773 lazyload\" data-src=\"\/wp-content\/uploads\/2019\/06\/kubectl_get_deploy.jpg\" alt=\"\" width=\"784\" height=\"115\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/kubectl_get_deploy.jpg 784w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/kubectl_get_deploy-300x44.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/kubectl_get_deploy-768x113.jpg 768w\" data-sizes=\"(max-width: 784px) 100vw, 784px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 784px; --smush-placeholder-aspect-ratio: 784\/115;\" \/><\/a><\/p>\n<p>\u015eimdilik her \u015fey yolunda g\u00f6r\u00fcn\u00fcyor.<\/p>\n<p>Birde <em>API<\/em>&#8216;lar\u0131 test edelim. Bunun i\u00e7in &#8220;<em>Product.Gateway.API<\/em>&#8221; \u0131n\u0131n d\u0131\u015far\u0131ya expose oldu\u011fu service adresini almam\u0131z gerekiyor.<\/p>\n<pre class=\"lang:default decode:true\">kubectl get svc -n linkerd-test<\/pre>\n<p><a href=\"\/wp-content\/uploads\/2019\/06\/kubectl_get_svc.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-2774 lazyload\" data-src=\"\/wp-content\/uploads\/2019\/06\/kubectl_get_svc.jpg\" alt=\"\" width=\"783\" height=\"116\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/kubectl_get_svc.jpg 783w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/kubectl_get_svc-300x44.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/kubectl_get_svc-768x114.jpg 768w\" data-sizes=\"(max-width: 783px) 100vw, 783px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 783px; --smush-placeholder-aspect-ratio: 783\/116;\" \/><\/a><\/p>\n<blockquote><p><em><strong>NOT<\/strong><\/em>: External <em>IP<\/em> adresi almas\u0131 bir ka\u00e7 dakika s\u00fcrebilir.<\/p><\/blockquote>\n<p>Test i\u015flemini ger\u00e7ekle\u015ftirebilmek i\u00e7in, &#8220;<em>Product.API<\/em>&#8221; ve &#8220;<em>Price.API<\/em>&#8221; i\u00e7erisine id&#8217;si &#8220;1&#8221; olan dummy bir product eklemi\u015ftim.<\/p>\n<p>Test edebilmek i\u00e7in, &#8220;<em>Product.Gateway.API<\/em>&#8221; a a\u015fa\u011f\u0131daki gibi bir request g\u00f6nderelim ve sonucuna bir bakal\u0131m.<\/p>\n<pre class=\"lang:default decode:true\">http:\/\/{YOUR_EXTERNAL_IP}\/api\/products\/1<\/pre>\n<p><a href=\"\/wp-content\/uploads\/2019\/06\/test_apis.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-2775 lazyload\" data-src=\"\/wp-content\/uploads\/2019\/06\/test_apis.jpg\" alt=\"\" width=\"1163\" height=\"291\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/test_apis.jpg 1163w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/test_apis-300x75.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/test_apis-768x192.jpg 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/test_apis-1024x256.jpg 1024w\" data-sizes=\"(max-width: 1163px) 100vw, 1163px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1163px; --smush-placeholder-aspect-ratio: 1163\/291;\" \/><\/a><\/p>\n<p>Harika, <em>API<\/em>&#8216;lar da \u00e7al\u0131\u015f\u0131yor.<\/p>\n<p>\u015eimdi mesh&#8217;leyebilmek i\u00e7in tek yapmam\u0131z gereken, <em>linkerd<\/em>&#8216;yi <em>API<\/em>&#8216;lara inject etmek. Bu i\u015flemi ger\u00e7ekle\u015ftirebilmek i\u00e7in ise, a\u015fa\u011f\u0131daki gibi <em>linkerd<\/em>&#8216;nin <em>CLI<\/em>&#8216;\u0131ndan faydalanaca\u011f\u0131z.<\/p>\n<pre class=\"lang:default decode:true\">kubectl get -n linkerd-test deploy -o yaml | linkerd inject - | kubectl apply -f -<\/pre>\n<p><a href=\"\/wp-content\/uploads\/2019\/06\/linkerd-inject.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-2777 lazyload\" data-src=\"\/wp-content\/uploads\/2019\/06\/linkerd-inject.jpg\" alt=\"\" width=\"798\" height=\"190\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/linkerd-inject.jpg 798w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/linkerd-inject-300x71.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/linkerd-inject-768x183.jpg 768w\" data-sizes=\"(max-width: 798px) 100vw, 798px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 798px; --smush-placeholder-aspect-ratio: 798\/190;\" \/><\/a><\/p>\n<p>Yukar\u0131daki komut sat\u0131r\u0131 ile, &#8220;<em>linkerd-test<\/em>&#8221; namespace&#8217;i alt\u0131ndaki uygulamalar\u0131m\u0131za, linkerd&#8217;yi inject ediyoruz.<\/p>\n<p>\u015eimdi <em>linkerd<\/em>&#8216;nin dashboard&#8217;u \u00fczerinden, neler oluyor bir bakal\u0131m.<\/p>\n<p>Dashboard&#8217;a eri\u015febilmek i\u00e7in:<\/p>\n<pre class=\"lang:default decode:true\">linkerd dashboard &amp;<\/pre>\n<p><a href=\"\/wp-content\/uploads\/2019\/06\/linkerd_dashboard.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-2779 lazyload\" data-src=\"\/wp-content\/uploads\/2019\/06\/linkerd_dashboard.jpg\" alt=\"\" width=\"1276\" height=\"674\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/linkerd_dashboard.jpg 1276w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/linkerd_dashboard-300x158.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/linkerd_dashboard-768x406.jpg 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/linkerd_dashboard-1024x541.jpg 1024w\" data-sizes=\"(max-width: 1276px) 100vw, 1276px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1276px; --smush-placeholder-aspect-ratio: 1276\/674;\" \/><\/a><\/p>\n<p>Overview k\u0131sm\u0131nda bizi yukar\u0131daki gibi bir ekranla kar\u015f\u0131l\u0131yor. Burada deployment ve pod&#8217;lar\u0131 g\u00f6rebiliyoruz. Ayr\u0131ca hangi service&#8217;leri mesh&#8217;ledi\u011fimizi de g\u00f6rebilmek m\u00fcmk\u00fcn.<\/p>\n<p>En sevdi\u011fim k\u0131s\u0131mlardan birisi ise <strong>metric<\/strong>&#8216;ler. Her service&#8217;e \u00f6zel &#8220;<em>Success Rate<\/em>&#8220;, &#8220;<em>RPS<\/em>&#8221; ve &#8220;<em>Latency<\/em>&#8221; gibi bilgilerini g\u00f6rebiliyoruz.<\/p>\n<p>\u015eimdi ilk giri\u015f noktas\u0131 olan &#8220;<em>Product.Gateway.API<\/em>&#8221; i\u00e7in, &#8220;<em>Deployments<\/em>&#8221; b\u00f6l\u00fcm\u00fc alt\u0131ndaki &#8220;<em>product-gateway-api-deploy<\/em>&#8221; deployment&#8217;\u0131na t\u0131klayal\u0131m ve detaylar\u0131na bir bakal\u0131m.<\/p>\n<p>Ard\u0131ndan biraz metric g\u00f6rebilmek i\u00e7in, a\u015fa\u011f\u0131daki gibi &#8220;<em>Product.Gateway.API<\/em>&#8221; a biraz request g\u00f6nderelim. Ben bu i\u015flem i\u00e7in <em>ApacheBench<\/em> kullanaca\u011f\u0131m.<\/p>\n<pre class=\"lang:default decode:true\">ab -n 1000 http:\/\/{YOUR_EXTERNAL_IP}\/api\/products\/1<\/pre>\n<p><a href=\"\/wp-content\/uploads\/2019\/06\/deployment__detail.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-2781 lazyload\" data-src=\"\/wp-content\/uploads\/2019\/06\/deployment__detail.jpg\" alt=\"\" width=\"1276\" height=\"1081\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/deployment__detail.jpg 1276w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/deployment__detail-300x254.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/deployment__detail-768x651.jpg 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/deployment__detail-1024x868.jpg 1024w\" data-sizes=\"(max-width: 1276px) 100vw, 1276px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1276px; --smush-placeholder-aspect-ratio: 1276\/1081;\" \/><\/a><\/p>\n<p>En sevdi\u011fim di\u011fer bir k\u0131s\u0131m ise, <strong>automatic service dependency map<\/strong>&#8216;i ve <strong>live traffic<\/strong> bilgilerini bize sunmas\u0131. Dependency map&#8217;ine bakarsak, &#8220;<em>product-gateway-api<\/em>&#8221; \u0131n hem &#8220;<em>price-api<\/em>&#8221; hem de &#8220;<em>product-api<\/em>&#8221; ile ba\u011flant\u0131l\u0131 oldu\u011funu g\u00f6rebiliriz.<\/p>\n<p>Ayr\u0131ca &#8220;<em>LIVE CALLS<\/em>&#8221; sekmesinden, o anda ger\u00e7ekle\u015fen call&#8217;lar\u0131n sample&#8217;lar\u0131n\u0131 da g\u00f6rebiliriz.<\/p>\n<p>Peki, de\u011finmek istedi\u011fim g\u00fczel bir konu daha var. <strong>Route-based runtime metric<\/strong>&#8216;leri ve <strong>retry<\/strong>&#8216;lar.<\/p>\n<h2>Service Profiles<\/h2>\n<p><em>Linkerd<\/em> i\u00e7erisinde \u00f6nemli konulardan bir tanesi de service profile&#8217;lar\u0131d\u0131r. Service profile&#8217;lar\u0131, <em>linkerd<\/em>&#8216;ye ilgili service hakk\u0131nda ek bilgiler sunan custom bir kubernetes resource&#8217;udur.<\/p>\n<p>Service profile&#8217;lar\u0131n\u0131 tan\u0131mlayarak, <em>linkerd<\/em>&#8216;nin bize her bir service i\u00e7in &#8220;<em>route-based runtime metrics<\/em>&#8221; verebilmesini sa\u011flayabiliriz. Ayr\u0131ca &#8220;<em>retries<\/em>&#8221; ve &#8220;<em>timeouts<\/em>&#8221; gibi feature&#8217;lar\u0131n\u0131 da etkinle\u015ftirebiliriz.<\/p>\n<p>Service profile&#8217;lar\u0131n\u0131 tan\u0131mlayabilmenin &#8220;<em>Swagger<\/em>&#8220;, &#8220;<em>Protobuf<\/em>&#8220;, &#8220;<em>Auto-Creation<\/em>&#8221; ve &#8220;<em>Template<\/em>&#8221; gibi bir ka\u00e7 fark\u0131 y\u00f6ntemi mevcut. Ben <em>API<\/em>&#8216;lar\u0131 geli\u015ftirirken swagger implemente etti\u011fim i\u00e7in, service profile tan\u0131mlayabilmek i\u00e7in swagger y\u00f6ntemini kullanaca\u011f\u0131m.<\/p>\n<p><em>API<\/em>&#8216;lar\u0131n ilgili swagger file&#8217;lar\u0131na, <em><a href=\"https:\/\/github.com\/GokGokalp\/service-mesh-linkerd-sample\/tree\/master\/deploy\" target=\"_blank\" rel=\"noopener noreferrer\">buradan<\/a><\/em> eri\u015febilirsiniz.<\/p>\n<h3>Route-based Metrics<\/h3>\n<p>Profile tan\u0131mlayabilmek i\u00e7in, a\u015fa\u011f\u0131daki komut sat\u0131r\u0131n\u0131 kullanaca\u011f\u0131z.<\/p>\n<pre class=\"lang:default decode:true\">linkerd -n linkerd-test profile --open-api .\/price-api-swagger.json price-api-svc | kubectl -n linkerd-test apply -f -\r\nlinkerd -n linkerd-test profile --open-api .\/product-api-swagger.json product-api-svc | kubectl -n linkerd-test apply -f -\r\nlinkerd -n linkerd-test profile --open-api .\/product-gateway-api-swagger.json product-gateway-api-svc | kubectl -n linkerd-test apply -f -<\/pre>\n<p><a href=\"\/wp-content\/uploads\/2019\/06\/linkerd_profile_create.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-2783 lazyload\" data-src=\"\/wp-content\/uploads\/2019\/06\/linkerd_profile_create.jpg\" alt=\"\" width=\"853\" height=\"101\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/linkerd_profile_create.jpg 853w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/linkerd_profile_create-300x36.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/linkerd_profile_create-768x91.jpg 768w\" data-sizes=\"(max-width: 853px) 100vw, 853px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 853px; --smush-placeholder-aspect-ratio: 853\/101;\" \/><\/a><\/p>\n<p>Evet, service profile&#8217;lar\u0131 olu\u015fmu\u015f durumda. \u015eimdi route-based metric&#8217;leri g\u00f6rebilece\u011fiz.<\/p>\n<p>Tekrardan &#8220;<em>Product.Gateway.API<\/em>&#8221; a biraz request g\u00f6nderelim. Bu sefer deployments ekran\u0131ndan &#8220;<em>price-api-deploy<\/em>&#8221; un &#8220;<em>ROUTE METRICS<\/em>&#8221; tab&#8217;\u0131na bir bakal\u0131m.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2019\/06\/price_deploy_route_based.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-2787 lazyload\" data-src=\"\/wp-content\/uploads\/2019\/06\/price_deploy_route_based.jpg\" alt=\"\" width=\"1276\" height=\"853\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/price_deploy_route_based.jpg 1276w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/price_deploy_route_based-300x201.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/price_deploy_route_based-768x513.jpg 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/price_deploy_route_based-1024x685.jpg 1024w\" data-sizes=\"(max-width: 1276px) 100vw, 1276px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1276px; --smush-placeholder-aspect-ratio: 1276\/853;\" \/><\/a><\/p>\n<p>G\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi, service profile ile route-based metric&#8217;leri g\u00f6rebiliyoruz. \u015eimdi birde retry&#8217;lar\u0131 nas\u0131l tan\u0131mlayabiliriz, ona bir bakal\u0131m.<\/p>\n<h3>Retries<\/h3>\n<p>\u00d6rne\u011fin, &#8220;<em>Price.API<\/em>&#8221; \u0131n &#8220;<em>Get<\/em>&#8221; endpoint&#8217;ine gelen request&#8217;lerin baz\u0131lar\u0131n\u0131n faile&#8217;a d\u00fc\u015ft\u00fc\u011f\u00fcn\u00fc varsayal\u0131m ve otomatik olarak retry \u00f6zelli\u011fini etkinle\u015ftirmek istiyoruz.<\/p>\n<p>Bunu ger\u00e7ekle\u015ftirebilmek i\u00e7in, a\u015fa\u011f\u0131daki gibi olu\u015fturmu\u015f oldu\u011fumuz service profile&#8217;\u0131n\u0131 edit&#8217;leyerek, ilgili route i\u00e7in &#8220;<em>isRetryable<\/em>&#8221; variable&#8217;\u0131n\u0131 eklememiz gerekmektedir.<\/p>\n<pre class=\"lang:default decode:true \">kubectl -n linkerd-test edit sp\/price-api-svc.linkerd-test.svc.cluster.local<\/pre>\n<p><a href=\"\/wp-content\/uploads\/2019\/06\/linkerd_retry.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-2784 lazyload\" data-src=\"\/wp-content\/uploads\/2019\/06\/linkerd_retry.jpg\" alt=\"\" width=\"854\" height=\"579\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/linkerd_retry.jpg 854w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/linkerd_retry-300x203.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/linkerd_retry-768x521.jpg 768w\" data-sizes=\"(max-width: 854px) 100vw, 854px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 854px; --smush-placeholder-aspect-ratio: 854\/579;\" \/><\/a><\/p>\n<p>Hepsi bu kadar.<\/p>\n<p>Dilerseniz customize edebilmek i\u00e7in, &#8220;<em>Retry Budget<\/em>&#8221; mekanizmas\u0131n\u0131 da kullanabilirsiniz. Detayl\u0131 bilgiye, <em><a href=\"https:\/\/linkerd.io\/2\/tasks\/configuring-retries\/\" target=\"_blank\" rel=\"noopener noreferrer\">buradan<\/a><\/em> ula\u015fabilirsiniz. <em>API<\/em> kodlar\u0131na herhangi bir m\u00fcdehale etmeden, &#8220;<em>retry<\/em>&#8221; ve &#8220;<em>timeouts<\/em>&#8221; gibi fonksiyonalite&#8217;leri ekleyebilmek, g\u00fczel bir capability.<\/p>\n<p>Son olarak de\u011finmek istedi\u011fim bir di\u011fer konu ise, <em>Grafana<\/em> deste\u011fi. Live metric&#8217;lerin yan\u0131nda, ge\u00e7mi\u015f metricleri&#8217;de <em>Prometheus<\/em> ve <em>Grafana<\/em> deste\u011fi ile visualize edebilmek m\u00fcmk\u00fcnd\u00fcr.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2019\/06\/grafana_dashboard.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-2788 lazyload\" data-src=\"\/wp-content\/uploads\/2019\/06\/grafana_dashboard.jpg\" alt=\"\" width=\"1277\" height=\"870\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/grafana_dashboard.jpg 1277w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/grafana_dashboard-300x204.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/grafana_dashboard-768x523.jpg 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/grafana_dashboard-1024x698.jpg 1024w\" data-sizes=\"(max-width: 1277px) 100vw, 1277px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1277px; --smush-placeholder-aspect-ratio: 1277\/870;\" \/><\/a><\/p>\n<h2>Sonu\u00e7<\/h2>\n<p>Service mesh, microservice mimarileri i\u00e7in \u00f6nemli bir infrastructure layer&#8217;d\u0131r. Network&#8217;\u00fc abstract ederek, distributed mimarilerin challenge&#8217;lar\u0131n\u0131 (reliability, security, monitoring, etc&#8230;), kodumuz i\u00e7erisindeki complexity&#8217;i artt\u0131rmadan handle etmemize yard\u0131mc\u0131 olmaktad\u0131r. <em>Linkerd2<\/em> di\u011fer service mesh&#8217;lere g\u00f6re hen\u00fcz t\u00fcm \u00f6zelliklere sahip olmasa da,\u00a0\u00f6zellikle intelligent load balancing&#8217;i (low-latency) ile kullanabilece\u011fimiz iyi bir service mesh se\u00e7ene\u011fidir.<\/p>\n<p>Demo app: <em><a href=\"https:\/\/github.com\/GokGokalp\/service-mesh-linkerd-sample\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/github.com\/GokGokalp\/service-mesh-linkerd-sample<\/a><\/em><\/p>\n<h2>Kaynaklar<\/h2>\n<blockquote><p>https:\/\/linkerd.io\/2\/getting-started\/<br \/>\nhttps:\/\/www.zdnet.com\/article\/what-is-a-service-mesh-and-why-would-it-matter-so-much-now\/<\/p><\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>Bildi\u011fimiz gibi Microsoft, bu y\u0131l Barcelona KubeCon&#8216;da bir \u00e7ok yeniliklerini duyurdu. Bence bunlardan \u00f6nemli bir tanesi ise SMI(Service Mesh Interface) idi. \u0130nceledi\u011fim kadar\u0131yla SMI&#8216;\u0131n tan\u0131m\u0131 i\u00e7in k\u0131saca, t\u0131pk\u0131 AMQP&#8216;de oldu\u011fu gibi &#8220;interoperability&#8221; konusunu service mesh&#8217;ler aras\u0131nda sa\u011flayabilmek diyebilirim. \u00d6z\u00fcnde service mesh&#8217;ler i\u00e7in Kubernetes \u00fczerinde standart&#8230;<\/p>\n<div class=\"more-link-wrapper\"><a class=\"more-link\" href=\"https:\/\/gokhan-gokalp.com\/tr\/playing-with-service-mesh-linkerd-ve-azure-kubernetes-service\/\">Devam\u0131n\u0131 okuyun<span class=\"screen-reader-text\">Playing with Service Mesh &#8211; Linkerd ve Azure Kubernetes Service<\/span><\/a><\/div>\n","protected":false},"author":1,"featured_media":2799,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[505,68,417,418,434,368],"tags":[526,419,444,537,440,536,520,535],"class_list":["post-2760","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-net-core","category-architectural","category-asp-net-core","category-azure","category-containerizing","category-microservices","tag-net-core","tag-asp-net-core","tag-asp-net-core-kubernetes","tag-azure-kubernetes-service","tag-kubernetes","tag-linkerd","tag-resiliency","tag-service-mesh","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>Playing with Service Mesh - Linkerd ve Azure Kubernetes Service - 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\/playing-with-service-mesh-linkerd-ve-azure-kubernetes-service\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Playing with Service Mesh - Linkerd ve Azure Kubernetes Service - G\u00f6khan G\u00f6kalp\" \/>\n<meta property=\"og:url\" content=\"https:\/\/gokhan-gokalp.com\/playing-with-service-mesh-linkerd-ve-azure-kubernetes-service\/\" \/>\n<meta property=\"og:site_name\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n<meta property=\"article:published_time\" content=\"2019-06-27T18:20:16+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/kubernetes-linkerd-service-mesh.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1584\" \/>\n\t<meta property=\"og:image:height\" content=\"783\" \/>\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=\"21 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/playing-with-service-mesh-linkerd-ve-azure-kubernetes-service\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/playing-with-service-mesh-linkerd-ve-azure-kubernetes-service\\\/\"},\"author\":{\"name\":\"G\u00f6khan G\u00f6kalp\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"headline\":\"Playing with Service Mesh &#8211; Linkerd ve Azure Kubernetes Service\",\"datePublished\":\"2019-06-27T18:20:16+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/playing-with-service-mesh-linkerd-ve-azure-kubernetes-service\\\/\"},\"wordCount\":3205,\"commentCount\":3,\"publisher\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"image\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/playing-with-service-mesh-linkerd-ve-azure-kubernetes-service\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2019\\\/06\\\/kubernetes-linkerd-service-mesh.jpg\",\"keywords\":[\".net core\",\"asp.net core\",\"asp.net core kubernetes\",\"azure kubernetes service\",\"kubernetes\",\"linkerd\",\"resiliency\",\"service mesh\"],\"articleSection\":[\".NET Core\",\"Architectural\",\"ASP.NET Core\",\"Azure\",\"Containerizing\",\"Microservices\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/gokhan-gokalp.com\\\/playing-with-service-mesh-linkerd-ve-azure-kubernetes-service\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/playing-with-service-mesh-linkerd-ve-azure-kubernetes-service\\\/\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/playing-with-service-mesh-linkerd-ve-azure-kubernetes-service\\\/\",\"name\":\"Playing with Service Mesh - Linkerd ve Azure Kubernetes Service - G\u00f6khan G\u00f6kalp\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/playing-with-service-mesh-linkerd-ve-azure-kubernetes-service\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/playing-with-service-mesh-linkerd-ve-azure-kubernetes-service\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2019\\\/06\\\/kubernetes-linkerd-service-mesh.jpg\",\"datePublished\":\"2019-06-27T18:20:16+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/playing-with-service-mesh-linkerd-ve-azure-kubernetes-service\\\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/gokhan-gokalp.com\\\/playing-with-service-mesh-linkerd-ve-azure-kubernetes-service\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/playing-with-service-mesh-linkerd-ve-azure-kubernetes-service\\\/#primaryimage\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2019\\\/06\\\/kubernetes-linkerd-service-mesh.jpg\",\"contentUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2019\\\/06\\\/kubernetes-linkerd-service-mesh.jpg\",\"width\":1584,\"height\":783},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/playing-with-service-mesh-linkerd-ve-azure-kubernetes-service\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/gokhan-gokalp.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Playing with Service Mesh &#8211; Linkerd and Azure Kubernetes Service\"}]},{\"@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":"Playing with Service Mesh - Linkerd ve Azure Kubernetes Service - 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\/playing-with-service-mesh-linkerd-ve-azure-kubernetes-service\/","og_locale":"tr_TR","og_type":"article","og_title":"Playing with Service Mesh - Linkerd ve Azure Kubernetes Service - G\u00f6khan G\u00f6kalp","og_url":"https:\/\/gokhan-gokalp.com\/playing-with-service-mesh-linkerd-ve-azure-kubernetes-service\/","og_site_name":"G\u00f6khan G\u00f6kalp","article_published_time":"2019-06-27T18:20:16+00:00","og_image":[{"width":1584,"height":783,"url":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/kubernetes-linkerd-service-mesh.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":"21 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/gokhan-gokalp.com\/playing-with-service-mesh-linkerd-ve-azure-kubernetes-service\/#article","isPartOf":{"@id":"https:\/\/gokhan-gokalp.com\/playing-with-service-mesh-linkerd-ve-azure-kubernetes-service\/"},"author":{"name":"G\u00f6khan G\u00f6kalp","@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"headline":"Playing with Service Mesh &#8211; Linkerd ve Azure Kubernetes Service","datePublished":"2019-06-27T18:20:16+00:00","mainEntityOfPage":{"@id":"https:\/\/gokhan-gokalp.com\/playing-with-service-mesh-linkerd-ve-azure-kubernetes-service\/"},"wordCount":3205,"commentCount":3,"publisher":{"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"image":{"@id":"https:\/\/gokhan-gokalp.com\/playing-with-service-mesh-linkerd-ve-azure-kubernetes-service\/#primaryimage"},"thumbnailUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/kubernetes-linkerd-service-mesh.jpg","keywords":[".net core","asp.net core","asp.net core kubernetes","azure kubernetes service","kubernetes","linkerd","resiliency","service mesh"],"articleSection":[".NET Core","Architectural","ASP.NET Core","Azure","Containerizing","Microservices"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/gokhan-gokalp.com\/playing-with-service-mesh-linkerd-ve-azure-kubernetes-service\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/gokhan-gokalp.com\/playing-with-service-mesh-linkerd-ve-azure-kubernetes-service\/","url":"https:\/\/gokhan-gokalp.com\/playing-with-service-mesh-linkerd-ve-azure-kubernetes-service\/","name":"Playing with Service Mesh - Linkerd ve Azure Kubernetes Service - G\u00f6khan G\u00f6kalp","isPartOf":{"@id":"https:\/\/gokhan-gokalp.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/gokhan-gokalp.com\/playing-with-service-mesh-linkerd-ve-azure-kubernetes-service\/#primaryimage"},"image":{"@id":"https:\/\/gokhan-gokalp.com\/playing-with-service-mesh-linkerd-ve-azure-kubernetes-service\/#primaryimage"},"thumbnailUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/kubernetes-linkerd-service-mesh.jpg","datePublished":"2019-06-27T18:20:16+00:00","breadcrumb":{"@id":"https:\/\/gokhan-gokalp.com\/playing-with-service-mesh-linkerd-ve-azure-kubernetes-service\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/gokhan-gokalp.com\/playing-with-service-mesh-linkerd-ve-azure-kubernetes-service\/"]}]},{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/gokhan-gokalp.com\/playing-with-service-mesh-linkerd-ve-azure-kubernetes-service\/#primaryimage","url":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/kubernetes-linkerd-service-mesh.jpg","contentUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2019\/06\/kubernetes-linkerd-service-mesh.jpg","width":1584,"height":783},{"@type":"BreadcrumbList","@id":"https:\/\/gokhan-gokalp.com\/playing-with-service-mesh-linkerd-ve-azure-kubernetes-service\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/gokhan-gokalp.com\/"},{"@type":"ListItem","position":2,"name":"Playing with Service Mesh &#8211; Linkerd and Azure Kubernetes Service"}]},{"@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\/2760","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=2760"}],"version-history":[{"count":21,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/2760\/revisions"}],"predecessor-version":[{"id":2798,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/2760\/revisions\/2798"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/media\/2799"}],"wp:attachment":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/media?parent=2760"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/categories?post=2760"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/tags?post=2760"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}