﻿
{"id":24948,"date":"2022-05-07T23:46:38","date_gmt":"2022-05-07T23:46:38","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=24948"},"modified":"2022-05-07T23:47:16","modified_gmt":"2022-05-07T23:47:16","slug":"netflix-eureka-server-ile-service-discovery","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/netflix-eureka-server-ile-service-discovery\/","title":{"rendered":"Netflix Eureka Server \u0130le Service Discovery"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Microservice mimarisi ile geli\u015ftirilen projelerde birbirlerinden ba\u011f\u0131ms\u0131z onlarca servis aras\u0131nda ileti\u015fim esast\u0131r. Haliyle bu ileti\u015fim s\u00fcrecini m\u00fcmk\u00fcn mertebe basit ve etkili bir \u015fekilde dizayn etmemiz gerekmektedir. Genellikle servisler aras\u0131 ileti\u015fim kompleksli\u011fine, cephe g\u00f6revi g\u00f6ren <a href=\"https:\/\/www.gencayyildiz.com\/blog\/tag\/api-gateway\/\" rel=\"noopener\" target=\"_blank\">API Gateway<\/a> yaz\u0131l\u0131mlar\u0131yla \u00e7\u00f6z\u00fcm getirmeye \u00e7al\u0131\u015f\u0131r\u0131z lakin API Gateway&#8217;ler u\u00e7 d\u00fczeyde clienttan servise(<em>client-to-service<\/em>) trafi\u011fi y\u00f6netiklerinden dolay\u0131 servisler aras\u0131 ileti\u015fim i\u00e7in yeterli bir model sunamad\u0131klar\u0131ndan dolay\u0131 yetersiz gelmektedirler. \u00c7\u00fcnk\u00fc microservice mimarilerde yo\u011fun olarak servisten servise(<em>service-to-service<\/em>) haberle\u015fme s\u00f6z konusudur. Dolay\u0131s\u0131yla bu davran\u0131\u015f\u0131 kar\u015f\u0131layabilecek bir \u00e7\u00f6z\u00fcmsel modele ihtiyac\u0131m\u0131z olacakt\u0131r. O y\u00fczden bu i\u00e7eri\u011fimizde, API Gateway yerine bu ihtiyaca istinaden daha elveri\u015fli olan <em>Service Discovery<\/em> tool&#8217;u olan <em>Eureka<\/em> ile \u00e7\u00f6z\u00fcm getirmeye \u00e7al\u0131\u015facak ve servisler aras\u0131 ileti\u015fim s\u00fcrecini olabildi\u011fince y\u00f6netilebilir hale getirmeye odaklan\u0131yor olaca\u011f\u0131z.<\/p>\n<h3>Nedir Bu Service Discovery?<\/h3>\n<p>Service Discovery, farkl\u0131 adreslerde host edilen servislerin(ya da API&#8217;lerin) birbirleri aras\u0131ndaki ileti\u015fim\/haberle\u015fme i\u00e7in geli\u015ftiriciler taraf\u0131ndan adres bilgilerinin bilinmesi zorunlulu\u011funu ortadan kald\u0131rarak, bu servislerin ortak bir store&#8217;a register olmas\u0131n\u0131 sa\u011flayan ve b\u00f6ylece eri\u015fim tarifini kolayla\u015ft\u0131rarak ileti\u015fimi daha sade hale getiren bir modeldir. Bu model sayesinde ilgili proje ekosisteminde bulunan t\u00fcm servisler birbirleriyle &#8216;<em>service name<\/em>&#8216; de\u011ferleri arac\u0131l\u0131\u011f\u0131yla rahatl\u0131kla ileti\u015fim kurabilmekte ve geli\u015ftiricileri adres, port vs. gibi ufak tefek bilgilere bo\u011fmaks\u0131z\u0131n ileti\u015fimi s\u00fcrd\u00fcrebilmektedirler.<\/p>\n<p>Service Discovery mimarisini daha iyi anlayabilmek i\u00e7in a\u015fa\u011f\u0131daki g\u00f6rseli incelersek e\u011fer;<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/05\/Netflix-Eureka-Server-Ile-Service-Discovery.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/05\/Netflix-Eureka-Server-Ile-Service-Discovery.png\" alt=\"Netflix Eureka Server \u0130le Service Discovery\" width=\"1024\" height=\"631\" class=\"aligncenter size-full wp-image-24962\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/05\/Netflix-Eureka-Server-Ile-Service-Discovery.png 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/05\/Netflix-Eureka-Server-Ile-Service-Discovery-300x185.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/05\/Netflix-Eureka-Server-Ile-Service-Discovery-768x473.png 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a>servislerin kendi aralar\u0131ndaki ileti\u015fimi herhangi bir host bilgisine gerek kalmaks\u0131z\u0131n ger\u00e7ekle\u015ftirdi\u011fini g\u00f6rmekteyiz. Misal olarak, sol taraftaki &#8216;A Service&#8217;, sa\u011f taraftaki &#8216;B Service&#8217;e istek g\u00f6nderecekse e\u011fer ilgili servisin ip&#8217;sini, hostunu, portunu vs. bilmeye gerek duymaks\u0131z\u0131n direkt olarak &#8216;<em>Service Registry<\/em>&#8216; servisinden istek y\u00f6nlendirmede bulunabilmektedir. <em><strong>Bu i\u015flem nas\u0131l ger\u00e7ekle\u015fiyor?<\/strong><\/em> diye sorarsan\u0131z e\u011fer dikkat ederseniz t\u00fcm servisler service registry&#8217;e kay\u0131t olmu\u015f vaziyettedir. Haliyle istek g\u00f6nderecek servisin, hedef servisin tag(<em>service name<\/em>) bilgisini bilmesi ve bu bilgi do\u011frultusunda &#8216;<em>ben n isimli servise \u015fu iste\u011fi g\u00f6ndermek istiyorum<\/em>&#8216; \u015feklinde service registry \u00fczerinden hareket etmesi yeterli olacakt\u0131r \ud83d\ude42<\/p>\n<p>Uygulama ekosisteminde kullan\u0131lan servislerin, service registry&#8217;e kay\u0131t olmas\u0131 teoride olduk\u00e7a basittir. Bunun i\u00e7in her bir servis aya\u011fa kalkarken(ilk anda) service discovery&#8217;e request atarak kendisi hakk\u0131nda belirli tan\u0131mlamalarda bulunarak kay\u0131t i\u015flemini ger\u00e7ekle\u015ftirmektedir. B\u00f6ylece service discovery \u00fczerinde tan\u0131mlanan servis di\u011fer servislerle tag \u00fczerinden ileti\u015fim kurabilir vaziyette konumunu alm\u0131\u015f demektir.<\/p>\n<p>Bu arada service registry&#8217;in service discovery ile olan ili\u015fkisini k\u0131saca izah etmemiz gerekirse e\u011fer, t\u00fcm (mikro)servislerin host edildikleri network lokasyonlar\u0131n\u0131n register edilerek tutuldu\u011fu ve servisler aras\u0131 ileti\u015fimde bu lokasyonlar\u0131n tagler(<em>service name<\/em>) e\u015fli\u011finde eri\u015filebilir k\u0131l\u0131nd\u0131\u011f\u0131 bir yap\u0131lanmad\u0131r. Ayr\u0131ca birbirleri aras\u0131ndaki ileti\u015fim s\u00fcrecini, bu yap\u0131lanma \u00fczerinden ger\u00e7ekle\u015ftirmek isteyen t\u00fcm servislere <em>Service Registry Client<\/em> ismi verildi\u011fini s\u00f6ylemekte fayda g\u00f6rmekteyim.<\/p>\n<blockquote><p><em style=\"color:green;\">Service discovery, service-to-service haberle\u015fme s\u00fcre\u00e7lerinde uygulamalar\u0131n birbirlerinin network adreslerine metinsel de\u011ferler kar\u015f\u0131l\u0131\u011f\u0131nda ula\u015fmas\u0131n\u0131 sa\u011flayan basit bir model ortaya koymaktad\u0131r.<\/em><\/p><\/blockquote>\n<p><strong>Service discovery ile API Gateway aras\u0131ndaki fark nedir?<\/strong><br \/>\n\u0130\u00e7eri\u011fimize tam olarak giri\u015f yapmadan \u00f6nce belki service discovery&#8217;nin API Gateway&#8217;den fark\u0131n\u0131 \u00fcst sat\u0131rlarda ele alm\u0131\u015f olsak bile teoride pek yaratamam\u0131\u015f olabiliriz. Bundan dolay\u0131 iki kavram aras\u0131ndaki fark\u0131 a\u015fa\u011f\u0131daki tablo \u00fczerinden somutla\u015ft\u0131rarak i\u00e7eri\u011fe devam etmek daha verimli olacakt\u0131r kanaatindeyim.<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"width:50%;\">Service Discovery<\/th>\n<th>API Gateway<\/th>\n<\/tr>\n<\/thead>\n<tbody style=\"font-size:12px;\">\n<tr>\n<td>Servisten servise yap\u0131lacak istekleri y\u00f6netir.<\/td>\n<td>Clienttan servise yap\u0131lacak olan istekleri y\u00f6netir. Biraz daha nihaidir.<\/td>\n<\/tr>\n<tr>\n<td>Yatay d\u00fczlemde(servisler aras\u0131 &#8211; east\/west traffic) istek trafi\u011fini i\u015fler.<\/td>\n<td>Dikey d\u00fczlemde(client ile servis aras\u0131 &#8211; north\/south traffic) istek trafi\u011fini i\u015fler.<\/td>\n<\/tr>\n<tr>\n<td>\u0130\u00e7 kaynaklardaki trafiklere\/i\u015flere odaklan\u0131r.<\/td>\n<td>Harici\/d\u0131\u015f trafikleri i\u00e7 kaynaklara y\u00f6nlendirir. Burada d\u0131\u015f trafikten kas\u0131t clientlard\u0131r. Clientlar\u0131n t\u00fcketti\u011fi i\u00e7 kaynaklardan mevzu bahis ise servislerdir.<\/td>\n<\/tr>\n<tr>\n<td>Uygulamada kullan\u0131lan servislerin ileti\u015fimini \u00f6n plana \u00e7\u0131kar\u0131r.<\/td>\n<td>Uygulamada kullan\u0131lan servislerin y\u00f6netimini ve kontrol\u00fcn\u00fc ortaya \u00e7\u0131kar\u0131r.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u015eimdi gelin uygulamal\u0131 olarak service discovery implementasyonunu ger\u00e7ekle\u015ftirmeyi inceleyelim. Tabi \u00fczerine \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131z projede service discovery implementasyonunu ger\u00e7ekle\u015ftirebilmek i\u00e7in <a href=\"https:\/\/zookeeper.apache.org\/\" rel=\"noopener\" target=\"_blank\">ZooKeeper<\/a>, <a href=\"https:\/\/istio.io\/\" rel=\"noopener\" target=\"_blank\">Istio<\/a>, <a href=\"https:\/\/www.consul.io\/\" rel=\"noopener\" target=\"_blank\">Consul by HashiCorp<\/a>, <a href=\"https:\/\/github.com\/Netflix\/eureka\" rel=\"noopener\" target=\"_blank\">Netflix Eureka<\/a> vs. gibi t\u00fcrl\u00fc t\u00fcrl\u00fc tool&#8217;lar mevcuttur. Bizler bu i\u00e7eri\u011fimizde malumunuz giri\u015f paragraf\u0131nda da bildirildi\u011fi gibi <em>Netflix Eureka<\/em> \u00fczerinden service discovery operasyonlar\u0131n\u0131 .NET Core e\u015fli\u011finde y\u00fcr\u00fct\u00fcyor olacak ve implementasyon a\u00e7\u0131s\u0131ndan pratikte incelemede bulunaca\u011f\u0131z.<\/p>\n<h3>Eureka Kurulumu<\/h3>\n<p>\u0130lk olarak Eureka sunucusunun kurulumuyla ba\u015flayal\u0131m. Eureka&#8217;y\u0131 kullanabilmek i\u00e7in <a href=\"https:\/\/docs.steeltoe.io\/guides\/service-discovery\/eureka.html?tabs=cli\" rel=\"noopener\" target=\"_blank\">steeltoe<\/a> ekibinin sundu\u011fu docker image&#8217;inden istifade edebiliriz. Bunun i\u00e7in a\u015fa\u011f\u0131daki docker talimat\u0131n\u0131n \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131 yeterlidir.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\ndocker run --name Eureka --publish 8761:8761 steeltoeoss\/eureka-server\r\n<\/pre>\n<\/div>\n<p>Bu talimat neticesinde Eureka Server&#8217;\u0131 bar\u0131nd\u0131ran bir docker container <a href=\"http:\/\/localhost:8761\/\" rel=\"noopener\" target=\"_blank\">http:\/\/localhost:8761<\/a> portunda aya\u011fa kald\u0131r\u0131lm\u0131\u015f olacakt\u0131r.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/05\/Netflix-Eureka-Server-Ile-Service-Discovery-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/05\/Netflix-Eureka-Server-Ile-Service-Discovery-1.png\" alt=\"Netflix Eureka Server \u0130le Service Discovery\" width=\"861\" height=\"479\" class=\"aligncenter size-full wp-image-24983\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/05\/Netflix-Eureka-Server-Ile-Service-Discovery-1.png 861w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/05\/Netflix-Eureka-Server-Ile-Service-Discovery-1-300x167.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/05\/Netflix-Eureka-Server-Ile-Service-Discovery-1-768x427.png 768w\" sizes=\"auto, (max-width: 861px) 100vw, 861px\" \/><\/a>Evet, g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere service discovery sunucumuz hali haz\u0131r ayakta. Bundan sonra bu sunucuya register olacak servisleri olu\u015fturmaya ge\u00e7ebiliriz.<\/p>\n<h3>Eureka &#8211; Service Registry<\/h3>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/05\/Netflix-Eureka-Server-Ile-Service-Discovery-2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/05\/Netflix-Eureka-Server-Ile-Service-Discovery-2.png\" alt=\"Netflix Eureka Server \u0130le Service Discovery\" width=\"269\" height=\"341\" class=\"alignleft size-full wp-image-24987\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/05\/Netflix-Eureka-Server-Ile-Service-Discovery-2.png 269w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/05\/Netflix-Eureka-Server-Ile-Service-Discovery-2-237x300.png 237w\" sizes=\"auto, (max-width: 269px) 100vw, 269px\" \/><\/a>\u015eimdi \u00f6rneklendirmemizi iki API bir console uygulamas\u0131 \u00fczerinden sergiliyor olaca\u011f\u0131z. Bunun i\u00e7in blank solution a\u00e7\u0131p i\u00e7erisine yandaki g\u00f6rseldeki gibi &#8216;AService&#8217; ve &#8216;BService&#8217; ad\u0131nda iki Web API ve &#8216;CService&#8217; isminde de bir console projesi olu\u015ftural\u0131m.<\/p>\n<p>Tabi bu projeler bizim farazimizi tatbik edece\u011fimiz \u00f6rnek uygulamalard\u0131r. Sizler ger\u00e7ek operasyonlarda farkl\u0131 solutionlarda bulunan projeleri bu \u00e7al\u0131\u015fmaya dahil edebilir ve hatta farkl\u0131 bir framework veya dil\/platform&#8217;da geli\u015ftirilen uygulamay\u0131 da kendi f\u0131trat\u0131na uygun sisteme implemente edebilirsiniz. Velhas\u0131l bizler \u015fimdiki ahvalde devam edelim.<\/p>\n<p>\u015eimdi Eureka \u00fczerinden service discovery ile call edilecek t\u00fcm uygulamalar ilgili sunucuya registry olmak mecburiyetindedirler. Bunun i\u00e7in .NET Core ortam\u0131nda <a href=\"https:\/\/www.nuget.org\/packages\/Steeltoe.Discovery.Eureka\/\" rel=\"noopener\" target=\"_blank\">Steeltoe.Discovery.Eureka<\/a> k\u00fct\u00fcphanesinden istifade etmekteyiz. Sisteme hem register olacak hem de register olmu\u015f servislere istek g\u00f6nderecek t\u00fcm uygulamalar bu k\u00fct\u00fcphaneyi entegre etmek mecburiyetindedir.<\/p>\n<p>T\u00fcm servislere ilgili k\u00fct\u00fcphaneyi entegre ettikten sonra \u00f6ncelikle Web API&#8217;lar \u00fczerinden gerekli konfig\u00fcrasyonlara ba\u015flayabiliriz. Bunun i\u00e7in her iki API servisindeki &#8216;Program.cs&#8217; dosyas\u0131nda a\u015fa\u011f\u0131daki gibi <code>AddDiscoveryClient<\/code> metodu e\u015fli\u011finde Eureka implementasyonunu ger\u00e7ekle\u015ftirelim.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nusing Steeltoe.Discovery.Client;\r\n\r\nvar builder = WebApplication.CreateBuilder(args);\r\n\r\nbuilder.Services.AddControllers();\r\nbuilder.Services.AddDiscoveryClient(builder.Configuration);\r\n\r\nvar app = builder.Build();\r\n\r\napp.UseHttpsRedirection();\r\napp.UseAuthorization();\r\napp.MapControllers();\r\napp.Run();\r\n<\/pre>\n<\/div>\n<p>Bu <code>AddDiscoveryClient<\/code> metodu neticesinde uygulamalar\u0131m\u0131z ilk aya\u011fa kalkt\u0131\u011f\u0131nda service discovery&#8217;e client olarak talepte bulunacak ve i\u00e7eri\u011fi a\u015fa\u011f\u0131da bildirildi\u011fi gibi <code>appsettings.json<\/code> dosyas\u0131ndaki konfig\u00fcrasyonel de\u011ferler e\u015fli\u011finde kendilerini register edecektirler.<br \/>\n&#8216;AService&#8217; :<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n.\r\n.\r\n.\r\n  &quot;spring&quot;: {\r\n    &quot;application&quot;: {\r\n      &quot;name&quot;: &quot;AService&quot;\r\n    }\r\n  },\r\n  &quot;eureka&quot;: {\r\n    &quot;client&quot;: {\r\n      &quot;serviceUrl&quot;: &quot;http:\/\/localhost:8761\/eureka\/&quot;,\r\n      &quot;shouldFetchRegistry&quot;: &quot;true&quot;,\r\n      &quot;shouldRegisterWithEureka&quot;: true,\r\n      &quot;validateCertificates&quot;: false\r\n    },\r\n    &quot;instance&quot;: {\r\n      &quot;port&quot;: &quot;7175&quot;,\r\n      &quot;ipAddress&quot;: &quot;localhost&quot;,\r\n      &quot;preferIpAddress&quot;: true\r\n    }\r\n  }\r\n.\r\n.\r\n.\r\n<\/pre>\n<\/div>\n<p>&#8216;BService&#8217; :<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n.\r\n.\r\n.\r\n  &quot;spring&quot;: {\r\n    &quot;application&quot;: {\r\n      &quot;name&quot;: &quot;BService&quot;\r\n    }\r\n  },\r\n  &quot;eureka&quot;: {\r\n    &quot;client&quot;: {\r\n      &quot;serviceUrl&quot;: &quot;http:\/\/localhost:8761\/eureka\/&quot;,\r\n      &quot;shouldFetchRegistry&quot;: &quot;true&quot;,\r\n      &quot;shouldRegisterWithEureka&quot;: true,\r\n      &quot;validateCertificates&quot;: false\r\n    },\r\n    &quot;instance&quot;: {\r\n      &quot;port&quot;: &quot;7253&quot;,\r\n      &quot;ipAddress&quot;: &quot;localhost&quot;,\r\n      &quot;preferIpAddress&quot;: true\r\n    }\r\n  }\r\n.\r\n.\r\n.\r\n<\/pre>\n<\/div>\n<p>Evet, service discovery s\u00fcrecinde olacak t\u00fcm servisler bu konfig\u00fcrasyonel de\u011ferler e\u015fli\u011finde bildiride bulunmak mecburiyetindedirler. <em><strong>Peki bu de\u011ferler ne anlama gelmektedir?<\/strong><\/em> diye sordu\u011funuzu duyar gibiyim&#8230; Gelin k\u0131saca a\u00e7\u0131klayal\u0131m;<\/p>\n<ul style=\"font-size:12px;line-height: 1.8;\">\n<li><strong><em>spring:application:name<\/em><\/strong><br \/>\n\u0130lgili servisin kayd\u0131 neticesinde kullanaca\u011f\u0131 ad\u0131n\u0131 temsil eder.\n<\/li>\n<li><strong><em>eureka:client<\/em><\/strong><br \/>\nServisin Eureka ile olan davran\u0131\u015f\u0131n\u0131n temel ayarlar\u0131n\u0131 bar\u0131nd\u0131r\u0131r.\n<\/li>\n<li><strong><em>eureka:client:serviceUrl<\/em><\/strong><br \/>\nBa\u011flan\u0131lacak olan Eureka sunucu adresini temsil eder.\n<\/li>\n<li><strong><em>eureka:client:shouldFetchRegistry<\/em><\/strong><br \/>\n\u0130lgili servisin, ba\u015fka bir servis taraf\u0131ndan discovery\/ke\u015fifini temsil eder. &#8220;true&#8221; ise eri\u015filebilir. &#8220;false&#8221; ise eri\u015filemez!\n<\/li>\n<li><strong><em>eureka:client:shouldRegisterWithEureka<\/em><\/strong><br \/>\n\u0130lgili servisin Eureka&#8217;ya kay\u0131t olup olmamas\u0131n\u0131 ifade eder. Tabi ki de servis di\u011fer servisler taraf\u0131ndan call edilecekse &#8216;true&#8217; olmas\u0131 gerekmektedir.\n<\/li>\n<li><strong><em>eureka:client:validateCertificates<\/em><\/strong><br \/>\nSertifika do\u011frulamas\u0131n\u0131 etkinle\u015ftirir.\n<\/li>\n<li><strong><em>eureka:instance<\/em><\/strong><br \/>\nUygulamaya dair temel bilgileri bar\u0131nd\u0131r\u0131r.\n<\/li>\n<li><strong><em>eureka:instance:port<\/em><\/strong><br \/>\nUygulaman\u0131n port bilgisini ifade eder.\n<\/li>\n<li><strong><em>eureka:instance:ipAddress<\/em><\/strong><br \/>\nUygulaman\u0131n ip adresini\/host bilgisini ifade eder.\n<\/li>\n<li><strong><em>eureka:instance:preferIpAddress<\/em><\/strong><br \/>\nUygulama Eureka&#8217;ya kaydedilirken hostname yerine ip adresin kullan\u0131larak kay\u0131t edilip edilmemesini belirler.\n<\/li>\n<div style=\"background-color:#E4E4E4\">T\u00fcm bunlar\u0131n d\u0131\u015f\u0131nda geri kalan konfig\u00fcrasyonel de\u011ferlerin default de\u011ferleriyle birlikte neler oldu\u011funu incelemek i\u00e7in <a href=\"https:\/\/docs.steeltoe.io\/api\/v2\/discovery\/netflix-eureka.html\" rel=\"noopener\" target=\"_blank\">\u015furadaki<\/a> i\u00e7eri\u011fe g\u00f6z atman\u0131z\u0131 tavsiye ederim.<\/div>\n<\/ul>\n<p>Velhas\u0131l, bu ayarlar e\u015fli\u011finde uygulamalar\u0131 aya\u011fa kald\u0131r\u0131p Eureka server&#8217;a <a href=\"http:\/\/localhost:8761\/\" rel=\"noopener\" target=\"_blank\">http:\/\/localhost:8761<\/a> adresinden giri\u015f yaparsan\u0131z e\u011fer ilgili uygulamalar\u0131n instance olarak eklendi\u011fini g\u00f6receksiniz.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/05\/Netflix-Eureka-Server-Ile-Service-Discovery-3.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/05\/Netflix-Eureka-Server-Ile-Service-Discovery-3.png\" alt=\"Netflix Eureka Server \u0130le Service Discovery\" width=\"927\" height=\"288\" class=\"aligncenter size-full wp-image-24992\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/05\/Netflix-Eureka-Server-Ile-Service-Discovery-3.png 927w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/05\/Netflix-Eureka-Server-Ile-Service-Discovery-3-300x93.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/05\/Netflix-Eureka-Server-Ile-Service-Discovery-3-768x239.png 768w\" sizes=\"auto, (max-width: 927px) 100vw, 927px\" \/><\/a>Burada g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere &#8216;Application&#8217; kolonunda yazan de\u011ferler ilgili servisin host ve port bilgisine gerek kalmaks\u0131z\u0131n direkt olarak istek atmam\u0131z\u0131 sa\u011flayacak olan &#8216;<em>service name<\/em>&#8216; de\u011ferleridir. Bu &#8216;<em>service name<\/em>&#8216; de\u011ferini kullanarak <code>https:\/\/BService\/******<\/code> \u015feklinde isteklerde bulunabilece\u011fiz. \u015eimdi gelin bunu test edelim.<\/p>\n<h3>Calling Service\/API<\/h3>\n<p>Service discovery&#8217;e register olan t\u00fcm servisler birbirlerini \u00e7a\u011f\u0131rabileceklerinden dolay\u0131 burada \u00f6rnek ama\u00e7l\u0131 &#8216;AService&#8217; \u00fczerinden &#8216;BService&#8217;e bir istek g\u00f6nderelim. Bunun i\u00e7in her iki serviste de &#8216;ServiceController&#8217; isminde \u00f6rnek bir controller s\u0131n\u0131f\u0131 olu\u015fturulmas\u0131 kafidir.<\/p>\n<p>\u00d6nce &#8216;BService&#8217; i\u00e7erisinde controller&#8217;\u0131 olu\u015ftural\u0131m.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nnamespace BService.Controllers\r\n{\r\n    &#x5B;Route(&quot;api\/&#x5B;controller]&quot;)]\r\n    &#x5B;ApiController]\r\n    public class ServiceController : ControllerBase\r\n    {\r\n        public string Get()\r\n            =&gt; &quot;B Service is working&quot;;\r\n    }\r\n}\r\n<\/pre>\n<\/div>\n<p>Ard\u0131ndan &#8216;AService&#8217; i\u00e7erisinde &#8216;BService&#8217;e istek g\u00f6nderecek \u015fekilde controller&#8217;\u0131 in\u015fa edelim.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nnamespace AService.Controllers\r\n{\r\n    &#x5B;Route(&quot;api\/&#x5B;controller]&quot;)]\r\n    &#x5B;ApiController]\r\n    public class ServiceController : ControllerBase\r\n    {\r\n        readonly DiscoveryHttpClientHandler _discoveryHttpClientHandler;\r\n        public ServiceController(IDiscoveryClient discoveryClient)\r\n        {\r\n            _discoveryHttpClientHandler = new(discoveryClient);\r\n        }\r\n        public async Task&lt;string&gt; GetBService()\r\n        {\r\n            using HttpClient httpClient = new(_discoveryHttpClientHandler, false);\r\n            return await httpClient.GetStringAsync(&quot;https:\/\/BService\/api\/service&quot;);\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<\/div>\n<p>Yukar\u0131daki kod blo\u011funa dikkat ederseniz e\u011fer IoC Container&#8217;dan <code>IDiscoveryClient<\/code> referans\u0131yla inject edilen nesne <code>DiscoveryHttpClientHandler<\/code> t\u00fcr\u00fcnden handler s\u0131n\u0131f\u0131n\u0131n constructor&#8217;\u0131na verilmekte ve &#8216;HttpClient&#8217; nesnesinin bu handler s\u0131n\u0131f\u0131n\u0131 kullanarak istek yapmas\u0131 sa\u011flanmaktad\u0131r. T\u00fcm bu \u00e7al\u0131\u015fmalardan sonra &#8216;AService&#8217;ine <code>https:\/\/localhost:7175\/api\/service<\/code> adresi \u00fczerinden get iste\u011finde bulunal\u0131m ve sonucu hep birlikte g\u00f6zlemleyelim.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/05\/Netflix-Eureka-Server-Ile-Service-Discovery-4.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/05\/Netflix-Eureka-Server-Ile-Service-Discovery-4.png\" alt=\"Netflix Eureka Server \u0130le Service Discovery\" width=\"307\" height=\"73\" class=\"aligncenter size-full wp-image-24996\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/05\/Netflix-Eureka-Server-Ile-Service-Discovery-4.png 307w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/05\/Netflix-Eureka-Server-Ile-Service-Discovery-4-300x71.png 300w\" sizes=\"auto, (max-width: 307px) 100vw, 307px\" \/><\/a>Evet, g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere &#8216;AService&#8217; \u00fczerinden &#8216;BService&#8217;e <code>https:\/\/BService\/api\/service<\/code> endpoint&#8217;i arac\u0131l\u0131\u011f\u0131yla ba\u015far\u0131yla istek g\u00f6ndermi\u015f bulunuyoruz. Burada iki servis \u00fczerinden olay\u0131 sim\u00fcle etti\u011fimiz i\u00e7in k\u0131ymeti pek anla\u015f\u0131lmasa da esas\u0131nda onlarca servisin s\u00f6z konusu oldu\u011fu durumlarda Eureka server \u00fczerinden application ad\u0131n\u0131 al\u0131p, portsuz, hostsuz direkt istek yapabilmenin tad\u0131 paha bi\u00e7ilemez olacakt\u0131r \ud83d\ude42<\/p>\n<p>Ayr\u0131ca \u00f6rneklendirme i\u00e7in olu\u015fturdu\u011fumuz console uygulamas\u0131 olan &#8216;CService&#8217;i unuttu\u011fumuzu sanman\u0131z\u0131 istemem \ud83d\ude42 \u015eimdi gelin service discovery&#8217;e register edilmi\u015f servisleri sadece call edecek bir client uygulamas\u0131n\u0131n \u00f6rneklendirmesini bu console uygulamas\u0131 \u00fczerinden ger\u00e7ekle\u015ftirelim.<\/p>\n<p>\u015eimdi ilk olarak console uygulamas\u0131 i\u00e7erisinde &#8216;appsettings.json&#8217; isimli dosya olu\u015ftural\u0131m ve i\u00e7eri\u011fini a\u015fa\u011f\u0131daki gibi doldural\u0131m.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n{\r\n  &quot;spring&quot;: {\r\n    &quot;application&quot;: {\r\n      &quot;name&quot;: &quot;CService&quot;\r\n    }\r\n  },\r\n  &quot;eureka&quot;: {\r\n    &quot;client&quot;: {\r\n      &quot;serviceUrl&quot;: &quot;http:\/\/localhost:8761\/eureka\/&quot;,\r\n      &quot;shouldFetchRegistry&quot;: &quot;true&quot;,\r\n      &quot;shouldRegisterWithEureka&quot;: true,\r\n      &quot;validateCertificates&quot;: false\r\n    },\r\n    &quot;instance&quot;: {\r\n    }\r\n  }\r\n}\r\n<\/pre>\n<\/div>\n<p>Dikkat ederseniz e\u011fer bu uygulama sadece Eureka&#8217;da ki servisleri call edece\u011finden dolay\u0131 instance k\u0131sm\u0131n\u0131 bo\u015f ge\u00e7mekteyiz. Bu dosyaya console uygulamas\u0131 taraf\u0131ndan runtime&#8217;da eri\u015filebilmesi i\u00e7in &#8216;CService.csproj&#8217; dosyas\u0131nda a\u015fa\u011f\u0131daki gibi include etmemiz gerekmektedir.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n&lt;Project Sdk=&quot;Microsoft.NET.Sdk&quot;&gt;\r\n\t.\r\n\t.\r\n\t.\r\n\t&lt;ItemGroup&gt;\r\n\t\t&lt;Content Include=&quot;.\/appsettings.json&quot;&gt;\r\n\t\t\t&lt;CopyToOutputDirectory&gt;Always&lt;\/CopyToOutputDirectory&gt;\r\n\t\t&lt;\/Content&gt;\r\n\t&lt;\/ItemGroup&gt;\r\n\t.\r\n\t.\r\n\t.\r\n&lt;\/Project&gt;\r\n<\/pre>\n<\/div>\n<p>Ve son olarak a\u015fa\u011f\u0131daki gibi service discovery \u00fczerinden iste\u011fi g\u00f6nderelim.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nusing Microsoft.Extensions.Configuration;\r\nusing Microsoft.Extensions.DependencyInjection;\r\nusing Steeltoe.Common.Discovery;\r\nusing Steeltoe.Discovery;\r\nusing Steeltoe.Discovery.Client;\r\n\r\nConfigurationManager configurationManager = new();\r\nconfigurationManager.AddJsonFile(&quot;.\/appsettings.json&quot;);\r\n\r\nIServiceCollection serviceCollection = new ServiceCollection();\r\nserviceCollection.AddConfigurationDiscoveryClient(configurationManager);\r\nserviceCollection.AddSingleton&lt;IConfiguration&gt;(configurationManager);\r\nserviceCollection.AddDiscoveryClient(configurationManager);\r\n\r\nServiceProvider serviceProvider = serviceCollection.BuildServiceProvider();\r\n\r\nIDiscoveryClient discoveryClient = serviceProvider.GetService&lt;IDiscoveryClient&gt;();\r\nDiscoveryHttpClientHandler discoveryHttpClientHandler = new(discoveryClient);\r\nusing HttpClient httpClient = new(discoveryHttpClientHandler, false);\r\nConsole.WriteLine(await httpClient.GetStringAsync(&quot;https:\/\/BService\/api\/service&quot;));\r\n<\/pre>\n<\/div>\n<p>Burada yapt\u0131\u011f\u0131m\u0131z \u00e7al\u0131\u015fmaya g\u00f6z atarsan\u0131z e\u011fer &#8216;appsettings.json&#8217; dosyas\u0131ndaki konfig\u00fcrasyonel de\u011ferleri okuyabilmek i\u00e7in <code><a href=\"https:\/\/www.gencayyildiz.com\/blog\/net-6da-configurationmanager-nesnesi\/\" rel=\"noopener\" target=\"_blank\">ConfigurationManager<\/a><\/code> nesnesinden istifade etmekteyiz. Ard\u0131ndan build-in gelen <code>IServiceCollection<\/code> IoC container&#8217;\u0131na discovery client servisi y\u00fcklenmekte ve devam\u0131nda ise <code>IDiscoveryClient<\/code> t\u00fcr\u00fcnden nesne inject edilip, <code>DiscoveryHttpClientHandler<\/code> nesnesine verildikten sonra &#8216;HttpClient&#8217; \u00fczerinden istek ger\u00e7ekle\u015ftirilmektedir.<br \/>\n<div id=\"attachment_25000\" style=\"width: 252px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/05\/Netflix-Eureka-Server-Ile-Service-Discovery-5.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-25000\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/05\/Netflix-Eureka-Server-Ile-Service-Discovery-5.png\" alt=\"Netflix Eureka Server \u0130le Service Discovery\" width=\"242\" height=\"45\" class=\"size-full wp-image-25000\" \/><\/a><p id=\"caption-attachment-25000\" class=\"wp-caption-text\">Console uygulamas\u0131nda sonu\u00e7 \ud83d\ude42<\/p><\/div><\/p>\n<p>Nihai olarak,<br \/>\nServisler aras\u0131 ileti\u015fim s\u00fcre\u00e7lerinde host ve port bilgilerine bo\u011fulmaks\u0131z\u0131n service discovery \u00fczerinden &#8216;<em>service name<\/em>&#8216; de\u011ferleri e\u015fli\u011finde call operasyonlar\u0131n\u0131 y\u00fcr\u00fctebilmenin nas\u0131l oldu\u011funu Netflix Eureka tool&#8217;u \u00fczerinden incelemi\u015f ve bu yakla\u015f\u0131m\u0131n biz geli\u015ftiriciler a\u00e7\u0131s\u0131ndan s\u00fcreci olduk\u00e7a verimli ve y\u00f6netilebilir k\u0131ld\u0131\u011f\u0131na hep beraber \u015fahit olmu\u015f bulunmaktay\u0131z.<\/p>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<p>Not : \u00d6rnek \u00e7al\u0131\u015fmaya a\u015fa\u011f\u0131daki github adresinden eri\u015febilirsiniz.<br \/>\n<a href=\"https:\/\/github.com\/gncyyldz\/Eureka-Service-Discovery-Example\" rel=\"noopener\" target=\"_blank\">https:\/\/github.com\/gncyyldz\/Eureka-Service-Discovery-Example<\/a><\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, Microservice mimarisi ile geli\u015ftirilen projelerde birbirlerinden ba\u011f\u0131ms\u0131z onlarca servis aras\u0131nda ileti\u015fim esast\u0131r. Haliyle bu ileti\u015fim s\u00fcrecini m\u00fcmk\u00fcn mertebe basit ve etkili bir \u015fekilde dizayn etmemiz gerekmektedir. Genellikle servisler aras\u0131 ileti\u015fim kompleksli\u011fine, cephe g\u00f6revi&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":24962,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3573],"tags":[4572,4574,4284,4575,4576,4573],"class_list":["post-24948","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-microservices","tag-client-to-service","tag-eureka","tag-service-discovery","tag-service-registry","tag-service-registry-client","tag-service-to-service"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/24948","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=24948"}],"version-history":[{"count":51,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/24948\/revisions"}],"predecessor-version":[{"id":25005,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/24948\/revisions\/25005"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/24962"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=24948"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=24948"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=24948"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}