<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Eyüp Akdeniz</title>
    <description>The latest articles on DEV Community by Eyüp Akdeniz (@eyupakdniz).</description>
    <link>https://dev.to/eyupakdniz</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1100828%2F2c0bde0e-287c-4529-bba9-2b63d3e7afc7.png</url>
      <title>DEV Community: Eyüp Akdeniz</title>
      <link>https://dev.to/eyupakdniz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/eyupakdniz"/>
    <language>en</language>
    <item>
      <title>HTTP &amp; REST API Fundamentals</title>
      <dc:creator>Eyüp Akdeniz</dc:creator>
      <pubDate>Sun, 18 May 2025 01:12:31 +0000</pubDate>
      <link>https://dev.to/eyupakdniz/http-rest-api-fundamentals-3kin</link>
      <guid>https://dev.to/eyupakdniz/http-rest-api-fundamentals-3kin</guid>
      <description>&lt;h2&gt;
  
  
  HTTP
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;HTTP&lt;/strong&gt; (Hypertext Transfer Protocol) is a protocol used for exchanging data over the web. &lt;br&gt;
HTTP Request is sent by a client (e.g., a web browser or mobile app) to a server, asking it to perform an operation (such as fetching or modifying data). &lt;br&gt;
The client then waits for the server's HTTP Response.&lt;/p&gt;

&lt;h3&gt;
  
  
  Real-World Examples:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Loading product lists
&lt;/li&gt;
&lt;li&gt;Fetching user profiles
&lt;/li&gt;
&lt;li&gt;Checking order status
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  RESTful APIs
&lt;/h2&gt;

&lt;p&gt;RESTful(Representational State Transfer) is an architectural style for designing web services (APIs). &lt;br&gt;
It efficiently utilizes HTTP methods (GET, POST, PUT, DELETE, etc.) to standardize how clients interact with server resources.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features:
&lt;/h3&gt;

&lt;p&gt;✔ Resource-based URLs (&lt;code&gt;/users&lt;/code&gt;, &lt;code&gt;/products&lt;/code&gt;)&lt;br&gt;&lt;br&gt;
✔ Stateless (no client data stored between requests)&lt;br&gt;&lt;br&gt;
✔ JSON/XML responses&lt;br&gt;&lt;br&gt;
✔ Standard HTTP methods  &lt;/p&gt;




&lt;h2&gt;
  
  
  REST API Best Practices
&lt;/h2&gt;

&lt;p&gt;Client-Server Architecture : Backend (API) and frontend (UI) should be completely separate.&lt;/p&gt;

&lt;p&gt;Stateless : Each request must contain all necessary authentication/authorization data.&lt;/p&gt;

&lt;p&gt;Cacheable : Responses (especially GET requests) should be cacheable.&lt;/p&gt;

&lt;p&gt;Uniform Interface : Resource access must follow consistent and clear rules.&lt;/p&gt;

&lt;p&gt;Layered System : The client should never directly access the database.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvnu6mf7spzvn9bqr8e79.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvnu6mf7spzvn9bqr8e79.jpg" alt="Image description" width="761" height="406"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  HTTP Methods
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Retrieve data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;POST&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Create data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PUT&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Full update&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PATCH&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Partial update&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DELETE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Remove data&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  HTTP Status Codes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Code Range&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Common Codes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1xx&lt;/td&gt;
&lt;td&gt;Informational&lt;/td&gt;
&lt;td&gt;100 Continue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2xx&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;td&gt;200 OK, 201 Created&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3xx&lt;/td&gt;
&lt;td&gt;Redirection&lt;/td&gt;
&lt;td&gt;301 Moved Permanently&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4xx&lt;/td&gt;
&lt;td&gt;Client Error&lt;/td&gt;
&lt;td&gt;400 Bad Request, 404 Not Found&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5xx&lt;/td&gt;
&lt;td&gt;Server Error&lt;/td&gt;
&lt;td&gt;500 Internal Server Error&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  Request Headers:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Authorization&lt;/code&gt;: Passes credentials for authentication. &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Content-Type&lt;/code&gt;: Specifies the media type (MIME type) of the request body. &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Accept&lt;/code&gt;: Specifies the media type (MIME type) of the request body.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;User-Agent&lt;/code&gt;: Identifies the client (browser, OS, or app).
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Response Headers:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Content-Type&lt;/code&gt;: &lt;code&gt;application/json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Access-Control-Allow-Origin(CORS)&lt;/code&gt; : Specifies which origins are allowed to access the resource.
&lt;/li&gt;
&lt;li&gt;Instructs the client to store cookies.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Set-Cookie&lt;/code&gt;: Session management
&lt;/li&gt;
&lt;li&gt;Rate limiting headers:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;X-RateLimit-Limit&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;X-RateLimit-Remaining&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Retry-After&lt;/code&gt; (on 429)
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




