Mikroservis mimarisinin artan popülaritesine rağmen, monolithic (mikrosveris olmayan) uygulama geliştirme yaklaşımı da hâlâ tercih edilebiliyor. Monolithic uygulamaların gereksinimlere adaptasyonu, ölçeklendirilebilmesi ve Spring Boot’la daha iyi yapılandırılabilmesi için VMare adım attı. Bu doğrultuda, geçen sene Kasım ayında Spring Modulith 1.0’ı duyurdu.

Ağustos ayında Spring Boot etkinliğinde, Spring Modulith’in tam desteklenen bir Spring projesi olduğu duyuruldu. Spring Modulith’in deneysellikten çıkması, framework’ü VSC ve Spring Tool Suite gibi derleyicilerin tanıması anlamına geliyor.

Peki Spring Modulith Ne Sağlıyor?

Java dilinde modülleri, birbiriyle yakın ilişkisi olan bir grup Java paketleri olarak düşünebiliriz. Aynı modülün içinde tanımlı Java paketleri, birbiri tarafından erişilebilir ve okunabilirken modül-dışı paketler, bu paketlere erişemez. Bu da kodun tekrar kullanımını artırır (reusable).

Örneğin aşağıdaki gibi bir Java projesi yapısı düşünelim.

└─ src/main/java
   ├─ example
   │  └─ Application.java
   ├─ example.inventory
   │  ├─ InventoryManagement.java
   │  └─ SomethingInventoryInternal.java
   ├─ example.order
   │  └─ OrderManagement.java
   └─ example.order.internal
      └─ SomethingOrderInternal.java

Modül kullanılmadan yukarıdaki şekilde organize edilmiş bir Java uygulamasında example.inventory.SomethingInventoryInternal sınıfı, diğer paketlerin içindeki Java sınıfları tarafından, özellikle “public” olarak tanımlanmadıkça görünemez durumdadır. Ancak “public” olarak tanımlanması durumunda da, diğer tüm paketler tarafından erişilebilir olacaktır.

Aslında tam bu ihtiyaç için, Java 9 ile Java Platform Module System (JPMS) devreye girmişti. JPMS, paketlerin de üzerinde, soyut bir gruplama katmanı tanımlamaktaydı. JPMS hakkında detaylı bilgi için şunu okuyabilirsiniz: A Guide to Java 9 Modularity (İngilizce).

Spring Modulith Mimarisi
Spring Modulith Mimarisi

Spring Modulith’i ise, JPMS kullanmadan “module” konseptini kullanabileceğiniz bir Spring framework’ü olarak düşünebilirsiniz. Modulith kullandığınızda, en üst Java paketi altındaki tüm paketler “by default” Java modülü varsayılır. Böylece, ana paketin altında yer alan tüm paketler (örnekte order ve inventory), modülün parçası olur. Bu paketler altındaki public Java tipleri ise modülün API’sini oluşturur. Bu sayede, örnekteki example.order.internal paketini public hale getirmeden, aynı ana paket altındaki sınıflar tarafından erişilebilir yapabilirsiniz.

Bununla beraber, eğer Java uygulamanızda Java JPMS modülü varsa, modüller arası internal paketlere erişim gibi tanımlarınız olsa da (yetkisiz erişim) kodunuz yine de compile olurdu. Yani, bu tarz erişim problemlerini fark etmek oldukça zor olurdu. Ancak Modulith, yetkisiz erişimleri test aşamasında yakalar ve compilation hatası vererek uygulamanızın modülerliğini korur.

Modüller Arası İletişim

Spring Modulith, modüller arasında iletişim için Spring Framework uygulama event’leri kullanma imkanı sunar. Spring, uygulama event’lerinin Event Publication Registry (EPR) üzerinde kaydedilerek hedefine gönderilebilmesini güvenceye alır (guaranteed delivery). EPR ile modüller arası iletişimde kullanılan bu event’ler, JPA, JDBC ve MongoDB aracılığıyla veritabanında saklanabilmektedir.

Modulith ile Asenkron Uygulamalarda Test

İletişimini asenkron eventlerle gerçekleştiren Java uygulamalarında standart Java test yöntemleri ile test geliştirmek daha zordur. Bu nedenle Modulith kapsamında, Java test’lerine dahil edilebilen, event’inizin başlangıcını ve beklediğiniz cevabı tanımlayarak test oluşturabildiğiniz Integration Test senaryoları da sağlanmakta.

YORUM YAP

Lütfen yorumunu bırak!
Lütfen adını buraya gir