Spring Micoreservices - Folks Dev - Türkçe - Video

 



Yazılımda Microservice Mimarisi ve Kullanılan Teknolojiler

"Bu yayınımızda, adından sıkça bahsedilen yazılım dünyasının son dönemlerde en çok uygulanmak istenen Microservice Mimarisini ve bu mimari çerçevesinde kullanılan teknolojileri, Microservice terminolojisini ve Microservice avantaj ve dezavantajlarını konuşuyoruz."


[TechThursday] - Microservice #2 - Spring Cloud Eureka Server/Client, Feign Client

"Bu yayınımızda, Microservice yayın serimizin devamı olarak Spring Boot framework ve Spring Cloud Eureka Server ve Spring Cloud Client kullanarak, iki microservice'in Service Discovery Server'a Register olmalarını ve Feing Client kullanarak RestAPI üzerinden birbirlerine istekte bulunmalarını ve Feing Client FallBack senaryoları ve yöntemlerini anlatıyoruz. "


[TechThursday] - Microservice #3 - Spring Boot Feign Client Error Handling & Fault Tolerance

"Bu yayınımızda, Microservice yayın serimizin devamı olarak Spring Boot framework ve Spring Cloud Eureka Server ve Spring Cloud Client kullanarak, iki microservice'in Service Discovery Server'a Register olmalarını ve Feing Client kullanarak RestAPI üzerinden birbirlerine istekte bulunmalarını ve Feing Client FallBack senaryoları ve yöntemlerini anlatmıştık önceki bölümde. Bu bölümde ise Spring Feign Client ile Error Handling ve Resilience4j ile Faul Tolerance konularını anlatıyoruz"



[TechThursday] Microservice #4 - API Gateway, Spring Actuator, Distributed Log Trace, Zipkin

"Herkese merhaba,
Bu yayınımızda, Microservice yayın serimizin devamı olarak Spring Boot ve Spring Framework ile Spring API Gateway ve Spring Cloud Actuator kullanarak bir API Gateway geliştirmesi yapıp, Microservice konusunun en önemli konularından biri olan Distributed Log Trace geliştirmelerini Zipkin Server ve Zipkin Client entegrasyonu konularını anlatıyoruz"

[TechThursday] Microservice #5 - Spring Cloud Config ile Centralized Configuration

"Bu yayınımızda, Microservice yayın serimizin devamı olarak Spring Boot ve Spring Framework ile Spring Cloud Config kullanarak Microservisler arasında Git tabanlı bir Centralized Configuration nasıl kurulanacağını anlatıyoruz."





Data Structures & Algorithms - Java - Scott Barrett - Udemy - İngilizce

 Görsellerle zenginleştirlmiş, hazırlanışı eğitmenin yaklaşık bir sene almış, Scott Barrett'in sade anlaşılır anlatımıyla Data Structures & Algorithms - Java eğitimine buradan ulaşabilirsiniz.





Mastery of Data Structures and Algorithms

Confidently answer technical interview questions

Time and Space Complexity of Data Structures and Algorithms

Strengthen your skills as a developer


Hi!  I'm Scott, and I am exited to be part of the process that takes you to the next level technically. 


I started the journey of my tech career over 25 years ago and it is definitely worth the time and effort.  In that time I have worked at large Fortune 500 companies such as Hewlett-Packard, Cisco, and Chevron;  as well as several smaller firms.


As an instructor I take a different approach when I create a course.  After each line of code, an animation of the data structure or algorithm is updated to show exactly what that line of code did.


This visual approach allows students to learn more material in less time and have higher retention of the material.


I invite you to watch a few of my course intro videos you will see the difference this approach will make for you. 


I am looking forward to working with you on your coding journey. 

Software Architecture (SOLID) & Design Patterns in Java - Udemy - İnglizce - Holczer Balazs - Udemy

 Holczer Balzacs'ın SOLID ve Design Patternlerı kısa ve yeterince açıklayıcı şekilde, Java kodlarıyla anlattığı kursa buradan ulaşabilirsiniz.




Software Architecture (SOLID) & Design Patterns in Java