</description>
    </item>
    <item>
      <title>Singleton Tasarım Deseni ve Bean Scope</title>
      <dc:creator>Eyüp Akdeniz</dc:creator>
      <pubDate>Sun, 15 Oct 2023 20:27:24 +0000</pubDate>
      <link>https://dev.to/eyupakdniz/singleton-tasarim-deseni-ve-bean-scope-188f</link>
      <guid>https://dev.to/eyupakdniz/singleton-tasarim-deseni-ve-bean-scope-188f</guid>
      <description>&lt;h1&gt;
  
  
  Singleton
&lt;/h1&gt;

&lt;p&gt;Uygulamada birçok nesne tarafından yeniden kullanılması amaçlanan tek bir instance'a ihtiyaç duyulan durumlarda kullanılır. Spring'de, bu nesneleri Spring'in singleton bean'leri kullanarak veya Singleton tasarım desenini kendimiz uygulayarak oluşturabiliriz. Singleton, nesnelerin tekrar tekrar oluşturulmasının maliyetini önlemek veya bir nesneyi paylaşmanın gerektiği durumlar için idealdir.&lt;/p&gt;

&lt;p&gt;Singleton pattern implementasyonu, bir nesnenin gerçekten ihtiyaç duyulana kadar oluşturulmasını geciktirmek için genellikle tembel (lazy) başlatmayı kullanır. Yani bir nesnenin gerçekten ihtiyaç duyulana kadar oluşturulmasını erteleyerek, kaynak kullanımını ve performansı optimize edebilir.&lt;/p&gt;

&lt;p&gt;Spring çerçevesinde bir "bean," Spring IoC konteyneri içinde oluşturulan, yönetilen ve sonlandırılan bir nesnedir.&lt;/p&gt;

&lt;h1&gt;
  
  
  Bean Scope
&lt;/h1&gt;

&lt;p&gt;Spring bean'leri ile bir nesneyi, Inversion of Control(IoC) kullanarak, metadata aracılığıyla Spring container'ı enjekte edebiliriz. Bu, bir nesnenin bağımlılıklarını oluşturmadan tanımlayabilmesini ve bu işi IoC container'ına devredebilmesini sağlar.&lt;/p&gt;

&lt;p&gt;Spring çerçevesinin en son sürümü altı tür kapsam tanımlar:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Singleton&lt;/li&gt;
&lt;li&gt;Prototype&lt;/li&gt;
&lt;li&gt;Request&lt;/li&gt;
&lt;li&gt;Session&lt;/li&gt;
&lt;li&gt;Application&lt;/li&gt;
&lt;li&gt;WebSocket&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Bir bean'in scope'u, yaşam döngüsünü ve görünürlüğünü tanımlar. Ayrıca bir bean'in gerçek instancelarının nasıl oluşturulacağını belirler.&lt;/p&gt;

&lt;h3&gt;
  
  
  Singleton Scope
&lt;/h3&gt;

&lt;p&gt;Bir bean'i singleton scope ile tanımladığımızda, container o bean'in yalnızca bir instance oluşturur; bu bean adı için gelen tüm istekler aynı nesneyi döndürecektir ve bu nesne önbelleğe alınır. Nesnenin herhangi bir değişikliği, bean'e yapılan tüm isteklerde yansıtılır. Eğer başka bir kapsam belirtilmemişse, varsayılan olarak Singleton değerindedir.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prototype Scope
&lt;/h3&gt;

