Teknoloji · Diller ve framework’ler

Hata kaldırmayan sistemler için Java ve Spring Boot.

İşlem çekirdekleri, yüksek işlem hacimli olay işleme ve halihazırda JVM üzerinde çalışan sistem envanterlerinin modernizasyonu için Java ve Spring Boot mühendisleri — bankacılık, telekom, lojistik ve havayolu sistemleri.

JavaOnunla neler geliştiriyoruz
01İşlem çekirdekleri
02Yüksek işlem hacimli olay işleme
03Modüler monolit içinde alan servisleri
04Entegrasyon ve API katmanları
05Legacy yeniden yapılandırma
06Toplu ve zamanlanmış işleme
Genellikle birlikte
  1. Java 21
  2. Spring Boot
  3. Spring Kafka
  4. Spring Batch
  5. PostgreSQL
  6. Kafka
Neden kullanıyoruz

Hata yapmayı göze alamayan sistemlerin dili.

Java, kurumların hata yapmayı göze alamayacağı sistemlerin dilidir: temel bankacılık kayıt defterleri, faturalama, sadakat puan kazanımı, yük mutabakatı. Kendi platformlarımızdaki işlem ve olay işleme servislerini TypeScript ile birlikte Java çalıştırır; birçok kurumsal sistem envanteri de zaten bu dille yazılmıştır. JVM; sürekli yük altında öngörülebilir performans, olgun bir çöp toplama mekanizması ve çalışan bir sistemi teşhis etmeye yarayan onlarca yıllık araç birikimi sunar.

Java’yı üretken kılan şey Spring Boot’tur. Otomatik yapılandırma, iyi bilinen bir bağımlılık enjeksiyonu modeli; Kafka, PostgreSQL, güvenlik ve gözlemlenebilirlik için birinci sınıf destek ve bir mühendisin projeyi yeniden öğrenmeden kod tabanları arasında geçmesini sağlayan bir konvansiyon. Son Java sürümlerindeki sanal iş parçacıkları, istek başına iş parçacığı modelinin sadeliğinden vazgeçmeden, I/O yoğun servislerde asenkron çalışma zamanlarıyla arasındaki farkın büyük kısmını kapattı.

Her iş için varsayılan tercih değildir. Küçük bir BFF, bir içerik sitesi veya bir veri hattı için genellikle TypeScript ya da Python daha uygundur; bunu da söyleriz. Java; doğruluğun, işlem hacminin ve uzun bir operasyonel ömrün ilk prototipin hızından daha çok önem taşıdığı yerde yerini hak eder.

Bununla ne geliştiriyoruz

Java ve Spring Boot ile hayata geçirdiğimiz altı şey.

01

İşlem çekirdekleri

Kayıt defterleri, tahakkuk ve mutabakat motorları, sipariş ve poliçe yönetimi — her yazma işleminin idempotent, denetlenebilir ve mutabık kılınabilir olduğu, bir hatanın destek kaydı değil finansal bir olay anlamına geldiği servisler.

02

Yüksek işlem hacimli olay işleme

Yüksek hacimli olay akışlarını ücretlendiren, zenginleştiren ve yönlendiren Kafka tüketicileri ve akış işlemcileri; iş alanının gerektirdiği yerde exactly-once semantiği, gerektirmediği yerde ise belgelenmiş bir yanıt.

03

Modüler monolit içinde alan servisleri

Büyük bir kod tabanını okunabilir tutan Spring Modulith ya da disiplinli bir paket yapısı; sonradan servislere ayırabileceğiniz — ya da bilinçli olarak hiç ayırmayacağınız — açık modül sınırlarıyla.

04

Entegrasyon ve API katmanları

SAP, temel bankacılık, taşıyıcı ve ödeme sistemlerinin önünde duran REST ve gRPC servisleri; dayanıklılık desenleri — devre kesiciler, bölmeler, jitter’lı yeniden denemeler — doğaçlama değil yapılandırılmış biçimde.

05

Legacy yeniden yapılandırma

Java EE, Struts veya tedarikçi platformlarının strangler deseniyle değiştirilmesi: önce karakterizasyon testleri, ardından her seferinde bir rotanın veya bir yeteneğin Spring Boot’a taşınması; sayılar tutana kadar eski ve yeni yan yana çalışır.

