Büyütme Camının Altında Mikroprofile, Bölüm 1: API Yapılandır
Eclipse-mikroprofile projesi, kurumsal-Java ortamındaki mikro hizmetler için taşınabilir bir çözüm sağlamaya başladı. Yeni arılar, Java EE standardı ile mikro hizmet mimarisinin pratik gereksinimleri arasındaki boşluğu doldurmalıdır.
Mikro hizmetler ve Java EE (aka EE4J)? Gerçekten uymuyor! En azından Java-Enterprise standardına dayalı mikro hizmet uygulamalarının uygulanması söz konusu olduğunda popüler görüş. JAX-GRS, CDI, JPA ve JSON-P ile Java EE, artık pirinç mikro hizmetleri uygulamak için ihtiyacınız olan her şeyi sunar. Ve mesajlara veya olaylara dayanan asenkron hizmetler, JMS, web sitesi ve etkinlikler-sunucu-Semen (Java EE 8'den) sayesinde bazı kod satırlarıyla da yapılabilir. Peki sorun nerede?
Mikro hizmet uygulamaları genellikle süreçlerinde performans gösteren çeşitli hizmetlerin birbirleriyle etkileşime girmesi ve dolayısıyla büyük bir bütün haline dönüşmesi ile karakterizedir. Bu hizmetlerin kaplarda ve bulut dağılımında paketlenmesi nadir değildir. Sonuç olarak, son derece dinamik ve güçlü dağıtılmış bir sistemle uğraşıyoruz.
Bu nedenle gerçek zorluk, tüm hizmetin düzenli etkileşiminin gerçekleştirilmesinde olduğu gibi, tek bir hizmetin (profesyonel) mantığının uygulanmasında daha azdır. Ve tam olarak Java EE'nin sorunun veya zayıf noktası bulunur. Çünkü Java EE, bireysel eserlerin – bu durumda hizmetlerin – içeride olmasını amaçlamaktadır. A Uygulama sunucusu, yapılandırma, izleme, kayıt, güvenlik ve cetera gibi bu tam hizmetlerin (çapraz endişeler) varsayabileceği şekilde dağıtılacaktır. Sunucu düşerse veya her biri mikro hizmetini yöneten kendinden yeterli sunucunun birkaç örneği varsa, koordinasyon kontrol merkezi eksiktir.
Tam olarak bu kusur aynı zamanda bir dizi uygulama sunucusu sağlayıcıyı tanıdı ve 2016 yılında Micropro-Rumor girişimini başlattı. Şu anda Eclipse Foundation'a dayanan girişim, Java-Enterprise standardı ile mikro hizmetlere dayanan mimarinin pratik gereksinimleri arasındaki boşluğu doldurmaya başladı. İfadelerinize göre, Java topluluğunun mevcut momentumunu ve bir kaldıraç olarak ve organik olarak mikro hizmet topluluğunun ihtiyacına katkıda bulunmak istiyorsunuz. Plan yükseliyor gibi görünüyor. Birkaç ay içinde, mikro hizmetlerle ilgili bir dizi hassas arı APIS Java-ee-7/8 ile birleştirilmiştir ve bunları mevcut mikropro-philos sürümlerinde yayınlamıştır. Sağlık kontrolü, metrikler, başarısızlık toleransı, JWT yayılımı, konfigürasyon, eser veya açık arılar olması, mikropro -philos'un bagajda doğru cevaplara – yani arılara – sahip olduğu görülmektedir.
Bu blog yazısı, mikro hizmete özgü mikropro -Philos API ile ilgilenen küçük bir dizinin ilk kısmıdır. Yani belirli Java EE'nin bir parçası olmayan arılar. Sadece birkaç gün önce 1.2 sürümünde yayınlanan yapılandırma arıları ile başlar.
Yapılandırmanın küçük çarpma tablosu fipas
Mantığı ayırma fikri ve uygulamanın yapılandırması gerçekten yeni değil. Dış kaynak kullanımındaki bir konfigürasyon yardımıyla, uygulama veya hizmet dışarıdan ilgili sabit dönemi ortama uyarlanabilir. Yerel test ortamı için, örneğin, test kodunda belirtilen ayarlar kullanılırken, konteynerin buluttaki bir kap içindeki üretken bir ortamda yürütme süresi yapılandırma için gerekli değerleri ayarlar.
Basit görünen, pratikte beklenmedik zorluklara yol açabilir. Bir uygulama veya hizmet yapılandırmaya yönelik ayrı değerler genellikle sistem özellikleri, çevresel değişkenler, dosyalar, veritabanları veya tescilli yapılandırma kaynakları gibi farklı kaynaklardan gelir. Değerlerin sıklıkla depolandığı biçim düzgün değildir ve genellikle uygulama veya hizmet içindeki yapılandırma değerlerinin kullanılması gereken nesne biçimine karşılık gelmez. Statik konfigürasyon değerlerinin başlangıcında bir kez yüklemek yeterli olsa da, dinamik değerler öznelikleri için kalıcı olarak kontrol edilmeli ve gerekirse tekrar yeniden canlandırmalıdır. Ve elbette bir uygulama, bir yapılandırma bulmak mümkün olmasa bile makul bir şekilde çalışmalıdır.
Mikro -övgü konfigürasyonu arılar (bundan böyle aşağıdaki yapılandırma arılarının altında) tüm bu yönleri ve daha fazlasını dikkate alır. Çeşitli yapılandırma kaynaklarına standart erişim sunar. Bireysel kaynaklara öncelik verilebilir, böylece konfigürasyonların hedefli bir şekilde üzerine yazılması mümkündür. Yapılandırma arıları üç farklı kaynak bilir:
- VIA sisteminin özellikleri System.getProperties () ()Sıralı = 400)
- Çevresel değişkenler System.getev () (Sıralı = 300)
- Yerel yapılandırma dosyaları Meta-Inf/Microvele-Config.Properties (Sıralı = 100)
Ve “aksiyon” …
Yapılandırma arıları, arka planda yönetilen yapılandırmalara erişmek için iki farklı yol sunar. Bir yandan, diğer yandan CDI enjeksiyonu yoluyla programlama düzeyinde erişim yapılabilir.
Programlı erişim, yapılandırma sınıfı için bir uygulama kullanılarak gerçekleşir, bu da en basit durumda Rahatlık Oluşturulabilir:
// get access to the Config instance via ConfigProvider
Config config = ConfigProvider.getConfig();
// access config properties via Config instance
String someStringValue = config.getValue("SOME_STRING_KEY", String.class);
Boolean someBooleanValue = config.getValue("SOME_BOOL_KEY", Boolean.class);
Yapılandırma isteğinin oluşturulması sırasında daha fazla etkiye sahip olmak istiyorsanız, Rahatlık birinde Configuilder kullanılabilir. Üretici bir veya diğer bireysel düzenlemeye izin verir. Yukarıda gösterilen kod biriyle olacaktır Configuilder Görünüşe göre:
// get access to the Config instance via ConfigBuilder
ConfigBuilder builder = ConfigProviderResolver.getBuilder();
builder.addDefaultSources();
Config config = builder.build();
// access config properties via Config instance
String someStringValue = config.getValue("SOME_STRING_KEY", String.class);
Boolean someBooleanValue = config.getValue("SOME_BOOL_KEY", Boolean.class);
Not: Kullanırken Rahatlık Eğer GetConfig ()-Methodi Verimlilik nedeniyle otomatik olarak döndürülen yapılandırma isteği tarafından döndürüldü. Bu, kullandığında Configuilder veya ConftoctionResolver Durum böyle değil.
Seviyeye gösterilen programatik erişim CDI enjeksiyonudur:
@Inject @ConfigProperty("SOME_STRING_KEY")
String someStringValue;
@Inject @ConfigProperty("SOME_BOOL_KEY")
String someBooleanValue;
Ancak aradığınız anahtar yapılandırma kaynaklarının hiçbirinde bulunamazsa ne olur? Yukarıdaki örnekte, bu otomatik olarak bir istisnaya yol açacaktır. İlk örnekte, programatik erişim bir Nossuche unsurlarının genişlemesi yürütme aşamasında. İkinci örnekte, diğer taraftan, CDI enjeksiyonu durumunda, bunu yaparsınız Dağıtım hariç başlangıç sırasında başlatılacak.
İsteğe bağlı yapılandırma
Bir yapılandırma isteğe bağlı olması gerekiyorsa, örneğin yalnızca özel ortamlardaki standart değerlerin üzerine yazmak için, ancak diğerlerinde de değil, gösterilen her iki erişim mekanizması için de mümkündür. Programlı erişim durumunda, bu aşağıdakileri takip ediyor:
// get access to the Config instance
Config config = ConfigProvider.getConfig();
// access optional string property
String someStringValue = config.getOptionalValue("SOME_KEY", String.class)
.orElse("someDefaultValue");
CDI enjeksiyonuna, diğer taraftan, doğru tipin önceden tanımlanmış basit değeri yeterlidir:
// inject optional property
@Inject @ConfigProperty("SOME_KEY", defaultValue="someDefaultValue")
String someValue;
Tam zamanında yapılandırma
Mikro hizmetlere dayalı uygulamalar, bireysel hizmetlerin yeniden başlatılmasını kolayca hayatta kalacak şekilde tasarlansa bile, bir hizmeti yalnızca bir yapılandırmanın değeri değiştiği için her seferinde yeniden başlatmak kesinlikle mantıklı değildir. Bu nedenle, yapılandırma arıları, kullanım sırasında yapılandırma değerlerini dinamik olarak yüklemek için bir mekanizma içerir.
Tabii ki, yapılandırma kaynağının savaş dağıtım özellikleri dosyasıyla birlikte olması durumunda bu çok az mantıklı. Bir veritabanı veya bir yapılandırma sunucusu kaynak olarak bağlanırsa durum farklıdır.
Bir mülkün kullanıldığı sırada enjeksiyon sırasında değeri değil, her zaman mevcut değerini elde etmek için, konfigürasyon yerine bir sağlayıcı enjekte edilmelidir. Sağlayıcının yardımıyla ve onun Elde etmek ()-Method bu nedenle tam zamanında bir yapılandırma olabilir.
// inject property provider
@Inject @ConfigProperty("SOME_KEY")
Provider<String> someValueProvider;
...
// get property value "just-in-time" via provider
String someValue = someValueProvider.get();
Bu durumda, “tam zamanında” terimi nispeten görülebilir ve yalnızca şu anda yapılandırma kaynağında arşivlenen değer. Kaynak, değerleri nasıl güncelliyor ve üzerinde bir güncelleme gerçekleştirildiğinde belirtilmiyor ve bu nedenle yazarı KonfigürasyonSol sınıf. Örneğin OpenLiberty'nin uygulanması MicroProfile.config.Refresh.Rate Yapılandırma kaynakları için. Varsayılan değer 500 (MS) 'dır, böylece bir güncelleme gerekirse her yarım saniyede gerçekleşir.
Dönüştürücü
İlk örnekte gösterildiği gibi, yapılandırma arıları sadece türün sahip olma türünü desteklemekle kalmaz. Halat. SO -Called Converter sayesinde, yapılandırma kaynaklarında depolanan dizenin değerleri her tür Java'ya aktarılabilir.
Sözde oluşturma dönüştürücü zaten bir dizi Java türü için mevcuttur. Şimdiye kadar gösterilen türlere ek olarak Halat VE Boole Diğer şeylerin yanı sıra Bütün,, Uzun,, Çift,, Yüzer ilave olarak Süre,, Yerel,, Yerel tarih,, Yerel,, Ani VE Url “Kutunun dışında” desteklendi. Ve dizinin kullanımı 1.2 sürümünden de mümkün oldu:
// injection list property via array converter
@Inject @ConfigProperty("SOME_LIST_KEY")
private List<String> someListValues;
...
// get access to the Config instance via ConfigProvider
Config config = ConfigProvider.getConfig();
// access config properties via Config instance
private String[] someArrayValues =
config.getValue("SOME_ARRAY_KEY", String[].class);
Ancak desteklenmezse veya veri türleriniz yapılandırma arılarıyla ayarlanmalıdır? Bu durumda belirli bir kişiselleştirilmiş dönüştürücü yapabilirsiniz. Dönüştürücü -Uygulanan arayüzde kullanın. Aşağıdaki örnek, bir sınıf için basit bir dönüştürücü göstermektedir. E-posta:
@Priority(200)
public class EmailConverter implements Converter<Email> {
@Override
public Email convert(String email) throws IllegalArgumentException {
return new Email(email);
}
}
Dönüştürücünün yürütme sırasında otomatik olarak kullanılabilmesi için de kaydedilmelidir. Bu, Java Servisiterocars aracılığıyla yapılabilir – karşılık gelen bir dosyada dönüştürücünün tamamen nitelikli sınıf adını belirtmek Meta-Inf/Services/org.eclipse.microprofile.config.spi.converter – Olmak veya alternatif olarak dosyayı kullanarak Configuilder:
// get access to the Config instance via ConfigBuilder
ConfigBuilder builder = ConfigProviderResolver.getBuilder();
builder.addDefaultSources();
// add custom converter for Email class
Converter<Email> emailConverter = new EmailConverter();
builder.withConverters(emailConverter);
Config config = builder.build();
// read email property into email object
Optional<Email> emailOpt = config.getOptionalValue("ADMIN_EMAIL",
Email.class);
...
Listesi gibi E -posta ile göndermek Dönüştürücü de bir önceliğe sahip olabilir. Dolayısıyla, aynı tip için birkaç dönüştürücü kaydedilirse, dönüştürücü en yüksek önceliğe sahip daha düşük önceliğe sahip olanların üzerine yazar. Varsayılan değer 100'dür.
Çözüm
Sonuç olarak, yapılandırma arıları yuvarlak bir izlenim bırakıyor, bu da API'nın kökenlerine daha yakından bakarsanız gerçekten şaşırtıcı değil:
Arıları denemek için küçük bir arzunuz varsa, aşağıdaki uygulamaları yapabilirsiniz:
Gelecek için zaten başka özellikler öngörülüyor. Temel bir amaç, dinamik destek konfigürasyonunda daha iyi değişiklikler olacaktır. Heyecanlı olabilirsin.
()