Сайн байцгаана уу, Quarkus цувралын 3 дахь бичлэгийг хүргэж байна!

Java микро үйлчилгээг хөгжүүлэхдээ ихэвчлэн ийм зүйл итгэдэг и нь тусдаа бөгөөд бие даасан API юм. Анхдагч байдлаар, програмистууд шинэ хүрээ болон ажиллах үеийн бүрэлдэхүүн хэсгүүдийг сурахад маш их цаг зарцуулдаг тул аль хэдийн дассан API-г ашиглах хандлагатай байдаг. Өнөөдөр бид зарим алдартай хөгжлийг хялбарчлахыг хичээх болно Spring API болон шинэ ашигтай функцуудыг хэрхэн нэгэн зэрэг ашиглахыг танд үзүүлэх болно .
Бага зэрэг дэлгэрэнгүй, бид эхлээд Spring хөгжүүлэгчдэд MicroProfile API-г өдөр тутмын ажилдаа хэрхэн ашиглахыг харуулахын тулд Quarkus Spring API-г хэрхэн дэмждэг талаар дэлгэрэнгүй авч үзэх болно. Дараа нь бид хаврын хөгжүүлэгчдэд бичил үйлчилгээ үүсгэхэд хэрэг болох MicroProfile API-уудыг авч үзэх болно.
Яагаад Кваркус гэж? Нэгдүгээрт, энэ бол шууд кодчилол, өөрөөр хэлбэл MicroProfile API, Spring API болон бусад Java API-д гарсан өөрчлөлтийг автоматаар дахин ачаалах бөгөөд үүнийг зөвхөн нэг тушаалаар гүйцэтгэдэг: mvn quarkus:dev. Хоёрдугаарт, авч үзсэн Person үйлчилгээ (Spring, MicroProfile, JPA API-аас уугуул GraalVM дүрсийг ашиглан хоёртын файл болгон хөрвүүлдэг) ердөө 0.055 секундын дотор эхэлж, RESTful програмын төгсгөлийн цэг дээр ойролцоогоор 90 MB RAM (RSS) эзэлнэ. Түүгээр ч барахгүй түүний эмхэтгэл нь mvn package -Pnative гэсэн ганцхан тушаалаар хийгддэг.
Бид Spring-ийн хөгжүүлэгчдэд Spring API-уудыг Quarkus дахь MicroProfile API-тай хэрхэн ашиглах талаар ойлгоход нь туслахаас өөр MicroProfile-ийн талаар дэлгэрэнгүй ярихгүй.
Контейнер ба Кубернет
Энэ нийтлэлийг энгийн байлгахын тулд бид зөвхөн дээд түвшний дэмжлэгийг энд авч үзэх болно. , учир нь ойлгох нь чухал. Quarkus нь Kubernetes-д зориулсан Java стек хэлбэрээр байрладаг бөгөөд энэ нь санах ойн зарцуулалт, Java програм, үйлчилгээг эхлүүлэх хугацааг багасгахад зориулагдсан бөгөөд үүний үр дүнд хост дээрх нягтралыг нэмэгдүүлж, нийт зардлыг бууруулдаг.
Кваркус бас Kubernetes нөөц ба санал Kubernetes болон Red Hat OpenShift платформ дээр байрлуулахад зориулагдсан. Нэмж дурдахад Quarkus нь контейнер үүсгэхэд шаардлагатай Dockerfile.jvm (JVM савлагаа) болон Dockerfile.native (уугуул хоёртын савлагаа) файлуудыг автоматаар үүсгэдэг.
Эцэст нь Кубернетесийг зорилтот байршуулах орчин болгон төвлөрүүлснээр Quarkus нь Kubernetes платформын түвшинд ижил төстэй функцийг хэрэгжүүлсэн тохиолдолд Java хүрээг ашигладаггүй. Хүснэгт 1-д Кубернетес болон Spring хөгжүүлэгчдийн ашигладаг ердийн Java хүрээнүүдийн хоорондох функциональ харилцааны газрын зургийг үзүүлэв.
Хүснэгт 1. Java framework болон Kubernetes хоорондын функциональ харилцааны газрын зураг.
Функциональ
Уламжлалт хаврын гутал
Kubernetes
Үйлчилгээний нээлт
Эврика
DNS
Тохиргоо
Хаврын үүл тохиргоо
Газрын зураг/Нууцыг тохируулах
Ачааллыг тэнцвэржүүлэх
Тууз (үйлчлүүлэгч тал)
Үйлчилгээ, хуулбарлах хянагч (серверийн тал)
Жишээн дээрх кодыг эмхэтгэж ажиллуулж байна
Энэ нийтлэлд бид дурддаг , Spring болон MicroProfile API-ууд, тэр ч байтугай ижил Java анги хамт хэрэглэгддэг. Энэ жишээн дээрх кодыг эмхэтгэж, командын мөрөөс ажиллуулж болно, дэлгэрэнгүйг README.md файлаас үзнэ үү.
Spring Framework APIs
Хамааралтай тарилга
Quarkus нь хэд хэдэн төрлийг дэмждэг болон хаврын хамаарлын тарилга (Spring DI) APIs. Хэрэв та MicroProfile-тэй ажиллаж байгаа бол, , тэгвэл та CDI-г аль хэдийн сайн мэддэг болсон. Нөгөө талаас, Spring хөгжүүлэгчид Spring DI-тай нийцтэй байхын тулд Spring DI API-д зориулсан Quarkus өргөтгөлийг ашиглаж болно. Дэмжигдсэн Spring DI API-г ашиглах жишээг 2-р хүснэгтэд үзүүлэв.
В CDI болон Spring Dependency Injection хоёуланг нь ашигладаг. Энэ сэдвээр нэмэлт мэдээлэл, жишээ авахыг хүсвэл Quarkus гарын авлагыг үзнэ үү .
Хүснэгт 2. Дэмжигдсэн Spring DI API-г ашиглах жишээ.
Дэмжигдсэн хаврын DI функцууд
жишээ
Бүтээгч тарилга
public PersonSpringController(
PersonSpringRepository personRepository, // injected
PersonSpringMPService personService) { // injected
this.personRepository = personRepository;
this.personService = personService;
}
Талбайн тарилга
@Autowired
@RestClient
SalutationRestClient salutationRestClient;
@Value("${fallbackSalutation}")
String fallbackSalutation;
@ Тохиргоо
@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;
}
}
Вэб хүрээ
MicroProfile хэрэглэгчид Quarkus нь JAX-RS, MicroProfile Rest Client, JSON-P, JSON-B-ийг вэб програмчлалын үндсэн загвар болгон дэмждэгт дуртай байх болно. Хаврын хөгжүүлэгчид Quarkus-ийн Spring Web API, ялангуяа REST интерфейсийг дэмжсэнд сэтгэл хангалуун байх болно. Spring DI-тай адил Spring Web API-ийн дэмжлэгийн гол зорилго нь Spring Web API-г MicroProfile API-тай хамт ашиглах боломжийг Spring хөгжүүлэгчдэд олгох явдал юм. Дэмжигдсэн Spring Web API-г хэрхэн ашиглах жишээг Хүснэгт 3-т өгсөн байгаа бөгөөд энэ сэдвийн талаарх дэлгэрэнгүй мэдээлэл, жишээг Quarkus хичээлээс олж болно. .
Хүснэгт 3. Дэмжигдсэн Spring Web API-г ашиглах жишээ.
Дэмжигдсэн хаврын вэб функцууд
жишээ
@RestController
@RequestMapping
@RestController
@RequestMapping("/person")
public class PersonSpringController {
...
...
...
}
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestParam
@RequestHeader
@MatrixVariable
@PathVariable
@CookieValue
@RequestBody
@ResponseStatus
@ExceptionHandler
@RestControllerAdvice (хэсэгчилсэн)
@GetMapping(path = "/greet/{id}",
produces = "text/plain")
public String greetPerson(
@PathVariable(name = "id") long id) {
...
...
...
}
Хаврын мэдээлэл JPA
MicroProfile хэрэглэгчид Quarkus нь Hibernate ORM ашиглан JPA-г дэмждэгт талархах болно. Хаврын хөгжүүлэгчдэд бас сайн мэдээ байна: Quarkus нь нийтлэг Spring Data JPA тэмдэглэгээ болон төрлийг дэмждэг. Дэмжигдсэн Spring Data JPA API-г ашиглах жишээг 4-р хүснэгтэд үзүүлэв.
В Spring Data JPA API-г ашигладаг бөгөөд илүү дэлгэрэнгүй мэдээллийг Quarkus хичээлээс авах боломжтой .
Хүснэгт 4. Дэмжигдсэн Spring Data JPA API ашиглах жишээ.
Хаврын өгөгдлийн JPA функцуудыг дэмждэг
жишээ
CrudRepository
public interface PersonRepository
extends JpaRepository,
PersonFragment {
...
}
Репозитор
JpaRepository
PagingAndSortingRepository
public class PersonRepository extends
Repository {
Person save(Person entity);
Optional findById(Person entity);
}
Хадгалах сангийн фрагментууд
public interface PersonRepository
extends JpaRepository,
PersonFragment {
...
}
Гаргасан асуулгын аргууд
public interface PersonRepository extends CrudRepository {
List findByName(String name);
Person findByNameBySsn(String ssn);
Optional
findByNameBySsnIgnoreCase(String ssn);
Boolean existsBookByYearOfBirthBetween(
Integer start, Integer end);
}
Хэрэглэгчийн тодорхойлсон асуулга
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 APIs
Алдааг тэсвэрлэх чадвар
Гэмтлийг тэсвэрлэх бүтэц нь шаталсан бүтэлгүйтлээс урьдчилан сэргийлэх, найдвартай микро үйлчилгээний архитектурыг бий болгоход маш чухал юм. Хаврын хөгжүүлэгчид олон жилийн турш алдааг тэсвэрлэхийн тулд таслуур ашиглаж ирсэн. . Гэсэн хэдий ч Hystrix шинэчлэгдээгүй удаж байгаа ч MicroProfile-ийн алдааг тэсвэрлэх чадвар нь одоо идэвхтэй хөгжиж байгаа бөгөөд үүний цаана хэдэн жилийн үйлдвэрлэлийн хэрэглээ бий. Тиймээс Кваркус дахь үйлчилгээний найдвартай байдлыг сайжруулахын тулд MicroProfile Fault Tolerance API-г ашиглахыг зөвлөж байна, тэдгээрийн жишээг Хүснэгт 5-д ашигласан болно. Энэ талаар дэлгэрэнгүй мэдээллийг Quarkus гарын авлагаас үзнэ үү. .
Хүснэгт 5. Дэмжигдсэн MicroProfile Fault Tolerance API ашиглах жишээ.
MicroProfile-ийн алдааг тэсвэрлэх шинж чанарууд
Тайлбар
жишээ
@Асинхрон
Тусдаа хэлхээнд логикийг гүйцэтгэж байна
@Asynchronous
@Retry
public Future<String> getSalutation() {
...
return future;
}
@Balkhead
Нэг зэрэг хүсэлт гаргах тоог хязгаарлах
@Bulkhead(5)
public void fiveConcurrent() {
makeRemoteCall(); //...
}
@CircuitBreaker
Ухаалаг алдаатай харьцах, алдааг сэргээх
@CircuitBreaker(delay=500 // milliseconds
failureRatio = .75,
requestVolumeThreshold = 20,
successThreshold = 5)
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
@Эргэж буцах
Амжилтгүй болсон тохиолдолд өөр логикийг дуудах
@Timeout(500) // milliseconds
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
public String fallback() {
return "hello";
}
Хүсэлт амжилтгүй болсны дараа дахин оролдоно уу
@Retry(maxRetries=3)
public String getSalutation() {
makeRemoteCall(); //...
}
Алдааг хянах хугацаа хэтэрсэн
@Timeout(value = 500 ) // milliseconds
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
Үйлчилгээг шалгаж байна (Үйлчилгээний эрүүл мэнд)
Kubernetes платформууд нь тусгай үйлчилгээг ашиглан савны эрүүл мэндийг хянадаг. Суурь платформд үйлчилгээг хянах боломжийг олгохын тулд Spring хөгжүүлэгчид ихэвчлэн өөрчлөн тохируулсан HealthIndicator болон Spring Boot Actuator ашигладаг. Quarkus-д үүнийг MicroProfile Health ашиглан хийж болох бөгөөд энэ нь анхдагчаар амьд байдлын шалгалт хийдэг боловч амьд байдал болон бэлэн байдлыг нэгэн зэрэг шалгахаар тохируулж болно. Дэмжигдсэн MicroProfile Health API-г хэрхэн ашиглах жишээг Хүснэгт 6-д өгсөн бөгөөд нэмэлт мэдээллийг Quarkus гарын авлагад өгсөн болно. .
Хүснэгт 6: Дэмжигдсэн MicroProfile Health API-ийн хэрэглээний жишээ.
MicroProfile эрүүл мэндийн онцлог
Тайлбар
жишээ
@Амьдрал
Платформ нь бүтэлгүйтсэн контейнержүүлсэн програмуудыг дахин ачаалдаг
Төгсгөлийн цэг:
хост:8080/эрүүл мэнд/амьд
@Liveness
public class MyHC implements HealthCheck {
public HealthCheckResponse call() {
...
return HealthCheckResponse
.named("myHCProbe")
.status(ready ? true:false)
.withData("mydata", data)
.build();
}
@Бэлэн байдал
Платформ нь бэлэн биш бол контейнержүүлсэн програмууд руу траффик илгээхгүй
Төгсгөлийн цэг:
хост:8080/эрүүл мэнд/бэлэн
@Readiness
public class MyHC implements HealthCheck {
public HealthCheckResponse call() {
...
return HealthCheckResponse
.named("myHCProbe")
.status(live ? true:false)
.withData("mydata", data)
.build();
}
Хэмжигдэхүүн
Аппликейшн нь үйл ажиллагааны зорилгоор (гүйцэтгэлийн SLA-г хянах) эсвэл үйл ажиллагааны бус зорилгоор (бизнесийн SLA) хэмжүүрээр хангадаг. Хаврын хөгжүүлэгчид Spring Boot Actuator болон Micrometer ашиглан хэмжүүрүүдийг өгдөг. Хариуд нь Quarkus нь MicroProfile хэмжигдэхүүнийг ашиглан суурь үзүүлэлтүүд (JVM ба үйлдлийн систем), борлуулагчийн хэмжүүрүүд (Quarkus) болон хэрэглээний хэмжүүрүүдийг хангадаг. MicroProfile Metrics нь хэрэгжилт нь JSON болон OpenMetrics (Prometheus) гаралтын форматыг дэмждэг байхыг шаарддаг. MicroProfile Metrics API ашиглах жишээг Хүснэгт 7-д үзүүлэв.
В MicroProfile хэмжигдэхүүнийг програмын хэмжүүрээр хангахад ашигладаг. Дэлгэрэнгүй мэдээллийг Quarkus гарын авлагаас үзнэ үү .
Хүснэгт 7. MicroProfile Metrics API ашиглах жишээ.
Microprofile хэмжигдэхүүнүүдийн онцлогууд
Тайлбар
жишээ
@Тоолсон
Тайлбартай объектыг хэдэн удаа дуудсаныг тоолох тоолуурыг заана
@Counted(name = "fallbackCounter",
displayName = "Fallback Counter",
description = "Fallback Counter")
public String salutationFallback() {
return fallbackSalutation;
}
@ConcurrentGauge
Тэмдэглэгээтэй объект руу залгасан дуудлагын тоог тоолох хэмжигчийг заана
@ConcurrentGuage(
name = "fallbackConcurrentGauge",
displayName="Fallback Concurrent",
description="Fallback Concurrent")
public String salutationFallback() {
return fallbackSalutation;
}
@ хэмжигч
Тайлбартай объектын утгыг хэмждэг хэмжигч мэдрэгчийг заана
@Metered(name = "FallbackGauge",
displayName="Fallback Gauge",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
@Хэмжээтэй
Тайлбартай объектын дуудлагын давтамжийг хянадаг тоолуурын мэдрэгчийг заана
@Metered(name = "MeteredFallback",
displayName="Metered Fallback",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
Метрик оруулах эсвэл гаргах хүсэлтийг хүлээн авах үед мета өгөгдлийн талаарх мэдээллийг агуулсан тэмдэглэгээ
@Metric
@Metered(name = "MeteredFallback",
displayName="Metered Fallback",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
Тайлбартай объектын үргэлжлэх хугацааг хянадаг таймерыг заана
@Timed(name = "TimedFallback",
displayName="Timed Fallback",
description="Fallback delay")
public String salutationFallback() {
return fallbackSalutation;
}
Метрикийн төгсгөлийн цэгүүд
Хэрэглээний хэмжүүр :8080/метрик/програм
Үндсэн хэмжүүрүүд :8080/метрик/суурь
Борлуулагчийн хэмжүүр :8080/метрик/борлуулагч
Бүх хэмжүүрүүд :8080/метр
MicroProfile Rest Client
Бичил үйлчилгээнүүд нь ихэвчлэн RESTful төгсгөлийн цэгүүдээр хангадаг бөгөөд тэдгээртэй ажиллахад холбогдох клиент API-г шаарддаг. RESTful төгсгөлийн цэгүүдийг ашиглахын тулд Spring хөгжүүлэгчид ихэвчлэн RestTemplate ашигладаг. Quarkus энэ асуудлыг шийдэхийн тулд MicroProfile Rest Client API-г санал болгодог бөгөөд тэдгээрийн хэрэглээний жишээг 8-р хүснэгтэд үзүүлэв.
В RESTful төгсгөлийн цэгүүдийг ашиглах нь MicroProfile Rest Client ашиглан хийгддэг. Энэ сэдвээр дэлгэрэнгүй мэдээлэл, жишээг Quarkus гарын авлагаас олж болно .
Хүснэгт 8. MicroProfile Rest Client API ашиглах жишээ.
MicroProfile Rest Client-ийн онцлогууд
Тайлбар
жишээ
@RegisterRestClient
Бичсэн Java интерфейсийг REST клиент болгон бүртгэнэ
@RegisterRestClient
@Path("/")
public interface MyRestClient {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getSalutation();
}
@RestClient
Бичсэн REST клиент интерфэйсийн жишээний хэрэгжилтийг тэмдэглэнэ
@Autowired // or @Inject
@RestClient
MyRestClient restClient;
Уучлалт
REST төгсгөлийн цэгийг дууддаг
System.out.println(
restClient.getSalutation());
mp-rest/url
REST төгсгөлийн цэгийг зааж өгнө
application.properties:
org.example.MyRestClient/mp-rest/url=
http://localhost:8081/myendpoint
Үр дүн
Хаврын хөгжүүлэгчдэд зориулсан энэ блогт бид Java микро үйлчилгээг хөгжүүлэхийн тулд Spring API-уудыг Кваркус дахь MicroProfile API-тай хэрхэн ашиглах, дараа нь тэдгээрийг олон зуун мегабайт RAM хэмнэж, үндсэн хоёртын код болгон хөрвүүлэх талаар хурдан харлаа. миллисекундын асуудал.
Та аль хэдийн ойлгосноор Spring болон MicroProfile API-ийн дэмжлэгийн талаарх дэлгэрэнгүй мэдээлэл болон бусад олон хэрэгтэй мэдээллийг эндээс авах боломжтой. .
Эх сурвалж: www.habr.com