understand SOLID principles
understand the core of design patterns
undertand object oriented design
understand the single responsibility principle
understand the open / closed principle
understand the Liskov substitution principle
understand the interface segregation principle
understand the dependency inversion principle
understand creational design patterns (singleton pattern, factory pattern, builder pattern and prototype pattern)
understand behavioral design patterns (strategy pattern, command pattern, visitor pattern and template pattern)
understand structural design patterns (adapter pattern, facade pattern and decorator pattern)

Clean Code ve Effective Java Dersleri - Udemy - Furkan Sönmez - Türkçe

 Clean Code ve Effective Java kitaplarını işleyen Furkan Sönmez konuya hakim ve bol örneklerle konunun anlaşılmasını kolaylaştıryor.






İleri/Orta Seviye Java Dersleri - (Effective Java)

Kursa buradan ulaşabilirsiniz.

Sürekli güncellenen ileri orta seviye effective java eğitimiyle bilginizi ve java mülakat performansınızı katlayın!
Java teknik mülakat geçme garantisi :)Design Pattern ezberi yapmadan sorunları patterne dökebilme yeteneği.Temiz, doğru, esnek ve bakımı kolay uygulamalar tasarlayabilme yeteneği.İş arkadaşlarınızın okurken zorlanmayacağı ve insanların kolay adapte olabileceği tasarımlar yapmak.Ezbere değil farkında olarak kod yazma yetisi.Effective Java kitabının en ince detayına kadar tüm içeriği.


Clean Code - Temiz Kod Yazma Sanatı

Piyasanın en etkin clean code eğitimi. Kurstan sonra bir daha asla aynı kodu yazmayacaksınız. (Güncel Bonus İçeriklerle)

Kursa buradan ulaşabilirsiniz.

Kaliteli ve okunabilir kod yazma
Metotları ve sınıfları optimum uzunlukta tutma
SOLID prensipleri (Detaylı örneklerle)
Test yazmanın önemi ve mentalitesi
Kod refaktör etme
Temel Yazılım Prensipleri
Kurs dil spesifik değil ama Java Püf noktalarına sıkça değindik :)
Yük Testlerinin Önemi
Mülakat Performansında Gözle Görülür Artış
Kod yazan normal bir bireyden ziyade MÜHENDİS kafasıyla yazılım yapma





Domain Driven Design Kimdir? - Barış Velioğlu - Medium

Barış Velioğlu'nun DDD'yi bir kişilik haline getirip karşılıklı konuştuğu makale DDD'yi anlamamızıa yardımcı oluyor. Yazıya buradan ulaşabilirsiniz.Yazının bir kısmı şu şekilde :

"Söyleşimizin ilk bölümünde Domain Driven Design yani nam-ı diğer DDD ile problem çözerken hangi stratejilerden yararlandığı hakkında konuşuyoruz.

Teknolojinin dili olsa da konuşsa dediğiniz oldu mu hiç? Bugün sizlerle birlikte farklı bir şey deneyeceğiz. Teknolojiye konuşması için gerekli olan meziyetleri vererek onunla karşımda bir insan varmışcasına bir söyleşi yapmayı deneyeceğim. Yani DDD’nin bize biraz kendisinden bahsetmesini isteyeceğiz.

Bu söyleşinin sonunda aşağıdaki soruların hepsine cevap bulmuş olacağız.

  • “Ubiquitous Language” nedir? Neden önemlidir?
  • “Driven Design” kavramı ne ifade eder?
  • DDD için “Domain Expert” neden gereklidir?
  • “Bounded Context” nedir? Contextleri bulabilmek için hangi yöntemlerden yararlanılabilir?
  • Domainler neden 3 ayrı başlık (Core, Generic, Supporting) altında değerlendirilir? Hangisine odaklanmalıyız?"

Güney Kore'nin başarısını anlatan videolar






Java Concurrency / Multithreading - RAJEEV SINGH

Yazının orjinaline buradan ulaşabilirsiniz. 


Eşzamanlılık, aynı anda birden fazla şeyi yapabilme yeteneğidir.

İlk zamanlarda, bilgisayarlar aynı anda yalnızca bir programı çalıştırabiliyordu. Ancak şimdi, modern bilgisayarlar aynı anda birçok görevi yerine getirebiliyor. Örneğin -