&lt;p&gt;Prototype scope'a sahip bir bean, her seferinde container istendiğinde farklı bir instance döndürecektir. Bu, bean tanımında @Scope açıklamasına prototype değerini ayarlayarak tanımlanır.&lt;/p&gt;

&lt;h3&gt;
  
  
  Request Scope
&lt;/h3&gt;

&lt;p&gt;Bir bean, her HTTP isteği için ayrı bir instance oluşturur. Yani bir istek aldığında yanıt verilene kadar bir instance kullanılır ve yeni bir istek geldiğinde farklı bir instance bean tarafından oluşturulur. Request scope, yalnızca web uygulamaları için geçerlidir.&lt;/p&gt;

&lt;h3&gt;
  
  
  Session Scope
&lt;/h3&gt;

&lt;p&gt;Bir bean, her HTTP oturumu için ayrı bir instance oluşturur. Bu, aynı kullanıcının oturumu boyunca aynı bean instance'ı paylaşmanızı sağlar. Session kapsamı da yalnızca web uygulamaları için geçerlidir.&lt;/p&gt;

&lt;h3&gt;
  
  
  Application Scope
&lt;/h3&gt;

&lt;p&gt;Application kapsamı, yine yalnızca web uygulamaları için geçerlidir. Bir bean, bir ServletContext'in yaşam döngüsü boyunca aynı örneği oluşturur. Bu, tüm uygulama boyunca aynı bean instance'ı paylaşmanızı sağlar. ServletContext, bir Java web uygulamasının çalıştığı sunucu ortamında, tüm web bileşenlerinin paylaştığı bir nesnedir.&lt;/p&gt;

&lt;h3&gt;
  
  
  WebSocket Scope
&lt;/h3&gt;

&lt;p&gt;WebSocket kapsamı da web uygulamaları ile ilişkilidir ve belirli bir WebSocket oturumu için bir bean instance oluşturur. Bu, WebSocket oturumu süresince aynı bean örneğini paylaşmanızı sağlar.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.baeldung.com/spring-boot-singleton-vs-beans"&gt;Singleton Design Pattern vs Singleton Beans in Spring Boot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.baeldung.com/spring-bean-scopes"&gt;Quick Guide to Spring Bean Scopes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>singleton</category>
      <category>spring</category>
      <category>bean</category>
      <category>java</category>
    </item>
    <item>
      <title>Inversion of Control(IoC) ve Dependency Injection(DI)</title>
      <dc:creator>Eyüp Akdeniz</dc:creator>
      <pubDate>Fri, 13 Oct 2023 20:39:34 +0000</pubDate>
      <link>https://dev.to/eyupakdniz/inversion-of-controlioc-ve-dependency-injectiondi-13a2</link>
      <guid>https://dev.to/eyupakdniz/inversion-of-controlioc-ve-dependency-injectiondi-13a2</guid>
      <description>&lt;h1&gt;
  
  
  Inversion of Control (IoC)
&lt;/h1&gt;

&lt;p&gt;Inversion of Control, bir nesnenin veya bir programın bölümlerinin kontrolünü ele almak yerine dışarıdan bir container veya framework tarafından sağlanan bir prensiptir. Bu prensip, yazılımın daha modüler ve esnek olmasını sağlar ve nesneler arasındaki bağımlılıkları azaltır. Genellikle nesne yönelimli programlama bağlamında kullanılır.&lt;/p&gt;

&lt;p&gt;IoC, bir frameworkün bir programın akışını kontrol altına almasına ve özel kodumuza çağrı yapmasına olanak tanır. Bunu sağlamak için frameworkler, yerleşik ek davranışlarla birlikte soyutlamalar kullanır. Kendi davranışımızı eklemek istiyorsak, frameworkün sınıflarını genişletmemiz veya kendi sınıflarımızı eklentilememiz gerekir.&lt;/p&gt;

