Hammaga salom, Quarkus turkumidagi uchinchi post!
Java mikroservislarini ishlab chiqishda ko'pincha bunga ishonishadi
Biroz batafsilroq, biz Spring dasturchilariga MicroProfile API-dan kundalik ishlarida qanday foydalanishni ko'rsatish uchun Quarkus Spring API-larni qanday qo'llab-quvvatlashini ko'rib chiqamiz. Keyin biz mikroservislarni yaratishda Spring dasturchilari uchun foydali bo'lgan MicroProfile API-larini ko'rib chiqamiz.
Nega Quarkus? Birinchidan, bu jonli kodlash, ya'ni MicroProfile API, Spring API va boshqa Java API-lardagi har qanday o'zgarishlarni avtomatik ravishda qayta yuklash, bu faqat bitta buyruq bilan amalga oshiriladi: mvn quarkus:dev. Ikkinchidan, muhokama qilingan
Biz MicroProfile haqida batafsil ma'lumot bermaymiz, faqat Spring dasturchilariga Quarkusdagi MicroProfile API bilan Spring API'laridan qanday foydalanishlari mumkinligini tushunishga yordam berishdan tashqari.
Konteynerlar va Kubernetlar
Ushbu maqolani sodda saqlash uchun biz bu yerda faqat yuqori darajadagi qo‘llab-quvvatlash jihatlarini yoritamiz.
Kvarkus ham
Va nihoyat, Kubernetes-ga maqsadli joylashtirish muhiti sifatida e'tibor qaratib, Quarkus shunga o'xshash funksiya Kubernetes platformasining o'zi darajasida amalga oshirilgan hollarda Java ramkalaridan foydalanmaydi. 1-jadvalda Kubernetes va Spring dasturchilari tomonidan ishlatiladigan odatiy Java ramkalar o'rtasidagi funktsional yozishmalar xaritasi keltirilgan.
Jadval 1. Java ramkalari va Kubernetes o'rtasidagi funktsional yozishmalar xaritasi.
Funktsionallik
An'anaviy bahor etik
Kubernetes
Xizmat kashfiyoti
Eureka
DNS
konfiguratsiya
Spring Cloud konfiguratsiyasi
Xaritalar/sirlarni sozlash
Yuklarni muvozanatlash
Lenta (mijoz tomoni)
Xizmat, replikatsiya tekshiruvi (server tomoni)
Misoldagi kodni kompilyatsiya qilish va ishga tushirish
Ushbu maqolada biz havola qilamiz
Spring Framework API
Qarama-qarshi in'ektsiya
Quarkus bir qator qo'llab-quvvatlaydi
В
Jadval 2. Qo'llab-quvvatlanadigan Spring DI API-laridan foydalanishga misollar.
Qo'llab-quvvatlanadigan Spring DI xususiyatlari
misollar
Konstruktor in'ektsiyasi
public PersonSpringController(
PersonSpringRepository personRepository, // injected
PersonSpringMPService personService) { // injected
this.personRepository = personRepository;
this.personService = personService;
}
Dala in'ektsiyasi
@Autowired
@RestClient
SalutationRestClient salutationRestClient;
@Value("${fallbackSalutation}")
String fallbackSalutation;
@Konfiguratsiya
@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;
}
}
Veb-ramka
MicroProfile foydalanuvchilari Quarkus JAX-RS, MicroProfile Rest Client, JSON-P va JSON-B-ni asosiy veb-dasturlash modeli sifatida qo'llab-quvvatlashini yaxshi ko'radilar. Bahor ishlab chiquvchilari Quarkusning Spring Web API-ni, xususan, REST interfeyslarini qo'llab-quvvatlashidan mamnun bo'lishadi. Spring DI-ga o'xshab, Spring Web API-ni qo'llab-quvvatlashning asosiy maqsadi Spring ishlab chiquvchilariga Spring Web API-larini MicroProfile API-lari bilan birgalikda ishlatish imkonini berishdir. Qo'llab-quvvatlanadigan Spring Web API-dan qanday foydalanishga misollar 3-jadvalda keltirilgan va ushbu mavzu bo'yicha qo'shimcha ma'lumot va misollarni Quarkus qo'llanmasida topishingiz mumkin.
Jadval 3. Qo'llab-quvvatlanadigan Spring Web API-dan foydalanishga misollar.
Qo'llab-quvvatlanadigan Spring veb xususiyatlari
misollar
@RestController
@RequestMapping
@RestController
@RequestMapping("/person")
public class PersonSpringController {
...
...
...
}
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestParam
@RequestHeader
@MatrixVariable
@PathVariable
@CookieValue
@RequestBody
@ResponseStatus
@ExceptionHandler
@RestControllerAdvice (qisman)
@GetMapping(path = "/greet/{id}",
produces = "text/plain")
public String greetPerson(
@PathVariable(name = "id") long id) {
...
...
...
}
Spring DataJPA
MicroProfile foydalanuvchilari Quarkusning Hibernate ORM-dan foydalangan holda JPA-ni qo'llab-quvvatlashini ham qadrlashadi. Bahor ishlab chiquvchilari uchun yaxshi yangilik ham bor: Quarkus umumiy Spring Data JPA izohlari va turlarini qo'llab-quvvatlaydi. Qo'llab-quvvatlanadigan Spring Data JPA API-laridan foydalanish misollari 4-jadvalda keltirilgan.
В
Jadval 4. Qo'llab-quvvatlanadigan Spring Data JPA API-laridan foydalanishga misollar.
Qo'llab-quvvatlanadigan Spring Data JPA xususiyatlari
misollar
CrudRepository
public interface PersonRepository
extends JpaRepository,
PersonFragment {
...
}
Axborotlar
JpaRepository
PagingAndSortingRepository
public class PersonRepository extends
Repository {
Person save(Person entity);
Optional findById(Person entity);
}
Repozitariy fragmentlari
public interface PersonRepository
extends JpaRepository,
PersonFragment {
...
}
Olingan so'rov usullari
public interface PersonRepository extends CrudRepository {
List findByName(String name);
Person findByNameBySsn(String ssn);
Optional
findByNameBySsnIgnoreCase(String ssn);
Boolean existsBookByYearOfBirthBetween(
Integer start, Integer end);
}
Foydalanuvchi tomonidan belgilangan so'rovlar
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);
}
MicroProfile API
Xatolarga chidamlilik
Xatolarga chidamlilik konstruksiyalari kaskadli nosozliklarning oldini olish va ishonchli mikroservis arxitekturasini yaratish uchun juda muhimdir. Bahor ishlab chiquvchilari ko'p yillar davomida nosozliklarga chidamlilik uchun o'chirgichlardan foydalanishgan.
Jadval 5. Qo'llab-quvvatlanadigan MicroProfile Fault Tolerance API'laridan foydalanishga misollar.
MicroProfile xatolarga chidamlilik xususiyatlari
tavsifi
misollar
@Asinxron
Mantiqni alohida mavzuda bajarish
@Asynchronous
@Retry
public Future<String> getSalutation() {
...
return future;
}
@Bulkhead
Bir vaqtning o'zida so'rovlar sonini cheklang
@Bulkhead(5)
public void fiveConcurrent() {
makeRemoteCall(); //...
}
@CircuitBreaker
Muvaffaqiyatsizliklarni aqlli boshqarish va nosozliklarni tiklash
@CircuitBreaker(delay=500 // milliseconds
failureRatio = .75,
requestVolumeThreshold = 20,
successThreshold = 5)
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
@Ortga qaytish
Muvaffaqiyatsiz bo'lgan taqdirda muqobil mantiqni chaqirish
@Timeout(500) // milliseconds
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
public String fallback() {
return "hello";
}
Soʻrov bajarilmasa, qayta urinib koʻring
@Retry(maxRetries=3)
public String getSalutation() {
makeRemoteCall(); //...
}
Muvaffaqiyatsizlikni nazorat qilish vaqti tugashi
@Timeout(value = 500 ) // milliseconds
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
Xizmatlarni tekshirish (Salomatlik xizmati)
Kubernetes platformalari maxsus xizmatlardan foydalangan holda konteynerlarning sog'lig'ini kuzatib boradi. Asosiy platformaga xizmatlarni kuzatishga ruxsat berish uchun Spring dasturchilari odatda maxsus HealthIndicator va Spring Boot Actuator-dan foydalanadilar. Quarkusda buni MicroProfile Health yordamida amalga oshirish mumkin, u sukut bo'yicha jonlilikni tekshirishni amalga oshiradi, lekin bir vaqtning o'zida jonlilik va tayyorlikni tekshirish uchun sozlanishi mumkin. Qo'llab-quvvatlanadigan MicroProfile Health API'laridan qanday foydalanishga misollar 6-jadvalda keltirilgan va qo'shimcha ma'lumotlar Quarkus qo'llanmasida keltirilgan.
6-jadval: Qo'llab-quvvatlanadigan MicroProfile Health API'laridan foydalanish misollari.
MicroProfile Health xususiyatlari
tavsifi
misollar
@Tiriklik
Platforma muvaffaqiyatsiz konteynerlangan ilovalarni qayta ishga tushiradi
Yakuniy nuqta:
xost: 8080/salomatlik/jonli
@Liveness
public class MyHC implements HealthCheck {
public HealthCheckResponse call() {
...
return HealthCheckResponse
.named("myHCProbe")
.status(ready ? true:false)
.withData("mydata", data)
.build();
}
@Tayyorlik
Platforma tayyor bo'lmasa, konteynerlashtirilgan ilovalarga trafik jo'natmaydi
Yakuniy nuqta:
xost: 8080/salomatlik/tayyor
@Readiness
public class MyHC implements HealthCheck {
public HealthCheckResponse call() {
...
return HealthCheckResponse
.named("myHCProbe")
.status(live ? true:false)
.withData("mydata", data)
.build();
}
Ko'rsatkichlar
Ilovalar operatsion maqsadlarda (samaradorlik SLAlarini kuzatish uchun) yoki operatsion bo'lmagan maqsadlarda (biznes SLAs) ko'rsatkichlarni taqdim etadi. Bahor ishlab chiquvchilari Spring Boot Actuator va Micrometer yordamida o'lchovlarni taqdim etadilar. O'z navbatida, Quarkus asosiy ko'rsatkichlarni (JVM va operatsion tizim), sotuvchi ko'rsatkichlarini (Quarkus) va dastur ko'rsatkichlarini taqdim etish uchun MicroProfile Metricsdan foydalanadi. MicroProfile Metrics dastur JSON va OpenMetrics (Prometey) chiqish formatlarini qo'llab-quvvatlashini talab qiladi. MicroProfile Metrics API dan foydalanishga misollar 7-jadvalda keltirilgan.
В
Jadval 7. MicroProfile Metrics API-laridan foydalanishga misollar.
Microprofile ko'rsatkichlari xususiyatlari
tavsifi
misollar
@hisoblangan
Izohlangan ob'ektning necha marta chaqirilganligini hisoblovchi hisoblagichni bildiradi
@Counted(name = "fallbackCounter",
displayName = "Fallback Counter",
description = "Fallback Counter")
public String salutationFallback() {
return fallbackSalutation;
}
@ConcurrentGauge
Izohlangan ob'ektga bir vaqtda qo'ng'iroqlar sonini hisoblaydigan o'lchagichni bildiradi
@ConcurrentGuage(
name = "fallbackConcurrentGauge",
displayName="Fallback Concurrent",
description="Fallback Concurrent")
public String salutationFallback() {
return fallbackSalutation;
}
@Gauge
Izohlangan ob'ektning qiymatini o'lchaydigan o'lchov sensorini bildiradi
@Metered(name = "FallbackGauge",
displayName="Fallback Gauge",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
@Metered
Izohlangan ob'ektning qo'ng'iroq chastotasini kuzatuvchi hisoblagich sensorini bildiradi
@Metered(name = "MeteredFallback",
displayName="Metered Fallback",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
Ko'rsatkichni kiritish yoki ishlab chiqarish uchun so'rov olinganida metama'lumotlar haqida ma'lumotni o'z ichiga olgan izoh
@Metric
@Metered(name = "MeteredFallback",
displayName="Metered Fallback",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
Izohlangan ob'ektning davomiyligini kuzatuvchi taymerni bildiradi
@Timed(name = "TimedFallback",
displayName="Timed Fallback",
description="Fallback delay")
public String salutationFallback() {
return fallbackSalutation;
}
Ko'rsatkichlar so'nggi nuqtalari
Ilova ko'rsatkichlari
Asosiy ko'rsatkichlar
Sotuvchi ko'rsatkichlari
Barcha ko'rsatkichlar
MicroProfile Rest Client
Mikroservislar ko'pincha RESTful so'nggi nuqtalarini taqdim etadi, ular bilan ishlash uchun mos keladigan mijoz API-larini talab qiladi. RESTful so'nggi nuqtalaridan foydalanish uchun Spring dasturchilari odatda RestTemplate-dan foydalanadilar. Quarkus ushbu muammoni hal qilish uchun MicroProfile Rest Client API-larini taklif qiladi, ulardan foydalanish misollari 8-jadvalda keltirilgan.
В
Jadval 8. MicroProfile Rest Client API-laridan foydalanishga misollar.
MicroProfile Rest Client xususiyatlari
tavsifi
misollar
@RegisterRestClient
Terilgan Java interfeysini REST mijozi sifatida ro'yxatdan o'tkazadi
@RegisterRestClient
@Path("/")
public interface MyRestClient {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getSalutation();
}
@RestClient
Terilgan REST mijoz interfeysi namunasini amalga oshirishni belgilaydi
@Autowired // or @Inject
@RestClient
MyRestClient restClient;
Chaqiruv
REST oxirgi nuqtasini chaqiradi
System.out.println(
restClient.getSalutation());
mp-dam olish/url
REST oxirgi nuqtasini belgilaydi
application.properties:
org.example.MyRestClient/mp-rest/url=
http://localhost:8081/myendpoint
natijalar
Asosan Spring dasturchilariga qaratilgan ushbu blogda biz Java mikroservislarini ishlab chiqish va keyin ularni yuzlab megabayt operativ xotirani tejaydigan mahalliy ikkilik kodga kompilyatsiya qilish uchun Quarkusdagi MicroProfile API-lari bilan Spring API-laridan qanday foydalanishni tez ko'rib chiqdik. millisekundlar masalasi.
Siz allaqachon tushunganingizdek, Spring va MicroProfile API-larini qo'llab-quvvatlash haqida ko'proq ma'lumotni, shuningdek, boshqa ko'plab foydali ma'lumotlarni quyidagi havolada topishingiz mumkin.
Manba: www.habr.com