06

Toplu ve zamanlanmış işleme

Gün sonu, ekstre üretimi ve mutabakat için Spring Batch işleri — yeniden başlatılabilir, parçalı, gözlemlenebilir ve işin ortasındaki bir hatanın baştan başlamak anlamına gelmeyeceği şekilde tasarlanmış.

Uygunluk

Ne zaman tercih edilmeli.

Doğru tercih

Uzun yıllar yaşayacak, para ya da regülasyona tabi veri işleyecek veya sürekli CPU yükü altında gecikmesini koruması gereken servisler için Java ve Spring Boot’u seçin. Kurumunuz zaten JVM çalıştırıyorsa ve buna uygun ekibe, izleme ve güvenlik araçlarına sahipse tercih edin — yeni bir çalışma zamanı eklemek, getirdiğinden fazlasına mal olur. Büyük ekiplere iyi uyar: konvansiyonlar, mühendisler değiştikçe kod tabanının tutarlı kalmasını sağlayacak kadar güçlüdür.

Başka yere bakın

Küçük bir prototip, bir tanıtım sitesi veya TypeScript’in daha uygun olduğu ince bir BFF için tercih etmeyin; Python’ın ekosisteme hâkim olduğu veri bilimi ve LLM işleri için de tercih etmeyin. Çalışan bir Java 8 monolitini yeni bir dilde baştan yazarak da modernize etmeyin — dürüst yol genellikle bir sürüm yükseltmesi, modüler bir yapı ve strangler desenidir; bunu tek satır kod yazılmadan önce ortaya koyarız.

Pratikte

Kaybolmayacak ve yinelenmeyecek şekilde tasarlanmış bir outbox olayı.

SettlementService.javajava
@Transactional
public Settlement settle(SettleCommand cmd) {
    var existing = settlements.findByIdempotencyKey(cmd.key());
    // a retried command returns the original result, never a second write
    if (existing.isPresent()) return existing.get();

    var settlement = ledger.apply(cmd);
    settlements.save(settlement);
    // written in the same transaction; a relay publishes it to Kafka
    outbox.append(SettlementCompleted.from(settlement));
    return settlement;
}
Referans mimari

Spring Boot’un bir Odeontech sistem envanterindeki yeri.

Edge
API ağ geçidiNext.js / BFFPartner API’leri
Servisler
Spring Boot alan servisleriAkış işlemcileriSpring Batch
Mesajlaşma
KafkaTransactional outboxDebezium CDC
Veri
PostgreSQLOracle / SQL Server (legacy)Redis
Platform
KubernetesOpenTelemetryMicrometerGitLab CI / GitHub Actions
Standartlarımız

Teslim ettiğimiz Java kod tabanlarının ortak özellikleri.

  • Bilinçli olarak güncel LTS. Java 21 veya en güncel LTS, Spring Boot 3.x ve bir sonraki CVE’de keşfedilen değil, runbook’a yazılmış bir yükseltme yolu.
  • İşlemler ve idempotentlik varsayılmaz, tasarlanır. Para, stok veya durum değiştiren her komut bir idempotency anahtarı taşır; her olay bir transactional outbox üzerinden çıkar.
  • Riski yansıtan testler. Alan için JUnit, gerçek bir PostgreSQL ve Kafka’ya karşı Testcontainers, her entegrasyon için sözleşme testleri ve işlem hacminin gereksinim olduğu yerde Gatling.
  • İlk commit’ten itibaren gözlemlenebilirlik. Micrometer metrikleri, OpenTelemetry izleri ve korelasyon kimlikleri taşıyan yapılandırılmış loglar; servis trafik almadan önce hazır SLO panoları.
  • Yapılandırılmış dayanıklılık. Dışa giden her çağrıda zaman aşımı, Resilience4j ile devre kesiciler ve bölmeler, hata veren bir bağımlılığı zorlamak yerine jitter’la geri çekilen yeniden denemeler.
  • CI hattında güvenlik. Bağımlılık taraması, SAST, her derleme için bir SBOM ve bir eğitim yazısından kopyalanmış değil, gözden geçirilmiş bir temelden yapılandırılmış Spring Security.
  • Sürümlenmiş şema geçişleri. Flyway veya Liquibase, yalnızca ileri yönlü, canlı ortama benzer bir kopyaya karşı test edilmiş — veritabanı kodla birlikte değişir, ondan önce değil.
  • Bir kez derlenen container’lar. Sabitlenmiş temel katmanlara ve container’ın bellek limitine göre ayarlanmış JVM bayraklarına sahip yeniden üretilebilir imajlar; test ortamından canlı ortama değişmeden terfi eder.