Bloguma bir web tarayıcısında göz atabilir ve aynı zamanda bir medya oynatıcıda müzik dinleyebilirsiniz.


Bir kelime işlemcide bir belgeyi düzenleyebilirsiniz, diğer uygulamalar aynı anda internetten dosya indirebilir.

Eşzamanlılık mutlaka birden fazla uygulamayı içermez. Tek bir uygulamanın birden çok parçasını aynı anda çalıştırmak, eşzamanlılık olarak da adlandırılır. Örneğin -

Bir kelime işlemci metni biçimlendirir ve aynı zamanda klavye olaylarına yanıt verir .


Bir ses akışı uygulaması, sesi ağdan okur, sıkıştırır ve aynı anda ekranı günceller .


Esasen bilgisayarda çalışan bir program olan web sunucusu, aynı anda dünyanın her yerinden gelen binlerce isteğe hizmet eder .

Aynı anda birden fazla iş yapabilen yazılımlara eş zamanlı yazılım denir.

Bilgisayarımın aşağıdaki ekran görüntüsü bir eşzamanlılık örneğini göstermektedir. Bilgisayar sistemim aynı anda birden fazla şey yapıyor - Bir medya oynatıcıda video çalıştırıyor, bir terminalde klavye girişini kabul ediyor ve IntelliJ Idea'da bir proje oluşturuyor.



Eşzamanlılık: Kaputun Altında



Tamam! Bilgisayarların aynı anda birden çok görevi çalıştırabildiğini anlıyorum, ancak bunu nasıl yapıyorlar?

Günümüzde bilgisayarların birden fazla işlemciyle geldiğini biliyorum, ancak tek işlemcili bir sistemde de eşzamanlılık mümkün değil mi? Ayrıca bilgisayarlar, mevcut işlemci sayısından çok daha fazla görevi yerine getirebilir.

Tek bir CPU'da bile birden fazla görev aynı anda nasıl yürütülebilir?

Peki! Görünen o ki, aslında aynı fiziksel anda yürütülmüyorlar. Eşzamanlılık paralel yürütme anlamına gelmez.

“Aynı anda birden fazla görev yürütülüyor” dediğimizde, aslında “birden çok görev aynı zaman diliminde ilerleme kaydediyor” demek istiyoruz.

Görevler aralıklı olarak yürütülür. İşletim sistemi, görevler arasında o kadar sık ​​geçiş yapar ki, kullanıcılara aynı fiziksel anda yürütülüyormuş gibi görünür.



Bu nedenle, Eşzamanlılık Paralellik anlamına gelmez . Aslında, tek işlemcili bir sistemde Paralellik mümkün değildir.

Eşzamanlılık Birimi



Eşzamanlılık çok geniş bir terimdir ve çeşitli düzeylerde kullanılabilir. Örneğin -

Çoklu İşleme(Multiprocessing) - Aynı anda çalışan Çoklu İşlemciler/CPU'lar. Buradaki eşzamanlılık birimi bir CPU'dur.


Çoklu görev(Multitasking) - Tek bir CPU üzerinde aynı anda çalışan birden fazla görev/işlem. İşletim sistemi bu görevleri aralarında çok sık geçiş yaparak yürütür. Bu durumda eşzamanlılık birimi bir Süreçtir.


Çoklu iş parçacığı(Multithreading) - Aynı programın birden çok parçasının aynı anda çalışması. Bu durumda bir adım daha ileri giderek aynı programı birden çok parçaya/iş parçacığına bölüp bu evreleri aynı anda çalıştırıyoruz.

Processes ve Threadler

Şimdi iki temel eşzamanlılık biriminden bahsedelim: İşlemler ve İş Parçacıkları.

İşlem

İşlem, yürütülmekte olan bir programdır. Kendi adres alanı, bir çağrı yığını ve açık dosyalar gibi herhangi bir kaynağa bağlantısı vardır.

