Herkese merhaba, Quarkus serisinin üçüncü yazısı ile karşınızdayız!
Java mikro hizmetleri geliştirilirken genellikle şuna inanılır:
Biraz daha ayrıntılı olarak, Spring geliştiricilerine MicroProfile API'yi günlük çalışmalarında nasıl kullanacaklarını göstermek için öncelikle Quarkus'un Spring API'lerini nasıl desteklediğinin kapsamına ve ayrıntılarına bakacağız. Daha sonra, Spring geliştiricilerinin mikro hizmetler oluştururken yararlı olduğu MicroProfile API'lerini ele alacağız.
Neden Quarkus? Birincisi, bu canlı kodlamadır, yani MicroProfile API, Spring API ve diğer Java API'lerindeki herhangi bir değişikliğin otomatik olarak yeniden yüklenmesidir ve tek bir komutla gerçekleştirilir: mvn quarkus:dev. İkinci olarak, tartışılan
Spring geliştiricilerinin Quarkus'ta Spring API'lerini MicroProfile API'leri ile nasıl kullanabileceklerini anlamalarına yardımcı olmak dışında MicroProfile hakkında ayrıntılara girmeyeceğiz.
Konteynerler ve Kubernetes
Bu makaleyi basit tutmak için burada yalnızca desteğin üst düzey yönlerini ele alacağız.
Kuarkus da
Son olarak, hedef dağıtım ortamı olarak Kubernetes'e odaklanan Quarkus, benzer işlevlerin Kubernetes platformunun kendi düzeyinde uygulandığı durumlarda Java çerçevelerini kullanmaz. Tablo 1, Kubernetes ile Spring geliştiricileri tarafından kullanılan tipik Java çerçeveleri arasındaki işlevsel yazışmanın bir haritasını sunmaktadır.
Tablo 1. Java çerçeveleri ile Kubernetes arasındaki işlevsel yazışmaların haritası.
fonksiyonel
Geleneksel Bahar Çizme
Kubernetes
Hizmet keşfi
Buldum
DNS
yapılandırma
Bahar Bulutu Yapılandırması
Haritaları/Sırları Yapılandırma
Yük dengeleme
Şerit (istemci tarafı)
Hizmet, Çoğaltma Denetleyicisi (sunucu tarafı)
Örnekteki kodun derlenmesi ve çalıştırılması
Bu yazıda bahsettiğimiz
Spring Framework API'leri
Bağımlılık Enjeksiyonu
Quarkus bir dizi desteği destekler
В
Tablo 2. Desteklenen Spring DI API'lerini kullanma örnekleri.
Desteklenen Spring DI Özellikleri
Örnekler
Yapıcı Enjeksiyon
public PersonSpringController(
PersonSpringRepository personRepository, // injected
PersonSpringMPService personService) { // injected
this.personRepository = personRepository;
this.personService = personService;
}
Saha Enjeksiyonu
@Autowired
@RestClient
SalutationRestClient salutationRestClient;
@Value("${fallbackSalutation}")
String fallbackSalutation;
@Yapılandırma
@Configuration
public class AppConfiguration {
@Bean(name = "capitalizeFunction")
public StringFunction capitalizer() {
return String::toUpperCase;
}
}
@Component("noopFunction")
public class NoOpSingleStringFunction implements StringFunction {
@Override
public String apply(String s) {
return s;
}
}
@Service
public class MessageProducer {
@Value("${greeting.message}")
String message;
public String getPrefix() {
return message;
}
}
Web çerçevesi
MicroProfile kullanıcıları Quarkus'un birincil web programlama modeli olarak JAX-RS, MicroProfile Rest Client, JSON-P ve JSON-B'yi desteklemesini seveceklerdir. Spring geliştiricileri Quarkus'un Spring Web API'sine, özellikle de REST arayüzlerine verdiği son destekten memnun kalacaklardır. Spring DI'ye benzer şekilde Spring Web API desteğinin ana amacı, Spring geliştiricilerinin Spring Web API'lerini MicroProfile API'leriyle birlikte kullanmasını sağlamaktır. Desteklenen Spring Web API'lerinin nasıl kullanılacağına ilişkin örnekler Tablo 3'te verilmiştir ve bu konuyla ilgili daha fazla bilgi ve örnekler, Quarkus adlı eğitimde bulunabilir.
Tablo 3. Desteklenen Spring Web API'lerini kullanma örnekleri.
Desteklenen Bahar Web Özellikleri
Örnekler
@RestController
@RequestMapping
@RestController
@RequestMapping("/person")
public class PersonSpringController {
...
...
...
}
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestParam
@RequestHeader
@MatrixVariable
@PathVariable
@CookieValue
@RequestBody
@Yanıt Durumu
@Hayalhanemersin
@RestControllerAdvice (kısmi)
@GetMapping(path = "/greet/{id}",
produces = "text/plain")
public String greetPerson(
@PathVariable(name = "id") long id) {
...
...
...
}
Yay Verileri JPA
MicroProfile kullanıcıları ayrıca Quarkus'un Hibernate ORM kullanarak JPA'yı desteklemesini takdir edeceklerdir. Spring geliştiricileri için de iyi haberler var: Quarkus, yaygın Spring Data JPA ek açıklamalarını ve türlerini destekler. Desteklenen Spring Data JPA API'lerinin kullanımına ilişkin örnekler Tablo 4'te verilmiştir.
В
Tablo 4. Desteklenen Spring Data JPA API'lerini kullanma örnekleri.
Desteklenen Spring Data JPA Özellikleri
Örnekler
Crud Deposu
public interface PersonRepository
extends JpaRepository,
PersonFragment {
...
}
depo
Jpa Deposu
PagingAndSortingRepository
public class PersonRepository extends
Repository {
Person save(Person entity);
Optional findById(Person entity);
}
Depo Parçaları
public interface PersonRepository
extends JpaRepository,
PersonFragment {
...
}
Türetilmiş sorgu yöntemleri
public interface PersonRepository extends CrudRepository {
List findByName(String name);
Person findByNameBySsn(String ssn);
Optional
findByNameBySsnIgnoreCase(String ssn);
Boolean existsBookByYearOfBirthBetween(
Integer start, Integer end);
}
Kullanıcı tanımlı sorgular
public interface MovieRepository
extends CrudRepository {
Movie findFirstByOrderByDurationDesc();
@Query("select m from Movie m where m.rating = ?1")
Iterator findByRating(String rating);
@Query("from Movie where title = ?1")
Movie findByTitle(String title);
}
Mikro Profil API'leri
Hata toleransı
Hata toleransı yapıları, basamaklı arızaların önlenmesi ve güvenilir mikro hizmet mimarilerinin oluşturulması açısından çok önemlidir. Spring geliştiricileri uzun yıllardan beri hata toleransı için devre kesiciler kullanıyor.
Tablo 5. Desteklenen MicroProfile Hata Toleransı API'lerini kullanma örnekleri.
MicroProfile Hata Toleransı Özellikleri
Açıklama
Örnekler
@Eşzamansız
Mantığı ayrı bir iş parçacığında yürütme
@Asynchronous
@Retry
public Future<String> getSalutation() {
...
return future;
}
@Bölme
Eşzamanlı isteklerin sayısını sınırlayın
@Bulkhead(5)
public void fiveConcurrent() {
makeRemoteCall(); //...
}
@Devre kesici
Akıllı arıza yönetimi ve arızalardan kurtarma
@CircuitBreaker(delay=500 // milliseconds
failureRatio = .75,
requestVolumeThreshold = 20,
successThreshold = 5)
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
@Geri çekilmek
Arıza durumunda alternatif mantığın çağrılması
@Timeout(500) // milliseconds
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
public String fallback() {
return "hello";
}
İstek hatası üzerine yeniden deneme
@Retry(maxRetries=3)
public String getSalutation() {
makeRemoteCall(); //...
}
Arıza kontrolü zaman aşımı
@Timeout(value = 500 ) // milliseconds
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
Hizmetleri kontrol etme (Hizmet Sağlığı)
Kubernetes platformları, özel hizmetleri kullanarak konteynerlerin durumunu izler. Temel platformun hizmetleri izlemesine izin vermek için Spring geliştiricileri genellikle özel bir HealthIndicator ve Spring Boot Actuator kullanır. Quarkus'ta bu, varsayılan olarak bir canlılık kontrolü gerçekleştiren ancak aynı anda canlılığı ve hazırlığı kontrol edecek şekilde yapılandırılabilen MicroProfile Health kullanılarak yapılabilir. Desteklenen MicroProfile Health API'lerinin nasıl kullanılacağına ilişkin örnekler Tablo 6'da verilmiştir ve ek bilgiler Quarkus kılavuzunda sağlanmaktadır.
Tablo 6: Desteklenen MicroProfile Health API'lerinin kullanım örnekleri.
MicroProfile Sağlık özellikleri
Açıklama
Örnekler
@canlılık
Platform, başarısız konteynerleştirilmiş uygulamaları yeniden başlatır
Son nokta:
ana bilgisayar:8080/sağlık/canlı
@Liveness
public class MyHC implements HealthCheck {
public HealthCheckResponse call() {
...
return HealthCheckResponse
.named("myHCProbe")
.status(ready ? true:false)
.withData("mydata", data)
.build();
}
@Hazırlık
Platform hazır değilse konteynerli uygulamalara trafik göndermez
Son nokta:
ana bilgisayar:8080/sağlık/hazır
@Readiness
public class MyHC implements HealthCheck {
public HealthCheckResponse call() {
...
return HealthCheckResponse
.named("myHCProbe")
.status(live ? true:false)
.withData("mydata", data)
.build();
}
Metrikler
Uygulamalar, operasyonel amaçlara (performans SLA'larını izlemek için) veya operasyonel olmayan amaçlara (iş SLA'ları) yönelik ölçümler sağlar. Spring geliştiricileri, Spring Boot Actuator ve Micrometer'ı kullanarak ölçümler sağlar. Buna karşılık Quarkus, temel ölçümleri (JVM ve işletim sistemi), satıcı ölçümlerini (Quarkus) ve uygulama ölçümlerini sağlamak için MicroProfile Metrics'i kullanır. MicroProfile Metrics, uygulamanın JSON ve OpenMetrics (Prometheus) çıktı formatlarını desteklemesini gerektirir. MicroProfile Metrics API'nin kullanımına ilişkin örnekler Tablo 7'de verilmiştir.
В
Tablo 7. MicroProfile Metrics API'lerini kullanma örnekleri.
Mikro Profil Metrikleri Özellikleri
Açıklama
Örnekler
@Sayıldı
Açıklamalı bir nesnenin kaç kez çağrıldığını sayan bir sayaç sayacını belirtir
@Counted(name = "fallbackCounter",
displayName = "Fallback Counter",
description = "Fallback Counter")
public String salutationFallback() {
return fallbackSalutation;
}
@ConcurrentGauge
Açıklamalı bir nesneye yapılan eşzamanlı çağrıların sayısını sayan bir ölçeri belirtir
@ConcurrentGuage(
name = "fallbackConcurrentGauge",
displayName="Fallback Concurrent",
description="Fallback Concurrent")
public String salutationFallback() {
return fallbackSalutation;
}
@Gösterge
Açıklamalı bir nesnenin değerini ölçen bir gösterge sensörünü belirtir
@Metered(name = "FallbackGauge",
displayName="Fallback Gauge",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
@Ölçülü
Açıklamalı bir nesnenin çağrı sıklığını izleyen bir ölçüm sensörünü belirtir
@Metered(name = "MeteredFallback",
displayName="Metered Fallback",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
Bir metrik girmek veya üretmek için bir istek alındığında meta veriler hakkında bilgi içeren bir ek açıklama
@Metric
@Metered(name = "MeteredFallback",
displayName="Metered Fallback",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
Açıklamalı bir nesnenin süresini izleyen bir zamanlayıcıyı belirtir
@Timed(name = "TimedFallback",
displayName="Timed Fallback",
description="Fallback delay")
public String salutationFallback() {
return fallbackSalutation;
}
Metrik Uç Noktaları
Uygulama metrikleri
Temel metrikler
Satıcı metrikleri
Tüm metrikler
MicroProfile Dinlenme İstemcisi
Mikro hizmetler genellikle ilgili istemci API'lerinin birlikte çalışmasını gerektiren RESTful uç noktalar sağlar. RESTful uç noktalarını kullanmak için Spring geliştiricileri genellikle RestTemplate'i kullanır. Quarkus, bu sorunu çözmek için, kullanım örnekleri Tablo 8'de verilen MicroProfile Rest Client API'lerini sunmaktadır.
В
Tablo 8. MicroProfile Rest Client API'lerini kullanma örnekleri.
MicroProfile Rest İstemci Özellikleri
Açıklama
Örnekler
@RegisterRestClient
Yazılan bir Java arayüzünü REST istemcisi olarak kaydeder
@RegisterRestClient
@Path("/")
public interface MyRestClient {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getSalutation();
}
@RestClient
Yazılan bir REST istemci arayüzü örneğinin uygulanmasını işaretler
@Autowired // or @Inject
@RestClient
MyRestClient restClient;
Çağırma
Bir REST uç noktasını çağırır
System.out.println(
restClient.getSalutation());
mp-dinlenme/url
REST uç noktasını belirtir
application.properties:
org.example.MyRestClient/mp-rest/url=
http://localhost:8081/myendpoint
sonuçlar
Öncelikle Spring geliştiricilerini hedef alan bu blogda, Java mikro hizmetlerini geliştirmek için Spring API'lerini Quarkus'taki MicroProfile API'leri ile nasıl kullanacağımıza ve ardından bunları yüzlerce megabayt RAM'den tasarruf eden ve başlatılan yerel ikili kodda nasıl derleyeceğimize hızlıca bir göz attık. milisaniyelik bir mesele.
Zaten anladığınız gibi, Spring ve MicroProfile API'lerine yönelik destek hakkında daha fazla bilginin yanı sıra diğer birçok yararlı bilgiyi şu adreste bulabilirsiniz:
Kaynak: habr.com