<?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: nk sk</title>
    <description>The latest articles on DEV Community by nk sk (@nk_sk_6f24fdd730188b284bf).</description>
    <link>https://dev.to/nk_sk_6f24fdd730188b284bf</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%2F3521810%2Fd12da72d-4995-4c6d-93d9-747647857151.png</url>
      <title>DEV Community: nk sk</title>
      <link>https://dev.to/nk_sk_6f24fdd730188b284bf</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nk_sk_6f24fdd730188b284bf"/>
    <language>en</language>
    <item>
      <title>🚀 Modern CI/CD for Microservices: Monorepos, AWS, Jenkins &amp; What Tech Giants Actually Use</title>
      <dc:creator>nk sk</dc:creator>
      <pubDate>Tue, 09 Dec 2025 10:38:04 +0000</pubDate>
      <link>https://dev.to/nk_sk_6f24fdd730188b284bf/modern-cicd-for-microservices-monorepos-aws-jenkins-what-tech-giants-actually-use-1bpd</link>
      <guid>https://dev.to/nk_sk_6f24fdd730188b284bf/modern-cicd-for-microservices-monorepos-aws-jenkins-what-tech-giants-actually-use-1bpd</guid>
      <description>&lt;p&gt;Microservices have become the standard way to build scalable backend systems. But as teams grow, architecture questions begin flooding in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Should microservices each have their own repo?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Is a monorepo anti-microservice?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;What do Amazon, Google, Netflix actually use?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How do we deploy microservices independently from AWS without GitHub?&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This guide brings a &lt;em&gt;practical&lt;/em&gt;, &lt;em&gt;real-world&lt;/em&gt;, and &lt;em&gt;industry-backed&lt;/em&gt; explanation of how microservices CI/CD and repo structures truly work today — especially in AWS environments using Jenkins.&lt;/p&gt;




&lt;h1&gt;
  
  
  🧩 &lt;strong&gt;1. The Myth: Microservices Require Multiple Git Repos&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Many developers assume:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Each microservice must live in a separate repo.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is &lt;strong&gt;not&lt;/strong&gt; a microservices rule.&lt;br&gt;
It’s simply a &lt;em&gt;common implementation pattern&lt;/em&gt;, not a requirement.&lt;/p&gt;

&lt;p&gt;Microservices need:&lt;/p&gt;

&lt;p&gt;✔ Independent &lt;strong&gt;build&lt;/strong&gt;&lt;br&gt;
✔ Independent &lt;strong&gt;test&lt;/strong&gt;&lt;br&gt;
✔ Independent &lt;strong&gt;deployment&lt;/strong&gt;&lt;br&gt;
✔ Independent &lt;strong&gt;scaling&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;None of these require separate repositories.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can achieve all four from a &lt;strong&gt;single repository&lt;/strong&gt; as well.&lt;/p&gt;


&lt;h1&gt;
  
  
  🟦 &lt;strong&gt;2. What Is a Monorepo?&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;A &lt;strong&gt;monorepo&lt;/strong&gt; (monolithic repository) stores the code for many projects and microservices inside a single version-controlled repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/services
   /auth-service
   /payment-service
   /order-service

/libs
   /logging
   /common-utils
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of scattered repos, everything lives together.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✔ Benefits of Monorepos
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Shared libraries are easy to maintain&lt;/li&gt;
&lt;li&gt;One place for all code&lt;/li&gt;
&lt;li&gt;Atomic changes across multiple services&lt;/li&gt;
&lt;li&gt;Unified linting, testing, formatting&lt;/li&gt;
&lt;li&gt;Simpler onboarding&lt;/li&gt;
&lt;li&gt;Avoid version drift across services&lt;/li&gt;
&lt;li&gt;Code reviews are easier and faster&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  🟥 &lt;strong&gt;3. “But does a monorepo break microservices independence?”&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;No.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;Because independent deployment has nothing to do with repository layout.&lt;/p&gt;

&lt;h3&gt;
  
  
  In a proper monorepo setup:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Each service has its own Dockerfile&lt;/li&gt;
&lt;li&gt;Each service has its own pipeline/Jenkinsfile&lt;/li&gt;
&lt;li&gt;Pipelines run only when that service changes&lt;/li&gt;
&lt;li&gt;Each service deploys its own container to Kubernetes&lt;/li&gt;
&lt;li&gt;Other services remain untouched&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example independent builds:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/services/user-service  -&amp;gt; ECR -&amp;gt; EKS deployment A
/services/order-service -&amp;gt; ECR -&amp;gt; EKS deployment B
/services/payment       -&amp;gt; ECR -&amp;gt; EKS deployment C
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is &lt;strong&gt;fully compliant&lt;/strong&gt; with microservices principles.&lt;/p&gt;




&lt;h1&gt;
  
  
  🟩 &lt;strong&gt;4. How Tech Giants Do It (Real Industry Practices)&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Let’s break down how the largest engineering teams handle microservices.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔵 &lt;strong&gt;Google&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Massive monorepo called &lt;strong&gt;Piper&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Millions of files&lt;/li&gt;
&lt;li&gt;Independent builds via &lt;strong&gt;Bazel&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Independent deployments via Borg/Kubernetes&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔵 &lt;strong&gt;Meta (Facebook)&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Mercurial-powered monorepo&lt;/li&gt;
&lt;li&gt;Thousands of microservices&lt;/li&gt;
&lt;li&gt;Independently deployable&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔵 &lt;strong&gt;Uber&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Hybrid monorepo&lt;/li&gt;
&lt;li&gt;Go, Java, Node services&lt;/li&gt;
&lt;li&gt;Independent builds + Spinnaker deployments&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔶 &lt;strong&gt;Netflix&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Mostly monorepo + GitHub Enterprise&lt;/li&gt;
&lt;li&gt;CI using Spinnaker&lt;/li&gt;
&lt;li&gt;Deploying microservices independently to Titus/Kubernetes&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🟦 &lt;strong&gt;Microsoft&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Azure DevOps monorepos&lt;/li&gt;
&lt;li&gt;Independent pipelines + AKS deployments&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  💡 &lt;strong&gt;Reality:&lt;/strong&gt;
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Tech giants don’t use GitHub public repos for production code.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Most use &lt;strong&gt;monorepos&lt;/strong&gt; with &lt;strong&gt;independent deployment pipelines&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  🟨 &lt;strong&gt;5. Production-Grade Repositories in AWS&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;If you don’t want GitHub, AWS gives you:&lt;/p&gt;

&lt;h3&gt;
  
  
  ✔ &lt;strong&gt;AWS CodeCommit&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;A fully private Git repository inside AWS.&lt;br&gt;
Used in enterprises, banks, and regulated industries.&lt;/p&gt;
&lt;h3&gt;
  
  
  ✔ &lt;strong&gt;AWS CodePipeline / CodeBuild&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Complete CI/CD inside AWS.&lt;/p&gt;
&lt;h3&gt;
  
  
  ✔ &lt;strong&gt;Jenkins on AWS&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;For teams already using Jenkins.&lt;/p&gt;


&lt;h1&gt;
  
  
  🟦 &lt;strong&gt;6. Production Architecture: Jenkins + AWS CodeCommit + EKS&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;This is the architecture many real AWS customers follow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;           ┌─────────────┐
           │ CodeCommit   │ ← Private Git repo
           └──────┬──────┘
                  │ Webhook
           ┌──────▼──────┐
           │   Jenkins    │
           └──────┬──────┘
   Build / Test   │
                  │ Build Docker Image
           ┌──────▼──────┐
           │    ECR      │ ← Stores versioned images
           └──────┬──────┘
                  │ Deploy
           ┌──────▼──────┐
           │    EKS      │ ← Kubernetes cluster
           └─────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each microservice has its own pipeline inside Jenkins.&lt;/p&gt;




&lt;h1&gt;
  
  
  🟧 &lt;strong&gt;7. Jenkinsfile for Independent Microservice Deployment&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Example structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/services
   /user-service
      Jenkinsfile
   /order-service
      Jenkinsfile
   /payment-service
      Jenkinsfile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each Jenkinsfile:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Builds only its own service&lt;/li&gt;
&lt;li&gt;Pushes only its own image&lt;/li&gt;
&lt;li&gt;Updates only its own Kubernetes deployment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s true microservice independence.&lt;/p&gt;