Bir bilgisayar sistemi normalde aynı anda çalışan birden çok işleme sahiptir. İşletim sistemi tüm bu işlemlerin kaydını tutar ve CPU'nun işlem süresini aralarında paylaşarak yürütülmesini kolaylaştırır.

Thread

Bir iş parçacığı, bir işlem içindeki bir yürütme yoludur. Her işlemin ana iş parçacığı adı verilen en az bir iş parçacığı vardır. Ana iş parçacığı, işlem içinde ek iş parçacıkları oluşturabilir.

Bir işlem içindeki iş parçacıkları, bellek ve açık dosyalar dahil olmak üzere işlemin kaynaklarını paylaşır. Ancak, her iş parçacığının kendi çağrı yığını vardır.

İş parçacıkları işlemin aynı adres alanını paylaştığından, yeni iş parçacıkları oluşturmak ve aralarında iletişim kurmak daha verimlidir.

Eşzamanlılıkla İlgili Sık Karşılaşılan Sorunlar



Eşzamanlılık, CPU kullanımını artırarak bilgisayarların verimini büyük ölçüde artırır. Ancak harika performansla birlikte birkaç sorun ortaya çıkıyor -

İş parçacığı girişim hataları (Yarış Koşulları) (Race Conditions) : Birden çok iş parçacığı aynı anda paylaşılan bir değişkeni okuyup yazmaya çalıştığında ve bu okuma ve yazma işlemleri yürütme sırasında çakıştığında iş parçacığı girişim hataları oluşur.
  • Bu durumda, nihai sonuç, tahmin edilemez olan okuma ve yazma işlemlerinin gerçekleştiği sıraya bağlıdır. Bu, thread girişim hatalarının tespit edilmesini ve düzeltilmesini zorlaştırır.
    
    Bir seferde yalnızca bir iş parçacığının paylaşılan bir kaynağa erişmesini sağlayarak iş parçacığı girişim hatalarından kaçınılabilir. Bu genellikle herhangi bir paylaşılan kaynağa erişmeden önce birbirini dışlayan bir kilit alarak yapılır.
    
    Herhangi bir paylaşılan kaynağa erişmeden önce bir kilit edinme kavramı, **kilitlenme** ve **açlık** gibi başka sorunlara yol açabilir. Bu sorunları ve çözümlerini gelecek eğitimlerde öğreneceğiz.
  • Bellek tutarlılığı hataları (Memory consistency errors) : Farklı iş parçacıkları aynı verilerin tutarsız görünümlerine sahip olduğunda bellek tutarlılığı hataları oluşur. Bu, bir iş parçacığı bazı paylaşılan verileri güncellediğinde olur, ancak bu güncelleme diğer iş parçacıklarına yayılmaz ve eski verileri kullanırlar.

Java Thread and Runnable


Java'da yeni threadlerin nasıl oluşturulacağını ve bu konuların içinde görevlerin nasıl çalıştırılacağını öğreneceğiz.

Bir Thread Yaratmak ve Başlatmak

Java'da thread oluşturmanın iki yolu vardır.

1.Thread Class'ından Extend Ederek

Sınıfınızı Thread'den genişleterek ve onun run() yöntemini geçersiz kılarak yeni bir iş parçacığı oluşturabilirsiniz.

run() yöntemi, yeni iş parçacığının içinde yürütülen kodu içerir. Bir iş parçacığı oluşturulduktan sonra, start() yöntemini çağırarak başlatabilirsiniz.



public class ThreadExample extends Thread {

    // run() method contains the code that is executed by the thread.
    @Override
    public void run() {
        System.out.println("Inside : " + Thread.currentThread().getName());
    }

    public static void main(String[] args) {
        System.out.println("Inside : " + Thread.currentThread().getName());

        System.out.println("Creating thread...");
        Thread thread = new ThreadExample();

        System.out.println("Starting thread...");
        thread.start();
    }
}




# Output
Inside : main
Creating thread...
Starting thread...
Inside : Thread-0
Thread.currentThread(), o anda yürütülmekte olan iş parçacığına bir başvuru döndürür. Yukarıdaki örnekte, mevcut iş parçacığının adını yazdırmak için iş parçacığının getName() yöntemini kullandım.

