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’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.