1.9. Support#
Uygulama mimarisinde ihtiyaç duyulan destek paketlerini içeren altyapı bileşenidir.
- Elasticsearch Apm Support
- Spring Batch
- File System
- Mail Sender
- Micrometer Prometheus
- Multitenancy
- Tracing
Apm Support#
EKSEN, bu bileşen ile APM agentlarını instance içerisine ekleyerek Elasticsearch - APM entegrasyonu desteği sağlamaktadır.
hvl-infra altında bulunan 'application-apm.yml' dosyasıyla konfigure edilebilmektedir.
Batch Support#
Kurumsal sistemlerin günlük operasyonları için hayati önem taşıyan güçlü toplu uygulamaların geliştirilmesini sağlamak üzere tasarlanmış hafif ve kapsamlı bir altyapı bileşenidir.
Spring Batch, günlüğe kaydetme/izleme, işlem yönetimi, iş işleme istatistikleri, işi yeniden başlatma, atlama ve kaynak yönetimi dahil olmak üzere büyük hacimli kayıtların işlenmesinde gerekli olan yeniden kullanılabilir işlevler sağlar. Ayrıca, optimizasyon ve bölümleme teknikleri yoluyla son derece yüksek hacimli ve yüksek performanslı toplu işleri mümkün kılacak daha gelişmiş teknik hizmetler ve özellikler de sağlar. Basit ve aynı zamanda karmaşık, yüksek hacimli toplu işler, önemli miktarda bilgiyi işlemek için yüksek düzeyde ölçeklenebilir bir şekilde kullanabilir.
hvl-infra altında bulunan 'application-batch.yml' dosyasıyla konfigure edilebilmektedir.
Tablo İlklendirme#
Spring batch, veritabanındaki kendine ait tablolar vasıtasıyla çalışmaktadır. Bu kapsamda hvl-batch-support kütüphanesinden liquibase desteği sağlanmaktadır. Aşağıdaki şekilde liquibase scripti basitçe liqubase yaml dosyalarına eklenebilir.
Temel olarak job, step, reader, processor ve writer beanleri tanımlanmalıdır. Yapılacak işleme göre farklı tanımlamalara ihtiyaç duyulabilir. Aşağıdaki örnekte veritabanından okunan verinin kafkaya yazılması örneği bulunmaktadır.
@Bean
public Job simpleJob(Step simpleStep) {
return new JobBuilder(JOB_NAME, jobRepository)
.start(simpleStep)
.build();
}
@Bean
public Step simpleStep(PlatformTransactionManager transactionManager,
ItemReader<HvlBatchSimplePersonEntity> simplePersonItemReader,
ItemProcessor<HvlBatchSimplePersonEntity, HvlBatchSimplePersonKafkaModel> simplePersonItemProcessor,
ObjectProvider<ItemWriter<HvlBatchSimplePersonKafkaModel>> kafkaItemWriter) {
return new StepBuilder("simple_step", jobRepository)
.<HvlBatchSimplePersonEntity, HvlBatchSimplePersonKafkaModel>chunk(10, transactionManager)
.reader(simplePersonItemReader) //read data
.processor(simplePersonItemProcessor) // process data
.writer(Objects.requireNonNull(kafkaItemWriter.getIfAvailable(), "Item writer bean cannot be null!")) //write to kafka
.allowStartIfComplete(true)
.build();
}
@Bean
public ItemReader<HvlBatchSimplePersonEntity> simplePersonItemReader(HvlBatchSimplePersonRepository simplePersonRepository) {
return new RepositoryItemReaderBuilder<HvlBatchSimplePersonEntity>()
.name("simple_person_item_reader")
.pageSize(100)
.repository(simplePersonRepository)
.methodName("findAll")
.sorts(Map.of("id", Sort.Direction.ASC))
.build();
}
@Bean
public ItemProcessor<HvlBatchSimplePersonEntity, HvlBatchSimplePersonKafkaModel> simplePersonItemProcessor() {
return item -> {
System.out.printf("Processing item %s", item);
final HvlBatchSimplePersonKafkaModel simplePersonKafkaModel = new HvlBatchSimplePersonKafkaModel();
simplePersonKafkaModel.setName(item.getName());
simplePersonKafkaModel.setSurname(item.getSurname());
return simplePersonKafkaModel;
};
}
@Bean
public ItemWriter<HvlBatchSimplePersonKafkaModel> kafkaItemWriter(
KafkaTemplate<String, HvlBatchSimplePersonKafkaModel> kafkaTemplate) {
kafkaTemplate.setDefaultTopic("my-simple-person-topic");
return new KafkaItemWriterBuilder<String, HvlBatchSimplePersonKafkaModel>()
.itemKeyMapper(source -> null)
.kafkaTemplate(kafkaTemplate)
.build();
}
Tanımlanan job'ı çalıştırmak için ise JobLauncher kullanılmaktadır. Aşağıda basit bir örnek verilmiştir.
final JobLauncher jobLauncher = applicationContext.getBean(JobLauncher.class);
final Job simpleJob = applicationContext.getBean(Job.class);
try {
jobLauncher.run(simpleJob, new JobParameters());
} catch (JobRestartException e) {
throw new RuntimeException(e);
} catch (JobInstanceAlreadyCompleteException e) {
throw new RuntimeException(e);
} catch (JobExecutionAlreadyRunningException e) {
throw new RuntimeException(e);
} catch (JobParametersInvalidException e) {
throw new RuntimeException(e);
}
Daha detaylı örneklere hvl-javalt-samples altindaki projelerden ulaşılabilir. Simple proje yukarıdaki örneğin detaylı halidir. Jdbc projesi ise csv uzantılı bir dosyadan veri okuyup veritabanına yazan bir örnek projedir.
File System Support#
Belirli bir path üzerinde dosya işlemleri yapmak için sağlanan bileşendir. HvlFileSystemResourceService
sınıfı kullanılarak işlemler yapılmaktadır.
public interface HvlFileSystemResourceService {
void persistDocument(InputStream document, HvlFileSystemInfoModel resourcePersisterInfo) throws HvlFileSystemException;
void deleteDocument(HvlFileSystemInfoModel resourcePersisterInfo) throws HvlFileSystemException;
InputStream readDocument(HvlFileSystemInfoModel resourcePersisterInfo) throws HvlFileSystemException;
String getDocumentName(HvlFileSystemResourcePathStrategy hvlFileSystemResourcePathStrategy);
}
Yapılacak dosya işlemleri resourcePath'e verilen path üzerinde gerçekleştirilir.
Mail Support#
EKSEN, mail atmak için gerekli altyapıyı sağlamaktadır. Başlıca yetenekler:
- Fake mail: Geliştirme ortamları için tüm maillerin sahte bir adrese yönlendirilmesi yapılabilir. Böylece tek bir mail adresi hesabından tüm mailler kontrol edilebilir.
- Html mail desteği
- Takvim/Toplantı davetli mail desteği
- Ekli mail gönderme desteği
Ek olarak mail template'leri ile daha kompleks mailler atılmak isteniyorsa EKSEN tarafından sağlanan ve EKSEN altyapısını kullanan Notification ürünü incelenebilir.
hvl-infra altında bulunan 'application-hvl-mail.yml' dosyasıyla konfigure edilebilmektedir.
Micrometer Prometheus Support#
EKSEN, micrometer kütüphanelerini kullanarak prometheus'a veri basılmasını sağlamaktadır. Böylece Grafana gibi monitoring uygulamaları kullanılarak uygulamalar hakkında detaylı bilgi edinilebilmektedir.
Multi Tenancy Support#
EKSEN, aynı uygulama üzerinden farklı müşterilere destek verilmesi durumları için multi tenancy support bileşenini sağlamaktadır. Bu bileşen ile aşağıdaki türlerde tenancy sağlanabilmektedir.
- Veritabanı
- Veritabanı Şeması
- Veritabanı Tablo Kolonu
- Gateway
Veritabanı düzeylerinden birinde multi tenancy yapılmak istendiğinde aşağıdaki entity sınıfları kullanılmalıdır:
- HvlHardDeleteTenantEntity
- HvlLookupTenantEntity
- HvlSimpleTenantEntity
- HvlSoftDeleteTenantEntity
hvl-infra altında bulunan 'application-hvl-multi-tenancy.yml' dosyasıyla konfigure edilebilmektedir.
Tracing Support#
EKSEN, cloud ortamlar için tracing yapabilmek amacıyla Micrometer ve Brave desteği sağlamaktadır. Bu teknolojiler kullanılarak, instancelar arasındaki network izlenebilir ve requestlerin hangi uygulamalardan geçtiği gözlenebilir. Monitoring tool olarak Zipkin kullanılarak uygulamalar arası network izlenebilir.
Sağlanan @HvlTraceLog
anotasyonu ile çalışan methodların da trace edilmesi sağlanmaktadır. Takip edilmek istenen methodların tepesine eklenmesi gerekmektedir.
Konsol log seviyesi trace yapılarak request ve response'lar detaylı olarak görülebilmektedir.
hvl-infra altında bulunan 'application-cloud-tracing.yml' dosyasıyla konfigure edilebilmektedir.