&lt;p&gt;Nesneler arasındaki bağımlılıkları ortadan kaldıran ve bunun yerine soyutlamalara dayanan bir tasarım desenidir. Inversion of Control, yazılım bileşenlerini sorumluluklardan ayırmaya yönelik bir teknik olan Dependency Injection yoluyla elde edilebilir. Dependency Injection, bir sınıfın gerekli bağımlılıklarını dışarıdan enjekte etme yöntemini ifade eder. Bu da IoC prensibinin bir uygulama şeklidir ve IoC'nin bir sonucu olarak kullanılır.&lt;/p&gt;

&lt;p&gt;IoC'nin avantajları arasında kodun daha iyi organizasyonu, test edilebilirlik ve yazılım bileşenlerinin daha kolay değiştirilebilir olması yer alır. Bu prensip, bir programın daha fazla modüler ve bakımı daha kolay hale getiren önemli bir yazılım mühendisliği ilkesidir.&lt;/p&gt;

&lt;h1&gt;
  
  
  Dependency Injection (DI)
&lt;/h1&gt;

&lt;p&gt;Dependency Injection, bir objenin ihtiyaç duyduğu objeleri sağlar. Bağımlılıklar kendilerini oluşturmak yerine bazı dış araçlarla enjekte edilirler. Bu, kodun daha az bağımlı, daha modüler ve daha test edilebilir olmasını sağlar. Bu tasarım deseni, Inversion of Control (IoC) prensibinin bir uygulaması olarak da kabul edilir, çünkü bağımlılıkların kontrolünü sınıftan başka bir yere (çoğunlukla bir DI konteynerine veya konfigürasyon dosyasına) devreder.&lt;/p&gt;

&lt;h4&gt;
  
  
  Spring Boot'ta Dependency Injection için kullanılan yöntemler:
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Constructor Injection&lt;/li&gt;
&lt;li&gt;Setter Injection&lt;/li&gt;
&lt;li&gt;Field Injection&lt;/li&gt;
&lt;li&gt;Method Injection&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.baeldung.com/inversion-control-and-dependency-injection-in-spring"&gt;Intro to Inversion of Control and Dependency Injection with Spring&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@nirmalkumar8273/inversion-of-control-and-dependency-injection-in-spring-framework-e8e40b9afd8d#:~:text=Inversion%20of%20control%20is%20a,and%20instead%20depends%20on%20abstractions."&gt;Inversion of Control and Dependency Injection in Spring Framework&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>inversionofcontrol</category>
      <category>dependencyinjection</category>
      <category>springboot</category>
      <category>java</category>
    </item>
    <item>
      <title>gRPC</title>
      <dc:creator>Eyüp Akdeniz</dc:creator>
      <pubDate>Wed, 04 Oct 2023 07:59:26 +0000</pubDate>
      <link>https://dev.to/eyupakdniz/grpc-1nmp</link>
      <guid>https://dev.to/eyupakdniz/grpc-1nmp</guid>
      <description>&lt;h3&gt;
  
  
  IDL(Interface description language)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;IDL'nin temel amacı, farklı dillerde yazılmış bileşenlerin birbirleriyle etkileşimde bulunabilmelerini sağlamaktır. &lt;/li&gt;