Tipik eşleşmeler

Genellikle yanında teslim edilenler.

  • Güvenlik, doğrulama, izleme, sağlık kontrolleri ve Testcontainers hazır bağlanmış bir Spring Boot servis şablonu
  • Bir registry’de sürümlenmiş şemalara sahip Kafka topic’leri ve kod tabanında transactional outbox deseni
  • Flyway geçişleri ve DBA’in onayladığı bir veritabanı değişiklik süreci
  • İş modernizasyon olduğunda karakterizasyon testleri ve paralel çalıştırma düzeneği
  • Nöbetçi mühendisin, kodu yazan kişi olmadan kullanabileceği runbook’lar, SLO panoları ve JVM tanılama araçları
Birlikte çalışır
Java 21Spring BootSpring KafkaSpring BatchPostgreSQLKafkaDebeziumFlywayTestcontainersResilience4jMicrometerKubernetes
SSS

Sık sorulan sorular

Genellikle önce modüler monolit. Tek bir dağıtılabilir birim içindeki açık modül sınırları, dağıtık bir sistemin operasyonel maliyeti olmadan faydanın büyük kısmını verir — net sahiplik, bağımsız test. Bir modülün gerçek bir gerekçesi olduğunda servisi ayırırız: ayrı ölçeklenme, farklı bir sürüm temposu, farklı bir ekip. Bir diyagram daha güzel göründüğü için değil.
Evet, üstelik çoğu zaman doğru ilk adım budur. Bağımlılıkların envanterini çıkarır, test paketini güvenlik ağı olarak kullanarak adım adım yükseltir ve Spring Boot 3 ile gelen javax-jakarta geçişini yürütürüz. Plan — adımlar, sıra, her adımda neyin test edileceği — iş başlamadan önce yazılır ve sonunda desteklenen bir çalışma zamanına geçmiş olursunuz.
Üreticiler için transactional outbox, olay kimliğine göre anahtarlanmış idempotent tüketiciler ve yalnızca iş alanının gerçekten exactly-once işleme ihtiyaç duyduğu yerde Kafka işlemleri. Her topic’in hangi garantiyi taşıdığını belgeleriz; böylece tüketen ekip tahmin yürütmez.
Öyle olmak zorunda değil. Katmanlı imajlar, güvenli olan yerlerde tembel başlatma, CDS arşivleri ve — soğuk başlangıcın gerçekten önemli olduğu yerlerde — GraalVM yerel imajları, başlangıç süresini kısaltır. Bunu varsaymak yerine sizin ölçeklendirme politikanıza göre ölçeriz.
Evet. Bir denetimle başlarız — sürümler, testler, derleme, gözlemlenebilirlik, güvenlik duruşu — ve bulguları size yazılı olarak veririz. Ardından sizin depolarınızda, sizin CI hattınızda ve sizin gözden geçirme sürecinizde çalışır, ilerledikçe çıtayı yükseltiriz. Baştan yazma, yalnızca denetim bunu gerektirdiğinde önerilir.
İlgili

Komşu teknolojiler ve onları kullanan hizmetler.

Yük altında çalışan sistemler için Java mühendisleri mi arıyorsunuz?

İşin yeni bir işlem servisi mi, bir olay hattı mı yoksa bir modernizasyon mu olduğunu ve ihtiyacınız olan kıdemi bize iletin. İsimleriyle bir ekip önerir ya da uzmanları sizin ekibinize yerleştiririz.

✓ Satış sunumu yok✓ AI-native bir mühendisten yanıt✓ Yazılı geri dönüş