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