&lt;li&gt;Bir bileşenin sunmuş olduğu hizmetleri ve veri türlerini açıkça belirlemek, diğer bileşenlerin bu hizmetlere ve verilere erişimini kolaylaştırır.&lt;/li&gt;
&lt;li&gt;Temel olarak, bir bileşenin veya modülün dışarıya açtığı fonksiyonların, veri yapılarının ve diğer arayüz öğelerinin nasıl görünmesi gerektiğini tanımlayan bir dil olarak düşünülebilir.&lt;/li&gt;
&lt;li&gt;Google protocol Buffers(protobuf), Apache Thrift, Apache Avro, openAPI/swagger, WSDL, CORBA gibi teknolojiler örnek olaraka verilebilir.
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Protocol Buffers
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Google tarafından geliştirilen bir veri serileştirme ve iletişim biçimi formatıdır. &lt;/li&gt;
&lt;li&gt;Protocol Buffers, hızlı, taşınabilir ve veri boyutunu minimize ederek veri alışverişini optimize eden bir veri serileştirme formatıdır.&lt;/li&gt;
&lt;li&gt;Bu format, özellikle dil ve platform bağımsız uygulamalar arasında veri alışverişi gerektiren senaryolarda yaygın olarak kullanılır.&lt;/li&gt;
&lt;li&gt;Protobuf, XML veya JSON gibi diğer veri serileştirme formatlarına alternatif olarak hafif ve hızlı bir yapı sunar. &lt;/li&gt;
&lt;li&gt;Dosya uzantısı .proto formatında dır.&lt;/li&gt;
&lt;li&gt;Şu anda protobuf dosyaları yazarken 3. versiyon kullanılır. Her .proto uzantılı dosyanın başına syntax="proto3"; eklenmesi gerekir
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  RPC(Remote Procedure Call)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Farklı dillerde yazılmış servislerin birbirleriyle iletişim kurmalarını kolaylaştıran yapıdır.&lt;/li&gt;
&lt;li&gt;Servislerin güvenli, güvenilir ve etkili bir şekilde iletişim kurmalarını sağlamak bazı özellikler vardır:

&lt;ul&gt;
&lt;li&gt;Servis Keşfi (Service Discovery): Servislerin otomatik olarak birbirlerini tespit edebilmelerini sağlar. Bu, Servislerin IP adresleri veya bağlantı noktaları gibi detayları bilmelerine gerek kalmadan birbirleriyle iletişim kurmalarını sağlar.&lt;/li&gt;
&lt;li&gt; Authentication: Authentication, hizmetlerin birbirlerini tanımalarını ve yetkisiz erişimi engellemelerini sağlar.&lt;/li&gt;
&lt;li&gt;Transport Layer Security (TLS): TLS, verilerin şifrelenerek iletilmesini sağlayan bir güvenlik protokolüdür. Bu, hizmetlerin verileri üçüncü şahısların okuyamayacağı şekilde iletmelerini sağlar.&lt;/li&gt;
&lt;li&gt;Retries: İletişim sırasında geçici hatalar meydana gelebilir. Eğer bir çağrı başarısız olursa, hizmetler otomatik olarak yeniden deneyebilir.&lt;/li&gt;
&lt;li&gt;Timeouts: Timeouts, bir çağrının belirli bir süre içinde cevap alamaması durumunda çağrının sonlandırılmasını sağlar.&lt;/li&gt;
&lt;li&gt;Cancellation: Client, uzun sürecek bir çağrıyı iptal etmek isteyebilir. Bu özellik, client bir çağrıyı başlatıp iptal etmesini ve hizmetin gereksiz yere kaynak kullanımını önlemesini sağlar.
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  gRPC
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;gRPC, Google tarafından geliştirilen ve açık kaynaklı bir Remote Procedure Call (RPC) framework'üdür. &lt;/li&gt;
&lt;li&gt;Temelde, farklı dillerde yazılmış servislerin birbirleriyle iletişim kurmasını kolaylaştıran bir teknolojidir. &lt;/li&gt;
&lt;li&gt;gRPC, Protocol Buffers (Protobuf) adı verilen bir veri serileştirme formatını temel alır ve modern dağıtık sistemlerde hızlı, verimli ve güvenilir iletişimi sağlamayı amaçlar.&lt;/li&gt;
&lt;li&gt;Protobuf, JSON veya XML'e göre daha hafif ve verimli bir veri taşıma biçimidir.&lt;/li&gt;
&lt;li&gt;gRPC, HTTP/2 tabanlı bir iletişim protokolünü kullanarak düşük geçikme süreleri ve yüksek veri iletim hızları sağlar. HTTP/2, tek bir bağlantı üzerinden çoklu veri akışını destekler.&lt;/li&gt;
&lt;li&gt;gRPC, otomatikleştirilmiş yük dengeleme, zaman aşımı, hata yönetimi, güvenlik (TLS), kimlik doğrulama ve yeniden deneme gibi ortak özellikleri destekler.&lt;/li&gt;
&lt;li&gt;gRPC, Protobuf tabanlı bir Service Definition Language kullanır. Bu dille servislerin ve mesajların tanımlanması sağlanır.&lt;/li&gt;
&lt;li&gt;Büyük ve karmaşık sistemlerde kullanım için tasarlanmıştır. Mikro hizmet mimarileri ve bulut tabanlı uygulamalar gibi senaryolarda sıkça tercih edilir.
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Protobuf &lt;br&gt;
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Message
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Protobuf'da &lt;code&gt;message&lt;/code&gt;, veriyi taşımak ve iletmek için kullanılan bir yapıdır. &lt;/li&gt;
&lt;li&gt;Bu mesajlar, farklı sistemler veya bileşenler arasında veri paylaşımını kolaylaştırmak için kullanılır. &lt;/li&gt;
&lt;li&gt;Mesajlar, sahip oldukları fields ve bu alanların veri türleri ile tanımlanır.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;message ClientMsg {&lt;/code&gt;&lt;br&gt;&lt;br&gt;
  &lt;code&gt;string firstVar = 1;&lt;/code&gt;&lt;br&gt;&lt;br&gt;
  &lt;code&gt;int32 secondVar = 2;&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;}&lt;/code&gt;&lt;br&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;message ServerMsg {&lt;/code&gt;&lt;br&gt;&lt;br&gt;
 &lt;code&gt;string name = 1;&lt;/code&gt;&lt;br&gt;&lt;br&gt;
 &lt;code&gt;int32 age = 2;&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;}&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Service
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Protobuf'da &lt;code&gt;service&lt;/code&gt;, farklı bileşenlerin birbirleriyle iletişim kurmalarını sağlayan bir yapıdır.&lt;/li&gt;
&lt;li&gt;Servisler, clientlara serverlara belirli işlemleri yapması için talepte bulunabildiği bir yapıdır. &lt;/li&gt;
&lt;li&gt;RPC kavramını Protobuf'da uygulamak için servisler kullanılır.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;service ServiceName {&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;rpc rpcCall (ClientMsg) returns (ServerMsg) {}&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;}&lt;/code&gt;&lt;br&gt;&lt;/p&gt;