Her thread'in bir adı vardır. Thread(String name) yapıcısını kullanarak özel bir adla bir iş parçacığı oluşturabilirsiniz. Herhangi bir ad belirtilmezse, iş parçacığı için otomatik olarak yeni bir ad seçilir.

2-Runnable bir Nesne Yaratarak

Runnable arabirim, bir iş parçacığı tarafından yürütülmesi amaçlanan herhangi bir nesne için birincil şablondur. İş parçacığı tarafından yürütülen kodu içermesi amaçlanan tek bir run() yöntemini tanımlar.

Örneğinin bir iş parçacığı tarafından yürütülmesi gereken herhangi bir sınıf, Runnable arabirimini uygulamalıdır.

Thread sınıfı, Runnable'ı run() yönteminin boş bir uygulamasıyla uygular.

Yeni bir iş parçacığı oluşturmak için, Runnable arabirimini uygulayan sınıfın bir örneğini oluşturun ve ardından bu örneği Thread(Runnable target) yapıcısına iletin.




public class RunnableExample implements Runnable {

    public static void main(String[] args) {
        System.out.println("Inside : " + Thread.currentThread().getName());

        System.out.println("Creating Runnable...");
        Runnable runnable = new RunnableExample();

        System.out.println("Creating Thread...");
        Thread thread = new Thread(runnable);

        System.out.println("Starting Thread...");
        thread.start();
    }

    @Override
    public void run() {
        System.out.println("Inside : " + Thread.currentThread().getName());
    }
}

# Output
Inside : main
Creating Runnable...
Creating Thread...
Starting Thread...
Inside : Thread-0
Runnable'ı uygulayan bir sınıf oluşturmak ve ardından çalıştırılabilir nesneyi almak için bu sınıfı başlatmak yerine, Java'nın anonim sınıf sözdizimini kullanarak anonim bir çalıştırılabilir nesne oluşturabileceğinizi unutmayın.

Anonim sınıflar, kodunuzu daha sade hale getirmenizi sağlar. Aynı anda bir sınıfı bildirmenizi ve başlatmanızı sağlarlar. - Java dokümanından.



public class RunnableExampleAnonymousClass {

    public static void main(String[] args) {
        System.out.println("Inside : " + Thread.currentThread().getName());

        System.out.println("Creating Runnable...");
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                System.out.println("Inside : " + Thread.currentThread().getName());
            }
        };

        System.out.println("Creating Thread...");
        Thread thread = new Thread(runnable);

        System.out.println("Starting Thread...");
        thread.start();
    }
}
Yukarıdaki örnek, Java 8'in lambda ifadesi kullanılarak daha da kısaltılabilir -
  
  public class RunnableExampleLambdaExpression {

    public static void main(String[] args) {
        System.out.println("Inside : " + Thread.currentThread().getName());

        System.out.println("Creating Runnable...");
        Runnable runnable = () -> {
            System.out.println("Inside : " + Thread.currentThread().getName());
        };

        System.out.println("Creating Thread...");
        Thread thread = new Thread(runnable);

        System.out.println("Starting Thread...");
        thread.start();

    }
}

Runnable veya Thread Hangisini Kullanmalı?


Thread sınıfından genişleterek bir iş parçacığı oluşturduğunuz ilk yöntem çok sınırlıdır çünkü sınıfınızı Thread'den bir kez genişlettiğinizde, Java çoklu kalıtıma izin vermediğinden başka bir sınıftan genişletemezsiniz.

Ayrıca, iyi tasarım uygulamasını izlerseniz, Kalıtım, üst sınıfın işlevselliğini genişletmek içindir, ancak bir iş parçacığı oluşturduğunuzda, Thread sınıfının işlevselliğini genişletmezsiniz, yalnızca run() yönteminin uygulanmasını sağlarsınız.

Bu nedenle, genel olarak, bir iş parçacığı oluşturmak için her zaman Runnable nesnesini kullanmalısınız. Bu yöntem daha esnektir. Sınıfınızın başka herhangi bir sınıftan genişlemesine izin verir. Ayrıca, kodunuzu daha özlü hale getirmek için Runnable ile anonim sınıf sözdizimini ve Java 8'in lambda ifadesini kullanabilirsiniz.

