Ana içeriğe geç

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.


drawing Nasıl konfigure edilir?

hvl-infra altında bulunan 'application-apm.yml' dosyasıyla konfigure edilebilmektedir.


drawing Uygulamaya nasıl eklenir?
group: 'tr.com.havelsan.framework.support', name: 'hvl-apm-support'

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.


drawing Nasıl konfigure edilir?

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.

databaseChangeLog:
  - include:
      file: liquibase/hvl-batch-support-changelog/changelog-root.yaml

drawing Uygulamaya nasıl eklenir?
group: 'tr.com.havelsan.framework.support', name: 'hvl-batch-support'

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);

}

drawing Nasıl konfigure edilir?
hvl:
  file-system:
    resourcePath: /[path]

Yapılacak dosya işlemleri resourcePath'e verilen path üzerinde gerçekleştirilir.


drawing Uygulamaya nasıl eklenir?
group: 'tr.com.havelsan.framework.support', name: 'hvl-fs-support'

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.


drawing Nasıl konfigure edilir?

hvl-infra altında bulunan 'application-hvl-mail.yml' dosyasıyla konfigure edilebilmektedir.


drawing Uygulamaya nasıl eklenir?
group: 'tr.com.havelsan.framework.support', name: 'hvl-mail-support'

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.


drawing Uygulamaya nasıl eklenir?
group: 'tr.com.havelsan.framework.support', name: 'hvl-micrometer-prometheus-support'

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

drawing Nasıl konfigure edilir?

hvl-infra altında bulunan 'application-hvl-multi-tenancy.yml' dosyasıyla konfigure edilebilmektedir.


drawing Uygulamaya nasıl eklenir?
group: 'tr.com.havelsan.framework.support', name: 'hvl-multi-tenancy-support'

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.


drawing Nasıl konfigure edilir?

hvl-infra altında bulunan 'application-cloud-tracing.yml' dosyasıyla konfigure edilebilmektedir.


drawing Uygulamaya nasıl eklenir?
group: 'tr.com.havelsan.framework.support', name: 'hvl-tracing-support'