&lt;p&gt;rpcCall: RPC çağrısının adıdır. Client bu adı kullanarak servera belirli bir işlem yapma talebi gönderebilir.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Stream
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;stream&lt;/code&gt; verileri Protobuf ile RPC çağrılarıyla iletmek, büyük veri miktarlarını hızlı ve etkili bir şekilde işlemek, gerçek zamanlı uygulamalarda kullanmak, enerji tasarrufu yapmak ve daha fazla senkronizasyon ve yönetim esnekliği sağlamak gibi birçok avantajı beraberinde getirir.&lt;br&gt;&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Server Streaming: Sunucu tarafından tek bir isteğe karşı birden fazla yanıt gönderilebilir.&lt;br&gt;&lt;br&gt;
&lt;code&gt;rpc rpcCall (ClientMsg) returns (stream ServerMsg) {}&lt;/code&gt;&lt;br&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Client Streaming: İstemci tarafından birden fazla istek gönderilebilir ve sunucu tek bir yanıt gönderir.&lt;br&gt;&lt;br&gt;
&lt;code&gt;rpc rpcCall (stream ClientMsg) returns (ServerMsg) {}&lt;/code&gt;&lt;br&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Bidirectional streaming: client ile server arasında chat gibi req-res gönderir.&lt;br&gt;&lt;br&gt;
&lt;code&gt;rpc rpcCall (stream ClientMsg) returns (stream ServerMsg) {}&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;br&gt;&lt;br&gt;
Not: gRPC kullanan uygulamalarda url'deki v1,v2 yani versionlama protobuf'nin değiştiği anlamına gelir.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>grpc</category>
    </item>
    <item>
      <title>KAFKA ve KRaft</title>
      <dc:creator>Eyüp Akdeniz</dc:creator>
      <pubDate>Tue, 03 Oct 2023 11:17:42 +0000</pubDate>
      <link>https://dev.to/eyupakdniz/kafka-ve-kraft-2fkg</link>
      <guid>https://dev.to/eyupakdniz/kafka-ve-kraft-2fkg</guid>
      <description>&lt;p&gt;Linkedin tarafında geliştirilmiştir. Dağıtık bir veri akış platformudur. Asenkron olarak çalışır. Kafkaya girilen mesajlar hangi formatta olursa olsun byte array halinde taşınır.&lt;/p&gt;