Bir Thread'in sleep() Methodu ile Çalışmasına Ara Vermek


Thread sınıfı tarafından sağlanan sleep() yöntemi, o anda yürütülmekte olan iş parçacığının yürütülmesini belirtilen milisaniye sayısı kadar duraklatmanıza olanak tanır.





  

    public class ThreadSleepExample {

    public static void main(String[] args) {
        System.out.println("Inside : " + Thread.currentThread().getName());

        String[] messages = {"If I can stop one heart from breaking,",
                "I shall not live in vain.",
                "If I can ease one life the aching,",
                "Or cool one pain,",
                "Or help one fainting robin",
                "Unto his nest again,",
                "I shall not live in vain"};

        Runnable runnable = () -> {
            System.out.println("Inside : " + Thread.currentThread().getName());

            for(String message: messages) {
                System.out.println(message);
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    throw new IllegalStateException(e);
                }
            }
        };

        Thread thread = new Thread(runnable);

        thread.start();
    }
}
    
  

  # Output
Inside : main
Inside : Thread-0
If I can stop one heart from breaking,
I shall not live in vain.
If I can ease one life the aching,
Or cool one pain,
Or help one fainting robin
Unto his nest again,
I shall not live in vain
    

Yukarıdaki örnek, ileti dizisi üzerinde yinelenen, mevcut iletiyi yazdıran, Thread.sleep() öğesini çağırarak 2 saniye bekleyen ve ardından bir sonraki yinelemeye geçen bir for döngüsünden oluşur.

Herhangi bir iş parçacığı geçerli iş parçacığını keserse, sleep() yöntemi InterruptedException'ı atar. InterruptedException, kontrol edilen bir istisnadır ve ele alınması gerekir.


join() Kullanarak Diğer Thread'in Tamamlanmasını Beklemek

Join() yöntemi, bir iş parçacığının diğerinin tamamlanmasını beklemesine izin verir. Aşağıdaki örnekte, Thread 2, Thread.join(1000)'i çağırarak 1000 milisaniye boyunca Thread 1'in tamamlanmasını bekler ve ardından yürütmeyi başlatır -


  

      public class ThreadJoinExample {

    public static void main(String[] args) {
        // Create Thread 1
        Thread thread1 = new Thread(() -> {
            System.out.println("Entered Thread 1");
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                throw new IllegalStateException(e);
            }
            System.out.println("Exiting Thread 1");
        });

        // Create Thread 2
        Thread thread2 = new Thread(() -> {
            System.out.println("Entered Thread 2");
            try {
                Thread.sleep(4000);
            } catch (InterruptedException e) {
                throw new IllegalStateException(e);
            }
            System.out.println("Exiting Thread 2");
        });

        System.out.println("Starting Thread 1");
        thread1.start();

        System.out.println("Waiting for Thread 1 to complete");
        try {
            thread1.join(1000);
        } catch (InterruptedException e) {
            throw new IllegalStateException(e);
        }

        System.out.println("Waited enough! Starting Thread 2 now");
        thread2.start();
    }
}
                
Starting Thread 1
Waiting for Thread 1 to complete
Entered Thread 1
Waited enough! Starting Thread 2 now
Entered Thread 2
Exiting Thread 1
Exiting Thread 2

Thread.join() için bekleme süresi MIN (iş parçacığının sonlanması için geçen süre, yöntem bağımsız değişkeninde belirtilen milisaniye sayısı) değerine eşittir.

Join() yöntemi, argüman olmadan da çağrılabilir. Bu durumda, sadece iş parçacığı ölene kadar bekler.

DDD (Domain Driven Design) Özet- İnglizce - Eleonora Ciceri (Slideshare)





DDD - 1 - A gentle introduction to Domain Driven Design




DDD - 2 - Domain Driven Design: Tactical design



DDD - 3 - Domain Driven Design: Event sourcing



DDD - 4 - Domain Driven Design_ Architectural patterns



DDD - 5 - Domain Driven Design_ Repositories

Rastgele İçerik

DonanımHaber

© tüm hakları saklıdır
made with by templateszoo