&lt;h1&gt;
  
  
  🟩 &lt;strong&gt;8. Sample Jenkins Pipeline (AWS ECR + EKS)&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;A simplified production pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="n"&gt;pipeline&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="n"&gt;any&lt;/span&gt;

    &lt;span class="n"&gt;environment&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;AWS_REGION&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ap-south-1"&lt;/span&gt;
        &lt;span class="n"&gt;APP_NAME&lt;/span&gt;      &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"user-service"&lt;/span&gt;
        &lt;span class="n"&gt;AWS_ACCOUNT&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;ACCOUNT-ID&amp;gt;"&lt;/span&gt;
        &lt;span class="n"&gt;ECR_REPO&lt;/span&gt;      &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"${AWS_ACCOUNT}.dkr.ecr.${AWS_REGION}.amazonaws.com/${APP_NAME}"&lt;/span&gt;
        &lt;span class="n"&gt;IMAGE_TAG&lt;/span&gt;     &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"${env.BUILD_NUMBER}"&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;stages&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Checkout'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;checkout&lt;/span&gt; &lt;span class="n"&gt;scm&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Login to ECR'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;sh&lt;/span&gt; &lt;span class="s2"&gt;"""
                    aws ecr get-login-password --region ${AWS_REGION} |
                    docker login --username AWS --password-stdin ${ECR_REPO}
                """&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Build &amp;amp; Push'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;sh&lt;/span&gt; &lt;span class="s2"&gt;"""
                    docker build -t ${APP_NAME}:${IMAGE_TAG} .
                    docker tag ${APP_NAME}:${IMAGE_TAG} ${ECR_REPO}:${IMAGE_TAG}
                    docker push ${ECR_REPO}:${IMAGE_TAG}
                """&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Deploy to EKS'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;sh&lt;/span&gt; &lt;span class="s2"&gt;"""
                    aws eks update-kubeconfig --region ${AWS_REGION} --name my-eks
                    kubectl set image deployment/${APP_NAME} ${APP_NAME}=${ECR_REPO}:${IMAGE_TAG}
                    kubectl rollout status deployment/${APP_NAME}
                """&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fully independent.&lt;br&gt;
No conflict across microservices.&lt;/p&gt;




&lt;h1&gt;
  
  
  🟥 &lt;strong&gt;9. Should You Choose Monorepo or Polyrepo?&lt;/strong&gt;
&lt;/h1&gt;

&lt;h3&gt;
  
  
  ✔ Choose &lt;strong&gt;Monorepo&lt;/strong&gt; when:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Shared libraries&lt;/li&gt;
&lt;li&gt;Cross-service updates&lt;/li&gt;
&lt;li&gt;Unified CI/CD&lt;/li&gt;
&lt;li&gt;Developer productivity&lt;/li&gt;
&lt;li&gt;Medium–large engineering teams&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ✔ Choose &lt;strong&gt;Polyrepo&lt;/strong&gt; when:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Completely unrelated services&lt;/li&gt;
&lt;li&gt;Different tech stacks&lt;/li&gt;
&lt;li&gt;Very strict team boundaries&lt;/li&gt;
&lt;li&gt;No shared dependencies&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  🟩 &lt;strong&gt;10. Final Truth Summary&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Here is the honest conclusion, based on how real companies operate:&lt;/p&gt;

&lt;h3&gt;
  
  
  ✔ Microservices require independent builds and deployments
&lt;/h3&gt;

&lt;h3&gt;
  
  
  ✔ They do &lt;strong&gt;NOT&lt;/strong&gt; require separate Git repos
&lt;/h3&gt;

&lt;h3&gt;
  
  
  ✔ Monorepos actually make microservices &lt;strong&gt;more efficient&lt;/strong&gt; at scale
&lt;/h3&gt;

&lt;h3&gt;
  
  
  ✔ Tech giants rely heavily on monorepos
&lt;/h3&gt;

&lt;h3&gt;
  
  
  ✔ AWS gives you CodeCommit as a production-grade Git alternative
&lt;/h3&gt;

&lt;h3&gt;
  
  
  ✔ Jenkins + ECR + EKS is a standard enterprise setup
&lt;/h3&gt;

&lt;h3&gt;
  
  
  ✔ Each microservice has its OWN pipeline, even in a monorepo
&lt;/h3&gt;




&lt;h1&gt;
  
  
  ✅ &lt;strong&gt;When a Monorepo Actually Shines (Real Practical Scenarios)&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Monorepo is NOT about "everything in one repo".&lt;br&gt;
Monorepo shines &lt;strong&gt;when your microservices are not completely isolated&lt;/strong&gt; and share things.&lt;/p&gt;

&lt;p&gt;Here are the &lt;strong&gt;exact cases where a monorepo is the BEST choice&lt;/strong&gt;:&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 &lt;strong&gt;1. When services have shared libraries or shared code&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;If you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;common-utils&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;logging&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;payment-client-sdk&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;shared protobuf models&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DTOs&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;API schemas&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then monorepo is a huge win.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why?
&lt;/h3&gt;

&lt;p&gt;Because you update the shared library &lt;strong&gt;once&lt;/strong&gt; and all services pick up the change &lt;strong&gt;instantly&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 &lt;strong&gt;2. When services are logically connected (domain-dependent)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;auth-service&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;user-service&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;account-service&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Updating a user schema might require a coordinated change across all three.&lt;/p&gt;

&lt;p&gt;Monorepo lets you:&lt;/p&gt;

&lt;p&gt;✔ Change all services in &lt;strong&gt;one commit&lt;/strong&gt;&lt;br&gt;
✔ Test them together&lt;br&gt;
✔ Deploy them independently&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 &lt;strong&gt;3. When the same team works across multiple services&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;This is very common:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Backend team owns 6–10 services&lt;/li&gt;
&lt;li&gt;They evolve together&lt;/li&gt;
&lt;li&gt;They share patterns, libraries, standards&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Monorepo increases speed and consistency dramatically.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 &lt;strong&gt;4. When services depend tightly on shared API contracts&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;gRPC &lt;code&gt;.proto&lt;/code&gt; files&lt;/li&gt;
&lt;li&gt;OpenAPI specs&lt;/li&gt;
&lt;li&gt;GraphQL schema&lt;/li&gt;
&lt;li&gt;Domain event contracts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In a polyrepo setup, versioning becomes painful.&lt;/p&gt;

&lt;p&gt;Monorepo solves:&lt;/p&gt;

&lt;p&gt;✔ Contract drift&lt;br&gt;
✔ Compatibility issues&lt;br&gt;
✔ Manual syncing between repos&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 &lt;strong&gt;5. When services evolve together over time&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;If two services:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;frequently change together&lt;/li&gt;
&lt;li&gt;share business logic&lt;/li&gt;
&lt;li&gt;require coordinated releases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then monorepo reduces management overhead.&lt;/p&gt;




&lt;h1&gt;
  
  
  ❗️ &lt;strong&gt;When Monorepo Is &lt;em&gt;Not&lt;/em&gt; Ideal&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Polyrepo is better when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Completely unrelated services&lt;/li&gt;
&lt;li&gt;Different tech stacks → Node + Go + Python&lt;/li&gt;
&lt;li&gt;Different teams owning different domains&lt;/li&gt;
&lt;li&gt;No shared libraries&lt;/li&gt;
&lt;li&gt;Loose coupling&lt;/li&gt;
&lt;li&gt;No cross-service code sharing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In these cases, separate repos reduce noise.&lt;/p&gt;




&lt;h1&gt;
  
  
  🔥 &lt;strong&gt;So the real truth in one sentence:&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;👉 &lt;strong&gt;Monorepo is best when services are dependent, share code, share contracts, or are owned by the same team.&lt;br&gt;
Polyrepo is best when services are fully independent in logic and ownership.&lt;/strong&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  💡 Even Tech Giants Do This
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situation&lt;/th&gt;
&lt;th&gt;Google / Meta / Uber&lt;/th&gt;
&lt;th&gt;Repo Choice&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Shared libraries&lt;/td&gt;
&lt;td&gt;Heavy&lt;/td&gt;
&lt;td&gt;Monorepo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shared protobuf schemas&lt;/td&gt;
&lt;td&gt;Massive&lt;/td&gt;
&lt;td&gt;Monorepo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-service changes&lt;/td&gt;
&lt;td&gt;Frequent&lt;/td&gt;
&lt;td&gt;Monorepo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multiple teams, isolated domains&lt;/td&gt;
&lt;td&gt;Some&lt;/td&gt;
&lt;td&gt;Polyrepo (hybrid)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;They use &lt;strong&gt;hybrid&lt;/strong&gt;, and you can too.&lt;/p&gt;




&lt;h1&gt;
  
  
  📌 Final Confirmation Based on Your Question
&lt;/h1&gt;

&lt;h3&gt;
  
  
  ✔ Yes — monorepo shines when services share libraries
&lt;/h3&gt;

&lt;h3&gt;
  
  
  ✔ Yes — monorepo shines when services change together
&lt;/h3&gt;

&lt;h3&gt;
  
  
  ✔ Yes — monorepo shines when one change affects another service
&lt;/h3&gt;

&lt;h3&gt;
  
  
  ✔ Yes — monorepo shines when same team works on multiple services
&lt;/h3&gt;

&lt;h3&gt;
  
  
  ✔ Yes — monorepo shines when services are tightly dependent
&lt;/h3&gt;

&lt;h3&gt;
  
  
  ✔ Yes — monorepo helps with consistent tooling &amp;amp; faster development
&lt;/h3&gt;

</description>
      <category>cicd</category>
      <category>microservices</category>
      <category>architecture</category>
      <category>aws</category>
    </item>
    <item>
      <title>🧠 Understanding SQL Execution Order: The Real Flow Behind Your Queries</title>
      <dc:creator>nk sk</dc:creator>
      <pubDate>Thu, 04 Dec 2025 09:04:26 +0000</pubDate>
      <link>https://dev.to/nk_sk_6f24fdd730188b284bf/understanding-sql-execution-order-the-real-flow-behind-your-queries-25cf</link>
      <guid>https://dev.to/nk_sk_6f24fdd730188b284bf/understanding-sql-execution-order-the-real-flow-behind-your-queries-25cf</guid>
      <description>&lt;p&gt;When developers write SQL, the query seems to flow top-to-bottom.&lt;br&gt;
But the database &lt;strong&gt;does NOT execute SQL in the order you write it&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Looks simple, right?&lt;br&gt;
But internally, SQL engines follow a &lt;strong&gt;logical processing order&lt;/strong&gt; that determines how data is filtered, grouped, aggregated, and returned.&lt;/p&gt;

&lt;p&gt;Let’s break this down with a clear, blog-ready explanation.&lt;/p&gt;


&lt;h2&gt;
  
  
  🔍 Why SQL Execution Order Matters
&lt;/h2&gt;

&lt;p&gt;Understanding SQL execution order helps you:&lt;/p&gt;

&lt;p&gt;✔ Debug complex queries&lt;br&gt;
✔ Write better optimized SQL&lt;br&gt;
✔ Understand why aliases sometimes “don’t exist yet”&lt;br&gt;
✔ Predict how filters, groups, and HAVING interact&lt;br&gt;
✔ Avoid unexpected results in joins&lt;/p&gt;

&lt;p&gt;This is especially important when working with complex joins, subqueries, and aggregations.&lt;/p&gt;


&lt;h1&gt;
  
  
  🚀 The Actual SQL Execution Order (Logical)
&lt;/h1&gt;

&lt;p&gt;SQL is processed in &lt;strong&gt;this exact internal order&lt;/strong&gt;, regardless of how you write it:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;Clause&lt;/th&gt;
&lt;th&gt;What Happens&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;FROM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Load table(s) and compute JOINs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;ON&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Apply JOIN conditions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;JOIN&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Combine datasets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;WHERE&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Filter rows (before grouping)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;GROUP BY&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Group the remaining rows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;HAVING&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Filter groups&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;SELECT&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Pick columns, evaluate expressions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;DISTINCT&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Remove duplicates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;ORDER BY&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sort result&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;LIMIT / OFFSET&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Apply row limits&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  🔥 Visual Explanation
&lt;/h2&gt;
&lt;h3&gt;
  
  
  🟦 Step 1–3: Build the Data Set
&lt;/h3&gt;

&lt;p&gt;SQL starts with the &lt;strong&gt;FROM + JOIN&lt;/strong&gt; clauses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Load base tables&lt;/li&gt;
&lt;li&gt;Perform JOINs&lt;/li&gt;
&lt;li&gt;Apply ON conditions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At this point, SQL has constructed the “raw” dataset.&lt;/p&gt;


&lt;h3&gt;
  
  
  🟧 Step 4: WHERE Filters the Rows
&lt;/h3&gt;

&lt;p&gt;This filter happens &lt;strong&gt;before grouping&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Important:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You &lt;strong&gt;cannot&lt;/strong&gt; use aggregates (&lt;code&gt;COUNT&lt;/code&gt;, &lt;code&gt;SUM&lt;/code&gt;) here.&lt;/li&gt;
&lt;li&gt;You &lt;strong&gt;can&lt;/strong&gt; filter by columns in tables.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🟨 Step 5: GROUP BY Happens
&lt;/h3&gt;

&lt;p&gt;Rows left after WHERE are grouped.&lt;/p&gt;

&lt;p&gt;You can use columns that appear in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GROUP BY&lt;/li&gt;
&lt;li&gt;Aggregations&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🟥 Step 6: HAVING Filters the Groups
&lt;/h3&gt;

&lt;p&gt;This is WHERE for groups.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;HAVING&lt;/span&gt; &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can use aggregates here, because groups exist by now.&lt;/p&gt;




&lt;h3&gt;
  
  
  🟩 Step 7: SELECT
&lt;/h3&gt;

&lt;p&gt;Columns and computed expressions are evaluated here.&lt;/p&gt;

&lt;p&gt;Important:&lt;br&gt;
&lt;strong&gt;You cannot use SELECT aliases in WHERE&lt;/strong&gt;, because WHERE happens earlier.&lt;/p&gt;

&lt;p&gt;You &lt;em&gt;can&lt;/em&gt; use aliases in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ORDER BY&lt;/li&gt;
&lt;li&gt;GROUP BY (in some SQL dialects)&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  🟪 Step 8–10: Final Touch
&lt;/h3&gt;

&lt;p&gt;SQL now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Removes duplicates with DISTINCT&lt;/li&gt;
&lt;li&gt;Orders the rows&lt;/li&gt;
&lt;li&gt;Applies LIMIT/OFFSET&lt;/li&gt;
&lt;/ul&gt;


&lt;h1&gt;
  
  
  🧭 Full Example with Explanation
&lt;/h1&gt;

&lt;p&gt;Query:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;department&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;emp_count&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;active&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;
&lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;department&lt;/span&gt;
&lt;span class="k"&gt;HAVING&lt;/span&gt; &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;emp_count&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What happens internally:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;FROM employees&lt;/li&gt;
&lt;li&gt;WHERE active = true&lt;/li&gt;
&lt;li&gt;GROUP BY department&lt;/li&gt;
&lt;li&gt;HAVING COUNT(*) &amp;gt; 10&lt;/li&gt;
&lt;li&gt;SELECT department, COUNT(*)&lt;/li&gt;
&lt;li&gt;ORDER BY emp_count&lt;/li&gt;
&lt;li&gt;LIMIT 5&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is why:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You &lt;strong&gt;can’t&lt;/strong&gt; use &lt;code&gt;emp_count&lt;/code&gt; in WHERE&lt;/li&gt;
&lt;li&gt;You &lt;em&gt;can&lt;/em&gt; use it in ORDER BY&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  🧩 Memory Shortcut: “F W G H S O L”
&lt;/h1&gt;

&lt;p&gt;A simple mnemonic:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;F&lt;/strong&gt;rom&lt;br&gt;
&lt;strong&gt;W&lt;/strong&gt;here&lt;br&gt;
&lt;strong&gt;G&lt;/strong&gt;roup By&lt;br&gt;
&lt;strong&gt;H&lt;/strong&gt;aving&lt;br&gt;
&lt;strong&gt;S&lt;/strong&gt;elect&lt;br&gt;
&lt;strong&gt;O&lt;/strong&gt;rder By&lt;br&gt;
&lt;strong&gt;L&lt;/strong&gt;imit&lt;/p&gt;




&lt;h1&gt;
  
  
  🏁 Final Thoughts
&lt;/h1&gt;

&lt;p&gt;Mastering SQL execution order makes your queries:&lt;/p&gt;

&lt;p&gt;✔ More predictable&lt;br&gt;
✔ Less error-prone&lt;br&gt;
✔ Easier to optimize&lt;br&gt;
✔ Easier to reason about with complex joins &amp;amp; aggregations&lt;/p&gt;

&lt;p&gt;Understanding it is one of the fastest ways to level up your SQL skills.&lt;/p&gt;

</description>
      <category>database</category>
      <category>sql</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Full resiliency guide for Spring Boot microservices — using all Resilience4j annotations</title>
      <dc:creator>nk sk</dc:creator>
      <pubDate>Tue, 02 Dec 2025 09:44:32 +0000</pubDate>
      <link>https://dev.to/nk_sk_6f24fdd730188b284bf/full-resiliency-guide-for-spring-boot-microservices-using-all-resilience4j-annotations-2e4k</link>
      <guid>https://dev.to/nk_sk_6f24fdd730188b284bf/full-resiliency-guide-for-spring-boot-microservices-using-all-resilience4j-annotations-2e4k</guid>
      <description>&lt;p&gt;Nice — let’s build a practical, copy-pasteable guide you can use right away: patterns, &lt;code&gt;pom.xml&lt;/code&gt;/&lt;code&gt;build.gradle&lt;/code&gt; snippets, &lt;code&gt;application.yml&lt;/code&gt; examples, complete code samples (CircuitBreaker, Semaphore &amp;amp; ThreadPool Bulkhead, Retry, TimeLimiter, RateLimiter), combining annotations, testing tips, monitoring, tuning, and deployment notes.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;Assumptions: you’re using Spring Boot with the &lt;code&gt;resilience4j-spring-boot2&lt;/code&gt;/&lt;code&gt;resilience4j-spring-boot3&lt;/code&gt; integration (Resilience4j 1.x/2.x work similarly). I’ll show plain Java + Spring examples (non-reactive). If you want reactive examples later, I can add them.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  1) Dependencies
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Maven (&lt;code&gt;pom.xml&lt;/code&gt;)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- core Spring Boot dependencies omitted for brevity --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;dependencies&amp;gt;&lt;/span&gt;
  &lt;span class="c"&gt;&amp;lt;!-- Spring Boot starter web --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-web&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;

  &lt;span class="c"&gt;&amp;lt;!-- Resilience4j starters --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;io.github.resilience4j&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;resilience4j-spring-boot3&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&lt;span class="c"&gt;&amp;lt;!-- or resilience4j-spring-boot2 for boot2 --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;1.7.1&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt; &lt;span class="c"&gt;&amp;lt;!-- pick a compatible version for your Spring Boot --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;io.github.resilience4j&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;resilience4j-all&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;1.7.1&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;

  &lt;span class="c"&gt;&amp;lt;!-- Optionally for metrics --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;io.micrometer&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;micrometer-registry-prometheus&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;

  &lt;span class="c"&gt;&amp;lt;!-- Spring Boot actuator to expose metrics --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-actuator&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;

  &lt;span class="c"&gt;&amp;lt;!-- For tests --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-test&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;scope&amp;gt;&lt;/span&gt;test&lt;span class="nt"&gt;&amp;lt;/scope&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;

  &lt;span class="c"&gt;&amp;lt;!-- Optional: WireMock for integration tests --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;com.github.tomakehurst&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;wiremock-jre8&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;scope&amp;gt;&lt;/span&gt;test&lt;span class="nt"&gt;&amp;lt;/scope&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/dependencies&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Gradle (Kotlin DSL)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nf"&gt;dependencies&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;implementation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"org.springframework.boot:spring-boot-starter-web"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nf"&gt;implementation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"io.github.resilience4j:resilience4j-spring-boot3:1.7.1"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nf"&gt;implementation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"io.github.resilience4j:resilience4j-all:1.7.1"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nf"&gt;implementation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"io.micrometer:micrometer-registry-prometheus"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nf"&gt;implementation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"org.springframework.boot:spring-boot-starter-actuator"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nf"&gt;testImplementation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"org.springframework.boot:spring-boot-starter-test"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nf"&gt;testImplementation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"com.github.tomakehurst:wiremock-jre8:2.27.2"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Choose versions compatible with your Spring Boot. (I avoided locking to a single Boot version.)&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  2) &lt;code&gt;application.yml&lt;/code&gt; — configuration examples
&lt;/h1&gt;

&lt;p&gt;Resilience4j configs are either &lt;strong&gt;per instance&lt;/strong&gt; or global defaults. Here are examples for each annotation/feature:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;resilience4j&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;circuitbreaker&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;configs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;registerHealthIndicator&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
        &lt;span class="na"&gt;slidingWindowType&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;COUNT_BASED&lt;/span&gt;
        &lt;span class="na"&gt;slidingWindowSize&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20&lt;/span&gt;
        &lt;span class="na"&gt;minimumNumberOfCalls&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;
        &lt;span class="na"&gt;permittedNumberOfCallsInHalfOpenState&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;
        &lt;span class="na"&gt;waitDurationInOpenState&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;30s&lt;/span&gt;
        &lt;span class="na"&gt;failureRateThreshold&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;50&lt;/span&gt;
        &lt;span class="na"&gt;automaticTransitionFromOpenToHalfOpenEnabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
    &lt;span class="na"&gt;instances&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;externalServiceCB&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;baseConfig&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;default&lt;/span&gt;
        &lt;span class="na"&gt;waitDurationInOpenState&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;10s&lt;/span&gt;
        &lt;span class="na"&gt;failureRateThreshold&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;40&lt;/span&gt;

  &lt;span class="na"&gt;retry&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;instances&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;externalServiceRetry&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;maxAttempts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;
        &lt;span class="na"&gt;waitDuration&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;500ms&lt;/span&gt;
        &lt;span class="na"&gt;retryExceptions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;java.io.IOException&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;java.util.concurrent.TimeoutException&lt;/span&gt;

  &lt;span class="na"&gt;timelimiter&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;instances&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;externalServiceTL&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;timeoutDuration&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2s&lt;/span&gt;
        &lt;span class="na"&gt;cancelRunningFuture&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;

  &lt;span class="na"&gt;bulkhead&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;configs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;maxConcurrentCalls&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;
        &lt;span class="na"&gt;maxWaitDuration&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;0ms&lt;/span&gt;    &lt;span class="c1"&gt;# for semaphore bulkhead&lt;/span&gt;
      &lt;span class="na"&gt;threadpool-default&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;maxThreadPoolSize&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;
        &lt;span class="na"&gt;coreThreadPoolSize&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;
        &lt;span class="na"&gt;queueCapacity&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;50&lt;/span&gt;
        &lt;span class="na"&gt;keepAliveDuration&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;30s&lt;/span&gt;
    &lt;span class="na"&gt;instances&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;semaphoreBulkhead&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;baseConfig&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;default&lt;/span&gt;
        &lt;span class="na"&gt;maxConcurrentCalls&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20&lt;/span&gt;
      &lt;span class="na"&gt;threadPoolBulkhead&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;baseConfig&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;threadpool-default&lt;/span&gt;

  &lt;span class="na"&gt;ratelimiter&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;instances&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;externalServiceRateLimiter&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;limitForPeriod&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;
        &lt;span class="na"&gt;limitRefreshPeriod&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1s&lt;/span&gt;
        &lt;span class="na"&gt;timeoutDuration&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also enable actuator endpoints:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;management&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;endpoints&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;web&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;exposure&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;include&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;health,info,prometheus&lt;/span&gt;
  &lt;span class="na"&gt;endpoint&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;health&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;show-details&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  3) Pattern explanation — when to use what (short)
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Circuit Breaker&lt;/strong&gt;: stop calling a failing downstream service to fail fast and let it recover.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bulkhead (Semaphore)&lt;/strong&gt;: protect CPU/memory by limiting concurrent calls within the same process.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bulkhead (ThreadPool)&lt;/strong&gt;: isolate blocking calls by running them on a dedicated thread pool.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retry&lt;/strong&gt;: retry transient errors but with backoff and limited attempts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TimeLimiter&lt;/strong&gt;: bound latency for async calls (integrates with Timeouts).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RateLimiter&lt;/strong&gt;: limit throughput to a downstream service (or limit your own outgoing).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Combine&lt;/strong&gt;: common pattern — &lt;code&gt;RateLimiter&lt;/code&gt; → &lt;code&gt;Bulkhead&lt;/code&gt; → &lt;code&gt;CircuitBreaker&lt;/code&gt; → &lt;code&gt;TimeLimiter&lt;/code&gt; → &lt;code&gt;Retry&lt;/code&gt; (order depends on semantics; retries usually around network calls, but be careful to not retry in ways that worsen load).&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  4) Example: service calling external HTTP API (synchronous)
&lt;/h1&gt;

&lt;p&gt;This example demonstrates combining annotations plus fallback.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ExternalClient.java&lt;/code&gt; — a thin HTTP client (using &lt;code&gt;RestTemplate&lt;/code&gt;)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Service&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ExternalClient&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;RestTemplate&lt;/span&gt; &lt;span class="n"&gt;restTemplate&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;ExternalClient&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;RestTemplateBuilder&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;restTemplate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setReadTimeout&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Duration&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ofSeconds&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setConnectTimeout&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Duration&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ofSeconds&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getRemoteData&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"https://external.service/api/resource/"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;restTemplate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getForObject&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;ResilientService.java&lt;/code&gt; — apply Resilience4j annotations&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Service&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ResilientService&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;ExternalClient&lt;/span&gt; &lt;span class="n"&gt;externalClient&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;ResilientService&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ExternalClient&lt;/span&gt; &lt;span class="n"&gt;externalClient&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;externalClient&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;externalClient&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Use CircuitBreaker + Semaphore Bulkhead + Retry + RateLimiter&lt;/span&gt;
    &lt;span class="nd"&gt;@RateLimiter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"externalServiceRateLimiter"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fallbackMethod&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"rateLimiterFallback"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="nd"&gt;@Bulkhead&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"semaphoreBulkhead"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Bulkhead&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Type&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;SEMAPHORE&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fallbackMethod&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"bulkheadFallback"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="nd"&gt;@Retry&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"externalServiceRetry"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fallbackMethod&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"retryFallback"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="nd"&gt;@CircuitBreaker&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"externalServiceCB"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fallbackMethod&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"circuitFallback"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getData&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;externalClient&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getRemoteData&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Fallback signatures: same return type and either same args + Throwable or same args + Exception&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;circuitFallback&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Throwable&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// fallback behavior for circuit breaker&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"circuit-fallback: cached-or-default"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;retryFallback&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Throwable&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"retry-fallback: sorry"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;bulkheadFallback&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;BulkheadFullException&lt;/span&gt; &lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"bulkhead-fallback: overloaded"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;rateLimiterFallback&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;RequestNotPermitted&lt;/span&gt; &lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"rate-limited-fallback: try-later"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Important notes about fallback signatures:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Method name must match &lt;code&gt;fallbackMethod&lt;/code&gt; (case-sensitive).&lt;/li&gt;
&lt;li&gt;Fallback method parameters must be the original method parameters plus optionally a final &lt;code&gt;Throwable&lt;/code&gt;/&lt;code&gt;Exception&lt;/code&gt; parameter.&lt;/li&gt;
&lt;li&gt;Return type must match.&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  5) TimeLimiter (async) + ThreadPoolBulkhead example
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;AsyncResilientService.java&lt;/code&gt; — asynchronous pattern (TimeLimiter + ThreadPool Bulkhead)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Service&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AsyncResilientService&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;ExternalClient&lt;/span&gt; &lt;span class="n"&gt;externalClient&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;ExecutorService&lt;/span&gt; &lt;span class="n"&gt;executor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Executors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;newFixedThreadPool&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;AsyncResilientService&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ExternalClient&lt;/span&gt; &lt;span class="n"&gt;externalClient&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;externalClient&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;externalClient&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// TimeLimiter expects a CompletableFuture (async)&lt;/span&gt;
    &lt;span class="nd"&gt;@Bulkhead&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"threadPoolBulkhead"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Bulkhead&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Type&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;THREADPOOL&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fallbackMethod&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"tpbFallback"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="nd"&gt;@TimeLimiter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"externalServiceTL"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fallbackMethod&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"timeLimiterFallback"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="nd"&gt;@CircuitBreaker&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"externalServiceCB"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fallbackMethod&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"circuitFallback"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;CompletableFuture&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;getDataAsync&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// run blocking/rest call in CompletableFuture using executor&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;CompletableFuture&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;supplyAsync&lt;/span&gt;&lt;span class="o"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;externalClient&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getRemoteData&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="n"&gt;executor&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;CompletableFuture&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;tpbFallback&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;BulkheadFullException&lt;/span&gt; &lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;CompletableFuture&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;completedFuture&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"threadpool-bulkhead-fallback"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;CompletableFuture&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;timeLimiterFallback&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Throwable&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;CompletableFuture&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;completedFuture&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"time-limiter-fallback"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;CompletableFuture&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;circuitFallback&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Throwable&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;CompletableFuture&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;completedFuture&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"circuit-fallback-async"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;@TimeLimiter&lt;/code&gt; works on &lt;code&gt;CompletionStage&lt;/code&gt; / &lt;code&gt;CompletableFuture&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@Bulkhead&lt;/code&gt; with &lt;code&gt;Type.THREADPOOL&lt;/code&gt; expects an async return type (e.g., &lt;code&gt;CompletionStage&lt;/code&gt; / &lt;code&gt;Future&lt;/code&gt; / &lt;code&gt;CompletableFuture&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  6) Combining annotations — recommended order &amp;amp; rationale
&lt;/h1&gt;

&lt;p&gt;Order can matter. A typical ordering for outbound calls:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;RateLimiter&lt;/strong&gt; — avoid hitting downstream too frequently.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bulkhead&lt;/strong&gt; — limit concurrency so your service doesn't exhaust resources.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CircuitBreaker&lt;/strong&gt; — prevent repeated calls to failing service.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TimeLimiter&lt;/strong&gt; — bound call latency (for async calls).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retry&lt;/strong&gt; — apply retries only when appropriate (often after circuit/bulkhead/timeouts depending on the semantics you want).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;But reality is nuanced. Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@RateLimiter&lt;/span&gt;&lt;span class="o"&gt;(...)&lt;/span&gt;
&lt;span class="nd"&gt;@Bulkhead&lt;/span&gt;&lt;span class="o"&gt;(...)&lt;/span&gt;
&lt;span class="nd"&gt;@CircuitBreaker&lt;/span&gt;&lt;span class="o"&gt;(...)&lt;/span&gt;
&lt;span class="nd"&gt;@TimeLimiter&lt;/span&gt;&lt;span class="o"&gt;(...)&lt;/span&gt;
&lt;span class="nd"&gt;@Retry&lt;/span&gt;&lt;span class="o"&gt;(...)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;CompletableFuture&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Be careful: retries can amplify load — combine with circuit breakers and backoffs.&lt;/p&gt;




&lt;h1&gt;
  
  
  7) Example controller wiring it all together
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@RestController&lt;/span&gt;
&lt;span class="nd"&gt;@RequestMapping&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/api"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DemoController&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;ResilientService&lt;/span&gt; &lt;span class="n"&gt;resilientService&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;AsyncResilientService&lt;/span&gt; &lt;span class="n"&gt;asyncResilientService&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;DemoController&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ResilientService&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;AsyncResilientService&lt;/span&gt; &lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;resilientService&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;asyncResilientService&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@GetMapping&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/sync/{id}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;sync&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;@PathVariable&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ok&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resilientService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getData&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@GetMapping&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/async/{id}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;CompletableFuture&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;async&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;@PathVariable&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;asyncResilientService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getDataAsync&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;thenApply&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;ResponseEntity:&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  8) Customizing defaults programmatically
&lt;/h1&gt;

&lt;p&gt;You can configure default circuit breaker settings via a &lt;code&gt;@Configuration&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Configuration&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Resilience4jConfig&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@Bean&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Customizer&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;github&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;resilience4j&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;circuitbreaker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;configure&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CircuitBreakerConfiguration&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;circuitBreakerCustomizer&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// Depending on Resilience4j Spring Boot integration you can register default configs.&lt;/span&gt;
        &lt;span class="o"&gt;};&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(Resilience4j also supports configuring defaults via &lt;code&gt;application.yml&lt;/code&gt; which is simpler for most teams.)&lt;/p&gt;




&lt;h1&gt;
  
  
  9) Metrics and observability
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Expose metrics&lt;/strong&gt;:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Add &lt;code&gt;micrometer-registry-prometheus&lt;/code&gt; and &lt;code&gt;spring-boot-starter-actuator&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Resilience4j exposes meters that Micrometer picks up. Prometheus can scrape &lt;code&gt;/actuator/prometheus&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Key metrics to monitor&lt;/strong&gt;:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;CircuitBreaker state (OPEN/HALF_OPEN/CLOSED)&lt;/li&gt;
&lt;li&gt;Failure rate, slow-call rate&lt;/li&gt;
&lt;li&gt;Bulkhead queue sizes and rejected calls&lt;/li&gt;
&lt;li&gt;Retry calls count and successes/failures&lt;/li&gt;
&lt;li&gt;Timeouts&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Health indicators&lt;/strong&gt;:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;resilience4j.circuitbreaker.instances.*.registerHealthIndicator=true&lt;/code&gt; will register health details.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Dashboards&lt;/strong&gt;:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Use Grafana + Prometheus. Visualize CB states, failure rate trends, latency percentiles.&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  10) Tests
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Unit test&lt;/strong&gt;: mock the external client and simulate failures.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@SpringBootTest&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ResilientServiceTest&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@MockBean&lt;/span&gt;
    &lt;span class="nc"&gt;ExternalClient&lt;/span&gt; &lt;span class="n"&gt;externalClient&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@Autowired&lt;/span&gt;
    &lt;span class="nc"&gt;ResilientService&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@Test&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;whenExternalFailsCircuitOpensAndFallbackUsed&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;when&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;externalClient&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getRemoteData&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;anyString&lt;/span&gt;&lt;span class="o"&gt;()))&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;thenThrow&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;RuntimeException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"down"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;

        &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getData&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;assertTrue&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;contains&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"fallback"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Integration test&lt;/strong&gt;: use WireMock to simulate downstream behavior (timeouts, slow responses, 500s) and test circuit transitions and metrics.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Load test&lt;/strong&gt;: use Gatling/jMeter to exercise Fault-injection and measure how circuit/bulkhead behave under load.&lt;/p&gt;




&lt;h1&gt;
  
  
  11) Tuning tips &amp;amp; best practices
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Start conservative&lt;/strong&gt;: permit enough calls for early testing, then tighten thresholds with real telemetry.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MinimumNumberOfCalls&lt;/strong&gt;: set &lt;code&gt;minimumNumberOfCalls&lt;/code&gt; so the circuit doesn't open on a tiny sample.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Half-open trials&lt;/strong&gt;: allow a small number of calls to probe downstream (permittedNumberOfCallsInHalfOpenState).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retries&lt;/strong&gt;: use exponential backoff (customize) and avoid retrying idempotent-unsafe operations by mistake.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bulkheads&lt;/strong&gt;: prefer &lt;strong&gt;semaphore&lt;/strong&gt; for low-latency operations and &lt;strong&gt;threadpool&lt;/strong&gt; for blocking calls (DB, legacy blocking HTTP).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TimeLimiter&lt;/strong&gt;: don't rely solely on TimeLimiter; combine with proper threadpool management to avoid exhaustion.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fallbacks&lt;/strong&gt;: return cached values or degrade gracefully. Avoid heavy logic in fallback methods.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Metrics&lt;/strong&gt;: instrument the system and use alerts (e.g., circuit open &amp;gt; X minutes, failure rate &amp;gt; Y%).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observability&lt;/strong&gt;: trace distributed calls with OpenTelemetry/Zipkin and tag traces with circuit/bulkhead outcomes.&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  12) Common pitfalls
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Retry + Bulkhead&lt;/strong&gt;: retries inside the same process can exhaust concurrency — be careful with combining retry and semaphore bulkhead.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retrying non-idempotent operations&lt;/strong&gt;: can cause side effects (e.g., duplicate payments).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fallback signature mismatch&lt;/strong&gt;: causes runtime exceptions; ensure parameter order and types are correct.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Blocking calls on main server threads&lt;/strong&gt;: if you use threadpool bulkhead but your fallback or calling code blocks the calling thread, you may still exhaust connectors.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Overly aggressive thresholds&lt;/strong&gt;: opening circuits too early causes unnecessary failures.&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  13) Example project layout (suggested)
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;src/main/java/com/example/resilience/
  - config/
    - Resilience4jConfig.java
  - client/
    - ExternalClient.java
  - service/
    - ResilientService.java
    - AsyncResilientService.java
  - web/
    - DemoController.java
src/test/java/...
application.yml
pom.xml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  14) Handy utilities &amp;amp; patterns
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cache Fallback&lt;/strong&gt;: keep a small cache (Caffeine) for last-known-good responses and return in fallbacks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bulkhead metrics exporter&lt;/strong&gt;: create a scheduled job to emit bulkhead queue metrics if you want fine-grained alerts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Circuit breaker event listener&lt;/strong&gt;: subscribe to events for logging/alerts
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Component&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CircuitBreakerEventListener&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@Autowired&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;CircuitBreakerEventListener&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;CircuitBreakerRegistry&lt;/span&gt; &lt;span class="n"&gt;registry&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;registry&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getAllCircuitBreakers&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;forEach&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cb&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;cb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getEventPublisher&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;onStateTransition&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                    &lt;span class="c1"&gt;// log or alert&lt;/span&gt;
                    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"CB "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;cb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getName&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" -&amp;gt; "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getStateTransition&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
                &lt;span class="o"&gt;}));&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  15) Quick reference: annotation usage examples
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@CircuitBreaker(name = "myCb", fallbackMethod = "fallback")&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@Bulkhead(name = "b1", type = Bulkhead.Type.SEMAPHORE, fallbackMethod = "fb")&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@Bulkhead(name = "tpb", type = Bulkhead.Type.THREADPOOL, fallbackMethod = "fb")&lt;/code&gt; — method should be async (&lt;code&gt;CompletableFuture&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@Retry(name = "r1", fallbackMethod = "fb")&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@TimeLimiter(name = "tl1", fallbackMethod = "fb")&lt;/code&gt; — for async methods returning &lt;code&gt;CompletionStage&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@RateLimiter(name = "rl1", fallbackMethod = "fb")&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  16) Example: circuitbreaker + event listener + Prometheus metrics (snippet)
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Bean&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;MeterRegistryCustomizer&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;MeterRegistry&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;metricsCommonTags&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;registry&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;registry&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;commonTags&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"application"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"resilience-demo"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add &lt;code&gt;micrometer-registry-prometheus&lt;/code&gt; dependency and ensure &lt;code&gt;/actuator/prometheus&lt;/code&gt; is exposed.&lt;/p&gt;




&lt;h1&gt;
  
  
  17) Final checklist before shipping to production
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;✅ Feature flags for toggling aggressive resilience settings&lt;/li&gt;
&lt;li&gt;✅ End-to-end tests with injected downstream failures&lt;/li&gt;
&lt;li&gt;✅ Metrics &amp;amp; dashboards set up (Prometheus + Grafana)&lt;/li&gt;
&lt;li&gt;✅ Alerts on circuit open duration and failure rate thresholds&lt;/li&gt;
&lt;li&gt;✅ Observability (tracing) to correlate client and server traces&lt;/li&gt;
&lt;li&gt;✅ Documented fallback behaviors (what the system returns when degraded)&lt;/li&gt;
&lt;li&gt;✅ Load testing to validate bulkhead and threadpool sizing&lt;/li&gt;
&lt;/ul&gt;




</description>
      <category>designpatterns</category>
      <category>java</category>
      <category>microservices</category>
      <category>springboot</category>
    </item>
    <item>
      <title>🧩 Understanding Fluent API in Spring: A Deep Dive</title>
      <dc:creator>nk sk</dc:creator>
      <pubDate>Wed, 29 Oct 2025 05:23:04 +0000</pubDate>
      <link>https://dev.to/nk_sk_6f24fdd730188b284bf/understanding-fluent-api-in-spring-a-deep-dive-51lh</link>
      <guid>https://dev.to/nk_sk_6f24fdd730188b284bf/understanding-fluent-api-in-spring-a-deep-dive-51lh</guid>
      <description>&lt;h2&gt;
  
  
  💡 What Is a Fluent API?
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;Fluent API&lt;/strong&gt; (short for &lt;em&gt;Fluent Interface API&lt;/em&gt;) is a &lt;strong&gt;design style&lt;/strong&gt; that allows you to &lt;strong&gt;chain method calls&lt;/strong&gt; to configure or build an object in a &lt;strong&gt;clear and readable way&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The term &lt;em&gt;fluent interface&lt;/em&gt; was introduced by &lt;em&gt;Martin Fowler&lt;/em&gt; and &lt;em&gt;Eric Evans&lt;/em&gt;.&lt;br&gt;
The goal: make code &lt;em&gt;read like a sentence&lt;/em&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  🔸 Non-Fluent Example
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setName&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Alice"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setEmail&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"alice@example.com"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setAge&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  🔸 Fluent Example
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;withName&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Alice"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;withEmail&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"alice@example.com"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;withAge&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Here, each method returns the same object (&lt;code&gt;this&lt;/code&gt;), so you can chain them together.&lt;br&gt;
The code becomes &lt;strong&gt;more compact&lt;/strong&gt;, &lt;strong&gt;more readable&lt;/strong&gt;, and &lt;strong&gt;more expressive&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  ⚙️ Fluent APIs in Spring Framework
&lt;/h2&gt;

&lt;p&gt;Spring uses fluent APIs extensively — from configuration to query building to HTTP calls.&lt;br&gt;
Let’s look at where and how they appear.&lt;/p&gt;


&lt;h3&gt;
  
  
  🛡️ 1. Spring Security DSL (Fluent Configuration)
&lt;/h3&gt;

&lt;p&gt;Spring Security’s modern configuration style is built entirely around a fluent interface.&lt;/p&gt;
&lt;h4&gt;
  
  
  Example:
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Bean&lt;/span&gt;
&lt;span class="nc"&gt;SecurityFilterChain&lt;/span&gt; &lt;span class="nf"&gt;securityFilterChain&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;HttpSecurity&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="nc"&gt;Exception&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;authorizeHttpRequests&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;requestMatchers&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/admin/**"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;hasRole&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"ADMIN"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;anyRequest&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;authenticated&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
        &lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;formLogin&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Customizer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;withDefaults&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;httpBasic&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Customizer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;withDefaults&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  ✅ Why It’s Fluent:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Each call returns the same &lt;code&gt;HttpSecurity&lt;/code&gt; builder.&lt;/li&gt;
&lt;li&gt;You can express complex rules clearly.&lt;/li&gt;
&lt;li&gt;No need for XML or verbose setter calls.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  🧠 Bonus:
&lt;/h4&gt;

&lt;p&gt;Earlier Spring versions (before Spring Security 5.4) required chained &lt;code&gt;.and()&lt;/code&gt; calls.&lt;br&gt;
The newer DSL uses &lt;strong&gt;lambdas&lt;/strong&gt;, making the configuration even cleaner.&lt;/p&gt;


&lt;h3&gt;
  
  
  🌐 2. Spring WebFlux Router Functions
&lt;/h3&gt;

&lt;p&gt;In functional-style Spring WebFlux, routes can be defined fluently instead of using annotations.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Bean&lt;/span&gt;
&lt;span class="nc"&gt;RouterFunction&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ServerResponse&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;routes&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;RouterFunctions&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;route&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;GET&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/hello"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;ServerResponse&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ok&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;bodyValue&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello World"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;POST&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/user"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;ServerResponse&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ok&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This fluent routing style is declarative, concise, and avoids annotations — perfect for reactive applications.&lt;/p&gt;




&lt;h3&gt;
  
  
  ☁️ 3. Spring WebClient
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;WebClient&lt;/code&gt; API is a prime example of a fluent interface for making HTTP requests.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;WebClient&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;WebClient&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"https://api.example.com"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="nc"&gt;Flux&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;uri&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/users"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;retrieve&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;bodyToFlux&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each method returns an intermediate builder or response specification, leading to an elegant and chainable HTTP request flow.&lt;/p&gt;




&lt;h3&gt;
  
  
  💾 4. Spring Data Fluent Query Builders
&lt;/h3&gt;

&lt;p&gt;Spring Data also supports fluent query construction — especially for MongoDB, R2DBC, and JPA Criteria APIs.&lt;/p&gt;

&lt;p&gt;Example with MongoDB:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Query&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Query&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addCriteria&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Criteria&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;where&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"age"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;gte&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;limit&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Sort&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;by&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This replaces verbose query objects with a clear, chainable style.&lt;/p&gt;




&lt;h3&gt;
  
  
  📦 5. Fluent Builders in Spring Core
&lt;/h3&gt;

&lt;p&gt;Even Spring’s &lt;code&gt;ResponseEntity&lt;/code&gt; uses a fluent builder approach:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;HttpStatus&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CREATED&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;header&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Location"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"/users/123"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;newUser&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is an example of the &lt;strong&gt;Builder Pattern + Fluent Interface&lt;/strong&gt; working together.&lt;/p&gt;




&lt;h2&gt;
  
  
  🏗️ How to Build Your Own Fluent API in Spring
&lt;/h2&gt;

&lt;p&gt;Creating a fluent API for your own components is straightforward.&lt;/p&gt;

&lt;p&gt;Let’s build an example: a fluent API for sending notifications.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Define a Builder Class
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;NotificationBuilder&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;recipient&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="n"&gt;urgent&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;NotificationBuilder&lt;/span&gt; &lt;span class="nf"&gt;to&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;recipient&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;recipient&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;recipient&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;NotificationBuilder&lt;/span&gt; &lt;span class="nf"&gt;withMessage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;NotificationBuilder&lt;/span&gt; &lt;span class="nf"&gt;urgent&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="n"&gt;urgent&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;urgent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urgent&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Notification&lt;/span&gt; &lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Imagine sending logic here&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Sending notification to "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;recipient&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Notification&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;recipient&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;urgent&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Use It Fluently
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Notification&lt;/span&gt; &lt;span class="n"&gt;notification&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;NotificationBuilder&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"admin@example.com"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;withMessage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Server CPU usage high!"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;urgent&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;send&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ✅ Benefits
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Self-explanatory code&lt;/li&gt;
&lt;li&gt;Encourages immutability&lt;/li&gt;
&lt;li&gt;Easier to maintain and extend&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🚀 Benefits of Using Fluent APIs
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Benefit&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🧠 &lt;strong&gt;Readability&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Makes configurations or object creation easy to understand&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔁 &lt;strong&gt;Chaining&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Reduces boilerplate by chaining calls&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🧩 &lt;strong&gt;Composability&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Builders can be reused and combined&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🧱 &lt;strong&gt;Immutability&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Works great with immutable objects&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⚙️ &lt;strong&gt;Declarative Style&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Perfect for configuration-based frameworks like Spring&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  ⚖️ Fluent API vs Builder Pattern
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Fluent API&lt;/th&gt;
&lt;th&gt;Builder Pattern&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Purpose&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Improve readability and chaining&lt;/td&gt;
&lt;td&gt;Construct complex objects step-by-step&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Return Type&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Usually returns &lt;code&gt;this&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Returns the builder or final object&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Used In&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Configurations, DSLs&lt;/td&gt;
&lt;td&gt;Object creation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Example in Spring&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;WebClient&lt;/code&gt;, &lt;code&gt;HttpSecurity&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ResponseEntity&lt;/code&gt;, &lt;code&gt;UriComponentsBuilder&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In practice, &lt;strong&gt;Spring often combines both&lt;/strong&gt; — for example, &lt;code&gt;ResponseEntity&lt;/code&gt; uses a builder with a fluent API.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧭 Conclusion
&lt;/h2&gt;

&lt;p&gt;Fluent APIs make code &lt;strong&gt;more natural, expressive, and maintainable&lt;/strong&gt;.&lt;br&gt;
Spring heavily leverages this approach to provide a &lt;strong&gt;developer-friendly&lt;/strong&gt; experience, allowing configurations that read almost like English sentences.&lt;/p&gt;

&lt;p&gt;As you build your own Spring components or libraries, consider offering a &lt;strong&gt;fluent interface&lt;/strong&gt; — your future self (and your teammates) will thank you.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✍️ Final Takeaway
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;“A well-designed fluent API turns configuration into storytelling — where your code narrates what it’s doing.”&lt;/p&gt;
&lt;/blockquote&gt;




</description>
      <category>designpatterns</category>
      <category>java</category>
      <category>springboot</category>
    </item>
    <item>
      <title>📘 System Design Trade-Off: Push vs Pull Based Architecture</title>
      <dc:creator>nk sk</dc:creator>
      <pubDate>Sat, 11 Oct 2025 10:40:06 +0000</pubDate>
      <link>https://dev.to/nk_sk_6f24fdd730188b284bf/system-design-trade-off-push-vs-pull-based-architecture-lej</link>
      <guid>https://dev.to/nk_sk_6f24fdd730188b284bf/system-design-trade-off-push-vs-pull-based-architecture-lej</guid>
      <description>&lt;p&gt;Modern distributed systems rely on efficient data flow — deciding &lt;strong&gt;how&lt;/strong&gt; data moves between producers and consumers is one of the most fundamental architectural choices. Two popular paradigms that determine this are &lt;strong&gt;Push&lt;/strong&gt; and &lt;strong&gt;Pull&lt;/strong&gt; architectures.&lt;/p&gt;

&lt;p&gt;This blog explores &lt;strong&gt;what they are, how they differ, when to use each, and the trade-offs&lt;/strong&gt; involved from a system design perspective.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩 1. Understanding the Core Concepts
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔹 Push-Based Architecture
&lt;/h3&gt;

&lt;p&gt;In a &lt;strong&gt;push-based system&lt;/strong&gt;, the &lt;strong&gt;producer&lt;/strong&gt; (or source) takes the initiative — it pushes data or events directly to the consumer (or subscriber) as soon as new data is available.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Email notifications, Webhooks, Kafka producers pushing to topics, or Firebase push notifications.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Analogy:&lt;/strong&gt;&lt;br&gt;
Think of a newspaper delivery — the publisher delivers papers every morning whether you read them or not.&lt;/p&gt;




&lt;h3&gt;
  
  
  🔹 Pull-Based Architecture
&lt;/h3&gt;

&lt;p&gt;In a &lt;strong&gt;pull-based system&lt;/strong&gt;, the &lt;strong&gt;consumer&lt;/strong&gt; requests data from the source whenever it needs it. The producer is passive; it only responds when asked.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;REST APIs (client fetches), polling a database, or a dashboard fetching metrics periodically.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Analogy:&lt;/strong&gt;&lt;br&gt;
Think of visiting a news website — you only fetch new articles when you decide to check.&lt;/p&gt;




&lt;h2&gt;
  
  
  🏗️ 2. Architecture Flow Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Push Architecture&lt;/th&gt;
&lt;th&gt;Pull Architecture&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Initiator&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Producer&lt;/td&gt;
&lt;td&gt;Consumer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data Flow&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Source pushes to destination&lt;/td&gt;
&lt;td&gt;Consumer requests data from source&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Timing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Event-driven, real-time&lt;/td&gt;
&lt;td&gt;Demand-driven, periodic or on request&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scalability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Harder if many consumers (fan-out)&lt;/td&gt;
&lt;td&gt;Easier with caching/load balancing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Latency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Very low (instant updates)&lt;/td&gt;
&lt;td&gt;Higher (depends on polling frequency)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Control&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Producer controls flow&lt;/td&gt;
&lt;td&gt;Consumer controls when to fetch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Examples&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Webhooks, Pub/Sub, Kafka, Notifications&lt;/td&gt;
&lt;td&gt;REST API, CRON jobs, APIs, Pull queues&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  ⚖️ 3. System Design Trade-Offs
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🧠 A. &lt;strong&gt;Scalability&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Push:&lt;/strong&gt;
Harder to scale if the producer must maintain connections to many consumers.
E.g., 1M WebSocket clients connected to a stock ticker system.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pull:&lt;/strong&gt;
Easier to scale using caching layers (e.g., CDN, Redis) since consumers fetch as needed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;Choose Pull&lt;/strong&gt; if scaling consumers independently is key.&lt;br&gt;
✅ &lt;strong&gt;Choose Push&lt;/strong&gt; if low latency updates are more important.&lt;/p&gt;




&lt;h3&gt;
  
  
  ⚙️ B. &lt;strong&gt;Latency and Freshness&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Push:&lt;/strong&gt; Near real-time; ideal for time-sensitive data (chat, notifications, IoT telemetry).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pull:&lt;/strong&gt; Data may be stale between requests unless polling is frequent.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;Choose Push&lt;/strong&gt; for real-time systems.&lt;br&gt;
✅ &lt;strong&gt;Choose Pull&lt;/strong&gt; for batch or periodic updates.&lt;/p&gt;




&lt;h3&gt;
  
  
  💾 C. &lt;strong&gt;Reliability &amp;amp; Fault Tolerance&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Push:&lt;/strong&gt; Data can be lost if consumers are offline (unless you have message queues or durable topics).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pull:&lt;/strong&gt; Consumers can retry at their own pace; easier to handle transient failures.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;Pull&lt;/strong&gt; tends to be more reliable without additional infrastructure.&lt;br&gt;
✅ &lt;strong&gt;Push&lt;/strong&gt; needs retries, queues, and delivery guarantees (e.g., Kafka, RabbitMQ).&lt;/p&gt;




&lt;h3&gt;
  
  
  🔐 D. &lt;strong&gt;Resource Utilization&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Push:&lt;/strong&gt; Efficient use of resources when updates are infrequent — no wasted polling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pull:&lt;/strong&gt; Wastes resources if polling happens too often with little data change.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;Push&lt;/strong&gt; is better for sporadic updates.&lt;br&gt;
✅ &lt;strong&gt;Pull&lt;/strong&gt; is better when frequent small updates are acceptable.&lt;/p&gt;




&lt;h3&gt;
  
  
  🧩 E. &lt;strong&gt;Complexity&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Push:&lt;/strong&gt; Needs message brokers, event routing, subscriptions, backpressure handling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pull:&lt;/strong&gt; Simpler — just expose an endpoint and let clients fetch.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;Pull&lt;/strong&gt; for simpler architectures.&lt;br&gt;
✅ &lt;strong&gt;Push&lt;/strong&gt; for event-driven distributed systems.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚦 4. When to Use Which (Real-World Scenarios)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Best Approach&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Real-time chat app&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Push&lt;/td&gt;
&lt;td&gt;Users need instant message delivery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Stock price ticker&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Push&lt;/td&gt;
&lt;td&gt;Market updates happen in milliseconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Analytics dashboard&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Pull&lt;/td&gt;
&lt;td&gt;Periodic fetch or on-demand metrics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mobile notifications&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Push&lt;/td&gt;
&lt;td&gt;Event-based user engagement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data synchronization service&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hybrid&lt;/td&gt;
&lt;td&gt;Push delta → Pull full sync on demand&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Web scraping or batch ingestion&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Pull&lt;/td&gt;
&lt;td&gt;Predictable, controlled frequency&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;IoT device telemetry&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Push&lt;/td&gt;
&lt;td&gt;Devices emit data continuously&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🔄 5. Hybrid (Push + Pull) Approach
&lt;/h2&gt;

&lt;p&gt;Many large-scale systems use &lt;strong&gt;hybrid models&lt;/strong&gt; to balance trade-offs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example: &lt;strong&gt;GitHub Webhooks + REST API&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;GitHub &lt;strong&gt;pushes events&lt;/strong&gt; (e.g., commit made) via webhooks → real-time notification.&lt;/li&gt;
&lt;li&gt;The consumer then &lt;strong&gt;pulls details&lt;/strong&gt; using REST API when needed → reliable data fetch.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Benefits of Hybrid:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Event awareness without overloading the system.&lt;/li&gt;
&lt;li&gt;Controlled, consistent data retrieval.&lt;/li&gt;
&lt;li&gt;Reduced latency with better fault tolerance.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🏗️ 6. Design Considerations and Patterns
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concern&lt;/th&gt;
&lt;th&gt;Push-Based Solution&lt;/th&gt;
&lt;th&gt;Pull-Based Solution&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Flow Control / Backpressure&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Use message queues (Kafka, RabbitMQ)&lt;/td&gt;
&lt;td&gt;Consumers fetch at their own rate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Offline Consumers&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Buffer messages (durable queue)&lt;/td&gt;
&lt;td&gt;Consumers poll when online&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Load Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Load balancers, fan-out optimization&lt;/td&gt;
&lt;td&gt;Caching layers, rate limiting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Security&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Token-based subscriptions, firewalls&lt;/td&gt;
&lt;td&gt;API authentication, throttling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Observability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Event tracing, logs per topic&lt;/td&gt;
&lt;td&gt;API monitoring, polling metrics&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🧮 7. Example Design Comparison
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Example 1: &lt;strong&gt;Push-Based Notification System&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Service A] ──&amp;gt; [Kafka Topic] ──&amp;gt; [Notification Worker] ──&amp;gt; [WebSocket Clients]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Low latency&lt;/li&gt;
&lt;li&gt;Needs durable message handling&lt;/li&gt;
&lt;li&gt;Must handle backpressure&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Example 2: &lt;strong&gt;Pull-Based Data Fetching&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Client App] ──&amp;gt; [API Gateway] ──&amp;gt; [Backend Service] ──&amp;gt; [Database / Cache]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Simpler&lt;/li&gt;
&lt;li&gt;Consumers fetch as needed&lt;/li&gt;
&lt;li&gt;Caching helps scale easily&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 8. Choosing Strategy – Decision Framework
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Factor&lt;/th&gt;
&lt;th&gt;Prefer &lt;strong&gt;Push&lt;/strong&gt;
&lt;/th&gt;
&lt;th&gt;Prefer &lt;strong&gt;Pull&lt;/strong&gt;
&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Real-time&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Many consumers&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Unreliable clients&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Low-latency needed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data volume high &amp;amp; continuous&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Simpler setup&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🚀 9. Summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Criteria&lt;/th&gt;
&lt;th&gt;Push&lt;/th&gt;
&lt;th&gt;Pull&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Initiated By&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Producer&lt;/td&gt;
&lt;td&gt;Consumer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Latency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Higher&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scalability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Harder&lt;/td&gt;
&lt;td&gt;Easier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Complexity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Higher&lt;/td&gt;
&lt;td&gt;Lower&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best For&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Real-time updates&lt;/td&gt;
&lt;td&gt;Periodic/batch fetches&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Examples&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Kafka, WebSockets, Notifications&lt;/td&gt;
&lt;td&gt;REST APIs, CRON jobs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🧭 10. Conclusion
&lt;/h2&gt;

&lt;p&gt;Choosing between &lt;strong&gt;push&lt;/strong&gt; and &lt;strong&gt;pull&lt;/strong&gt; architectures depends on your system’s &lt;strong&gt;latency, scalability, reliability, and complexity&lt;/strong&gt; goals.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Push&lt;/strong&gt; is best for &lt;strong&gt;real-time, event-driven&lt;/strong&gt; systems (chat, alerts, telemetry).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pull&lt;/strong&gt; is ideal for &lt;strong&gt;batch, periodic, or on-demand&lt;/strong&gt; systems (dashboards, APIs).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hybrid&lt;/strong&gt; approaches often yield the best of both worlds — balancing freshness and stability.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;💡 &lt;strong&gt;Pro Tip:&lt;/strong&gt;&lt;br&gt;
In scalable systems, &lt;strong&gt;start simple (pull)&lt;/strong&gt; and &lt;strong&gt;evolve into event-driven (push)&lt;/strong&gt; only when latency or responsiveness demands it.&lt;/p&gt;




</description>
      <category>architecture</category>
      <category>softwareengineering</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>The Complete Guide to Java Evolution: Java 8 to Java 25</title>
      <dc:creator>nk sk</dc:creator>
      <pubDate>Sat, 11 Oct 2025 07:57:24 +0000</pubDate>
      <link>https://dev.to/nk_sk_6f24fdd730188b284bf/the-complete-guide-to-java-evolution-java-8-to-java-25-5gik</link>
      <guid>https://dev.to/nk_sk_6f24fdd730188b284bf/the-complete-guide-to-java-evolution-java-8-to-java-25-5gik</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Java has undergone tremendous evolution since Java 8, transforming from a verbose, traditional language into a modern, expressive platform. This comprehensive guide explores every major feature introduced across all versions from Java 8 to Java 25.&lt;/p&gt;




&lt;h2&gt;
  
  
  Java 8 (March 2014) - LTS
&lt;/h2&gt;

&lt;p&gt;Java 8 was revolutionary, introducing functional programming concepts that changed how developers write Java code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lambda Expressions
&lt;/h3&gt;

&lt;p&gt;The most significant addition, enabling functional-style programming:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Before Java 8&lt;/span&gt;
&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;names&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Arrays&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;asList&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"John"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Jane"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Bob"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;Collections&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sort&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Comparator&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;compare&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;compareTo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Java 8 with Lambda&lt;/span&gt;
&lt;span class="nc"&gt;Collections&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sort&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;compareTo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Stream API
&lt;/h3&gt;

&lt;p&gt;Process collections declaratively with powerful operations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Arrays&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;asList&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;filter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;mapToInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;Integer:&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;intValue&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sum&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Functional Interfaces
&lt;/h3&gt;

&lt;p&gt;Single abstract method interfaces that enable lambdas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Function&amp;lt;T,R&amp;gt;&lt;/code&gt; - transforms input to output&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Predicate&amp;lt;T&amp;gt;&lt;/code&gt; - tests conditions&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Consumer&amp;lt;T&amp;gt;&lt;/code&gt; - performs operations without return&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Supplier&amp;lt;T&amp;gt;&lt;/code&gt; - supplies values&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Method References
&lt;/h3&gt;

&lt;p&gt;Simplified lambda syntax for existing methods:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Lambda&lt;/span&gt;
&lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;forEach&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;

&lt;span class="c1"&gt;// Method reference&lt;/span&gt;
&lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;forEach&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Default Methods in Interfaces
&lt;/h3&gt;

&lt;p&gt;Add methods to interfaces without breaking implementations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;Vehicle&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Starting vehicle..."&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Optional Class
&lt;/h3&gt;

&lt;p&gt;Eliminate null pointer exceptions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Optional&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;optional&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Optional&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ofNullable&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;getValue&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;optional&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;orElse&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"default"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  New Date and Time API (java.time)
&lt;/h3&gt;

&lt;p&gt;Based on Joda-Time, providing immutable date/time classes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;LocalDate&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;LocalDate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;now&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="nc"&gt;LocalDateTime&lt;/span&gt; &lt;span class="n"&gt;dateTime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;LocalDateTime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2024&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;ZonedDateTime&lt;/span&gt; &lt;span class="n"&gt;zoned&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ZonedDateTime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;now&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ZoneId&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"America/New_York"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Nashorn JavaScript Engine
&lt;/h3&gt;

&lt;p&gt;Run JavaScript code from Java (deprecated in Java 11).&lt;/p&gt;




&lt;h2&gt;
  
  
  Java 9 (September 2017)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Module System (Project Jigsaw)
&lt;/h3&gt;

&lt;p&gt;Revolutionized application structure with modules:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// module-info.java&lt;/span&gt;
&lt;span class="n"&gt;module&lt;/span&gt; &lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;myapp&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;requires&lt;/span&gt; &lt;span class="n"&gt;java&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sql&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;exports&lt;/span&gt; &lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;myapp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;api&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  JShell (REPL)
&lt;/h3&gt;

&lt;p&gt;Interactive Java shell for experimentation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jshell&amp;gt; int x &lt;span class="o"&gt;=&lt;/span&gt; 10
x &lt;span class="o"&gt;==&amp;gt;&lt;/span&gt; 10
jshell&amp;gt; x &lt;span class="k"&gt;*&lt;/span&gt; 2
&lt;span class="nv"&gt;$2&lt;/span&gt; &lt;span class="o"&gt;==&amp;gt;&lt;/span&gt; 20
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Factory Methods for Collections
&lt;/h3&gt;

&lt;p&gt;Create immutable collections easily:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"a"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"b"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"c"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;Set&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Set&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"key1"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"key2"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Private Methods in Interfaces
&lt;/h3&gt;

&lt;p&gt;Share code between default methods:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;MyInterface&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;method1&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;commonLogic&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;commonLogic&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Shared implementation&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Try-With-Resources Enhancement
&lt;/h3&gt;

&lt;p&gt;Use effectively final variables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;BufferedReader&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BufferedReader&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;FileReader&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"file.txt"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Use reader&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Stream API Improvements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;takeWhile()&lt;/code&gt; and &lt;code&gt;dropWhile()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ofNullable()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;iterate()&lt;/code&gt; with predicate&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Process API Updates
&lt;/h3&gt;

&lt;p&gt;Better control over OS processes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reactive Streams (Flow API)
&lt;/h3&gt;

&lt;p&gt;Foundation for reactive programming.&lt;/p&gt;




&lt;h2&gt;
  
  
  Java 10 (March 2018)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Local Variable Type Inference (var)
&lt;/h3&gt;

&lt;p&gt;Reduce verbosity without sacrificing type safety:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Before&lt;/span&gt;
&lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;HashMap&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Java 10&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;HashMap&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;();&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;stream&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Unmodifiable Collections
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;copyOf()&lt;/code&gt; methods create immutable copies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;original&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ArrayList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;copy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;copyOf&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;original&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Immutable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Optional.orElseThrow()
&lt;/h3&gt;

&lt;p&gt;Cleaner way to throw exceptions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;optional&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;orElseThrow&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Application Class-Data Sharing (AppCDS)
&lt;/h3&gt;

&lt;p&gt;Improved startup time and memory footprint.&lt;/p&gt;




&lt;h2&gt;
  
  
  Java 11 (September 2018) - LTS
&lt;/h2&gt;

&lt;h3&gt;
  
  
  New String Methods
&lt;/h3&gt;

&lt;p&gt;Powerful string manipulation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="s"&gt;" "&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isBlank&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;                    &lt;span class="c1"&gt;// true&lt;/span&gt;
&lt;span class="s"&gt;" Hello "&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;strip&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;                &lt;span class="c1"&gt;// "Hello"&lt;/span&gt;
&lt;span class="s"&gt;"Line1\nLine2"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;lines&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;            &lt;span class="c1"&gt;// Stream of lines&lt;/span&gt;
&lt;span class="s"&gt;"Java"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;repeat&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;                 &lt;span class="c1"&gt;// "JavaJavaJava"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Local Variable Syntax for Lambda Parameters
&lt;/h3&gt;

&lt;p&gt;Use &lt;code&gt;var&lt;/code&gt; in lambda expressions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  HTTP Client API (Standard)
&lt;/h3&gt;

&lt;p&gt;Modern, asynchronous HTTP client:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;HttpClient&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;HttpClient&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;newHttpClient&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="nc"&gt;HttpRequest&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;HttpRequest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;newBuilder&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;uri&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;URI&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"https://api.example.com"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

&lt;span class="nc"&gt;HttpResponse&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;send&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; 
    &lt;span class="nc"&gt;HttpResponse&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;BodyHandlers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ofString&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Files Methods
&lt;/h3&gt;

&lt;p&gt;Read/write files as strings:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Files&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;readString&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"file.txt"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
&lt;span class="nc"&gt;Files&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;writeString&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"file.txt"&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="s"&gt;"content"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Collection.toArray() Enhancement
&lt;/h3&gt;

&lt;p&gt;Convert to specific array type:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;array&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toArray&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]::&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Nest-Based Access Control
&lt;/h3&gt;

&lt;p&gt;Better nested class handling.&lt;/p&gt;

&lt;h3&gt;
  
  
  Epsilon GC
&lt;/h3&gt;

&lt;p&gt;No-op garbage collector for testing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Removal of Java EE and CORBA Modules
&lt;/h3&gt;

&lt;p&gt;Deprecated modules removed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Java 12 (March 2019)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Switch Expressions (Preview)
&lt;/h3&gt;

&lt;p&gt;Treat switch as an expression:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;numLetters&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;day&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="no"&gt;MONDAY&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="no"&gt;FRIDAY&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="no"&gt;SUNDAY&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="no"&gt;TUESDAY&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="no"&gt;THURSDAY&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="no"&gt;SATURDAY&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="no"&gt;WEDNESDAY&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  String Methods
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;indent()&lt;/code&gt; - adjust indentation&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;transform()&lt;/code&gt; - apply function to string
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"hello"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;transform&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;String:&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;toUpperCase&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Files.mismatch()
&lt;/h3&gt;

&lt;p&gt;Compare two files and find first difference.&lt;/p&gt;

&lt;h3&gt;
  
  
  Collectors.teeing()
&lt;/h3&gt;

&lt;p&gt;Combine two collectors:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;collect&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Collectors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;teeing&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
    &lt;span class="nc"&gt;Collectors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;summingInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
    &lt;span class="nc"&gt;Collectors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;counting&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt;
    &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;
&lt;span class="o"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Compact Number Formatting
&lt;/h3&gt;

&lt;p&gt;Format numbers in compact form:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;NumberFormat&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;NumberFormat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getCompactNumberInstance&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// "1K"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Java 13 (September 2019)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Text Blocks (Preview)
&lt;/h3&gt;

&lt;p&gt;Multi-line strings without escape sequences:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"""
    {
        "name": "John",
        "age": 30
    }
    """&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Switch Expressions (Second Preview)
&lt;/h3&gt;

&lt;p&gt;Introduced &lt;code&gt;yield&lt;/code&gt; keyword:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;temp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;temp&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Dynamic CDS Archives
&lt;/h3&gt;

&lt;p&gt;Improve application startup.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reimplement Legacy Socket API
&lt;/h3&gt;

&lt;p&gt;Modern implementation using NIO.&lt;/p&gt;




&lt;h2&gt;
  
  
  Java 14 (March 2020)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Switch Expressions (Standard)
&lt;/h3&gt;

&lt;p&gt;Switch expressions became standard feature.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pattern Matching for instanceof (Preview)
&lt;/h3&gt;

&lt;p&gt;Eliminate casting:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Before&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="k"&gt;instanceof&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Java 14&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="k"&gt;instanceof&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Records (Preview)
&lt;/h3&gt;

&lt;p&gt;Concise syntax for data carrier classes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="nf"&gt;Point&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Automatically generates:&lt;/span&gt;
&lt;span class="c1"&gt;// - Constructor&lt;/span&gt;
&lt;span class="c1"&gt;// - equals(), hashCode(), toString()&lt;/span&gt;
&lt;span class="c1"&gt;// - Getter methods&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Text Blocks (Second Preview)
&lt;/h3&gt;

&lt;p&gt;Improvements to text blocks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Helpful NullPointerExceptions
&lt;/h3&gt;

&lt;p&gt;Detailed messages showing which variable was null:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Exception&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;thread&lt;/span&gt; &lt;span class="s"&gt;"main"&lt;/span&gt; &lt;span class="n"&gt;java&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;NullPointerException&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; 
    &lt;span class="nc"&gt;Cannot&lt;/span&gt; &lt;span class="n"&gt;invoke&lt;/span&gt; &lt;span class="s"&gt;"String.length()"&lt;/span&gt; &lt;span class="n"&gt;because&lt;/span&gt; &lt;span class="s"&gt;"str"&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Packaging Tool (Incubator)
&lt;/h3&gt;

&lt;p&gt;Create native installers for Java applications.&lt;/p&gt;




&lt;h2&gt;
  
  
  Java 15 (September 2020)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Text Blocks (Standard)
&lt;/h3&gt;

&lt;p&gt;Text blocks became a standard feature.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sealed Classes (Preview)
&lt;/h3&gt;

&lt;p&gt;Control which classes can extend/implement:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;sealed&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Shape&lt;/span&gt; 
    &lt;span class="n"&gt;permits&lt;/span&gt; &lt;span class="nc"&gt;Circle&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Rectangle&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Square&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Circle&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Shape&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Rectangle&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Shape&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Square&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Shape&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Pattern Matching for instanceof (Second Preview)
&lt;/h3&gt;

&lt;p&gt;Further refinements.&lt;/p&gt;

&lt;h3&gt;
  
  
  Records (Second Preview)
&lt;/h3&gt;

&lt;p&gt;Additional improvements.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hidden Classes
&lt;/h3&gt;

&lt;p&gt;Support frameworks that generate classes at runtime.&lt;/p&gt;

&lt;h3&gt;
  
  
  Edwards-Curve Digital Signature Algorithm (EdDSA)
&lt;/h3&gt;

&lt;p&gt;Cryptographic signature implementation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Removed Nashorn JavaScript Engine
&lt;/h3&gt;

&lt;p&gt;Deprecated JavaScript engine removed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Java 16 (March 2021)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Records (Standard)
&lt;/h3&gt;

&lt;p&gt;Records became standard:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="nf"&gt;Person&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Compact constructor&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Person&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;IllegalArgumentException&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Additional methods&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;isAdult&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Pattern Matching for instanceof (Standard)
&lt;/h3&gt;

&lt;p&gt;Now a standard feature.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sealed Classes (Second Preview)
&lt;/h3&gt;

&lt;p&gt;Refinements to sealed classes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Unix-Domain Socket Channels
&lt;/h3&gt;

&lt;p&gt;Support for Unix domain sockets in socket and server-socket channels.&lt;/p&gt;

&lt;h3&gt;
  
  
  Foreign Linker API (Incubator)
&lt;/h3&gt;

&lt;p&gt;Call native code without JNI.&lt;/p&gt;

&lt;h3&gt;
  
  
  Foreign-Memory Access API (Third Incubator)
&lt;/h3&gt;

&lt;p&gt;Safe and efficient access to memory outside Java heap.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vector API (Incubator)
&lt;/h3&gt;

&lt;p&gt;Express vector computations for better CPU performance.&lt;/p&gt;

&lt;h3&gt;
  
  
  Enable C++14 Language Features
&lt;/h3&gt;

&lt;p&gt;JDK C++ source code can now use C++14 features.&lt;/p&gt;

&lt;h3&gt;
  
  
  Warnings for Value-Based Classes
&lt;/h3&gt;

&lt;p&gt;Prepare for future primitive classes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Java 17 (September 2021) - LTS
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Sealed Classes (Standard)
&lt;/h3&gt;

&lt;p&gt;Sealed classes finalized:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;sealed&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;Vehicle&lt;/span&gt; 
    &lt;span class="n"&gt;permits&lt;/span&gt; &lt;span class="nc"&gt;Car&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Truck&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Motorcycle&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Car&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Vehicle&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Truck&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Vehicle&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;non&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;sealed&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Motorcycle&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Vehicle&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Pattern Matching for switch (Preview)
&lt;/h3&gt;

&lt;p&gt;Match patterns in switch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;formatter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Object&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;switch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nc"&gt;Integer&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"int %d"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"long %d"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nc"&gt;Double&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"double %f"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"String %s"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;};&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Restore Always-Strict Floating-Point Semantics
&lt;/h3&gt;

&lt;p&gt;Make floating-point operations consistently strict.&lt;/p&gt;

&lt;h3&gt;
  
  
  Enhanced Pseudo-Random Number Generators
&lt;/h3&gt;

&lt;p&gt;New interfaces and implementations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;RandomGenerator&lt;/span&gt; &lt;span class="n"&gt;generator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;RandomGenerator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"L64X128MixRandom"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Remove RMI Activation
&lt;/h3&gt;

&lt;p&gt;Obsolete RMI activation mechanism removed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Context-Specific Deserialization Filters
&lt;/h3&gt;

&lt;p&gt;Improve security by allowing filters for different contexts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Deprecate the Applet API
&lt;/h3&gt;

&lt;p&gt;Applets marked for removal.&lt;/p&gt;

&lt;h3&gt;
  
  
  Strong Encapsulation of JDK Internals
&lt;/h3&gt;

&lt;p&gt;JDK internals strongly encapsulated by default.&lt;/p&gt;

&lt;h3&gt;
  
  
  Foreign Function &amp;amp; Memory API (Incubator)
&lt;/h3&gt;

&lt;p&gt;Combine Foreign Linker and Memory Access APIs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vector API (Second Incubator)
&lt;/h3&gt;

&lt;p&gt;Improvements to vector operations.&lt;/p&gt;




&lt;h2&gt;
  
  
  Java 18 (March 2022)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  UTF-8 by Default
&lt;/h3&gt;

&lt;p&gt;UTF-8 is now the default charset:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// No need to specify charset&lt;/span&gt;
&lt;span class="nc"&gt;Files&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;readString&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"file.txt"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Simple Web Server
&lt;/h3&gt;

&lt;p&gt;Built-in HTTP server for prototyping:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jwebserver
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Code Snippets in Java API Documentation
&lt;/h3&gt;

&lt;p&gt;Enhanced Javadoc with &lt;code&gt;@snippet&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="cm"&gt;/**
 * {@snippet :
 *   List&amp;lt;String&amp;gt; list = List.of("a", "b", "c");
 *   list.forEach(System.out::println);
 * }
 */&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Pattern Matching for switch (Second Preview)
&lt;/h3&gt;

&lt;p&gt;Guarded patterns and refinements:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Object&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;switch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"Long string"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"Short string"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nc"&gt;Integer&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"Integer"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"Other"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;};&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Foreign Function &amp;amp; Memory API (Second Incubator)
&lt;/h3&gt;

&lt;p&gt;Continued refinements.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vector API (Third Incubator)
&lt;/h3&gt;

&lt;p&gt;Further improvements.&lt;/p&gt;

&lt;h3&gt;
  
  
  Deprecate Finalization
&lt;/h3&gt;

&lt;p&gt;Finalization marked for removal.&lt;/p&gt;




&lt;h2&gt;
  
  
  Java 19 (September 2022)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Virtual Threads (Preview)
&lt;/h3&gt;

&lt;p&gt;Lightweight threads for massive concurrency:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Traditional thread&lt;/span&gt;
&lt;span class="nc"&gt;Thread&lt;/span&gt; &lt;span class="n"&gt;thread&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Thread&lt;/span&gt;&lt;span class="o"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello from thread"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Virtual thread&lt;/span&gt;
&lt;span class="nc"&gt;Thread&lt;/span&gt; &lt;span class="n"&gt;virtualThread&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Thread&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;startVirtualThread&lt;/span&gt;&lt;span class="o"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello from virtual thread"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Executor for virtual threads&lt;/span&gt;
&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;executor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Executors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;newVirtualThreadPerTaskExecutor&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;1_000_000&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;executor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;submit&lt;/span&gt;&lt;span class="o"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// Handle task&lt;/span&gt;
        &lt;span class="o"&gt;});&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Pattern Matching for switch (Third Preview)
&lt;/h3&gt;

&lt;p&gt;Record patterns introduced:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="nf"&gt;Point&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt;

&lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;printPoint&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Object&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nf"&gt;Point&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; 
            &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Point: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;", "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Not a point"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Structured Concurrency (Incubator)
&lt;/h3&gt;

&lt;p&gt;Simplify multithreaded programming:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;scope&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;StructuredTaskScope&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ShutdownOnFailure&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;Future&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fork&lt;/span&gt;&lt;span class="o"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;findUser&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
    &lt;span class="nc"&gt;Future&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fork&lt;/span&gt;&lt;span class="o"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;fetchOrder&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;

    &lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;join&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;throwIfFailed&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

    &lt;span class="c1"&gt;// Both operations succeeded&lt;/span&gt;
    &lt;span class="n"&gt;processData&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;resultNow&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;resultNow&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Foreign Function &amp;amp; Memory API (Preview)
&lt;/h3&gt;

&lt;p&gt;Graduated from incubator.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vector API (Fourth Incubator)
&lt;/h3&gt;

&lt;p&gt;Continued improvements.&lt;/p&gt;

&lt;h3&gt;
  
  
  Record Patterns (Preview)
&lt;/h3&gt;

&lt;p&gt;Destructure record values.&lt;/p&gt;

&lt;h3&gt;
  
  
  Linux/RISC-V Port
&lt;/h3&gt;

&lt;p&gt;Support for RISC-V architecture.&lt;/p&gt;




&lt;h2&gt;
  
  
  Java 20 (March 2023)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Scoped Values (Incubator)
&lt;/h3&gt;

&lt;p&gt;Share immutable data within threads:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;ScopedValue&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;CURRENT_USER&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ScopedValue&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;newInstance&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

&lt;span class="nc"&gt;ScopedValue&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;where&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;CURRENT_USER&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="o"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;processRequest&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Record Patterns (Second Preview)
&lt;/h3&gt;

&lt;p&gt;Refinements and nested patterns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="nf"&gt;Point&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt;
&lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="nf"&gt;Rectangle&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Point&lt;/span&gt; &lt;span class="n"&gt;topLeft&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Point&lt;/span&gt; &lt;span class="n"&gt;bottomRight&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt;

&lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;printRectangle&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Object&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="k"&gt;instanceof&lt;/span&gt; &lt;span class="nf"&gt;Rectangle&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Point&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;x1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;y1&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; 
                                  &lt;span class="nc"&gt;Point&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;x2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;y2&lt;/span&gt;&lt;span class="o"&gt;)))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Rectangle from "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;x1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;","&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y1&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Pattern Matching for switch (Fourth Preview)
&lt;/h3&gt;

&lt;p&gt;Continued refinements with when clauses:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="n"&gt;when&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"Long"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"Short"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"Other"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Foreign Function &amp;amp; Memory API (Second Preview)
&lt;/h3&gt;

&lt;p&gt;Further improvements.&lt;/p&gt;

&lt;h3&gt;
  
  
  Virtual Threads (Second Preview)
&lt;/h3&gt;

&lt;p&gt;Refinements based on feedback.&lt;/p&gt;

&lt;h3&gt;
  
  
  Structured Concurrency (Second Incubator)
&lt;/h3&gt;

&lt;p&gt;Enhanced APIs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vector API (Fifth Incubator)
&lt;/h3&gt;

&lt;p&gt;Continued evolution.&lt;/p&gt;




&lt;h2&gt;
  
  
  Java 21 (September 2023) - LTS
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Virtual Threads (Standard)
&lt;/h3&gt;

&lt;p&gt;Production-ready virtual threads:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Create millions of virtual threads easily&lt;/span&gt;
&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;executor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Executors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;newVirtualThreadPerTaskExecutor&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;IntStream&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;range&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10_000&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;forEach&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;executor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;submit&lt;/span&gt;&lt;span class="o"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;Thread&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sleep&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Duration&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ofSeconds&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;});&lt;/span&gt;
    &lt;span class="o"&gt;});&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Sequenced Collections
&lt;/h3&gt;

&lt;p&gt;New interfaces for collections with defined encounter order:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;SequencedCollection&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;E&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Collection&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;E&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;SequencedCollection&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;E&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;reversed&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;addFirst&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;E&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;addLast&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;E&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="no"&gt;E&lt;/span&gt; &lt;span class="nf"&gt;getFirst&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="no"&gt;E&lt;/span&gt; &lt;span class="nf"&gt;getLast&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="no"&gt;E&lt;/span&gt; &lt;span class="nf"&gt;removeFirst&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="no"&gt;E&lt;/span&gt; &lt;span class="nf"&gt;removeLast&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ArrayList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addFirst&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"first"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addLast&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"last"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;first&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getFirst&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;reversed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;reversed&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Pattern Matching for switch (Standard)
&lt;/h3&gt;

&lt;p&gt;Full pattern matching in switch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;formatValue&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Object&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;switch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nc"&gt;Integer&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"int %d"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"long %d"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nc"&gt;Double&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"double %f"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"String %s"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"null"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;};&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Record Patterns (Standard)
&lt;/h3&gt;

&lt;p&gt;Destructure records in pattern matching:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="nf"&gt;Point&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt;

&lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;printSum&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Object&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="k"&gt;instanceof&lt;/span&gt; &lt;span class="nf"&gt;Point&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// In switch&lt;/span&gt;
&lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;sumCoordinates&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Object&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;switch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nf"&gt;Point&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;};&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  String Templates (Preview)
&lt;/h3&gt;

&lt;p&gt;Safe and convenient string interpolation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"John"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// String template&lt;/span&gt;
&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;STR&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="s"&gt;"Hello \{name}, you are \{age} years old"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// With expressions&lt;/span&gt;
&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;STR&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="s"&gt;"2 + 2 = \{2 + 2}"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// FMT for formatting&lt;/span&gt;
&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;formatted&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;FMT&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="s"&gt;"Value: %.2f\{value}"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Unnamed Patterns and Variables
&lt;/h3&gt;

&lt;p&gt;Use &lt;code&gt;_&lt;/code&gt; for unused variables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Unused variables in patterns&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="k"&gt;instanceof&lt;/span&gt; &lt;span class="nf"&gt;Point&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Only use x, ignore y&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// In switch&lt;/span&gt;
&lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nf"&gt;Point&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// In lambda&lt;/span&gt;
&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;forEach&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Item"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Unnamed Classes and Instance Main Methods (Preview)
&lt;/h3&gt;

&lt;p&gt;Simplify learning and prototyping:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Traditional main method&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HelloWorld&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello World"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Java 21 simplified&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello World"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Scoped Values (Preview)
&lt;/h3&gt;

&lt;p&gt;Share immutable data efficiently:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;ScopedValue&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;CURRENT_USER&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ScopedValue&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;newInstance&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;serve&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Request&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;authenticate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="nc"&gt;ScopedValue&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;where&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;CURRENT_USER&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
               &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="o"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;processRequest&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Structured Concurrency (Preview)
&lt;/h3&gt;

&lt;p&gt;Treat multiple tasks as single unit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;scope&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;StructuredTaskScope&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ShutdownOnFailure&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;Subtask&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fork&lt;/span&gt;&lt;span class="o"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;findUser&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
    &lt;span class="nc"&gt;Subtask&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fork&lt;/span&gt;&lt;span class="o"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;fetchOrder&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;

    &lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;join&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;throwIfFailed&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Response&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Foreign Function &amp;amp; Memory API (Third Preview)
&lt;/h3&gt;

&lt;p&gt;Call native code safely.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vector API (Sixth Incubator)
&lt;/h3&gt;

&lt;p&gt;Express vector computations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Encapsulation Mechanism API
&lt;/h3&gt;

&lt;p&gt;Support for Key Encapsulation Mechanism (KEM).&lt;/p&gt;

&lt;h3&gt;
  
  
  Deprecate Windows 32-bit x86 Port
&lt;/h3&gt;

&lt;p&gt;Prepare for removal.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prepare to Disallow Dynamic Loading of Agents
&lt;/h3&gt;

&lt;p&gt;Improve integrity by default.&lt;/p&gt;




&lt;h2&gt;
  
  
  Java 22 (March 2024)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Unnamed Variables &amp;amp; Patterns (Standard)
&lt;/h3&gt;

&lt;p&gt;Using &lt;code&gt;_&lt;/code&gt; is now standard:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Multiple unused variables&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;point&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nf"&gt;Point&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;// Try-catch with unused exception&lt;/span&gt;
&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;riskyOperation&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Exception&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;handleError&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Statements before super() (Preview)
&lt;/h3&gt;

&lt;p&gt;Initialize fields before calling superclass constructor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SubClass&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;SuperClass&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;SubClass&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Process before super()&lt;/span&gt;
        &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;validateAndTransform&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  String Templates (Second Preview)
&lt;/h3&gt;

&lt;p&gt;Refinements to string templates.&lt;/p&gt;

&lt;h3&gt;
  
  
  Implicitly Declared Classes and Instance Main (Second Preview)
&lt;/h3&gt;

&lt;p&gt;Simplified entry point:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Entire program&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello, World!"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Scoped Values (Second Preview)
&lt;/h3&gt;

&lt;p&gt;Performance improvements.&lt;/p&gt;

&lt;h3&gt;
  
  
  Structured Concurrency (Second Preview)
&lt;/h3&gt;

&lt;p&gt;API refinements.&lt;/p&gt;

&lt;h3&gt;
  
  
  Foreign Function &amp;amp; Memory API (Standard)
&lt;/h3&gt;

&lt;p&gt;Production-ready FFM API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Call native function&lt;/span&gt;
&lt;span class="nc"&gt;Linker&lt;/span&gt; &lt;span class="n"&gt;linker&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Linker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nativeLinker&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="nc"&gt;SymbolLookup&lt;/span&gt; &lt;span class="n"&gt;stdlib&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;linker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;defaultLookup&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

&lt;span class="nc"&gt;MethodHandle&lt;/span&gt; &lt;span class="n"&gt;strlen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;linker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;downcallHandle&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;stdlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;find&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"strlen"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;orElseThrow&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt;
    &lt;span class="nc"&gt;FunctionDescriptor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;JAVA_LONG&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="no"&gt;ADDRESS&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Vector API (Seventh Incubator)
&lt;/h3&gt;

&lt;p&gt;Continued improvements.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stream Gatherers (Preview)
&lt;/h3&gt;

&lt;p&gt;Custom intermediate operations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Custom gathering operation&lt;/span&gt;
&lt;span class="nc"&gt;Stream&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Stream&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;gather&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;windowFixed&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;// Sliding window&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;map&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;window&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;mapToInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;sum&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Class-File API (Preview)
&lt;/h3&gt;

&lt;p&gt;Parse, generate, transform class files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;ClassFile&lt;/span&gt; &lt;span class="n"&gt;cf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ClassFile&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ClassDesc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"MyClass"&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="n"&gt;cb&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;cb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;withMethod&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"myMethod"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; 
        &lt;span class="nc"&gt;MethodTypeDesc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CD_void&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; 
        &lt;span class="no"&gt;ACC_PUBLIC&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mb&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// Build method&lt;/span&gt;
        &lt;span class="o"&gt;});&lt;/span&gt;
&lt;span class="o"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Launch Multi-File Source-Code Programs
&lt;/h3&gt;

&lt;p&gt;Run programs with multiple source files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;java MainClass.java  &lt;span class="c"&gt;# Compiles and runs all dependencies&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Java 23 (September 2024)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Primitive Types in Patterns (Preview)
&lt;/h3&gt;

&lt;p&gt;Pattern matching for primitive types:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Match on primitive types&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="kt"&gt;short&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;// In instanceof&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="k"&gt;instanceof&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Integer: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Module Import Declarations (Preview)
&lt;/h3&gt;

&lt;p&gt;Import entire modules:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;module&lt;/span&gt; &lt;span class="n"&gt;java&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;base&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// All public APIs from java.base are available&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Markdown Documentation Comments (Preview)
&lt;/h3&gt;

&lt;p&gt;Use Markdown in Javadoc:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;/// # This is a heading&lt;/span&gt;
&lt;span class="c1"&gt;/// &lt;/span&gt;
&lt;span class="c1"&gt;/// This method does something **important**.&lt;/span&gt;
&lt;span class="c1"&gt;/// &lt;/span&gt;
&lt;span class="c1"&gt;/// ## Parameters&lt;/span&gt;
&lt;span class="c1"&gt;/// - `value` - the input value&lt;/span&gt;
&lt;span class="c1"&gt;/// &lt;/span&gt;
&lt;span class="c1"&gt;/// ## Returns&lt;/span&gt;
&lt;span class="c1"&gt;/// The processed result&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;process&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toUpperCase&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Flexible Constructor Bodies (Second Preview)
&lt;/h3&gt;

&lt;p&gt;More flexibility before super():&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;SubClass&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Validate and prepare&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;IllegalArgumentException&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;processed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;trim&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;toLowerCase&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

    &lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;processed&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Post-super initialization&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;timestamp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;currentTimeMillis&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Implicitly Declared Classes and Instance Main (Third Preview)
&lt;/h3&gt;

&lt;p&gt;Further refinements.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stream Gatherers (Second Preview)
&lt;/h3&gt;

&lt;p&gt;Enhanced gathering operations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Sliding window with custom logic&lt;/span&gt;
&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;windows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Stream&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;gather&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;slidingWindow&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toList&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Structured Concurrency (Third Preview)
&lt;/h3&gt;

&lt;p&gt;Improved structured task handling.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scoped Values (Third Preview)
&lt;/h3&gt;

&lt;p&gt;Additional optimizations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Class-File API (Second Preview)
&lt;/h3&gt;

&lt;p&gt;Improvements to class file manipulation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vector API (Eighth Incubator)
&lt;/h3&gt;

&lt;p&gt;Performance enhancements.&lt;/p&gt;

&lt;h3&gt;
  
  
  ZGC: Generational Mode by Default
&lt;/h3&gt;

&lt;p&gt;Z Garbage Collector uses generational mode.&lt;/p&gt;

&lt;h3&gt;
  
  
  Deprecate Memory-Access Methods in sun.misc.Unsafe
&lt;/h3&gt;

&lt;p&gt;Prepare for removal in favor of FFM API.&lt;/p&gt;




&lt;h2&gt;
  
  
  Java 24 (March 2025)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Primitive Types in Patterns (Second Preview)
&lt;/h3&gt;

&lt;p&gt;Refinements to primitive pattern matching.&lt;/p&gt;

&lt;h3&gt;
  
  
  Module Import Declarations (Second Preview)
&lt;/h3&gt;

&lt;p&gt;Enhanced module imports.&lt;/p&gt;

&lt;h3&gt;
  
  
  Statements before super() (Standard)
&lt;/h3&gt;

&lt;p&gt;Constructor flexibility is now standard:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Entity&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;normalizedName&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;User&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Logic before super()&lt;/span&gt;
        &lt;span class="n"&gt;normalizedName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;trim&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;toLowerCase&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;normalizedName&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Flexible Constructor Bodies (Third Preview)
&lt;/h3&gt;

&lt;p&gt;Continued enhancements.&lt;/p&gt;

&lt;h3&gt;
  
  
  Markdown Documentation Comments (Second Preview)
&lt;/h3&gt;

&lt;p&gt;Improved Markdown support in docs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Late Barrier Expansion for G1 (Experimental)
&lt;/h3&gt;

&lt;p&gt;Optimize G1 garbage collector performance.&lt;/p&gt;

&lt;h3&gt;
  
  
  New Class-File API Methods
&lt;/h3&gt;

&lt;p&gt;Additional utilities for class file processing.&lt;/p&gt;




&lt;h2&gt;
  
  
  Java 25 (September 2025)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Java 25 is scheduled for release in September 2025. The features listed here are based on current JEPs and proposals, but may change before the final release.&lt;/p&gt;

&lt;h3&gt;
  
  
  String Templates (Final)
&lt;/h3&gt;

&lt;p&gt;String templates expected to be finalized:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Alice"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;95&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;STR&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="s"&gt;"Student \{name} scored \{score}%"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Simplified Main Methods (Final)
&lt;/h3&gt;

&lt;p&gt;Simplified Java learning:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Simple program&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Getting started with Java!"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Value Objects (Preview Expected)
&lt;/h3&gt;

&lt;p&gt;Memory-efficient, immutable objects:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Point&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Enhanced Pattern Matching
&lt;/h3&gt;

&lt;p&gt;More sophisticated pattern matching capabilities.&lt;/p&gt;

&lt;h3&gt;
  
  
  Project Leyden Previews
&lt;/h3&gt;

&lt;p&gt;Ahead-of-time compilation features for improved startup and performance.&lt;/p&gt;

&lt;h3&gt;
  
  
  Additional Vector API Enhancements
&lt;/h3&gt;

&lt;p&gt;Further performance improvements for vector operations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Expanded Foreign Function Support
&lt;/h3&gt;

&lt;p&gt;More capabilities for native interoperability.&lt;/p&gt;




&lt;h2&gt;
  
  
  Migration Guide: Key Considerations
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Moving from Java 8 to Java 11
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Module system&lt;/strong&gt; - Reorganize dependencies&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deprecated API removal&lt;/strong&gt; - Update Java EE references&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTTP Client&lt;/strong&gt; - Migrate from old APIs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;String methods&lt;/strong&gt; - Leverage new utilities&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Moving from Java 11 to Java 17
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Sealed classes&lt;/strong&gt; - Control inheritance hierarchy&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pattern matching&lt;/strong&gt; - Simplify type checks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Records&lt;/strong&gt; - Replace verbose POJOs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Text blocks&lt;/strong&gt; - Improve string readability&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Moving from Java 17 to Java 21
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Virtual threads&lt;/strong&gt; - Scale concurrent applications&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sequenced collections&lt;/strong&gt; - Use ordered collection APIs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pattern matching for switch&lt;/strong&gt; - Modernize control flow&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;String templates&lt;/strong&gt; - Safer string composition&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Moving to Java 22+
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;FFM API&lt;/strong&gt; - Replace JNI with modern native calls&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unnamed patterns&lt;/strong&gt; - Simplify code with &lt;code&gt;_&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Class-File API&lt;/strong&gt; - Dynamic class generation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stream gatherers&lt;/strong&gt; - Custom stream operations&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Performance Evolution
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Garbage Collection Improvements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;G1GC&lt;/strong&gt; (Java 9+): Default GC with better throughput&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ZGC&lt;/strong&gt; (Java 15+): Sub-millisecond pause times&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shenandoah&lt;/strong&gt; (Java 15+): Low-pause-time GC&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generational ZGC&lt;/strong&gt; (Java 21+): Improved memory management&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Startup and Footprint
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CDS/AppCDS&lt;/strong&gt;: Class data sharing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JLink&lt;/strong&gt;: Custom runtime images&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Project Leyden&lt;/strong&gt;: Ahead-of-time compilation (upcoming)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Concurrency
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Virtual threads&lt;/strong&gt;: Million-thread scalability&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structured concurrency&lt;/strong&gt;: Safer multithreading&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scoped values&lt;/strong&gt;: Efficient thread-local alternatives&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Best Practices by Version
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Java 8-11: Foundation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use lambda expressions and streams&lt;/li&gt;
&lt;li&gt;Embrace Optional for null handling&lt;/li&gt;
&lt;li&gt;Adopt new Date/Time API&lt;/li&gt;
&lt;li&gt;Leverage HTTP Client&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Java 12-17: Modernization
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Create records for data classes&lt;/li&gt;
&lt;li&gt;Use text blocks for multi-line strings&lt;/li&gt;
&lt;li&gt;Implement sealed classes for closed hierarchies&lt;/li&gt;
&lt;li&gt;Apply pattern matching to reduce casting&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Java 18-21: Advanced Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Adopt virtual threads for high concurrency&lt;/li&gt;
&lt;li&gt;Use sequenced collections for ordered data&lt;/li&gt;
&lt;li&gt;Leverage pattern matching in switch&lt;/li&gt;
&lt;li&gt;Implement structured concurrency patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Java 22+: Cutting Edge
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Integrate FFM API for native code&lt;/li&gt;
&lt;li&gt;Use unnamed patterns for cleaner code&lt;/li&gt;
&lt;li&gt;Apply stream gatherers for custom operations&lt;/li&gt;
&lt;li&gt;Utilize class-file API for metaprogramming&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Java's evolution from version 8 to 25 represents a remarkable transformation. The language has become more expressive, performant, and developer-friendly while maintaining backward compatibility. Key themes include:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Functional Programming&lt;/strong&gt;: Lambdas, streams, and functional interfaces&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modern Syntax&lt;/strong&gt;: Records, text blocks, pattern matching, and string templates&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Concurrency&lt;/strong&gt;: Virtual threads and structured concurrency&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance&lt;/strong&gt;: Advanced GC, AOT compilation, and optimizations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interoperability&lt;/strong&gt;: Foreign Function &amp;amp; Memory API&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Developer Experience&lt;/strong&gt;: Simplified syntax, better error messages, REPL&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each version builds on previous innovations, making Java a powerful choice for modern application development. Whether you're maintaining legacy systems or building new applications, understanding these features helps you write better, more maintainable code.&lt;/p&gt;

&lt;p&gt;The journey from Java 8's revolutionary lambdas to Java 25's value objects and ahead-of-time compilation shows a language that continuously evolves while respecting its commitment to backward compatibility and enterprise reliability.&lt;/p&gt;

</description>
      <category>java</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>☕ Mastering Java Streams: Intermediate, Terminal, and Short-Circuiting Operations</title>
      <dc:creator>nk sk</dc:creator>
      <pubDate>Wed, 08 Oct 2025 09:47:45 +0000</pubDate>
      <link>https://dev.to/nk_sk_6f24fdd730188b284bf/mastering-java-streams-intermediate-terminal-and-short-circuiting-operations-2cpc</link>
      <guid>https://dev.to/nk_sk_6f24fdd730188b284bf/mastering-java-streams-intermediate-terminal-and-short-circuiting-operations-2cpc</guid>
      <description>&lt;p&gt;The &lt;strong&gt;Java Stream API&lt;/strong&gt; (introduced in Java 8) is one of the most powerful tools for functional-style programming. It allows you to &lt;strong&gt;process collections of data declaratively&lt;/strong&gt; — chaining multiple operations into a clean, readable pipeline.&lt;/p&gt;

&lt;p&gt;In this post, we’ll explore three key concepts:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Intermediate Operations&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Terminal Operations&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Short-Circuiting Operations&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;…and how they work together to create expressive, efficient stream pipelines.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 What is a Stream?
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;Stream&lt;/strong&gt; in Java is a sequence of elements that supports various operations to be performed &lt;strong&gt;in a pipeline&lt;/strong&gt; — producing a result without modifying the original data source.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;names&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Alice"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Bob"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Charlie"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"David"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
                  &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;filter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                  &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;map&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;String:&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;toUpperCase&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                  &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Output: 3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here’s what’s happening:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;filter&lt;/code&gt; and &lt;code&gt;map&lt;/code&gt; are &lt;strong&gt;intermediate operations&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;count&lt;/code&gt; is a &lt;strong&gt;terminal operation&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The pipeline runs &lt;strong&gt;lazily&lt;/strong&gt; — operations execute only when a terminal operation is called.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚙️ 1. Intermediate Operations
&lt;/h2&gt;

&lt;p&gt;Intermediate operations &lt;strong&gt;transform a stream into another stream&lt;/strong&gt;.&lt;br&gt;
They are &lt;strong&gt;lazy&lt;/strong&gt;, meaning they don’t process data immediately — they just define what should happen when a terminal operation runs.&lt;/p&gt;
&lt;h3&gt;
  
  
  🧩 Common Intermediate Operations
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operation&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;filter(Predicate&amp;lt;T&amp;gt;)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Filters elements based on a condition&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.filter(x -&amp;gt; x &amp;gt; 10)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;map(Function&amp;lt;T,R&amp;gt;)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Transforms each element&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.map(String::toUpperCase)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;flatMap(Function&amp;lt;T, Stream&amp;lt;R&amp;gt;&amp;gt;)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Flattens nested streams&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.flatMap(List::stream)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;distinct()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Removes duplicates&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.distinct()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;sorted()&lt;/code&gt; / &lt;code&gt;sorted(Comparator)&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Sorts elements&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.sorted()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;limit(long n)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Limits to first &lt;code&gt;n&lt;/code&gt; elements&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.limit(5)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;skip(long n)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Skips first &lt;code&gt;n&lt;/code&gt; elements&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.skip(2)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;peek(Consumer&amp;lt;T&amp;gt;)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Performs an action (mainly for debugging)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.peek(System.out::println)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
       &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;filter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
       &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;map&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
       &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;peek&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
       &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;collect&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Collectors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toList&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🎯 2. Terminal Operations
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;terminal operation&lt;/strong&gt; marks the end of the stream pipeline.&lt;br&gt;
It &lt;strong&gt;triggers&lt;/strong&gt; the processing of all previous intermediate operations and produces a &lt;strong&gt;result&lt;/strong&gt; (value, collection, or side effect).&lt;/p&gt;
&lt;h3&gt;
  
  
  🧾 Common Terminal Operations
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operation&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;forEach(Consumer&amp;lt;T&amp;gt;)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Performs an action on each element&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.forEach(System.out::println)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;collect(Collector&amp;lt;T,A,R&amp;gt;)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Reduces elements into a collection&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.collect(Collectors.toList())&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;count()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Counts elements&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.count()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;reduce(...)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Combines elements into one value&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.reduce(0, Integer::sum)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;findFirst()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Returns the first element (Optional)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.findFirst()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;findAny()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Returns any element (Optional)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.findAny()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;anyMatch(Predicate&amp;lt;T&amp;gt;)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Checks if any element matches&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.anyMatch(x -&amp;gt; x &amp;gt; 10)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;allMatch(Predicate&amp;lt;T&amp;gt;)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Checks if all elements match&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.allMatch(x -&amp;gt; x &amp;gt; 0)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;noneMatch(Predicate&amp;lt;T&amp;gt;)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Checks if none match&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.noneMatch(x -&amp;gt; x &amp;lt; 0)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;min(Comparator)&lt;/code&gt; / &lt;code&gt;max(Comparator)&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Finds smallest/largest element&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.max(Integer::compare)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;toArray()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Converts stream to array&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.toArray()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
              &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
              &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;reduce&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;Integer:&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 15&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ⚡ 3. Short-Circuiting Operations
&lt;/h2&gt;

&lt;p&gt;Short-circuiting operations are &lt;strong&gt;a special subset&lt;/strong&gt; of stream operations (both intermediate and terminal) that can &lt;strong&gt;terminate early&lt;/strong&gt; — without processing the entire stream.&lt;/p&gt;

&lt;p&gt;These are useful for performance and conditional logic.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔄 Short-Circuiting Intermediate Operations
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operation&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;limit(n)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Stops after processing &lt;code&gt;n&lt;/code&gt; elements&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;skip(n)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Skips &lt;code&gt;n&lt;/code&gt; elements and processes the rest&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  🔚 Short-Circuiting Terminal Operations
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operation&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;anyMatch()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Stops once a match is found&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;allMatch()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Stops when a non-matching element is found&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;noneMatch()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Stops when a matching element is found&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;findFirst()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Returns after the first element is found&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;findAny()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Returns as soon as an element is found (in parallel streams)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="n"&gt;hasEven&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
                      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;peek&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;anyMatch&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hasEven&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Notice: Once &lt;code&gt;6&lt;/code&gt; is found, the stream &lt;strong&gt;stops processing&lt;/strong&gt; further elements.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Summary Table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Examples&lt;/th&gt;
&lt;th&gt;Eager/Lazy&lt;/th&gt;
&lt;th&gt;Returns&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Intermediate&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;filter&lt;/code&gt;, &lt;code&gt;map&lt;/code&gt;, &lt;code&gt;flatMap&lt;/code&gt;, &lt;code&gt;peek&lt;/code&gt;, &lt;code&gt;sorted&lt;/code&gt;, &lt;code&gt;distinct&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Lazy&lt;/td&gt;
&lt;td&gt;Stream&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Terminal&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;collect&lt;/code&gt;, &lt;code&gt;forEach&lt;/code&gt;, &lt;code&gt;count&lt;/code&gt;, &lt;code&gt;reduce&lt;/code&gt;, &lt;code&gt;findFirst&lt;/code&gt;, &lt;code&gt;anyMatch&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Eager&lt;/td&gt;
&lt;td&gt;Value or side-effect&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Short-Circuiting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;limit&lt;/code&gt;, &lt;code&gt;skip&lt;/code&gt;, &lt;code&gt;anyMatch&lt;/code&gt;, &lt;code&gt;findFirst&lt;/code&gt;, &lt;code&gt;allMatch&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Eager (but stops early)&lt;/td&gt;
&lt;td&gt;Depends&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  💡 Key Takeaways
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Intermediate operations&lt;/strong&gt; are &lt;em&gt;lazy&lt;/em&gt; — they define &lt;em&gt;what&lt;/em&gt; to do, not &lt;em&gt;when&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Terminal operations&lt;/strong&gt; trigger the stream pipeline to execute.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Short-circuiting operations&lt;/strong&gt; can improve performance by stopping early.&lt;/li&gt;
&lt;li&gt;Streams are &lt;strong&gt;single-use&lt;/strong&gt; — once a terminal operation runs, the stream is consumed.&lt;/li&gt;
&lt;li&gt;Prefer &lt;strong&gt;pure functions&lt;/strong&gt; and &lt;strong&gt;avoid side effects&lt;/strong&gt; except for debugging (&lt;code&gt;peek&lt;/code&gt;).&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  🧩 Final Example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"apple"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"banana"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"cherry"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"date"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"elderberry"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
                 &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;filter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                 &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;peek&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Filtered: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
                 &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;map&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;String:&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;toUpperCase&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                 &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;peek&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Mapped: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
                 &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Count = "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Filtered: banana
Mapped: BANANA
Filtered: cherry
Mapped: CHERRY
Filtered: elderberry
Mapped: ELDERBERRY
Count = 3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>api</category>
      <category>java</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>The Complete Spring Ecosystem Guide: A Master Interview Reference</title>
      <dc:creator>nk sk</dc:creator>
      <pubDate>Sun, 05 Oct 2025 10:07:07 +0000</pubDate>
      <link>https://dev.to/nk_sk_6f24fdd730188b284bf/the-complete-spring-ecosystem-guide-a-master-interview-reference-558h</link>
      <guid>https://dev.to/nk_sk_6f24fdd730188b284bf/the-complete-spring-ecosystem-guide-a-master-interview-reference-558h</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;The Spring ecosystem has evolved from a simple dependency injection framework into a comprehensive platform for building enterprise Java applications. This guide covers all major Spring projects, their use cases, advantages, and the problems they solve—perfect for interview preparation and architectural decisions.&lt;/p&gt;




&lt;h2&gt;
  
  
  Core Framework
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Spring Framework (Core)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; The foundation of the entire Spring ecosystem, providing core features like dependency injection, aspect-oriented programming, and transaction management.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problems it solves:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tight coupling between components in traditional Java applications&lt;/li&gt;
&lt;li&gt;Complex object creation and lifecycle management&lt;/li&gt;
&lt;li&gt;Boilerplate code for common patterns&lt;/li&gt;
&lt;li&gt;Cross-cutting concerns like logging, security, and transactions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Inversion of Control (IoC) for loose coupling&lt;/li&gt;
&lt;li&gt;Declarative programming model&lt;/li&gt;
&lt;li&gt;POJO-based development&lt;/li&gt;
&lt;li&gt;Easy testability with mock objects&lt;/li&gt;
&lt;li&gt;Non-invasive framework design&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Foundation for any Spring-based application&lt;/li&gt;
&lt;li&gt;Dependency injection across application layers&lt;/li&gt;
&lt;li&gt;Transaction management in enterprise applications&lt;/li&gt;
&lt;li&gt;AOP for cross-cutting concerns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Interview talking points:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Explain IoC container and bean lifecycle&lt;/li&gt;
&lt;li&gt;Difference between BeanFactory and ApplicationContext&lt;/li&gt;
&lt;li&gt;Bean scopes (singleton, prototype, request, session)&lt;/li&gt;
&lt;li&gt;Spring AOP vs AspectJ&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Web and REST
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Spring MVC
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; A web framework based on the Model-View-Controller pattern for building web applications and RESTful services.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problems it solves:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complex servlet-based web development&lt;/li&gt;
&lt;li&gt;Request routing and handling&lt;/li&gt;
&lt;li&gt;Data binding and validation&lt;/li&gt;
&lt;li&gt;View rendering across multiple technologies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clean separation of concerns (Model, View, Controller)&lt;/li&gt;
&lt;li&gt;Flexible request mapping with annotations&lt;/li&gt;
&lt;li&gt;Built-in validation support&lt;/li&gt;
&lt;li&gt;Multiple view technologies (JSP, Thymeleaf, FreeMarker)&lt;/li&gt;
&lt;li&gt;RESTful API development capabilities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Traditional web applications with server-side rendering&lt;/li&gt;
&lt;li&gt;RESTful API development&lt;/li&gt;
&lt;li&gt;File upload/download handling&lt;/li&gt;
&lt;li&gt;Content negotiation for multiple response formats&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Interview talking points:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DispatcherServlet workflow&lt;/li&gt;
&lt;li&gt;Difference between @Controller and @RestController&lt;/li&gt;
&lt;li&gt;Request mapping annotations hierarchy&lt;/li&gt;
&lt;li&gt;Exception handling strategies (@ExceptionHandler, @ControllerAdvice)&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Spring WebFlux
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; A reactive, non-blocking web framework for building asynchronous applications using Project Reactor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problems it solves:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Thread-per-request model limitations&lt;/li&gt;
&lt;li&gt;Poor resource utilization under high load&lt;/li&gt;
&lt;li&gt;Backpressure handling in streaming scenarios&lt;/li&gt;
&lt;li&gt;Scalability issues with blocking I/O&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Non-blocking I/O for better scalability&lt;/li&gt;
&lt;li&gt;Functional programming model&lt;/li&gt;
&lt;li&gt;Backpressure support&lt;/li&gt;
&lt;li&gt;Event-driven architecture&lt;/li&gt;
&lt;li&gt;Lower resource consumption for high concurrency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;High-concurrency applications (millions of connections)&lt;/li&gt;
&lt;li&gt;Streaming data applications&lt;/li&gt;
&lt;li&gt;Microservices with reactive communication&lt;/li&gt;
&lt;li&gt;Real-time data processing systems&lt;/li&gt;
&lt;li&gt;Applications requiring backpressure handling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Interview talking points:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reactive programming concepts (Mono, Flux)&lt;/li&gt;
&lt;li&gt;When to choose WebFlux over MVC&lt;/li&gt;
&lt;li&gt;Event loop model vs thread-per-request&lt;/li&gt;
&lt;li&gt;Reactive database drivers (R2DBC)&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Spring Boot
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; An opinionated framework that simplifies Spring application development with auto-configuration and embedded servers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problems it solves:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complex Spring configuration&lt;/li&gt;
&lt;li&gt;Time-consuming application setup&lt;/li&gt;
&lt;li&gt;Deployment complexity with external servers&lt;/li&gt;
&lt;li&gt;Inconsistent dependency versions&lt;/li&gt;
&lt;li&gt;Production-ready features setup (metrics, health checks)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Convention over configuration&lt;/li&gt;
&lt;li&gt;Embedded servers (Tomcat, Jetty, Undertow)&lt;/li&gt;
&lt;li&gt;Auto-configuration based on classpath&lt;/li&gt;
&lt;li&gt;Starter dependencies for quick setup&lt;/li&gt;
&lt;li&gt;Production-ready actuator endpoints&lt;/li&gt;
&lt;li&gt;Simplified deployment (fat JAR)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Microservices development&lt;/li&gt;
&lt;li&gt;Rapid application prototyping&lt;/li&gt;
&lt;li&gt;REST API services&lt;/li&gt;
&lt;li&gt;Batch processing applications&lt;/li&gt;
&lt;li&gt;Cloud-native applications&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Interview talking points:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How auto-configuration works (@Conditional annotations)&lt;/li&gt;
&lt;li&gt;Application properties vs YAML configuration&lt;/li&gt;
&lt;li&gt;Profiles for environment-specific configs&lt;/li&gt;
&lt;li&gt;Actuator endpoints and custom health indicators&lt;/li&gt;
&lt;li&gt;SpringBootApplication annotation components&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Data Access
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Spring Data JPA
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; Abstraction layer over JPA that reduces boilerplate code for database operations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problems it solves:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repetitive DAO implementation code&lt;/li&gt;
&lt;li&gt;Complex query generation&lt;/li&gt;
&lt;li&gt;Transaction management complexity&lt;/li&gt;
&lt;li&gt;Pagination and sorting implementation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repository pattern implementation&lt;/li&gt;
&lt;li&gt;Query derivation from method names&lt;/li&gt;
&lt;li&gt;Reduced boilerplate code (80-90% less DAO code)&lt;/li&gt;
&lt;li&gt;Automatic pagination and sorting&lt;/li&gt;
&lt;li&gt;Custom query support with @Query&lt;/li&gt;
&lt;li&gt;Auditing capabilities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CRUD operations on relational databases&lt;/li&gt;
&lt;li&gt;Complex query generation&lt;/li&gt;
&lt;li&gt;Entity relationship management&lt;/li&gt;
&lt;li&gt;Audit trail implementation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Interview talking points:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repository hierarchy (CrudRepository, JpaRepository)&lt;/li&gt;
&lt;li&gt;Query method naming conventions&lt;/li&gt;
&lt;li&gt;N+1 query problem and solutions&lt;/li&gt;
&lt;li&gt;@EntityGraph for fetch optimization&lt;/li&gt;
&lt;li&gt;Difference between save() and saveAndFlush()&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Spring Data MongoDB
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; Spring Data implementation for MongoDB, providing similar abstractions as JPA but for document databases.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problems it solves:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complex MongoDB driver operations&lt;/li&gt;
&lt;li&gt;Mapping between Java objects and documents&lt;/li&gt;
&lt;li&gt;Query building complexity&lt;/li&gt;
&lt;li&gt;Consistent repository pattern across databases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repository abstraction for MongoDB&lt;/li&gt;
&lt;li&gt;Object-document mapping&lt;/li&gt;
&lt;li&gt;Query methods with method naming&lt;/li&gt;
&lt;li&gt;Geospatial query support&lt;/li&gt;
&lt;li&gt;GridFS support for large files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Document-oriented data storage&lt;/li&gt;
&lt;li&gt;Content management systems&lt;/li&gt;
&lt;li&gt;Real-time analytics&lt;/li&gt;
&lt;li&gt;IoT data storage&lt;/li&gt;
&lt;li&gt;Catalog management&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Interview talking points:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Document mapping annotations&lt;/li&gt;
&lt;li&gt;Embedded documents vs references&lt;/li&gt;
&lt;li&gt;Aggregation pipeline support&lt;/li&gt;
&lt;li&gt;Indexing strategies&lt;/li&gt;
&lt;li&gt;When to choose MongoDB over RDBMS&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Spring Data Redis
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; Integration with Redis for caching, messaging, and data structures.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problems it solves:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Application performance optimization&lt;/li&gt;
&lt;li&gt;Session management in distributed systems&lt;/li&gt;
&lt;li&gt;Pub/Sub messaging implementation&lt;/li&gt;
&lt;li&gt;Rate limiting and counting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Simple Redis operations abstraction&lt;/li&gt;
&lt;li&gt;Spring Cache abstraction integration&lt;/li&gt;
&lt;li&gt;Pub/Sub messaging support&lt;/li&gt;
&lt;li&gt;Repository pattern for Redis&lt;/li&gt;
&lt;li&gt;Transaction support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Application-level caching&lt;/li&gt;
&lt;li&gt;Session storage in microservices&lt;/li&gt;
&lt;li&gt;Real-time leaderboards&lt;/li&gt;
&lt;li&gt;Rate limiting&lt;/li&gt;
&lt;li&gt;Message queue implementation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Interview talking points:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cache eviction strategies&lt;/li&gt;
&lt;li&gt;RedisTemplate vs StringRedisTemplate&lt;/li&gt;
&lt;li&gt;Serialization strategies&lt;/li&gt;
&lt;li&gt;Redis vs other caches (Memcached, Hazelcast)&lt;/li&gt;
&lt;li&gt;Session clustering with Redis&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Spring Data JDBC
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; Simpler alternative to JPA, providing direct JDBC mapping without the complexity of ORM.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problems it solves:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JPA overhead and complexity&lt;/li&gt;
&lt;li&gt;Unnecessary features for simple use cases&lt;/li&gt;
&lt;li&gt;Lazy loading issues&lt;/li&gt;
&lt;li&gt;First-level cache complexity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Simpler than JPA&lt;/li&gt;
&lt;li&gt;No lazy loading complications&lt;/li&gt;
&lt;li&gt;Direct SQL control&lt;/li&gt;
&lt;li&gt;Better performance for simple scenarios&lt;/li&gt;
&lt;li&gt;No persistence context overhead&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Applications requiring simple CRUD&lt;/li&gt;
&lt;li&gt;Performance-critical database operations&lt;/li&gt;
&lt;li&gt;Teams preferring SQL over ORM abstractions&lt;/li&gt;
&lt;li&gt;Microservices with simple data models&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Interview talking points:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When to choose JDBC over JPA&lt;/li&gt;
&lt;li&gt;Aggregate pattern in Spring Data JDBC&lt;/li&gt;
&lt;li&gt;No session/persistence context benefits&lt;/li&gt;
&lt;li&gt;Performance comparison with JPA&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Spring Data REST
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; Automatically exposes Spring Data repositories as RESTful endpoints.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problems it solves:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repetitive REST controller implementation&lt;/li&gt;
&lt;li&gt;HATEOAS implementation complexity&lt;/li&gt;
&lt;li&gt;Consistent REST API patterns&lt;/li&gt;
&lt;li&gt;API documentation overhead&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Zero-code REST API generation&lt;/li&gt;
&lt;li&gt;HATEOAS compliance out-of-box&lt;/li&gt;
&lt;li&gt;HAL format support&lt;/li&gt;
&lt;li&gt;Pagination and sorting endpoints&lt;/li&gt;
&lt;li&gt;Custom query exposure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rapid API prototyping&lt;/li&gt;
&lt;li&gt;Admin interfaces&lt;/li&gt;
&lt;li&gt;Internal CRUD APIs&lt;/li&gt;
&lt;li&gt;Standardized REST APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Interview talking points:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pros and cons of auto-generated APIs&lt;/li&gt;
&lt;li&gt;Customizing exposed endpoints&lt;/li&gt;
&lt;li&gt;Security considerations&lt;/li&gt;
&lt;li&gt;When not to use Spring Data REST&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Spring Data Elasticsearch
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; Spring Data module for Elasticsearch integration, providing search and analytics capabilities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problems it solves:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Full-text search implementation&lt;/li&gt;
&lt;li&gt;Complex search queries&lt;/li&gt;
&lt;li&gt;Aggregations and analytics&lt;/li&gt;
&lt;li&gt;Distributed search scalability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repository abstraction for Elasticsearch&lt;/li&gt;
&lt;li&gt;Full-text search capabilities&lt;/li&gt;
&lt;li&gt;Aggregation framework support&lt;/li&gt;
&lt;li&gt;Real-time indexing&lt;/li&gt;
&lt;li&gt;Geospatial search&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Full-text search engines&lt;/li&gt;
&lt;li&gt;Log analytics and monitoring&lt;/li&gt;
&lt;li&gt;E-commerce product search&lt;/li&gt;
&lt;li&gt;Real-time data analytics&lt;/li&gt;
&lt;li&gt;Autocomplete and suggestions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Interview talking points:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Elasticsearch vs traditional databases&lt;/li&gt;
&lt;li&gt;Indexing strategies&lt;/li&gt;
&lt;li&gt;Query DSL vs repository methods&lt;/li&gt;
&lt;li&gt;Relevance scoring and boosting&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Microservices and Cloud
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Spring Cloud
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; Collection of tools for building cloud-native, distributed systems and microservices.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problems it solves:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Service discovery in distributed systems&lt;/li&gt;
&lt;li&gt;Configuration management across environments&lt;/li&gt;
&lt;li&gt;Circuit breaking for fault tolerance&lt;/li&gt;
&lt;li&gt;Load balancing between service instances&lt;/li&gt;
&lt;li&gt;Distributed tracing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complete microservices toolkit&lt;/li&gt;
&lt;li&gt;Netflix OSS integration&lt;/li&gt;
&lt;li&gt;Service mesh capabilities&lt;/li&gt;
&lt;li&gt;Cloud-agnostic design&lt;/li&gt;
&lt;li&gt;Production-proven patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Microservices architectures&lt;/li&gt;
&lt;li&gt;Cloud-native applications&lt;/li&gt;
&lt;li&gt;Distributed systems&lt;/li&gt;
&lt;li&gt;Multi-cloud deployments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Interview talking points:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Core Spring Cloud components&lt;/li&gt;
&lt;li&gt;Service discovery patterns&lt;/li&gt;
&lt;li&gt;Configuration management strategies&lt;/li&gt;
&lt;li&gt;Circuit breaker pattern implementation&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Spring Cloud Netflix (Eureka, Ribbon, Hystrix, Zuul)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; Integration with Netflix OSS components for microservices patterns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problems it solves:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Service registration and discovery&lt;/li&gt;
&lt;li&gt;Client-side load balancing&lt;/li&gt;
&lt;li&gt;Fault tolerance and resilience&lt;/li&gt;
&lt;li&gt;API gateway routing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Battle-tested Netflix components&lt;/li&gt;
&lt;li&gt;Easy service discovery&lt;/li&gt;
&lt;li&gt;Circuit breaker implementation&lt;/li&gt;
&lt;li&gt;Intelligent routing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Service discovery in microservices&lt;/li&gt;
&lt;li&gt;Load balancing without hardware&lt;/li&gt;
&lt;li&gt;Fault-tolerant service communication&lt;/li&gt;
&lt;li&gt;API gateway implementation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Interview talking points:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Eureka architecture (server, client)&lt;/li&gt;
&lt;li&gt;Ribbon load balancing algorithms&lt;/li&gt;
&lt;li&gt;Hystrix circuit breaker states&lt;/li&gt;
&lt;li&gt;Zuul vs Spring Cloud Gateway&lt;/li&gt;
&lt;li&gt;Note: Many components in maintenance mode (migration to alternatives)&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Spring Cloud Config
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; Centralized configuration management for distributed systems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problems it solves:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configuration scattered across services&lt;/li&gt;
&lt;li&gt;Environment-specific config management&lt;/li&gt;
&lt;li&gt;Configuration change deployment&lt;/li&gt;
&lt;li&gt;Secrets management&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Git-backed configuration storage&lt;/li&gt;
&lt;li&gt;Environment-specific profiles&lt;/li&gt;
&lt;li&gt;Encryption/decryption support&lt;/li&gt;
&lt;li&gt;Real-time configuration refresh&lt;/li&gt;
&lt;li&gt;Audit trail through Git history&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Centralized configuration for microservices&lt;/li&gt;
&lt;li&gt;Environment-specific configurations&lt;/li&gt;
&lt;li&gt;Feature toggle management&lt;/li&gt;
&lt;li&gt;Secret rotation without redeployment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Interview talking points:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Config server architecture&lt;/li&gt;
&lt;li&gt;Git repository structure&lt;/li&gt;
&lt;li&gt;@RefreshScope annotation&lt;/li&gt;
&lt;li&gt;Encryption strategies&lt;/li&gt;
&lt;li&gt;Bootstrap context vs application context&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Spring Cloud Gateway
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; Modern API gateway built on Spring WebFlux for routing and filtering requests.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problems it solves:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API routing and aggregation&lt;/li&gt;
&lt;li&gt;Cross-cutting concerns (auth, logging, rate limiting)&lt;/li&gt;
&lt;li&gt;Legacy Zuul performance limitations&lt;/li&gt;
&lt;li&gt;Protocol translation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Built on reactive stack (non-blocking)&lt;/li&gt;
&lt;li&gt;Predicates and filters for routing&lt;/li&gt;
&lt;li&gt;Circuit breaker integration&lt;/li&gt;
&lt;li&gt;Rate limiting and throttling&lt;/li&gt;
&lt;li&gt;WebSocket support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API gateway for microservices&lt;/li&gt;
&lt;li&gt;Request routing and transformation&lt;/li&gt;
&lt;li&gt;Security filtering (authentication/authorization)&lt;/li&gt;
&lt;li&gt;Rate limiting and throttling&lt;/li&gt;
&lt;li&gt;Protocol adaptation (HTTP to WebSocket)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Interview talking points:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Route predicates and filters&lt;/li&gt;
&lt;li&gt;Gateway vs Zuul (reactive vs blocking)&lt;/li&gt;
&lt;li&gt;Custom filter implementation&lt;/li&gt;
&lt;li&gt;Integration with service discovery&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Spring Cloud Stream
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; Framework for building event-driven microservices with message brokers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problems it solves:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Message broker abstraction&lt;/li&gt;
&lt;li&gt;Event-driven architecture complexity&lt;/li&gt;
&lt;li&gt;Message serialization/deserialization&lt;/li&gt;
&lt;li&gt;Consumer group management&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Broker-agnostic programming model&lt;/li&gt;
&lt;li&gt;Support for Kafka, RabbitMQ, etc.&lt;/li&gt;
&lt;li&gt;Declarative programming model&lt;/li&gt;
&lt;li&gt;Built-in error handling&lt;/li&gt;
&lt;li&gt;Partitioning support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Event-driven microservices&lt;/li&gt;
&lt;li&gt;Stream processing applications&lt;/li&gt;
&lt;li&gt;Message-based integration&lt;/li&gt;
&lt;li&gt;Real-time data pipelines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Interview talking points:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Binder abstraction concept&lt;/li&gt;
&lt;li&gt;Functional programming model&lt;/li&gt;
&lt;li&gt;Message headers and metadata&lt;/li&gt;
&lt;li&gt;Error handling strategies&lt;/li&gt;
&lt;li&gt;Kafka vs RabbitMQ considerations&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Spring Cloud Sleuth
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; Distributed tracing solution for microservices.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problems it solves:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Request tracking across services&lt;/li&gt;
&lt;li&gt;Performance bottleneck identification&lt;/li&gt;
&lt;li&gt;Debugging distributed systems&lt;/li&gt;
&lt;li&gt;Correlation of logs across services&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automatic trace ID generation&lt;/li&gt;
&lt;li&gt;Integration with Zipkin/Jaeger&lt;/li&gt;
&lt;li&gt;MDC (Mapped Diagnostic Context) support&lt;/li&gt;
&lt;li&gt;Minimal code changes required&lt;/li&gt;
&lt;li&gt;Async communication tracing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Distributed tracing&lt;/li&gt;
&lt;li&gt;Performance monitoring&lt;/li&gt;
&lt;li&gt;Debugging microservices&lt;/li&gt;
&lt;li&gt;Log correlation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Interview talking points:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Trace ID and Span ID concepts&lt;/li&gt;
&lt;li&gt;Sampling strategies&lt;/li&gt;
&lt;li&gt;Baggage propagation&lt;/li&gt;
&lt;li&gt;Integration with logging frameworks&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Spring Cloud OpenFeign
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; Declarative REST client for service-to-service communication.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problems it solves:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Boilerplate REST client code&lt;/li&gt;
&lt;li&gt;Service-to-service communication&lt;/li&gt;
&lt;li&gt;Load balancing integration&lt;/li&gt;
&lt;li&gt;Error handling standardization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Declarative REST client definition&lt;/li&gt;
&lt;li&gt;Integration with Ribbon/Eureka&lt;/li&gt;
&lt;li&gt;Hystrix fallback support&lt;/li&gt;
&lt;li&gt;Customizable encoders/decoders&lt;/li&gt;
&lt;li&gt;Request/response interceptors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Microservice-to-microservice communication&lt;/li&gt;
&lt;li&gt;External API integration&lt;/li&gt;
&lt;li&gt;Load-balanced REST calls&lt;/li&gt;
&lt;li&gt;Circuit breaker integration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Interview talking points:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Feign vs RestTemplate vs WebClient&lt;/li&gt;
&lt;li&gt;Custom configuration (timeouts, interceptors)&lt;/li&gt;
&lt;li&gt;Error handling and fallbacks&lt;/li&gt;
&lt;li&gt;Request/response logging&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Spring Cloud LoadBalancer
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; Client-side load balancer (replacement for Ribbon).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problems it solves:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Service instance selection&lt;/li&gt;
&lt;li&gt;Load distribution across instances&lt;/li&gt;
&lt;li&gt;Health-aware routing&lt;/li&gt;
&lt;li&gt;Ribbon end-of-life migration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reactive and non-reactive support&lt;/li&gt;
&lt;li&gt;Customizable load balancing algorithms&lt;/li&gt;
&lt;li&gt;Health check integration&lt;/li&gt;
&lt;li&gt;Simpler than Ribbon&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Client-side load balancing&lt;/li&gt;
&lt;li&gt;Service discovery integration&lt;/li&gt;
&lt;li&gt;Custom routing logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Interview talking points:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Load balancing algorithms&lt;/li&gt;
&lt;li&gt;Difference from server-side load balancing&lt;/li&gt;
&lt;li&gt;Integration with service discovery&lt;/li&gt;
&lt;li&gt;Migration from Ribbon&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Spring Cloud Circuit Breaker
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; Abstraction over circuit breaker implementations (Resilience4j, Hystrix).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problems it solves:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cascading failures in distributed systems&lt;/li&gt;
&lt;li&gt;Latency and fault tolerance&lt;/li&gt;
&lt;li&gt;Resource exhaustion from failed services&lt;/li&gt;
&lt;li&gt;Fallback mechanism standardization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Implementation-agnostic API&lt;/li&gt;
&lt;li&gt;Support for multiple libraries&lt;/li&gt;
&lt;li&gt;Fallback support&lt;/li&gt;
&lt;li&gt;Metrics and monitoring&lt;/li&gt;
&lt;li&gt;Easy testing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fault-tolerant service calls&lt;/li&gt;
&lt;li&gt;Timeout handling&lt;/li&gt;
&lt;li&gt;Fallback mechanisms&lt;/li&gt;
&lt;li&gt;Bulkhead pattern implementation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Interview talking points:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Circuit breaker states (Closed, Open, Half-Open)&lt;/li&gt;
&lt;li&gt;Resilience4j vs Hystrix&lt;/li&gt;
&lt;li&gt;Rate limiter and retry patterns&lt;/li&gt;
&lt;li&gt;Monitoring circuit breaker health&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Security
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Spring Security
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; Comprehensive security framework for authentication, authorization, and protection against common attacks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problems it solves:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Authentication and authorization complexity&lt;/li&gt;
&lt;li&gt;Session management&lt;/li&gt;
&lt;li&gt;CSRF, XSS, and other security threats&lt;/li&gt;
&lt;li&gt;Password encryption and management&lt;/li&gt;
&lt;li&gt;OAuth2 and JWT implementation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Highly customizable security&lt;/li&gt;
&lt;li&gt;Multiple authentication mechanisms&lt;/li&gt;
&lt;li&gt;Method-level security&lt;/li&gt;
&lt;li&gt;CSRF protection out-of-box&lt;/li&gt;
&lt;li&gt;OAuth2/OIDC support&lt;/li&gt;
&lt;li&gt;Integration with LDAP, Active Directory&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Web application security&lt;/li&gt;
&lt;li&gt;REST API authentication/authorization&lt;/li&gt;
&lt;li&gt;OAuth2 authorization server&lt;/li&gt;
&lt;li&gt;Single Sign-On (SSO) implementation&lt;/li&gt;
&lt;li&gt;Method-level security&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Interview talking points:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Authentication vs authorization&lt;/li&gt;
&lt;li&gt;Filter chain architecture&lt;/li&gt;
&lt;li&gt;UserDetailsService and password encoders&lt;/li&gt;
&lt;li&gt;JWT vs session-based authentication&lt;/li&gt;
&lt;li&gt;OAuth2 flows (authorization code, client credentials)&lt;/li&gt;
&lt;li&gt;SecurityContext and SecurityContextHolder&lt;/li&gt;
&lt;li&gt;@PreAuthorize vs @Secured&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Spring Security OAuth2
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; OAuth2 and OpenID Connect implementation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problems it solves:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Third-party authentication&lt;/li&gt;
&lt;li&gt;API security without sharing credentials&lt;/li&gt;
&lt;li&gt;Token-based authentication&lt;/li&gt;
&lt;li&gt;SSO implementation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complete OAuth2 flows support&lt;/li&gt;
&lt;li&gt;Resource server implementation&lt;/li&gt;
&lt;li&gt;Authorization server capabilities&lt;/li&gt;
&lt;li&gt;JWT token support&lt;/li&gt;
&lt;li&gt;Integration with social providers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Social login (Google, Facebook)&lt;/li&gt;
&lt;li&gt;API authorization&lt;/li&gt;
&lt;li&gt;Microservices security&lt;/li&gt;
&lt;li&gt;Mobile app authentication&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Interview talking points:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OAuth2 grant types&lt;/li&gt;
&lt;li&gt;JWT structure and claims&lt;/li&gt;
&lt;li&gt;Resource server vs authorization server&lt;/li&gt;
&lt;li&gt;Token validation strategies&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Batch and Integration
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Spring Batch
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; Framework for robust batch processing of large volumes of data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problems it solves:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Large-scale data processing&lt;/li&gt;
&lt;li&gt;Transaction management in batches&lt;/li&gt;
&lt;li&gt;Retry and skip logic&lt;/li&gt;
&lt;li&gt;Job scheduling and monitoring&lt;/li&gt;
&lt;li&gt;Restart capabilities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chunk-oriented processing&lt;/li&gt;
&lt;li&gt;Transaction management&lt;/li&gt;
&lt;li&gt;Retry/skip/restart capabilities&lt;/li&gt;
&lt;li&gt;Scalability (parallel processing, partitioning)&lt;/li&gt;
&lt;li&gt;Job repository for metadata&lt;/li&gt;
&lt;li&gt;Integration with Spring ecosystem&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ETL operations&lt;/li&gt;
&lt;li&gt;Report generation&lt;/li&gt;
&lt;li&gt;Data migration&lt;/li&gt;
&lt;li&gt;Bulk email/notification sending&lt;/li&gt;
&lt;li&gt;End-of-day processing&lt;/li&gt;
&lt;li&gt;File processing (CSV, XML)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Interview talking points:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Job, Step, ItemReader, ItemProcessor, ItemWriter concepts&lt;/li&gt;
&lt;li&gt;Chunk-oriented vs tasklet processing&lt;/li&gt;
&lt;li&gt;Job parameters and late binding&lt;/li&gt;
&lt;li&gt;Partitioning and parallel processing&lt;/li&gt;
&lt;li&gt;Restart and recovery mechanisms&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Spring Integration
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; Enterprise Application Integration (EAI) framework implementing Enterprise Integration Patterns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problems it solves:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;System integration complexity&lt;/li&gt;
&lt;li&gt;Message routing and transformation&lt;/li&gt;
&lt;li&gt;Protocol adaptation&lt;/li&gt;
&lt;li&gt;Legacy system integration&lt;/li&gt;
&lt;li&gt;Asynchronous processing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enterprise Integration Patterns support&lt;/li&gt;
&lt;li&gt;Channel adapters for various protocols&lt;/li&gt;
&lt;li&gt;Message routing and filtering&lt;/li&gt;
&lt;li&gt;Content enrichment and splitting&lt;/li&gt;
&lt;li&gt;Integration with external systems&lt;/li&gt;
&lt;li&gt;DSL for integration flows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;File system integration (FTP, SFTP)&lt;/li&gt;
&lt;li&gt;Message queue integration&lt;/li&gt;
&lt;li&gt;Email processing&lt;/li&gt;
&lt;li&gt;Web service integration&lt;/li&gt;
&lt;li&gt;Legacy system modernization&lt;/li&gt;
&lt;li&gt;Event-driven architectures&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Interview talking points:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Message channels (direct, queue, publish-subscribe)&lt;/li&gt;
&lt;li&gt;Message endpoints (service activator, transformer, router)&lt;/li&gt;
&lt;li&gt;Integration flows (Java DSL vs XML config)&lt;/li&gt;
&lt;li&gt;Error handling in integration flows&lt;/li&gt;
&lt;li&gt;Difference from Spring Cloud Stream&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Reactive and Messaging
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Spring WebSocket
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; WebSocket support for building bi-directional, full-duplex communication applications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problems it solves:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Real-time communication limitations of HTTP&lt;/li&gt;
&lt;li&gt;Polling overhead&lt;/li&gt;
&lt;li&gt;Server push capabilities&lt;/li&gt;
&lt;li&gt;Low-latency communication&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Full-duplex communication&lt;/li&gt;
&lt;li&gt;STOMP protocol support&lt;/li&gt;
&lt;li&gt;SockJS fallback for older browsers&lt;/li&gt;
&lt;li&gt;Message broker integration&lt;/li&gt;
&lt;li&gt;Broadcasting capabilities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chat applications&lt;/li&gt;
&lt;li&gt;Real-time notifications&lt;/li&gt;
&lt;li&gt;Live dashboards&lt;/li&gt;
&lt;li&gt;Multiplayer games&lt;/li&gt;
&lt;li&gt;Collaborative editing tools&lt;/li&gt;
&lt;li&gt;Stock tickers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Interview talking points:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WebSocket vs HTTP polling vs SSE&lt;/li&gt;
&lt;li&gt;STOMP protocol advantages&lt;/li&gt;
&lt;li&gt;Message broker integration (RabbitMQ, ActiveMQ)&lt;/li&gt;
&lt;li&gt;Authentication in WebSocket connections&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Spring AMQP
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; Support for Advanced Message Queuing Protocol (AMQP), primarily RabbitMQ.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problems it solves:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Asynchronous message processing&lt;/li&gt;
&lt;li&gt;Decoupling between services&lt;/li&gt;
&lt;li&gt;Message persistence and reliability&lt;/li&gt;
&lt;li&gt;Load leveling and buffering&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RabbitMQ abstraction&lt;/li&gt;
&lt;li&gt;Message conversion&lt;/li&gt;
&lt;li&gt;Listener container management&lt;/li&gt;
&lt;li&gt;Retry and error handling&lt;/li&gt;
&lt;li&gt;Transaction support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Asynchronous processing&lt;/li&gt;
&lt;li&gt;Task queues&lt;/li&gt;
&lt;li&gt;Publish-subscribe patterns&lt;/li&gt;
&lt;li&gt;Message-driven microservices&lt;/li&gt;
&lt;li&gt;Event notification systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Interview talking points:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Exchange types (direct, topic, fanout, headers)&lt;/li&gt;
&lt;li&gt;Message acknowledgment modes&lt;/li&gt;
&lt;li&gt;DLQ (Dead Letter Queue) handling&lt;/li&gt;
&lt;li&gt;Publisher confirms&lt;/li&gt;
&lt;li&gt;RabbitMQ vs Kafka use cases&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Spring for Apache Kafka
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; Spring's integration with Apache Kafka for building streaming applications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problems it solves:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complex Kafka producer/consumer code&lt;/li&gt;
&lt;li&gt;Message serialization/deserialization&lt;/li&gt;
&lt;li&gt;Error handling in streaming&lt;/li&gt;
&lt;li&gt;Transaction management&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;KafkaTemplate abstraction&lt;/li&gt;
&lt;li&gt;Message listener containers&lt;/li&gt;
&lt;li&gt;Type-safe message handling&lt;/li&gt;
&lt;li&gt;Error handling and retry&lt;/li&gt;
&lt;li&gt;Transaction support&lt;/li&gt;
&lt;li&gt;Integration with Spring ecosystem&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Event streaming applications&lt;/li&gt;
&lt;li&gt;Log aggregation&lt;/li&gt;
&lt;li&gt;Real-time analytics&lt;/li&gt;
&lt;li&gt;Event sourcing&lt;/li&gt;
&lt;li&gt;CQRS implementation&lt;/li&gt;
&lt;li&gt;Change data capture&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Interview talking points:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Producer acknowledgment modes&lt;/li&gt;
&lt;li&gt;Consumer offset management&lt;/li&gt;
&lt;li&gt;Kafka vs RabbitMQ differences&lt;/li&gt;
&lt;li&gt;Exactly-once semantics&lt;/li&gt;
&lt;li&gt;Kafka Streams vs Spring Cloud Stream&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Testing and DevOps
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Spring Test
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; Testing support integrated with JUnit and TestNG.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problems it solves:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Integration testing complexity&lt;/li&gt;
&lt;li&gt;Context caching across tests&lt;/li&gt;
&lt;li&gt;Mock data setup&lt;/li&gt;
&lt;li&gt;Transaction rollback in tests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Spring context caching&lt;/li&gt;
&lt;li&gt;Test fixtures support&lt;/li&gt;
&lt;li&gt;MockMvc for web layer testing&lt;/li&gt;
&lt;li&gt;@Transactional test rollback&lt;/li&gt;
&lt;li&gt;Profile-specific testing&lt;/li&gt;
&lt;li&gt;Integration with testing frameworks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unit testing with dependency injection&lt;/li&gt;
&lt;li&gt;Integration testing&lt;/li&gt;
&lt;li&gt;Web layer testing&lt;/li&gt;
&lt;li&gt;Database testing with test data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Interview talking points:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;@SpringBootTest annotations and configurations&lt;/li&gt;
&lt;li&gt;MockMvc vs WebTestClient&lt;/li&gt;
&lt;li&gt;@MockBean vs @Mock&lt;/li&gt;
&lt;li&gt;Test slicing (@WebMvcTest, @DataJpaTest)&lt;/li&gt;
&lt;li&gt;Context caching strategies&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Spring Boot Actuator
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; Production-ready features for monitoring and managing Spring Boot applications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problems it solves:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Application health monitoring&lt;/li&gt;
&lt;li&gt;Metrics collection&lt;/li&gt;
&lt;li&gt;Environment introspection&lt;/li&gt;
&lt;li&gt;Application management&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Built-in health checks&lt;/li&gt;
&lt;li&gt;Metrics integration (Micrometer)&lt;/li&gt;
&lt;li&gt;HTTP and JMX endpoints&lt;/li&gt;
&lt;li&gt;Custom health indicators&lt;/li&gt;
&lt;li&gt;Production-ready monitoring&lt;/li&gt;
&lt;li&gt;Integration with monitoring tools (Prometheus, Grafana)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Application health monitoring&lt;/li&gt;
&lt;li&gt;Performance metrics collection&lt;/li&gt;
&lt;li&gt;Environment configuration inspection&lt;/li&gt;
&lt;li&gt;Graceful shutdown&lt;/li&gt;
&lt;li&gt;Audit events tracking&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Interview talking points:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Important actuator endpoints (/health, /metrics, /info)&lt;/li&gt;
&lt;li&gt;Custom health indicators&lt;/li&gt;
&lt;li&gt;Micrometer integration&lt;/li&gt;
&lt;li&gt;Securing actuator endpoints&lt;/li&gt;
&lt;li&gt;Prometheus integration&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Spring Boot DevTools
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; Development-time tools for improved developer experience.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problems it solves:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Slow development cycle with restarts&lt;/li&gt;
&lt;li&gt;Static resource refresh&lt;/li&gt;
&lt;li&gt;Remote debugging complexity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automatic restart on code changes&lt;/li&gt;
&lt;li&gt;LiveReload support&lt;/li&gt;
&lt;li&gt;Remote application update&lt;/li&gt;
&lt;li&gt;Property defaults for development&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Local development&lt;/li&gt;
&lt;li&gt;Rapid prototyping&lt;/li&gt;
&lt;li&gt;UI development with live reload&lt;/li&gt;
&lt;li&gt;Remote development environment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Interview talking points:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How automatic restart works (two classloaders)&lt;/li&gt;
&lt;li&gt;Remote DevTools capabilities&lt;/li&gt;
&lt;li&gt;DevTools property overrides&lt;/li&gt;
&lt;li&gt;Should not be used in production&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Additional Projects
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Spring HATEOAS
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; Support for building hypermedia-driven REST APIs following HATEOAS principles.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problems it solves:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API discoverability&lt;/li&gt;
&lt;li&gt;Client-server coupling&lt;/li&gt;
&lt;li&gt;Link generation complexity&lt;/li&gt;
&lt;li&gt;Resource representation standardization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Link building utilities&lt;/li&gt;
&lt;li&gt;HAL format support&lt;/li&gt;
&lt;li&gt;Affordances support&lt;/li&gt;
&lt;li&gt;Resource assembler patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RESTful API development&lt;/li&gt;
&lt;li&gt;Hypermedia-driven applications&lt;/li&gt;
&lt;li&gt;Self-documenting APIs&lt;/li&gt;
&lt;li&gt;Microservices APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Interview talking points:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HATEOAS principles and benefits&lt;/li&gt;
&lt;li&gt;HAL vs other hypermedia formats&lt;/li&gt;
&lt;li&gt;When to use HATEOAS (trade-offs)&lt;/li&gt;
&lt;li&gt;Link relation types&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Spring Session
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; Abstraction for managing user session information across multiple data stores.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problems it solves:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Session clustering in distributed applications&lt;/li&gt;
&lt;li&gt;Multiple concurrent sessions per user&lt;/li&gt;
&lt;li&gt;Session data storage flexibility&lt;/li&gt;
&lt;li&gt;Container-specific session management&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multiple storage options (Redis, JDBC, Hazelcast)&lt;/li&gt;
&lt;li&gt;Container-neutral session management&lt;/li&gt;
&lt;li&gt;Clustered session support&lt;/li&gt;
&lt;li&gt;RESTful API session handling&lt;/li&gt;
&lt;li&gt;WebSocket session support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Microservices session management&lt;/li&gt;
&lt;li&gt;Zero-downtime deployments&lt;/li&gt;
&lt;li&gt;Session clustering&lt;/li&gt;
&lt;li&gt;Multiple concurrent sessions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Interview talking points:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Redis vs JDBC session storage&lt;/li&gt;
&lt;li&gt;Session cookie configuration&lt;/li&gt;
&lt;li&gt;Sticky sessions vs session replication&lt;/li&gt;
&lt;li&gt;Spring Session vs container sessions&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Spring REST Docs
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; Documentation generation for RESTful services using tests.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problems it solves:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Documentation and code sync issues&lt;/li&gt;
&lt;li&gt;Manual documentation maintenance&lt;/li&gt;
&lt;li&gt;API documentation accuracy&lt;/li&gt;
&lt;li&gt;Example generation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Test-driven documentation&lt;/li&gt;
&lt;li&gt;Always up-to-date documentation&lt;/li&gt;
&lt;li&gt;Asciidoctor integration&lt;/li&gt;
&lt;li&gt;Code snippets from tests&lt;/li&gt;
&lt;li&gt;Request/response examples&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API documentation generation&lt;/li&gt;
&lt;li&gt;Test-driven API development&lt;/li&gt;
&lt;li&gt;Client SDK documentation&lt;/li&gt;
&lt;li&gt;External API documentation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Interview talking points:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;REST Docs vs Swagger/OpenAPI&lt;/li&gt;
&lt;li&gt;Documentation from tests benefits&lt;/li&gt;
&lt;li&gt;Asciidoctor advantages&lt;/li&gt;
&lt;li&gt;Integration with MockMvc&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Spring Vault
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; Integration with HashiCorp Vault for secrets management.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problems it solves:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Secrets storage and management&lt;/li&gt;
&lt;li&gt;Dynamic secrets generation&lt;/li&gt;
&lt;li&gt;Credential rotation&lt;/li&gt;
&lt;li&gt;Encryption as a service&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Secure secrets management&lt;/li&gt;
&lt;li&gt;Dynamic secrets support&lt;/li&gt;
&lt;li&gt;PKI certificate management&lt;/li&gt;
&lt;li&gt;Database credential rotation&lt;/li&gt;
&lt;li&gt;Template abstraction for Vault&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Secrets management in microservices&lt;/li&gt;
&lt;li&gt;Database credential rotation&lt;/li&gt;
&lt;li&gt;PKI/TLS certificate management&lt;/li&gt;
&lt;li&gt;Encryption key management&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Interview talking points:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vault authentication methods&lt;/li&gt;
&lt;li&gt;Dynamic secrets vs static secrets&lt;/li&gt;
&lt;li&gt;Secret rotation strategies&lt;/li&gt;
&lt;li&gt;Property source integration&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Spring for GraphQL
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; Spring integration for building GraphQL APIs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problems it solves:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Over-fetching and under-fetching in REST&lt;/li&gt;
&lt;li&gt;Multiple API calls for related data&lt;/li&gt;
&lt;li&gt;Schema evolution complexity&lt;/li&gt;
&lt;li&gt;Real-time subscriptions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Declarative schema definition&lt;/li&gt;
&lt;li&gt;Data fetcher integration&lt;/li&gt;
&lt;li&gt;WebSocket subscriptions&lt;/li&gt;
&lt;li&gt;Spring Security integration&lt;/li&gt;
&lt;li&gt;Testing support&lt;/li&gt;
&lt;li&gt;DataLoader for N+1 problem&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Flexible API queries&lt;/li&gt;
&lt;li&gt;Mobile app backends&lt;/li&gt;
&lt;li&gt;Aggregation across microservices&lt;/li&gt;
&lt;li&gt;Real-time updates with subscriptions&lt;/li&gt;
&lt;li&gt;BFF (Backend for Frontend) pattern&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Interview talking points:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GraphQL vs REST trade-offs&lt;/li&gt;
&lt;li&gt;Resolver implementation&lt;/li&gt;
&lt;li&gt;N+1 problem and DataLoader&lt;/li&gt;
&lt;li&gt;Subscription implementation&lt;/li&gt;
&lt;li&gt;Schema design best practices&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Spring Modulith
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; Support for building modular monolithic applications with clear boundaries.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problems it solves:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Monolith modularization&lt;/li&gt;
&lt;li&gt;Module boundary enforcement&lt;/li&gt;
&lt;li&gt;Event-driven communication within monolith&lt;/li&gt;
&lt;li&gt;Migration path to microservices&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Module structure verification&lt;/li&gt;
&lt;li&gt;Application module model documentation&lt;/li&gt;
&lt;li&gt;Event publication and listening within modules&lt;/li&gt;
&lt;li&gt;Architectural testing&lt;/li&gt;
&lt;li&gt;Easier future microservices extraction&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Modular monolith architecture&lt;/li&gt;
&lt;li&gt;Domain-driven design implementation&lt;/li&gt;
&lt;li&gt;Gradual microservices migration&lt;/li&gt;
&lt;li&gt;Module boundary testing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Interview talking points:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Monolith vs microservices trade-offs&lt;/li&gt;
&lt;li&gt;Module boundaries and communication&lt;/li&gt;
&lt;li&gt;Event-based module interaction&lt;/li&gt;
&lt;li&gt;When to use modular monolith&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Spring AI
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; Integration with AI models and services (OpenAI, Azure OpenAI, etc.).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problems it solves:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI model integration complexity&lt;/li&gt;
&lt;li&gt;Prompt engineering abstraction&lt;/li&gt;
&lt;li&gt;Vector database integration&lt;/li&gt;
&lt;li&gt;Embedding generation and storage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multiple AI provider support&lt;/li&gt;
&lt;li&gt;Template-based prompt engineering&lt;/li&gt;
&lt;li&gt;Vector store abstraction&lt;/li&gt;
&lt;li&gt;Chat memory management&lt;/li&gt;
&lt;li&gt;Function calling support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chatbot development&lt;/li&gt;
&lt;li&gt;Semantic search&lt;/li&gt;
&lt;li&gt;RAG (Retrieval Augmented Generation) applications&lt;/li&gt;
&lt;li&gt;Content generation&lt;/li&gt;
&lt;li&gt;AI-powered features integration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Interview talking points:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vector databases and embeddings&lt;/li&gt;
&lt;li&gt;RAG pattern implementation&lt;/li&gt;
&lt;li&gt;Prompt engineering strategies&lt;/li&gt;
&lt;li&gt;AI model selection criteria&lt;/li&gt;
&lt;li&gt;Token management and cost optimization&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Spring Shell
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; Framework for building command-line applications with Spring.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problems it solves:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CLI application development complexity&lt;/li&gt;
&lt;li&gt;Command parsing and validation&lt;/li&gt;
&lt;li&gt;Interactive shell implementation&lt;/li&gt;
&lt;li&gt;Tab completion&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Annotation-based command definition&lt;/li&gt;
&lt;li&gt;Tab completion support&lt;/li&gt;
&lt;li&gt;Built-in commands&lt;/li&gt;
&lt;li&gt;Spring Boot integration&lt;/li&gt;
&lt;li&gt;Input validation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Administrative tools&lt;/li&gt;
&lt;li&gt;DevOps utilities&lt;/li&gt;
&lt;li&gt;Interactive database clients&lt;/li&gt;
&lt;li&gt;Code generation tools&lt;/li&gt;
&lt;li&gt;Testing utilities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Interview talking points:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CLI vs GUI application use cases&lt;/li&gt;
&lt;li&gt;Command availability conditions&lt;/li&gt;
&lt;li&gt;Dynamic command parameters&lt;/li&gt;
&lt;li&gt;Integration with Spring Boot&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Spring Retry
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; Declarative retry support for failed operations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problems it solves:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Transient failure handling&lt;/li&gt;
&lt;li&gt;Network instability&lt;/li&gt;
&lt;li&gt;Service unavailability&lt;/li&gt;
&lt;li&gt;Resource contention&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Declarative retry with annotations&lt;/li&gt;
&lt;li&gt;Backoff policies&lt;/li&gt;
&lt;li&gt;Recovery callbacks&lt;/li&gt;
&lt;li&gt;Retry statistics&lt;/li&gt;
&lt;li&gt;Template-based retry&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Network call retries&lt;/li&gt;
&lt;li&gt;Database deadlock handling&lt;/li&gt;
&lt;li&gt;External API integration&lt;/li&gt;
&lt;li&gt;Transient error handling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Interview talking points:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Retry policies and strategies&lt;/li&gt;
&lt;li&gt;Exponential backoff&lt;/li&gt;
&lt;li&gt;Circuit breaker integration&lt;/li&gt;
&lt;li&gt;When not to use retry&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Spring Statemachine
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; Framework for building state machine-based applications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problems it solves:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complex state management&lt;/li&gt;
&lt;li&gt;Workflow implementation&lt;/li&gt;
&lt;li&gt;State transition logic&lt;/li&gt;
&lt;li&gt;State persistence&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Declarative state definitions&lt;/li&gt;
&lt;li&gt;Transition guards and actions&lt;/li&gt;
&lt;li&gt;State persistence&lt;/li&gt;
&lt;li&gt;Event-driven state changes&lt;/li&gt;
&lt;li&gt;Hierarchical states&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Workflow engines&lt;/li&gt;
&lt;li&gt;Order processing systems&lt;/li&gt;
&lt;li&gt;Game logic&lt;/li&gt;
&lt;li&gt;Process automation&lt;/li&gt;
&lt;li&gt;IoT device state management&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Interview talking points:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;State machine concepts&lt;/li&gt;
&lt;li&gt;When to use state machines&lt;/li&gt;
&lt;li&gt;Persistence strategies&lt;/li&gt;
&lt;li&gt;Distributed state machine challenges&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Comparison Chart: When to Use What
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Web Framework Choice
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Spring MVC&lt;/strong&gt;: Traditional web apps, server-side rendering, synchronous APIs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spring WebFlux&lt;/strong&gt;: High concurrency, streaming, reactive systems, non-blocking I/O&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Data Access Choice
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Spring Data JPA&lt;/strong&gt;: Complex relationships, ORM benefits, transactional integrity&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spring Data JDBC&lt;/strong&gt;: Simple domain models, SQL control, performance-critical&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spring Data MongoDB&lt;/strong&gt;: Document storage, flexible schema, high write throughput&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spring Data Redis&lt;/strong&gt;: Caching, sessions, real-time leaderboards, pub/sub&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Messaging Choice
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Spring AMQP (RabbitMQ)&lt;/strong&gt;: Complex routing, message priorities, traditional queuing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spring Kafka&lt;/strong&gt;: High throughput, event streaming, log aggregation, replay capability&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spring Integration&lt;/strong&gt;: Enterprise integration, protocol adaptation, legacy systems&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Service Communication
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;RestTemplate&lt;/strong&gt;: Legacy systems (deprecated in favor of WebClient)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WebClient&lt;/strong&gt;: Modern reactive applications, non-blocking calls&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spring Cloud OpenFeign&lt;/strong&gt;: Declarative REST clients, microservices communication&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Configuration Management
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Spring Cloud Config&lt;/strong&gt;: Centralized configuration, Git-backed, distributed systems&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spring Vault&lt;/strong&gt;: Secrets management, dynamic credentials, encryption&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Interview Preparation Checklist
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Core Concepts to Master
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Dependency injection and IoC container&lt;/li&gt;
&lt;li&gt;Bean lifecycle and scopes&lt;/li&gt;
&lt;li&gt;AOP concepts and use cases&lt;/li&gt;
&lt;li&gt;Transaction management (programmatic vs declarative)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Architecture Patterns
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Microservices architecture with Spring Cloud&lt;/li&gt;
&lt;li&gt;Event-driven architecture with messaging&lt;/li&gt;
&lt;li&gt;CQRS and event sourcing patterns&lt;/li&gt;
&lt;li&gt;API Gateway pattern&lt;/li&gt;
&lt;li&gt;Circuit breaker and bulkhead patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Common Interview Questions
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Explain the Spring bean lifecycle&lt;/li&gt;
&lt;li&gt;Difference between @Component, @Service, @Repository, @Controller&lt;/li&gt;
&lt;li&gt;How does Spring Boot auto-configuration work?&lt;/li&gt;
&lt;li&gt;What is the difference between Spring MVC and Spring WebFlux?&lt;/li&gt;
&lt;li&gt;How do you handle transactions in Spring?&lt;/li&gt;
&lt;li&gt;Explain the circuit breaker pattern&lt;/li&gt;
&lt;li&gt;How does service discovery work in microservices?&lt;/li&gt;
&lt;li&gt;What is the difference between authentication and authorization?&lt;/li&gt;
&lt;li&gt;How do you secure REST APIs in Spring?&lt;/li&gt;
&lt;li&gt;Explain the different scopes of Spring beans&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Real-World Scenarios
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Handling distributed transactions (Saga pattern)&lt;/li&gt;
&lt;li&gt;Implementing caching strategies&lt;/li&gt;
&lt;li&gt;Designing resilient microservices&lt;/li&gt;
&lt;li&gt;Managing configuration across environments&lt;/li&gt;
&lt;li&gt;Implementing security in microservices&lt;/li&gt;
&lt;li&gt;Performance optimization techniques&lt;/li&gt;
&lt;li&gt;Monitoring and observability&lt;/li&gt;
&lt;li&gt;Testing strategies (unit, integration, end-to-end)&lt;/li&gt;
&lt;/ul&gt;




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

&lt;h3&gt;
  
  
  General Spring Best Practices
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Favor constructor injection over field injection&lt;/li&gt;
&lt;li&gt;Use interfaces for service layer&lt;/li&gt;
&lt;li&gt;Keep controllers thin (delegate to services)&lt;/li&gt;
&lt;li&gt;Use DTOs for API responses&lt;/li&gt;
&lt;li&gt;Implement proper exception handling&lt;/li&gt;
&lt;li&gt;Use profiles for environment-specific configuration&lt;/li&gt;
&lt;li&gt;Leverage Spring Boot starters&lt;/li&gt;
&lt;li&gt;Externalize configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Microservices Best Practices
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Implement health checks and metrics&lt;/li&gt;
&lt;li&gt;Use circuit breakers for resilience&lt;/li&gt;
&lt;li&gt;Implement distributed tracing&lt;/li&gt;
&lt;li&gt;Centralize logging&lt;/li&gt;
&lt;li&gt;Use API versioning&lt;/li&gt;
&lt;li&gt;Implement proper security (OAuth2/JWT)&lt;/li&gt;
&lt;li&gt;Design for failure&lt;/li&gt;
&lt;li&gt;Use asynchronous communication where appropriate&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Performance Best Practices
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use caching strategically&lt;/li&gt;
&lt;li&gt;Implement connection pooling&lt;/li&gt;
&lt;li&gt;Optimize database queries (avoid N+1)&lt;/li&gt;
&lt;li&gt;Use async processing for heavy operations&lt;/li&gt;
&lt;li&gt;Implement pagination for large datasets&lt;/li&gt;
&lt;li&gt;Monitor and profile regularly&lt;/li&gt;
&lt;li&gt;Use compression for responses&lt;/li&gt;
&lt;li&gt;Implement rate limiting&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The Spring ecosystem provides a comprehensive platform for building enterprise Java applications, from simple web apps to complex distributed systems. Understanding when and how to use each project is crucial for making architectural decisions and succeeding in technical interviews.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Takeaways:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Start with Spring Boot&lt;/strong&gt;: It's the foundation for modern Spring applications, providing sensible defaults and rapid development capabilities.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Choose the right tool&lt;/strong&gt;: Not every application needs the full Spring Cloud stack. Assess your requirements carefully (monolith vs microservices, synchronous vs reactive).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Think about resilience&lt;/strong&gt;: In distributed systems, failures are inevitable. Use circuit breakers, retries, and timeouts appropriately.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Security is not optional&lt;/strong&gt;: Always implement proper authentication and authorization from the start, not as an afterthought.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Monitor and observe&lt;/strong&gt;: Use Spring Boot Actuator, distributed tracing, and centralized logging to understand your application's behavior in production.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Test comprehensively&lt;/strong&gt;: Leverage Spring Test's powerful testing capabilities to ensure quality at all layers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Stay updated&lt;/strong&gt;: The Spring ecosystem evolves rapidly. Some projects enter maintenance mode (like Netflix OSS components) while new ones emerge (like Spring AI).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Technology Decision Matrix
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Application Type → Recommended Stack
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Simple Web Application:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Spring Boot + Spring MVC + Spring Data JPA + Thymeleaf&lt;/li&gt;
&lt;li&gt;Deploy as a fat JAR with embedded Tomcat&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;RESTful API Service:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Spring Boot + Spring MVC/WebFlux + Spring Data + Spring Security&lt;/li&gt;
&lt;li&gt;Add Spring REST Docs or Spring for GraphQL if needed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Microservices Architecture:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Spring Boot + Spring Cloud (Config, Gateway, LoadBalancer, Circuit Breaker)&lt;/li&gt;
&lt;li&gt;Spring Cloud Stream for event-driven communication&lt;/li&gt;
&lt;li&gt;Spring Cloud Sleuth for distributed tracing&lt;/li&gt;
&lt;li&gt;Spring Security OAuth2 for inter-service security&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Batch Processing Application:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Spring Boot + Spring Batch + Spring Data&lt;/li&gt;
&lt;li&gt;Spring Cloud Task for cloud-native batch jobs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Real-time Application:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Spring Boot + Spring WebFlux/WebSocket + Spring Data Redis&lt;/li&gt;
&lt;li&gt;Spring Cloud Stream with Kafka for event streaming&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Event-Driven System:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Spring Boot + Spring Cloud Stream + Apache Kafka&lt;/li&gt;
&lt;li&gt;Spring Integration for complex routing&lt;/li&gt;
&lt;li&gt;Spring AMQP for traditional messaging patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;High-Performance Trading System:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Spring Boot + Spring WebFlux + R2DBC + Spring Data Redis&lt;/li&gt;
&lt;li&gt;Reactive all the way through the stack&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Enterprise Integration:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Spring Boot + Spring Integration + Various adapters&lt;/li&gt;
&lt;li&gt;Spring Batch for bulk data processing&lt;/li&gt;
&lt;li&gt;Spring Cloud for distributed coordination&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Migration Paths
&lt;/h2&gt;

&lt;h3&gt;
  
  
  From Legacy Spring to Spring Boot
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Add Spring Boot parent POM&lt;/li&gt;
&lt;li&gt;Replace XML configuration with Java config and annotations&lt;/li&gt;
&lt;li&gt;Remove web.xml and use embedded containers&lt;/li&gt;
&lt;li&gt;Leverage auto-configuration&lt;/li&gt;
&lt;li&gt;Migrate to Spring Boot starters&lt;/li&gt;
&lt;li&gt;Add Actuator for production readiness&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  From Monolith to Microservices
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Start with modular monolith (Spring Modulith)&lt;/li&gt;
&lt;li&gt;Identify bounded contexts (DDD approach)&lt;/li&gt;
&lt;li&gt;Extract vertical slices as separate services&lt;/li&gt;
&lt;li&gt;Implement service discovery and configuration management&lt;/li&gt;
&lt;li&gt;Add circuit breakers and resilience patterns&lt;/li&gt;
&lt;li&gt;Implement distributed tracing and centralized logging&lt;/li&gt;
&lt;li&gt;Consider event-driven communication&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  From Blocking to Reactive
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Assess if reactive is necessary (high concurrency requirement?)&lt;/li&gt;
&lt;li&gt;Migrate data layer to reactive drivers (R2DBC, Reactive MongoDB)&lt;/li&gt;
&lt;li&gt;Replace Spring MVC with Spring WebFlux&lt;/li&gt;
&lt;li&gt;Replace RestTemplate with WebClient&lt;/li&gt;
&lt;li&gt;Use reactive Spring Security&lt;/li&gt;
&lt;li&gt;Update all blocking calls to reactive equivalents&lt;/li&gt;
&lt;li&gt;Test thoroughly (reactive debugging is harder)&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Common Pitfalls and How to Avoid Them
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Over-Engineering
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;: Using microservices when a monolith would suffice&lt;br&gt;
&lt;strong&gt;Solution&lt;/strong&gt;: Start with a modular monolith, extract services only when needed&lt;/p&gt;

&lt;h3&gt;
  
  
  2. N+1 Query Problem
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;: Loading collections causing multiple database queries&lt;br&gt;
&lt;strong&gt;Solution&lt;/strong&gt;: Use @EntityGraph, JOIN FETCH, or projection-based queries&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Reactive Programming Blocking Calls
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;: Blocking calls in reactive stack (JDBC, Thread.sleep)&lt;br&gt;
&lt;strong&gt;Solution&lt;/strong&gt;: Use R2DBC, Mono.delay(), ensure entire stack is reactive&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Transaction Boundary Issues
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;: LazyInitializationException, transaction too large/small&lt;br&gt;
&lt;strong&gt;Solution&lt;/strong&gt;: Design proper transaction boundaries, use Open Session In View carefully&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Security Misconfigurations
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;: Exposing actuator endpoints, weak JWT secrets, CSRF disabled unnecessarily&lt;br&gt;
&lt;strong&gt;Solution&lt;/strong&gt;: Secure all management endpoints, use strong secrets, understand CSRF requirements&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Memory Leaks
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;: Unclosed resources, unbounded caches, static collections&lt;br&gt;
&lt;strong&gt;Solution&lt;/strong&gt;: Use try-with-resources, configure cache eviction, avoid static state&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Configuration Management
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;: Hardcoded values, sensitive data in version control&lt;br&gt;
&lt;strong&gt;Solution&lt;/strong&gt;: Externalize configuration, use Spring Cloud Config or Vault for secrets&lt;/p&gt;

&lt;h3&gt;
  
  
  8. Missing Health Checks
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;: Load balancers routing to unhealthy instances&lt;br&gt;
&lt;strong&gt;Solution&lt;/strong&gt;: Implement custom health indicators for dependencies&lt;/p&gt;

&lt;h3&gt;
  
  
  9. Inadequate Exception Handling
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;: Exposing stack traces, generic error messages&lt;br&gt;
&lt;strong&gt;Solution&lt;/strong&gt;: Use @ControllerAdvice, return appropriate HTTP status codes, log properly&lt;/p&gt;

&lt;h3&gt;
  
  
  10. Testing Gaps
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;: Over-reliance on unit tests, missing integration tests&lt;br&gt;
&lt;strong&gt;Solution&lt;/strong&gt;: Use test slicing, TestContainers for database tests, MockMvc for web layer&lt;/p&gt;




&lt;h2&gt;
  
  
  Spring Ecosystem Evolution Timeline
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;2003&lt;/strong&gt;: Spring Framework created by Rod Johnson&lt;br&gt;
&lt;strong&gt;2006&lt;/strong&gt;: Spring WebFlow, Spring Security (formerly Acegi)&lt;br&gt;
&lt;strong&gt;2007&lt;/strong&gt;: Spring Batch, Spring Integration&lt;br&gt;
&lt;strong&gt;2009&lt;/strong&gt;: Spring Data project initiated&lt;br&gt;
&lt;strong&gt;2013&lt;/strong&gt;: Spring Boot 0.5.0 released&lt;br&gt;
&lt;strong&gt;2014&lt;/strong&gt;: Spring Cloud project initiated&lt;br&gt;
&lt;strong&gt;2015&lt;/strong&gt;: Spring Boot 1.0, Spring Cloud 1.0&lt;br&gt;
&lt;strong&gt;2017&lt;/strong&gt;: Spring Framework 5.0 with reactive support (WebFlux)&lt;br&gt;
&lt;strong&gt;2018&lt;/strong&gt;: Spring Boot 2.0, full embrace of reactive programming&lt;br&gt;
&lt;strong&gt;2019&lt;/strong&gt;: Spring Cloud Gateway replaces Zuul&lt;br&gt;
&lt;strong&gt;2020&lt;/strong&gt;: Spring Authorization Server project&lt;br&gt;
&lt;strong&gt;2021&lt;/strong&gt;: Spring Native (GraalVM support)&lt;br&gt;
&lt;strong&gt;2022&lt;/strong&gt;: Spring Boot 3.0 with Java 17 baseline&lt;br&gt;
&lt;strong&gt;2023&lt;/strong&gt;: Spring AI project initiated&lt;br&gt;
&lt;strong&gt;2024&lt;/strong&gt;: Spring Framework 6.x, enhanced virtual thread support&lt;br&gt;
&lt;strong&gt;2025&lt;/strong&gt;: Continued evolution with AI integration and cloud-native features&lt;/p&gt;




&lt;h2&gt;
  
  
  Architecture Patterns with Spring
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Layered Architecture
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Components&lt;/strong&gt;: Controller → Service → Repository → Database&lt;br&gt;
&lt;strong&gt;Spring projects&lt;/strong&gt;: Spring MVC, Spring Data, Spring Transaction&lt;br&gt;
&lt;strong&gt;Best for&lt;/strong&gt;: Traditional web applications, CRUD operations&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Hexagonal Architecture (Ports &amp;amp; Adapters)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Components&lt;/strong&gt;: Core domain, Ports (interfaces), Adapters (implementations)&lt;br&gt;
&lt;strong&gt;Spring projects&lt;/strong&gt;: Spring Core DI, Spring Data repositories as ports&lt;br&gt;
&lt;strong&gt;Best for&lt;/strong&gt;: Domain-driven design, testable business logic&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Microservices Architecture
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Components&lt;/strong&gt;: Independent services, API Gateway, Service Discovery&lt;br&gt;
&lt;strong&gt;Spring projects&lt;/strong&gt;: Spring Cloud ecosystem&lt;br&gt;
&lt;strong&gt;Best for&lt;/strong&gt;: Large-scale distributed systems, independent team scaling&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Event-Driven Architecture
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Components&lt;/strong&gt;: Event producers, Event consumers, Message broker&lt;br&gt;
&lt;strong&gt;Spring projects&lt;/strong&gt;: Spring Cloud Stream, Spring AMQP, Spring Kafka&lt;br&gt;
&lt;strong&gt;Best for&lt;/strong&gt;: Asynchronous processing, loose coupling, event sourcing&lt;/p&gt;

&lt;h3&gt;
  
  
  5. CQRS (Command Query Responsibility Segregation)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Components&lt;/strong&gt;: Separate read/write models&lt;br&gt;
&lt;strong&gt;Spring projects&lt;/strong&gt;: Spring Data (multiple repositories), Spring Cloud Stream&lt;br&gt;
&lt;strong&gt;Best for&lt;/strong&gt;: Complex domains, different read/write patterns, high scalability&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Saga Pattern
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Components&lt;/strong&gt;: Distributed transactions, Compensation logic&lt;br&gt;
&lt;strong&gt;Spring projects&lt;/strong&gt;: Spring Cloud Stream, Spring Statemachine&lt;br&gt;
&lt;strong&gt;Best for&lt;/strong&gt;: Distributed transactions across microservices&lt;/p&gt;

&lt;h3&gt;
  
  
  7. API Gateway Pattern
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Components&lt;/strong&gt;: Single entry point, Routing, Cross-cutting concerns&lt;br&gt;
&lt;strong&gt;Spring projects&lt;/strong&gt;: Spring Cloud Gateway&lt;br&gt;
&lt;strong&gt;Best for&lt;/strong&gt;: Microservices, centralized concerns (auth, rate limiting)&lt;/p&gt;

&lt;h3&gt;
  
  
  8. Backend for Frontend (BFF)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Components&lt;/strong&gt;: Specialized backends for different clients&lt;br&gt;
&lt;strong&gt;Spring projects&lt;/strong&gt;: Spring Boot services, Spring for GraphQL&lt;br&gt;
&lt;strong&gt;Best for&lt;/strong&gt;: Multiple client types (web, mobile, IoT)&lt;/p&gt;




&lt;h2&gt;
  
  
  Performance Optimization Strategies
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Database Optimization
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use proper indexing strategies&lt;/li&gt;
&lt;li&gt;Implement connection pooling (HikariCP)&lt;/li&gt;
&lt;li&gt;Batch operations where possible&lt;/li&gt;
&lt;li&gt;Use database-specific optimizations&lt;/li&gt;
&lt;li&gt;Consider read replicas for read-heavy applications&lt;/li&gt;
&lt;li&gt;Implement query result caching&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Caching Strategies
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Application-level&lt;/strong&gt;: Spring Cache with Redis/Caffeine&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database-level&lt;/strong&gt;: Second-level cache with Hibernate&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTTP-level&lt;/strong&gt;: ETags and Cache-Control headers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CDN-level&lt;/strong&gt;: Static resources on CDN&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Asynchronous Processing
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;a class="mentioned-user" href="https://dev.to/async"&gt;@async&lt;/a&gt; for non-blocking operations&lt;/li&gt;
&lt;li&gt;Implement task executors with appropriate thread pools&lt;/li&gt;
&lt;li&gt;Use Spring Cloud Stream for event processing&lt;/li&gt;
&lt;li&gt;Consider reactive programming for I/O-bound operations&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Resource Management
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Configure appropriate connection pool sizes&lt;/li&gt;
&lt;li&gt;Set proper timeouts (read, connection, socket)&lt;/li&gt;
&lt;li&gt;Implement circuit breakers to prevent resource exhaustion&lt;/li&gt;
&lt;li&gt;Use bulkhead pattern to isolate resources&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Monitoring and Observability Stack
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Metrics Collection
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Spring Boot Actuator&lt;/strong&gt;: Built-in metrics&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Micrometer&lt;/strong&gt;: Vendor-neutral metrics facade&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prometheus&lt;/strong&gt;: Metrics storage and querying&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grafana&lt;/strong&gt;: Metrics visualization&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Distributed Tracing
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Spring Cloud Sleuth&lt;/strong&gt;: Trace and span IDs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zipkin/Jaeger&lt;/strong&gt;: Trace visualization&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenTelemetry&lt;/strong&gt;: Emerging standard&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Logging
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Logback/Log4j2&lt;/strong&gt;: Logging framework&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ELK Stack&lt;/strong&gt;: Elasticsearch, Logstash, Kibana&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structured logging&lt;/strong&gt;: JSON format for machine parsing&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Application Performance Monitoring (APM)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;New Relic&lt;/strong&gt;: Commercial APM solution&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dynatrace&lt;/strong&gt;: Full-stack monitoring&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Elastic APM&lt;/strong&gt;: Open-source alternative&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spring Boot Admin&lt;/strong&gt;: Centralized Spring Boot application management&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Security Checklist for Spring Applications
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Authentication
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✓ Use strong password encoding (BCrypt, Argon2)&lt;/li&gt;
&lt;li&gt;✓ Implement account lockout after failed attempts&lt;/li&gt;
&lt;li&gt;✓ Use multi-factor authentication for sensitive operations&lt;/li&gt;
&lt;li&gt;✓ Implement proper session management&lt;/li&gt;
&lt;li&gt;✓ Use HTTPS only in production&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Authorization
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✓ Implement least privilege principle&lt;/li&gt;
&lt;li&gt;✓ Use method-level security where appropriate&lt;/li&gt;
&lt;li&gt;✓ Validate authorization at every layer&lt;/li&gt;
&lt;li&gt;✓ Implement proper RBAC or ABAC&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Data Protection
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✓ Encrypt sensitive data at rest&lt;/li&gt;
&lt;li&gt;✓ Use TLS for data in transit&lt;/li&gt;
&lt;li&gt;✓ Implement proper key management (Spring Vault)&lt;/li&gt;
&lt;li&gt;✓ Sanitize user inputs&lt;/li&gt;
&lt;li&gt;✓ Use parameterized queries to prevent SQL injection&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  API Security
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✓ Implement rate limiting&lt;/li&gt;
&lt;li&gt;✓ Use API keys or OAuth2 tokens&lt;/li&gt;
&lt;li&gt;✓ Validate and sanitize all inputs&lt;/li&gt;
&lt;li&gt;✓ Implement CORS properly&lt;/li&gt;
&lt;li&gt;✓ Enable CSRF protection for browser-based apps&lt;/li&gt;
&lt;li&gt;✓ Set security headers (X-Frame-Options, CSP, etc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Monitoring and Audit
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✓ Log security events&lt;/li&gt;
&lt;li&gt;✓ Monitor for suspicious activities&lt;/li&gt;
&lt;li&gt;✓ Implement audit trails&lt;/li&gt;
&lt;li&gt;✓ Regular security scanning and dependency updates&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Cloud Platform Integration
&lt;/h2&gt;

&lt;h3&gt;
  
  
  AWS Integration
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Spring Cloud AWS&lt;/strong&gt;: S3, SQS, SNS, RDS integration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Elastic Beanstalk&lt;/strong&gt;: Easy Spring Boot deployment&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ECS/EKS&lt;/strong&gt;: Container orchestration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lambda&lt;/strong&gt;: Serverless Spring Cloud Function&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Azure Integration
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Spring Cloud Azure&lt;/strong&gt;: Storage, Service Bus, Cosmos DB&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Azure Spring Apps&lt;/strong&gt;: Managed Spring Boot platform&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Azure Functions&lt;/strong&gt;: Serverless Java functions&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Google Cloud Integration
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Spring Cloud GCP&lt;/strong&gt;: Pub/Sub, Datastore, Storage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud Run&lt;/strong&gt;: Containerized Spring Boot apps&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GKE&lt;/strong&gt;: Kubernetes-based deployment&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Kubernetes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Spring Cloud Kubernetes&lt;/strong&gt;: Service discovery, config maps&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Helm charts&lt;/strong&gt;: Package management&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skaffold&lt;/strong&gt;: Development workflow&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Interview Question Categories
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Fundamental Questions
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Spring Core concepts (IoC, DI, AOP)&lt;/li&gt;
&lt;li&gt;Bean lifecycle and scopes&lt;/li&gt;
&lt;li&gt;Configuration approaches&lt;/li&gt;
&lt;li&gt;Transaction management&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Intermediate Questions
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Spring Boot auto-configuration mechanism&lt;/li&gt;
&lt;li&gt;RESTful API design with Spring&lt;/li&gt;
&lt;li&gt;Exception handling strategies&lt;/li&gt;
&lt;li&gt;Testing approaches and best practices&lt;/li&gt;
&lt;li&gt;Security implementation (authentication/authorization)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Advanced Questions
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Microservices architecture with Spring Cloud&lt;/li&gt;
&lt;li&gt;Reactive programming with WebFlux&lt;/li&gt;
&lt;li&gt;Distributed transaction handling&lt;/li&gt;
&lt;li&gt;Performance optimization techniques&lt;/li&gt;
&lt;li&gt;Circuit breaker and resilience patterns&lt;/li&gt;
&lt;li&gt;Event-driven architecture design&lt;/li&gt;
&lt;li&gt;Multi-tenancy implementation&lt;/li&gt;
&lt;li&gt;Caching strategies at scale&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Scenario-Based Questions
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;"Design a scalable e-commerce system"&lt;/li&gt;
&lt;li&gt;"How would you handle distributed transactions?"&lt;/li&gt;
&lt;li&gt;"Implement authentication for microservices"&lt;/li&gt;
&lt;li&gt;"Design a real-time notification system"&lt;/li&gt;
&lt;li&gt;"Handle 10,000 concurrent users"&lt;/li&gt;
&lt;li&gt;"Migrate from monolith to microservices"&lt;/li&gt;
&lt;li&gt;"Implement a retry mechanism with exponential backoff"&lt;/li&gt;
&lt;li&gt;"Design an audit logging system"&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Additional Resources for Deep Dive
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Official Documentation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Spring.io Documentation&lt;/li&gt;
&lt;li&gt;Spring Boot Reference Guide&lt;/li&gt;
&lt;li&gt;Spring Cloud Documentation&lt;/li&gt;
&lt;li&gt;Baeldung Spring tutorials&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Books
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;"Spring in Action" by Craig Walls&lt;/li&gt;
&lt;li&gt;"Cloud Native Java" by Josh Long and Kenny Bastani&lt;/li&gt;
&lt;li&gt;"Spring Microservices in Action" by John Carnell&lt;/li&gt;
&lt;li&gt;"Pro Spring 5" by Iuliana Cosmina et al.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Certifications
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Spring Professional Certification&lt;/li&gt;
&lt;li&gt;Pivotal Certified Spring Boot Developer&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Community Resources
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Spring YouTube Channel&lt;/li&gt;
&lt;li&gt;Spring Blog (spring.io/blog)&lt;/li&gt;
&lt;li&gt;Spring Community Forums&lt;/li&gt;
&lt;li&gt;Stack Overflow Spring tags&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Final Interview Tips
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Before the Interview
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Review fundamental Spring concepts thoroughly&lt;/li&gt;
&lt;li&gt;Practice explaining concepts without code&lt;/li&gt;
&lt;li&gt;Prepare real-world examples from your experience&lt;/li&gt;
&lt;li&gt;Understand trade-offs of different approaches&lt;/li&gt;
&lt;li&gt;Review recent Spring ecosystem changes&lt;/li&gt;
&lt;li&gt;Practice system design questions&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  During the Interview
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Ask clarifying questions before answering&lt;/li&gt;
&lt;li&gt;Think aloud - explain your reasoning&lt;/li&gt;
&lt;li&gt;Discuss trade-offs of your solutions&lt;/li&gt;
&lt;li&gt;Use diagrams if helpful&lt;/li&gt;
&lt;li&gt;Admit when you don't know something&lt;/li&gt;
&lt;li&gt;Connect Spring concepts to business value&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Red Flags to Avoid
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Not understanding basic Spring concepts&lt;/li&gt;
&lt;li&gt;Over-engineering simple solutions&lt;/li&gt;
&lt;li&gt;Ignoring non-functional requirements (security, performance)&lt;/li&gt;
&lt;li&gt;Not considering trade-offs&lt;/li&gt;
&lt;li&gt;Inability to explain why you chose certain technologies&lt;/li&gt;
&lt;li&gt;No practical experience with what you claim to know&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusion Summary
&lt;/h2&gt;

&lt;p&gt;The Spring ecosystem is vast and powerful, but success lies in knowing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What&lt;/strong&gt; each project does&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;When&lt;/strong&gt; to use it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why&lt;/strong&gt; it's better than alternatives&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How&lt;/strong&gt; it fits into the bigger picture&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Focus on understanding principles over memorizing APIs. Technologies change, but fundamental concepts like dependency injection, separation of concerns, and resilience patterns remain constant.&lt;/p&gt;

&lt;p&gt;For interviews, demonstrate not just knowledge but wisdom - the ability to choose the right tool for the right problem and articulate your reasoning clearly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good luck with your interviews!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>interview</category>
      <category>backend</category>
      <category>java</category>
      <category>architecture</category>
    </item>
    <item>
      <title>🔁 Idempotency in System Design</title>
      <dc:creator>nk sk</dc:creator>
      <pubDate>Sun, 05 Oct 2025 04:46:15 +0000</pubDate>
      <link>https://dev.to/nk_sk_6f24fdd730188b284bf/idempotency-in-system-design-2jcj</link>
      <guid>https://dev.to/nk_sk_6f24fdd730188b284bf/idempotency-in-system-design-2jcj</guid>
      <description>&lt;p&gt;&lt;strong&gt;Building Reliable, Fault-Tolerant Distributed Systems&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  📘 Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Introduction&lt;/li&gt;
&lt;li&gt;What Is Idempotency?&lt;/li&gt;
&lt;li&gt;Why Idempotency Matters in Distributed Systems&lt;/li&gt;
&lt;li&gt;Mathematical Definition vs System Design Meaning&lt;/li&gt;
&lt;li&gt;Common Real-World Use Cases&lt;/li&gt;
&lt;li&gt;Idempotency in HTTP APIs&lt;/li&gt;
&lt;li&gt;Implementing Idempotency Keys&lt;/li&gt;
&lt;li&gt;Idempotency in Messaging &amp;amp; Event-Driven Systems&lt;/li&gt;
&lt;li&gt;Design Patterns &amp;amp; Techniques&lt;/li&gt;
&lt;li&gt;Pitfalls and Anti-Patterns&lt;/li&gt;
&lt;li&gt;Testing and Observability&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  1️⃣ Introduction
&lt;/h2&gt;

&lt;p&gt;In distributed systems, &lt;strong&gt;failures are not exceptions — they are normal&lt;/strong&gt;.&lt;br&gt;
Messages get retried, APIs get called multiple times, and network timeouts confuse clients into resending the same request.&lt;/p&gt;

&lt;p&gt;Without proper handling, these retries can cause &lt;strong&gt;duplicate side effects&lt;/strong&gt; — double payments, repeated emails, multiple resource creations, or corrupted data.&lt;/p&gt;

&lt;p&gt;That’s where &lt;strong&gt;idempotency&lt;/strong&gt; comes in — a powerful design principle that ensures &lt;strong&gt;repeatability without duplication&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  2️⃣ What Is Idempotency?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Idempotency&lt;/strong&gt; means that performing the same operation &lt;strong&gt;multiple times has the same effect as performing it once&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In other words, &lt;strong&gt;no matter how many times you execute the same request, the final state remains consistent&lt;/strong&gt;.&lt;/p&gt;


&lt;h3&gt;
  
  
  💡 Example
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Non-idempotent behavior:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;POST /transfer?from&lt;span class="o"&gt;=&lt;/span&gt;123&amp;amp;to&lt;span class="o"&gt;=&lt;/span&gt;456&amp;amp;amount&lt;span class="o"&gt;=&lt;/span&gt;100
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If retried twice due to a timeout, the customer might be charged twice. 💸&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Idempotent behavior:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;POST /transfer?from&lt;span class="o"&gt;=&lt;/span&gt;123&amp;amp;to&lt;span class="o"&gt;=&lt;/span&gt;456&amp;amp;amount&lt;span class="o"&gt;=&lt;/span&gt;100
Header: Idempotency-Key: abc123
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Even if retried 5 times, the system processes it once and ignores duplicates. ✅&lt;/p&gt;




&lt;h2&gt;
  
  
  3️⃣ Why Idempotency Matters in Distributed Systems
&lt;/h2&gt;

&lt;p&gt;Distributed systems are &lt;strong&gt;unreliable by nature&lt;/strong&gt; — failures happen due to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Network delays or partitions&lt;/li&gt;
&lt;li&gt;Message queue retries&lt;/li&gt;
&lt;li&gt;API gateway timeouts&lt;/li&gt;
&lt;li&gt;Partial writes or duplicated events&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without idempotency:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Financial systems&lt;/strong&gt; can overcharge customers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Messaging systems&lt;/strong&gt; can send duplicate notifications.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database writes&lt;/strong&gt; can result in inconsistent state.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With idempotency:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Systems become &lt;strong&gt;fault-tolerant&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retries&lt;/strong&gt; are safe.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Eventually consistent&lt;/strong&gt; systems remain &lt;strong&gt;logically consistent&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4️⃣ Mathematical Definition vs System Design Meaning
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Domain&lt;/th&gt;
&lt;th&gt;Definition&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mathematics&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;An operation &lt;code&gt;f(x)&lt;/code&gt; is idempotent if &lt;code&gt;f(f(x)) = f(x)&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;System Design&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A request or message can be repeated multiple times, but only produces the same final outcome once&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;🧮 &lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;DELETE /user/123&lt;/code&gt; — whether called once or 10 times, user 123 ends up deleted.&lt;/li&gt;
&lt;li&gt;That’s idempotent behavior.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  5️⃣ Common Real-World Use Cases
&lt;/h2&gt;

&lt;h3&gt;
  
  
  💳 1. Payment Gateways
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Prevent charging customers twice if the payment API is retried.&lt;/li&gt;
&lt;li&gt;Stripe and PayPal use &lt;strong&gt;Idempotency Keys&lt;/strong&gt; for each transaction.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📩 2. Email or Notification Systems
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Ensure that “Password Reset” or “OTP” messages are sent only once even if event retried.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🧾 3. Order Processing
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Avoid creating multiple orders when clients or brokers retry “Create Order” APIs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🧰 4. Database Writes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;“Upsert” (&lt;code&gt;update if exists, insert if not&lt;/code&gt;) operations are idempotent.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ☁️ 5. Cloud APIs
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;AWS S3 &lt;code&gt;PUT&lt;/code&gt; operations are idempotent — uploading the same file again doesn’t duplicate it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🚚 6. Event Processing Systems
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Kafka consumers can receive the same message twice (due to at-least-once delivery), so consumers must handle it idempotently.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  6️⃣ Idempotency in HTTP APIs
&lt;/h2&gt;

&lt;p&gt;HTTP methods have &lt;strong&gt;built-in semantics&lt;/strong&gt; related to idempotency:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;HTTP Method&lt;/th&gt;
&lt;th&gt;Idempotent?&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GET&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;Fetching data doesn’t change state.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PUT&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;Updating the same resource with same data has no side effect.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DELETE&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;Deleting again has no additional effect.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;POST&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ No (by default)&lt;/td&gt;
&lt;td&gt;Usually creates new resources — can be non-idempotent unless handled with keys.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PATCH&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;⚠️ Depends&lt;/td&gt;
&lt;td&gt;Might be idempotent if designed that way.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  💡 Example of Idempotent API Design
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;POST /payments
Header: Idempotency-Key: txn_001
Body: &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"amount"&lt;/span&gt;: 100, &lt;span class="s2"&gt;"currency"&lt;/span&gt;: &lt;span class="s2"&gt;"INR"&lt;/span&gt;, &lt;span class="s2"&gt;"userId"&lt;/span&gt;: 42 &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Server stores the result (success/failure) against &lt;code&gt;txn_001&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If the same request (same key) is retried, server returns the &lt;strong&gt;previous result&lt;/strong&gt; without reprocessing.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  7️⃣ Implementing Idempotency Keys
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🧩 Workflow:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Client generates a unique Idempotency Key&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Typically a UUID or a hash of payload.&lt;/li&gt;
&lt;li&gt;Example: &lt;code&gt;Idempotency-Key: 9d23a1f8-44cc-4af0-9fa9-7718c9e7a45d&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Server stores request state&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;When the request first arrives, store:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Idempotency key&lt;/li&gt;
&lt;li&gt;Request body hash&lt;/li&gt;
&lt;li&gt;Response (if processed)&lt;/li&gt;
&lt;li&gt;Timestamp&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Server checks for duplicates&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;If a duplicate key is received:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Return cached response (if completed)&lt;/li&gt;
&lt;li&gt;Ignore (if already in-progress)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Expire old keys&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Use TTL to clear completed requests after reasonable retention.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🧱 Example Table: Idempotency Store
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key&lt;/th&gt;
&lt;th&gt;Request Hash&lt;/th&gt;
&lt;th&gt;Response&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;TTL&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;txn_001&lt;/td&gt;
&lt;td&gt;abcdef&lt;/td&gt;
&lt;td&gt;200 OK&lt;/td&gt;
&lt;td&gt;completed&lt;/td&gt;
&lt;td&gt;24h&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;txn_002&lt;/td&gt;
&lt;td&gt;xyzhjk&lt;/td&gt;
&lt;td&gt;pending&lt;/td&gt;
&lt;td&gt;processing&lt;/td&gt;
&lt;td&gt;5m&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Can be implemented using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Redis&lt;/strong&gt; (atomic SETNX)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SQL with UNIQUE constraints&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NoSQL document stores&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  8️⃣ Idempotency in Messaging &amp;amp; Event-Driven Systems
&lt;/h2&gt;

&lt;p&gt;In &lt;strong&gt;message queues (Kafka, RabbitMQ, SQS)&lt;/strong&gt;, &lt;strong&gt;“at-least-once delivery”&lt;/strong&gt; means the same message may arrive more than once.&lt;/p&gt;

&lt;p&gt;To achieve idempotency:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Assign &lt;strong&gt;unique message IDs&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Maintain a &lt;strong&gt;deduplication store&lt;/strong&gt; (processed IDs).&lt;/li&gt;
&lt;li&gt;Discard duplicates before processing.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Example: Kafka Consumer Pseudocode
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;process_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;already_processed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;
    &lt;span class="nf"&gt;save_to_database&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;mark_processed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  In Event-Driven Architectures
&lt;/h3&gt;

&lt;p&gt;When multiple services consume the same event (fan-out pattern):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Each consumer should independently enforce idempotency.&lt;/li&gt;
&lt;li&gt;Event payload should include a unique identifier (e.g., &lt;code&gt;order_id&lt;/code&gt;, &lt;code&gt;event_id&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  9️⃣ Design Patterns &amp;amp; Techniques
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Technique&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Idempotency Keys&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Unique client-generated request identifiers.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Deduplication Store&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Keep processed IDs to skip duplicates.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Transactional Outbox Pattern&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ensure event and DB write happen atomically.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;At-Least-Once + Idempotent Consumers&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Combine reliable delivery with safe processing.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Upsert Operations&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Use &lt;code&gt;INSERT ... ON DUPLICATE KEY UPDATE&lt;/code&gt; in SQL.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Optimistic Locking / Versioning&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Detect repeated updates safely.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;State Machines&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Transition only if current state allows it (e.g., “pending → completed”).&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🔥 Real-World Examples
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Stripe Payments
&lt;/h3&gt;

&lt;p&gt;Stripe’s API requires clients to send an &lt;strong&gt;&lt;code&gt;Idempotency-Key&lt;/code&gt;&lt;/strong&gt; for every POST request to prevent duplicate charges.&lt;/p&gt;

&lt;h3&gt;
  
  
  AWS SQS FIFO Queues
&lt;/h3&gt;

&lt;p&gt;Guarantee &lt;strong&gt;exactly-once processing&lt;/strong&gt; using &lt;strong&gt;deduplication IDs&lt;/strong&gt; and message group ordering.&lt;/p&gt;

&lt;h3&gt;
  
  
  PayPal Orders API
&lt;/h3&gt;

&lt;p&gt;Clients provide a &lt;code&gt;request_id&lt;/code&gt; to make POST requests idempotent.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔟 Pitfalls and Anti-Patterns
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pitfall&lt;/th&gt;
&lt;th&gt;Why It’s Problematic&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Using timestamps as keys&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;May differ between retries.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hashing non-deterministic payloads&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Different order of fields breaks equality.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ignoring partial failures&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Transaction may fail halfway — leaving inconsistent state.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Not storing intermediate states&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;“In-flight” requests must be tracked, not just completed ones.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Large TTL or unbounded key store&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Memory leaks from never-expired keys.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  11️⃣ Testing and Observability
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✅ Testing Idempotency
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Send same request multiple times → verify one effect.&lt;/li&gt;
&lt;li&gt;Simulate network retries and timeouts.&lt;/li&gt;
&lt;li&gt;Inject duplicate events in message streams.&lt;/li&gt;
&lt;li&gt;Test concurrent retries with same key.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  📊 Observability
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Log idempotency key and request IDs in structured logs.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Use metrics like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;duplicate_request_count&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;idempotency_cache_hits&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Add &lt;strong&gt;distributed tracing&lt;/strong&gt; to see where retries occur.&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  12️⃣ Conclusion
&lt;/h2&gt;

&lt;p&gt;In distributed systems, &lt;strong&gt;idempotency transforms unreliable networks into predictable systems&lt;/strong&gt;.&lt;br&gt;
It enables safe retries, ensures consistency, and protects user trust.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Takeaways:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Always design &lt;strong&gt;critical APIs and event consumers&lt;/strong&gt; to be idempotent.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;idempotency keys&lt;/strong&gt; or &lt;strong&gt;deduplication mechanisms&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Pair idempotency with &lt;strong&gt;retries&lt;/strong&gt;, &lt;strong&gt;timeouts&lt;/strong&gt;, and &lt;strong&gt;observability&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Remember: &lt;strong&gt;exactly-once semantics&lt;/strong&gt; is an illusion — &lt;strong&gt;idempotency&lt;/strong&gt; is the practical path to achieve it.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🧩 Quick Summary
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Area&lt;/th&gt;
&lt;th&gt;Technique&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;APIs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Idempotency Keys&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;POST /payment&lt;/code&gt; with &lt;code&gt;Idempotency-Key&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Databases&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Upserts&lt;/td&gt;
&lt;td&gt;&lt;code&gt;INSERT ON CONFLICT DO NOTHING&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Messaging&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Deduplication Store&lt;/td&gt;
&lt;td&gt;Skip duplicate message IDs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;State Transitions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;State Machines&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;pending → completed&lt;/code&gt; only once&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Retry Safety&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Safe Reprocessing&lt;/td&gt;
&lt;td&gt;Only one final effect&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




</description>
      <category>systemdesign</category>
      <category>microservices</category>
      <category>designpatterns</category>
      <category>architecture</category>
    </item>
    <item>
      <title>🧠 Understanding Fan-Out in System Design</title>
      <dc:creator>nk sk</dc:creator>
      <pubDate>Sun, 05 Oct 2025 04:16:09 +0000</pubDate>
      <link>https://dev.to/nk_sk_6f24fdd730188b284bf/understanding-fan-out-in-system-design-p3c</link>
      <guid>https://dev.to/nk_sk_6f24fdd730188b284bf/understanding-fan-out-in-system-design-p3c</guid>
      <description>&lt;p&gt;&lt;em&gt;A Deep Dive into a Critical Design Pattern for Scalable and Reliable Systems&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  📘 Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Introduction&lt;/li&gt;
&lt;li&gt;What is Fan-Out?&lt;/li&gt;
&lt;li&gt;Types of Fan-Out&lt;/li&gt;
&lt;li&gt;Why Fan-Out Matters&lt;/li&gt;
&lt;li&gt;Real-World Fan-Out Use Cases&lt;/li&gt;
&lt;li&gt;Fan-Out vs Fan-In&lt;/li&gt;
&lt;li&gt;Challenges with Fan-Out&lt;/li&gt;
&lt;li&gt;Design Patterns and Best Practices&lt;/li&gt;
&lt;li&gt;Monitoring and Observability&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  1️⃣ Introduction
&lt;/h2&gt;

&lt;p&gt;As modern systems evolve into &lt;strong&gt;microservices&lt;/strong&gt; and &lt;strong&gt;event-driven architectures&lt;/strong&gt;, understanding how data and requests “spread” across components is essential.&lt;/p&gt;

&lt;p&gt;One key concept behind this behavior is &lt;strong&gt;Fan-Out&lt;/strong&gt; — how a system &lt;strong&gt;distributes work or requests&lt;/strong&gt; to multiple downstream services or tasks.&lt;/p&gt;

&lt;p&gt;Fan-out directly affects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Latency&lt;/li&gt;
&lt;li&gt;Reliability&lt;/li&gt;
&lt;li&gt;Throughput&lt;/li&gt;
&lt;li&gt;Scalability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s explore what it is and how to use it effectively.&lt;/p&gt;




&lt;h2&gt;
  
  
  2️⃣ What is Fan-Out?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Fan-out&lt;/strong&gt; refers to the &lt;strong&gt;number of parallel downstream requests, calls, or tasks&lt;/strong&gt; initiated by a component or service to fulfill a single incoming request.&lt;/p&gt;

&lt;p&gt;Think of it as a &lt;strong&gt;broadcast or branching&lt;/strong&gt; of work.&lt;/p&gt;

&lt;h3&gt;
  
  
  💡 Example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;          ┌──────────────┐
 Request →│ Order Service│
          └──────┬───────┘
                 │
      ┌──────────┼──────────┐
      ▼           ▼          ▼
Inventory   Payment   Notification
 Service     Service      Service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, the &lt;strong&gt;Order Service&lt;/strong&gt; fans out one incoming request into &lt;strong&gt;three downstream calls&lt;/strong&gt;.&lt;br&gt;
Hence, &lt;strong&gt;Fan-out = 3&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  3️⃣ Types of Fan-Out
&lt;/h2&gt;
&lt;h3&gt;
  
  
  🟢 1. &lt;strong&gt;Synchronous Fan-Out&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Parent service waits for all child services to respond.&lt;/li&gt;
&lt;li&gt;Used when combined result is needed immediately.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
API Gateway calls multiple backend services in parallel and merges results before sending to client.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client → API Gateway → [User, Orders, Payments] → Aggregated Response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🧩 &lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Immediate result aggregation.&lt;/li&gt;
&lt;li&gt;Predictable flow.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⚠️ &lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Latency = slowest downstream.&lt;/li&gt;
&lt;li&gt;Failure in one service can fail the entire request.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🟡 2. &lt;strong&gt;Asynchronous Fan-Out&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Parent emits events or tasks to a &lt;strong&gt;queue&lt;/strong&gt;, &lt;strong&gt;topic&lt;/strong&gt;, or &lt;strong&gt;worker pool&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;It does &lt;strong&gt;not wait&lt;/strong&gt; for results.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
A “UserRegistered” event triggers multiple independent consumers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Send Welcome Email&lt;/li&gt;
&lt;li&gt;Create Default Profile&lt;/li&gt;
&lt;li&gt;Start Analytics Tracking
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User Service → Kafka Topic → [Email, Profile, Analytics Consumers]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🧩 &lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Highly scalable.&lt;/li&gt;
&lt;li&gt;Loose coupling.&lt;/li&gt;
&lt;li&gt;Failure isolation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⚠️ &lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Eventual consistency.&lt;/li&gt;
&lt;li&gt;More complexity in coordination.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4️⃣ Why Fan-Out Matters
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concern&lt;/th&gt;
&lt;th&gt;How Fan-Out Impacts It&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Performance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Parallelism increases throughput.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Latency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Synchronous fan-out adds dependency on slowest service.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Reliability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;More downstream dependencies = higher chance of partial failure.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scalability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;High fan-out may overload downstream systems.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cost&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;More network calls = more infrastructure and API cost.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  5️⃣ Real-World Fan-Out Use Cases
&lt;/h2&gt;

&lt;p&gt;Let’s go through &lt;strong&gt;extensive, real-world examples&lt;/strong&gt; across domains:&lt;/p&gt;




&lt;h3&gt;
  
  
  🏢 &lt;strong&gt;1. Microservices API Aggregation&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;API Gateway calling multiple backend services (User, Orders, Billing, Profile) to return one combined JSON.&lt;/li&gt;
&lt;li&gt;Used in BFF (Backend-for-Frontend) design.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  📬 &lt;strong&gt;2. Notification Fan-Out&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A single event triggers multiple notification channels:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Email Service&lt;/li&gt;
&lt;li&gt;SMS Service&lt;/li&gt;
&lt;li&gt;Push Notification Service
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Notification Service
 ├── Email
 ├── SMS
 └── Push
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  ☁️ &lt;strong&gt;3. Cloud Storage Replication&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;When data is uploaded, it fans out to multiple storage regions for redundancy.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Upload → S3 (Primary Region)&lt;/li&gt;
&lt;li&gt;Fan-out → Secondary &amp;amp; Tertiary Regions&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Ensures &lt;strong&gt;geo-redundancy&lt;/strong&gt; and &lt;strong&gt;disaster recovery&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  🧾 &lt;strong&gt;4. Data Pipeline Distribution&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ETL job or Kafka stream fans out messages to multiple downstream data consumers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Analytics Engine&lt;/li&gt;
&lt;li&gt;ML Feature Store&lt;/li&gt;
&lt;li&gt;Real-time Dashboard&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h3&gt;
  
  
  📦 &lt;strong&gt;5. E-commerce Order Processing&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;When a customer places an order:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fan-out to Inventory Service (check stock)&lt;/li&gt;
&lt;li&gt;Payment Service (process transaction)&lt;/li&gt;
&lt;li&gt;Shipping Service (prepare shipment)&lt;/li&gt;
&lt;li&gt;Notification Service (confirm order)&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  💬 &lt;strong&gt;6. Chat Application&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;A chat message fans out to all subscribers in a group.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sender → Message Broker → All Recipient Queues.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Used in &lt;strong&gt;Pub/Sub&lt;/strong&gt; systems like Kafka, RabbitMQ, or Redis Streams.&lt;/p&gt;




&lt;h3&gt;
  
  
  📊 &lt;strong&gt;7. Logging &amp;amp; Monitoring Systems&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Every log event fans out to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Elasticsearch (for search)&lt;/li&gt;
&lt;li&gt;S3 (for archiving)&lt;/li&gt;
&lt;li&gt;Alerting system (for real-time alarms)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h3&gt;
  
  
  🧠 &lt;strong&gt;8. Machine Learning Feature Updates&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A training event may trigger:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Model retraining job&lt;/li&gt;
&lt;li&gt;Metrics update&lt;/li&gt;
&lt;li&gt;Model registry update&lt;/li&gt;
&lt;li&gt;Deployment pipeline&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h3&gt;
  
  
  🕸️ &lt;strong&gt;9. Web Crawlers / Scrapers&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Each URL fetch may fan out into multiple requests for linked pages, creating a crawling tree.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🧮 &lt;strong&gt;10. Distributed Computation&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;MapReduce jobs fan out the "Map" phase to multiple workers for data partitioning and processing.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  6️⃣ Fan-Out vs Fan-In
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concept&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fan-Out&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;One service calls many downstreams&lt;/td&gt;
&lt;td&gt;Order Service → Inventory + Payment + Notification&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fan-In&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Many upstreams feed into one service&lt;/td&gt;
&lt;td&gt;Many microservices send logs → Log Aggregator&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Together, they form the &lt;strong&gt;flow of distributed systems&lt;/strong&gt; — fan-out distributes work; fan-in collects and aggregates results.&lt;/p&gt;




&lt;h2&gt;
  
  
  7️⃣ Challenges with Fan-Out
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Challenge&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Increased Latency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Synchronous calls depend on the slowest responder.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Failure Propagation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A single downstream failure can cascade upward.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Concurrency Control&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Managing too many parallel calls can exhaust threads or CPU.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Monitoring Complexity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hard to trace multi-branch request trees.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Throttling &amp;amp; Backpressure&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Downstreams may get overloaded.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  8️⃣ Design Patterns and Best Practices
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✅ &lt;strong&gt;1. Limit Fan-Out Depth&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Avoid long dependency chains like:&lt;br&gt;
&lt;code&gt;A → B → C → D → E&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Keep it shallow (1–2 levels) to reduce latency and failure domains.&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ &lt;strong&gt;2. Use Asynchronous Communication&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Adopt &lt;strong&gt;event-driven&lt;/strong&gt; or &lt;strong&gt;message queue&lt;/strong&gt; patterns to decouple services.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Kafka&lt;/li&gt;
&lt;li&gt;RabbitMQ&lt;/li&gt;
&lt;li&gt;AWS SNS/SQS&lt;/li&gt;
&lt;li&gt;Google Pub/Sub&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  ✅ &lt;strong&gt;3. Implement Circuit Breakers &amp;amp; Timeouts&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Use libraries like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Resilience4j&lt;/strong&gt; (Java)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hystrix&lt;/strong&gt; (Netflix OSS)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Envoy / Istio&lt;/strong&gt; (service mesh)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To prevent cascading failures.&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ &lt;strong&gt;4. Use Fan-In Aggregators&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;When you need to collect results, use aggregator services that combine responses efficiently.&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ &lt;strong&gt;5. Apply Bulkhead Pattern&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Isolate resource pools for high-fan-out calls so one downstream doesn’t starve others.&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ &lt;strong&gt;6. Apply Idempotency&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Ensure retried fan-out calls don’t produce duplicate side effects.&lt;/p&gt;




&lt;h2&gt;
  
  
  9️⃣ Monitoring and Observability
&lt;/h2&gt;

&lt;p&gt;Fan-out systems need &lt;strong&gt;end-to-end tracing&lt;/strong&gt; to diagnose latency and failure points.&lt;/p&gt;

&lt;p&gt;Tools and techniques:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OpenTelemetry&lt;/strong&gt; for distributed tracing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Jaeger / Zipkin&lt;/strong&gt; for visualization&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structured logging&lt;/strong&gt; (with correlation IDs)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Service mesh observability&lt;/strong&gt; via Envoy or Istio&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔟 Conclusion
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Fan-out&lt;/strong&gt; is a powerful design pattern for &lt;strong&gt;parallelism, scalability, and responsiveness&lt;/strong&gt; — but must be handled with care.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;synchronous fan-out&lt;/strong&gt; when you need real-time aggregation.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;asynchronous fan-out&lt;/strong&gt; for background, scalable workflows.&lt;/li&gt;
&lt;li&gt;Always implement &lt;strong&gt;timeouts, retries, and observability&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In a distributed world, controlling fan-out depth and width is key to &lt;strong&gt;building resilient, maintainable, and cost-efficient systems&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  🧩 Summary Table
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Synchronous Fan-Out&lt;/th&gt;
&lt;th&gt;Asynchronous Fan-Out&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Response Time&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Waits for all downstreams&lt;/td&gt;
&lt;td&gt;Immediate response&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Use Case&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Aggregated data&lt;/td&gt;
&lt;td&gt;Background jobs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Reliability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Prone to cascading failures&lt;/td&gt;
&lt;td&gt;Decoupled &amp;amp; resilient&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Complexity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Simpler&lt;/td&gt;
&lt;td&gt;Needs event infra&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Consistency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Strong&lt;/td&gt;
&lt;td&gt;Eventual&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>systemdesign</category>
      <category>microservices</category>
      <category>designpatterns</category>
      <category>architecture</category>
    </item>
    <item>
      <title>🧑‍💻 Apache Kafka CLI – Detailed Course</title>
      <dc:creator>nk sk</dc:creator>
      <pubDate>Fri, 03 Oct 2025 03:51:41 +0000</pubDate>
      <link>https://dev.to/nk_sk_6f24fdd730188b284bf/apache-kafka-cli-detailed-course-e6b</link>
      <guid>https://dev.to/nk_sk_6f24fdd730188b284bf/apache-kafka-cli-detailed-course-e6b</guid>
      <description>&lt;h2&gt;
  
  
  1. &lt;strong&gt;Introduction&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Kafka provides CLI tools (usually inside &lt;code&gt;bin/&lt;/code&gt; or &lt;code&gt;bin/windows/&lt;/code&gt;) to manage:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Brokers&lt;/strong&gt; (the Kafka servers)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Topics&lt;/strong&gt; (data channels)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Producers&lt;/strong&gt; (apps sending data)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consumers&lt;/strong&gt; (apps reading data)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consumer groups&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cluster configuration &amp;amp; monitoring&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;📂 Default path:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Linux/Mac: &lt;code&gt;kafka/bin/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Windows: &lt;code&gt;kafka/bin/windows/&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. &lt;strong&gt;Setup &amp;amp; Starting Kafka&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Before using CLI, ensure ZooKeeper (if &amp;lt; 2.8) and Kafka broker are running.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Start Zookeeper (older versions only)&lt;/span&gt;
bin/zookeeper-server-start.sh config/zookeeper.properties

&lt;span class="c"&gt;# Start Kafka broker&lt;/span&gt;
bin/kafka-server-start.sh config/server.properties
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 In newer versions (Kafka KRaft mode), ZooKeeper is not required.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. &lt;strong&gt;Topic Management&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Create a Topic
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bin/kafka-topics.sh &lt;span class="nt"&gt;--create&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--topic&lt;/span&gt; first-topic &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--bootstrap-server&lt;/span&gt; localhost:9092 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--partitions&lt;/span&gt; 3 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--replication-factor&lt;/span&gt; 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  List Topics
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bin/kafka-topics.sh &lt;span class="nt"&gt;--list&lt;/span&gt; &lt;span class="nt"&gt;--bootstrap-server&lt;/span&gt; localhost:9092
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Describe a Topic
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bin/kafka-topics.sh &lt;span class="nt"&gt;--describe&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--topic&lt;/span&gt; first-topic &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--bootstrap-server&lt;/span&gt; localhost:9092
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Delete a Topic
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bin/kafka-topics.sh &lt;span class="nt"&gt;--delete&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--topic&lt;/span&gt; first-topic &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--bootstrap-server&lt;/span&gt; localhost:9092
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. &lt;strong&gt;Producing Messages&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Simple Producer
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bin/kafka-console-producer.sh &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--broker-list&lt;/span&gt; localhost:9092 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--topic&lt;/span&gt; first-topic
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Type messages directly → Press &lt;strong&gt;Enter&lt;/strong&gt; → Sent to Kafka.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  With Keys
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bin/kafka-console-producer.sh &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--broker-list&lt;/span&gt; localhost:9092 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--topic&lt;/span&gt; first-topic &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--property&lt;/span&gt; &lt;span class="s2"&gt;"parse.key=true"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--property&lt;/span&gt; &lt;span class="s2"&gt;"key.separator=:"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;user1:hello
user2:hi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  5. &lt;strong&gt;Consuming Messages&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Simple Consumer
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bin/kafka-console-consumer.sh &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--bootstrap-server&lt;/span&gt; localhost:9092 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--topic&lt;/span&gt; first-topic &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--from-beginning&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Consumer with Group
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bin/kafka-console-consumer.sh &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--bootstrap-server&lt;/span&gt; localhost:9092 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--topic&lt;/span&gt; first-topic &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--group&lt;/span&gt; my-group
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6. &lt;strong&gt;Consumer Group Management&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  List Groups
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bin/kafka-consumer-groups.sh &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--bootstrap-server&lt;/span&gt; localhost:9092 &lt;span class="nt"&gt;--list&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Describe a Group
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bin/kafka-consumer-groups.sh &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--bootstrap-server&lt;/span&gt; localhost:9092 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--describe&lt;/span&gt; &lt;span class="nt"&gt;--group&lt;/span&gt; my-group
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Reset Offsets
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bin/kafka-consumer-groups.sh &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--bootstrap-server&lt;/span&gt; localhost:9092 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--group&lt;/span&gt; my-group &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--topic&lt;/span&gt; first-topic &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--reset-offsets&lt;/span&gt; &lt;span class="nt"&gt;--to-earliest&lt;/span&gt; &lt;span class="nt"&gt;--execute&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  7. &lt;strong&gt;Cluster &amp;amp; Broker Utilities&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Cluster Info
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bin/kafka-broker-api-versions.sh &lt;span class="nt"&gt;--bootstrap-server&lt;/span&gt; localhost:9092
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Broker Config
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bin/kafka-configs.sh &lt;span class="nt"&gt;--bootstrap-server&lt;/span&gt; localhost:9092 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--entity-type&lt;/span&gt; brokers &lt;span class="nt"&gt;--entity-name&lt;/span&gt; 0 &lt;span class="nt"&gt;--describe&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  8. &lt;strong&gt;Monitoring &amp;amp; Debugging&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Check Lag
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bin/kafka-consumer-groups.sh &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--bootstrap-server&lt;/span&gt; localhost:9092 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--group&lt;/span&gt; my-group &lt;span class="nt"&gt;--describe&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  List Partitions &amp;amp; Leaders
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bin/kafka-topics.sh &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--bootstrap-server&lt;/span&gt; localhost:9092 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--topic&lt;/span&gt; first-topic &lt;span class="nt"&gt;--describe&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Dump Log Segments (advanced debugging)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bin/kafka-dump-log.sh &lt;span class="nt"&gt;--files&lt;/span&gt; /tmp/kafka-logs/first-topic-0/00000000000000000000.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  9. &lt;strong&gt;Admin CLI (Newer Versions)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Kafka now has &lt;code&gt;kafka-cluster.sh&lt;/code&gt;, &lt;code&gt;kafka-storage.sh&lt;/code&gt;, &lt;code&gt;kafka-metadata-quorum.sh&lt;/code&gt; for KRaft mode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bin/kafka-storage.sh info &lt;span class="nt"&gt;-c&lt;/span&gt; config/kraft/server.properties
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  10. &lt;strong&gt;Hands-On Practice Plan&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;✅ Day 1 – Install Kafka, start broker, create/delete/list topics&lt;br&gt;
✅ Day 2 – Use producer &amp;amp; consumer CLI, send &amp;amp; read messages&lt;br&gt;
✅ Day 3 – Experiment with consumer groups, offsets, reset-offsets&lt;br&gt;
✅ Day 4 – Explore configs, broker info, and monitor lag&lt;br&gt;
✅ Day 5 – Debug using dump-log &amp;amp; move to advanced KRaft commands&lt;/p&gt;




</description>
      <category>cli</category>
      <category>dataengineering</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>🌩️ Understanding Cloud Computing: SaaS, PaaS, and IaaS</title>
      <dc:creator>nk sk</dc:creator>
      <pubDate>Fri, 03 Oct 2025 03:35:11 +0000</pubDate>
      <link>https://dev.to/nk_sk_6f24fdd730188b284bf/understanding-cloud-computing-saas-paas-and-iaas-2jnb</link>
      <guid>https://dev.to/nk_sk_6f24fdd730188b284bf/understanding-cloud-computing-saas-paas-and-iaas-2jnb</guid>
      <description>&lt;p&gt;Cloud computing has transformed how businesses and individuals use technology. Instead of investing in expensive physical servers and infrastructure, organizations can now &lt;strong&gt;access computing power, storage, and applications over the internet&lt;/strong&gt;—paying only for what they use.&lt;/p&gt;

&lt;p&gt;At its core, cloud computing delivers three main service models: &lt;strong&gt;SaaS, PaaS, and IaaS&lt;/strong&gt;. Let’s break them down with simple explanations and real-world examples.&lt;/p&gt;




&lt;h2&gt;
  
  
  ☁️ What is Cloud Computing?
&lt;/h2&gt;

&lt;p&gt;Cloud computing is the &lt;strong&gt;on-demand delivery of IT resources&lt;/strong&gt;—servers, storage, databases, networking, software, and more—via the internet. It eliminates the need for owning and managing physical hardware.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scalability&lt;/strong&gt; – Scale up or down instantly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost efficiency&lt;/strong&gt; – Pay-as-you-go, no upfront hardware costs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accessibility&lt;/strong&gt; – Work from anywhere, anytime.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security &amp;amp; reliability&lt;/strong&gt; – Providers offer advanced protection and uptime guarantees.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  1️⃣ Software as a Service (SaaS)
&lt;/h2&gt;

&lt;p&gt;SaaS delivers &lt;strong&gt;ready-to-use software applications&lt;/strong&gt; over the internet. Users don’t worry about installation, maintenance, or infrastructure. Everything is handled by the provider.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Examples:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gmail, Outlook (email services)&lt;/li&gt;
&lt;li&gt;Google Workspace, Microsoft 365 (productivity)&lt;/li&gt;
&lt;li&gt;Zoom, Slack (communication tools)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📌 &lt;strong&gt;When to use:&lt;/strong&gt; If you just want to use the software without worrying about hosting or managing it.&lt;/p&gt;




&lt;h2&gt;
  
  
  2️⃣ Platform as a Service (PaaS)
&lt;/h2&gt;

&lt;p&gt;PaaS provides a &lt;strong&gt;development and deployment environment in the cloud&lt;/strong&gt;. It includes tools, frameworks, databases, and runtime environments—so developers can build, test, and deploy apps without managing servers.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Examples:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Google App Engine&lt;/li&gt;
&lt;li&gt;Microsoft Azure App Service&lt;/li&gt;
&lt;li&gt;Heroku&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📌 &lt;strong&gt;When to use:&lt;/strong&gt; If you’re a developer who wants to focus on coding and innovation, while the platform manages infrastructure, updates, and scalability.&lt;/p&gt;




&lt;h2&gt;
  
  
  3️⃣ Infrastructure as a Service (IaaS)
&lt;/h2&gt;

&lt;p&gt;IaaS offers &lt;strong&gt;virtualized computing resources&lt;/strong&gt; such as servers, storage, and networking. It provides the most flexibility, as you manage the OS, applications, and runtime environment, while the cloud provider handles hardware.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Examples:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Amazon Web Services (AWS EC2, S3)&lt;/li&gt;
&lt;li&gt;Microsoft Azure Virtual Machines&lt;/li&gt;
&lt;li&gt;Google Cloud Compute Engine&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📌 &lt;strong&gt;When to use:&lt;/strong&gt; If you need maximum control over your IT resources and want to build custom environments.&lt;/p&gt;




&lt;h2&gt;
  
  
  🆚 SaaS vs PaaS vs IaaS (Quick Comparison)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;SaaS&lt;/th&gt;
&lt;th&gt;PaaS&lt;/th&gt;
&lt;th&gt;IaaS&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Target Users&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;End-users&lt;/td&gt;
&lt;td&gt;Developers&lt;/td&gt;
&lt;td&gt;IT Admins/Architects&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Control Level&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Lowest&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Highest&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;What You Manage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Just the app usage&lt;/td&gt;
&lt;td&gt;Apps &amp;amp; data&lt;/td&gt;
&lt;td&gt;Apps, data, OS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best For&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Businesses needing ready apps&lt;/td&gt;
&lt;td&gt;Developers building apps&lt;/td&gt;
&lt;td&gt;Enterprises needing infrastructure&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🔮 Future of Cloud Computing
&lt;/h2&gt;

&lt;p&gt;The adoption of cloud services is accelerating with AI, edge computing, and hybrid models. Organizations increasingly rely on a &lt;strong&gt;mix of SaaS, PaaS, and IaaS&lt;/strong&gt; to balance cost, control, and flexibility.&lt;/p&gt;

&lt;p&gt;Cloud isn’t just a technology trend—it’s the backbone of &lt;strong&gt;digital transformation&lt;/strong&gt;.&lt;/p&gt;




&lt;p&gt;✅ &lt;strong&gt;In short:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SaaS&lt;/strong&gt; = Use software&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PaaS&lt;/strong&gt; = Build software&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IaaS&lt;/strong&gt; = Host infrastructure&lt;/li&gt;
&lt;/ul&gt;




</description>
      <category>architecture</category>
      <category>beginners</category>
      <category>cloud</category>
    </item>
  </channel>
</rss>