&lt;h1&gt;
  
  
  Temel Kavramlar
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Topic&lt;/strong&gt; : Gelen mesajları kategorize etmeyi sağlar. Kategorize ettiği her yapıyada partition denir.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Partition&lt;/strong&gt; : Topic partiton'lardan oluşur. Mesajlarımız partitonlara immutable ve sıralı olarak eklenir.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Offset&lt;/strong&gt; : Partition'lara mesajlar eklenirken artan bir id değeri ile eklenirler bu da offset denir ve partitionun kendi içinde sıralı şekilde yazılır.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Producer&lt;/strong&gt; : Topiclere veri gönderirler. Kafka içinde hayali bir kavramdır.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Producer Acknowledgement&lt;/strong&gt;&lt;br&gt;
Mesaj teslimi üzerinde değişen düzeylerde güvenilirlik ve kontrol sağlar.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Ack 0&lt;/em&gt;&lt;/strong&gt; : Kafka brokers'a ulaşması yeter. Bu mod, en yüksek verimi ve en düşük gecikmeyi sunar, ancak mesajın Kafka'ya başarılı bir şekilde teslim edildiğini veya diğer aracılara kopyalandığını garanti etmez.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Ack 1&lt;/em&gt;&lt;/strong&gt; : Target partition'a ulaşır ve okuması beklenir. Kopyalanmayı garanti etmez.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Ack=all&lt;/em&gt;&lt;/strong&gt; veya &lt;strong&gt;&lt;em&gt;Ack=-1&lt;/em&gt;&lt;/strong&gt; : Ack 1 olacak ve replicası oluşturulacak&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Consumer&lt;/strong&gt; : Bir veya birden fazla topicten veri okur. Mesajları idlerine göre okur yani bir veri sadece bir kere okunur.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Consumer Veri Okuma Seçenekleri&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;&lt;em&gt;At Most Once&lt;/em&gt;&lt;/strong&gt; : En fazla 1 kere oku. Consumer tarafında verinin en fazla bir kez işlenmesini garanti etmez. Tüketici mesajı aldığında hemen offset'i kaydeder, bu nedenle bir hata olursa mesajı kaybetme riski vardır. Bu mod, daha hızlı işleme ve düşük maliyet sağlar, ancak veri kaybı olabilir.&lt;br&gt;
&lt;strong&gt;&lt;em&gt;At Least Once&lt;/em&gt;&lt;/strong&gt; : En fazla 1 kere oku. Consumer mesajı işledikten sonra offseti kaydeder. Bazı restart durumlarında duplikasyona sebep olabilir. &lt;br&gt;
&lt;strong&gt;&lt;em&gt;Exactly Once&lt;/em&gt;&lt;/strong&gt; : Tam bir kere okumadır. her mesajın en az 1 kere aktarılmasını garantiler. Transactional producer consumer kullanılır. Transactional oluğu için oldukça maliyetlidir.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Brokers&lt;/strong&gt; : Bir cluster içinde bir veya daha fazla broker olabilir. Producerdan gelen mesajları alır, saklar ve sunmakla sorumludur.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zookeeper&lt;/strong&gt; &lt;br&gt;
 Dağıtık sistemlerin koordinasyonunu ve yönetimini sağlamak için kullanılan açık kaynaklı bir yazılım projesidir. Verilerin tutulduğu yerdir.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zookeeper Kullanılırken Çekilen Sıkıntılar&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ölçeklendirme yaparken bottleneck olurdu.&lt;/li&gt;
