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:
  elastic:
    apm:
      server-url: ${ELASTIC_APM_SERVER_URL:http://hvlapmserver:8200}
      configuration-map:
        enabled: ${ELASTIC_APM_ENABLED:false}
        service_name: ${ELASTIC_APM_SERVICE_NAME:${spring.application.name}}
        application_packages: ${ELASTIC_APM_PACKAGES:tr.com.havelsan}
        environment: ${ELASTIC_APM_ENVIRONMENT:staging}
        cloud_provider: ${ELASTIC_APM_CLOUD_PROVIDER:NONE}
        transaction_ignore_urls: ${ELASTIC_APM_CLOUD_PROVIDER:/actuator/health,/actuator/info}

hvl-infra üzerinden Config Server kullanıldığı durumlarda bootstrap.yml dosyasındaki spring.cloud.config.profile pathine apm değerinin eklenmesi gerekmektedir. Böylece yukarıdaki özelliklerin ve daha fazlasının olduğu application-apm.yml dosyası projeye dahil olacaktır.


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

hvl.elastic.apm.configuration-map.enabled değeri true yapılarak apm tracing sistemi aktif hale getirilebilir. Sistemin düzgün bir şekilde çalışabilmesi için elastic-search uygulaması çalışıyor olmalıdır.

Loglanan metrikleri görüntülemek için Kibana uygulamasındaki APM ekranından konfigürasyonlarının yapılması gerekmektedir.

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:
  tracing:
    include-headers: ${TRACING_INCLUDE_HEADERS:true}
    include-client-info: ${TRACING_INCLUDE_CLIENT_INFO:true}
    include-query-string: ${TRACING_INCLUDE_QUERY_STRING:false}
    include-payload: ${TRACING_INCLUDE_PAYLOAD:true}
    max-payload: ${TRACING_MAX_PAYLOAD:5120}
    method:
      aspect:
        enabled: ${TRACING_METHOD_ASPECT_ENABLED:false}
    redis:
      name: redis
    ignoring-span-name-list:
      - 'http get'
      - 'http put'
      - 'http get /actuator/health'
      - 'http get /actuator/info'
      - 'http get /actuator'
      - 'security filterchain before'
      - 'security filterchain after'
      - 'authorize request'
      - 'secured request'
      - 'info'
      - 'connection'
  httpexchanges:
    recording:
      in-memory-trace:
        capacity: ${IN_MEMORY_TRACE_CAPACITY:100}
        reverse: ${IN_MEMORY_TRACE_REVERSE:true}

javamelody:
  enabled: false
  init-parameters:
    log: true
management:
  httpexchanges:
    recording:
      enabled: ${HTTP_TRACE_ENABLED:true}
  tracing:
    enabled: ${TRACING_ENABLED:false}
    sampling:
      probability: ${TRACING_PROBABILITY:1.0}
  zipkin:
    tracing:
      endpoint: ${ZIPKIN_ENDPOINT:http://hvlzipkin:9411/api/v2/spans}
  prometheus:
    metrics:
      export:
        enabled: ${PROMETHEUS_EXPORTER_ENABLED:false}

hvl-infra üzerinden Config Server kullanıldığı durumlarda bootstrap.yml dosyasındaki spring.cloud.config.profile pathine cloud-tracing ve management değerinin eklenmesi gerekmektedir. Böylece yukarıdaki özelliklerin ve daha fazlasının olduğu application-cloud-tracing.yml ve application-management.yml dosyaları projeye dahil olacaktır.


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

Zipkin#

management.tracing.enabled değeri true yapıldığı durumlarda uygulama management.zipkin.tracing.endpoint değerini kullanarak zipkin uygulamasına metrik göndermeye başlar. Sistemin düzgün olarak çalışabilmesi için elastic-search uygulaması ve zipkin uygulaması çalışıyor olmalıdır.

Java Melody ile Performans İzleme#

JavaMelody'nin amacı QA ve üretim ortamlarında Java veya Java EE uygulamalarını izlemektir. Kullanıcılardan gelen istekleri simüle etmek için bir araç değildir, kullanıcıların uygulamayı kullanımına bağlı olarak uygulamanın gerçek zamanlı çalışmasıyla ilgili istatistikleri ölçmek ve hesaplamak için bir araçtır.

javamelody.enabled değeri varsayılan olarak false gelmektedir. Bu değer true yapıldıktan sonra uygulamanın /monitoring path'i üzerinden java melody sayfasına ulaşılabilir.

Dikkat

Bu uygulama gerçek zamanlı olarak sürekli veri toplama yapacağı için, canlı kurulum ortamlarında ihtiyaç dışında kapalı tutulması tavsiye edilir.