&lt;li&gt;Sınırlı sayıda partition oluşturulmasına izin verilirdi.&lt;/li&gt;
&lt;li&gt;Kafka brokerları bir Kafka clustera katıldığında veya ayrıldığında lider seçimi süreçleri gerçekleştirilir, ve bu durum zaman zaman ZooKeeper'a ek yük getirebilir. &lt;/li&gt;
&lt;li&gt;Kafka clusterlarının kurulması zordur ve başka componentlere bağlıdır.&lt;/li&gt;
&lt;li&gt;Kafka cluster metadata ZooKeeper ile senkronize olabilir, ancak bazen bu senkronizasyon arızalanabilir veya out-of-sync hale gelebilir. &lt;/li&gt;
&lt;li&gt;ZooKeeper'ın güvenlik özellikleri ve mekanizmaları, Kafka'nın güvenlik özellikleri ve gereksinimleriyle karşılaştırıldığında genellikle geride kalır.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  KRaft
&lt;/h2&gt;

&lt;p&gt;Kafka, Kafka 4.0 ile Zookeeper yerine KRaft'ı tamamen desteklemeye başlayacak. Quorum denetleyicileri, metadata'nın doğru bir şekilde çoğaltılmasını sağlamak için yeni KRaft protokolünü kullanır. Quorum denetleyici, iç durum makinelerinin her zaman doğru bir şekilde yeniden oluşturulabilmesini garanti eden olay kaynaklı bir depolama modeli kullanır. Bu durumu saklamak için kullanılan olay günlüğü (metadata konusu olarak da bilinir), günlüğün sonsuza kadar büyümesini engellemek için periyodik olarak kesitlerle kısaltılır. Quorum içindeki diğer denetleyiciler, aktif denetleyiciyi takip ederek, bu denetleyicinin oluşturduğu ve günlüğünde sakladığı olaylara yanıt verirler. Bu nedenle, bir düğümün, örneğin bir bölme olayı nedeniyle duraklaması durumunda, katıldığında kaçırdığı olaylara hızlı bir şekilde yetişebilmesi için günlüğe erişebilir. Bu, sisteminki kötü durum kurtarma süresini iyileştirerek önemli ölçüde azaltır.&lt;/p&gt;

&lt;h3&gt;
  
  
  KRaft'ın Faydaları
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Kafka'nın KRaft adını alan yeni Metadata Quorum modu, ZooKeeper'ı kaldırarak Kafka'nın kendi içinde bir tür seçim (quorum) yapma yeteneği kazanmasını temsil eder. Bu mod, Kafka'nın kendi içerisinde bir seçim (quorum) mekanizması olan Raft protokolünü kullanır.&lt;/li&gt;
&lt;li&gt;Kararlılığı artırır, yazılımı basitleştirir ve Kafka'nın izlenmesini, yönetilmesini ve desteklenmesini kolaylaştırır&lt;/li&gt;
&lt;li&gt;Kafka'nın tüm sistem için tek bir güvenlik modeline sahip olmasını sağlar
&lt;/li&gt;
&lt;li&gt;Daha hızlı denetleyici kapatma ve kurtarma süresi&lt;/li&gt;
&lt;li&gt;kafka single-process şekilde çalışmaya başlar.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Kafkanın Kullanım Yerleri?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Web sayfası etkinlikleri izleme&lt;/li&gt;
&lt;li&gt;İzleme sistemlerindeki metriklerde&lt;/li&gt;
&lt;li&gt;Log toplama sistemlerinde&lt;/li&gt;
&lt;li&gt;Stream Proccessing işlemlerinde&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.conduktor.io/kafka/how-to-install-apache-kafka-on-linux-without-zookeeper-kraft-mode/"&gt;https://www.conduktor.io/kafka/how-to-install-apache-kafka-on-linux-without-zookeeper-kraft-mode/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.conduktor.io/kafka/kafka-kraft-mode/"&gt;https://www.conduktor.io/kafka/kafka-kraft-mode/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.confluent.io/learn/kraft/?source=post_page-----615b9582c270--------------------------------"&gt;https://developer.confluent.io/learn/kraft/?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>kafka</category>
      <category>zookeeper</category>
      <category>kraft</category>
    </item>
  </channel>
</rss>
