Баарыңарга салам, бул жерде Quarkus сериясындагы үчүнчү билдирүү!
Java микросервистерин иштеп чыгууда, көбүнчө деп ишенишет
Бир аз майда-чүйдөсүнө чейин, биз алгач жазгы иштеп чыгуучуларга MicroProfile APIди күнүмдүк иштеринде кантип колдонууну көрсөтүү үчүн Quarkus жазгы API'лерди кантип колдой тургандыгынын масштабын жана чоо-жайын карап чыгабыз. Андан кийин биз микросервистерди түзүүдө Spring иштеп чыгуучулары үчүн пайдалуу болгон MicroProfile API'лерин карайбыз.
Эмне үчүн Quarkus? Биринчиден, бул жандуу коддоо, башкача айтканда, MicroProfile API, Spring API жана башка Java API'лериндеги бардык өзгөртүүлөрдү автоматтык түрдө кайра жүктөө, ал бир гана буйрук менен аткарылат: mvn quarkus:dev. Экинчиден, каралат
Биз MicroProfile жөнүндө майда-чүйдөсүнө чейин кирбейбиз, жазгы иштеп чыгуучуларга Spring API'лерин Quarkusдагы MicroProfile API'лери менен кантип колдонсо болорун түшүнүүгө жардам берүүдөн башка.
Контейнерлер жана Кубернеттер
Бул макаланы жөнөкөй сактоо үчүн, биз бул жерде колдоонун жогорку деңгээлдеги аспектилерин гана карайбыз.
Кваркус дагы
Акыр-аягы, Kubernetes'ке максаттуу жайылтуу чөйрөсү катары көңүл буруу менен, Quarkus Java алкактарын ушундай функциялар Kubernetes платформасынын деңгээлинде ишке ашырылган учурларда колдонбойт. 1-таблица Kubernetes менен Spring иштеп чыгуучулары колдонгон типтүү Java алкактарынын ортосундагы функционалдык кат алышуунун картасын берет.
Таблица 1. Java алкактары менен Kubernetes ортосундагы функционалдык кат алышуунун картасы.
иш
Салттуу жазгы бут кийим
Kubernetes
Кызматтын ачылышы
Eureka
DNS
тарам орнотуусу
Жазгы Cloud Config
Карталарды/Сырларды конфигурациялоо
груз салмак
Тасма (кардар тарап)
Кызмат, репликация контроллери (сервер тарабы)
Мисалдан кодду түзүү жана иштетүү
Бул макалада биз кайрылабыз
Spring Framework API'лери
Көз карандылыкты саюу
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
@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 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-таблицада келтирилген.
В
Таблица 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 API'лери
Ката толеранттуулук
Каталарга чыдамдуулук конструкциялары каскаддык каталарды алдын алуу жана ишенимдүү микросервис архитектураларын түзүү үчүн абдан маанилүү. Жазгы иштеп чыгуучулар көп жылдар бою каталарга чыдамдуулук үчүн автоматтык өчүргүчтөрдү колдонуп келишет.
Таблица 5. Колдоого алынган MicroProfile Hata Tolerance API'лерин колдонуу мисалдары.
MicroProfile катачылыктарга чыдамдуулук өзгөчөлүктөрү
баяндоо
мисалдар
@Asynchronous
Логиканы өзүнчө жипте аткаруу
@Asynchronous
@Retry
public Future<String> getSalutation() {
...
return future;
}
@Bulkhead
Бир убактагы сурамдардын санын чектөө
@Bulkhead(5)
public void fiveConcurrent() {
makeRemoteCall(); //...
}
@CircuitBreaker
Акылдуу каталарды башкаруу жана каталардан калыбына келтирүү
@CircuitBreaker(delay=500 // milliseconds
failureRatio = .75,
requestVolumeThreshold = 20,
successThreshold = 5)
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
@Fallback
Ийгиликсиз болгон учурда альтернативалуу логиканы чакыруу
@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 платформалары атайын кызматтардын жардамы менен контейнерлердин ден соолугун көзөмөлдөйт. Негизги платформага кызматтарды көзөмөлдөөгө уруксат берүү үчүн, Жазды иштеп чыгуучулар адатта ыңгайлаштырылган HealthIndicator жана Spring Boot Actuator колдонушат. Кваркуста муну MicroProfile Health аркылуу жасоого болот, ал демейки боюнча жандуулукту текшерет, бирок бир эле учурда жандуулукту жана даярдуулукту текшерүү үчүн конфигурацияланса болот. Колдоого алынган MicroProfile Health API'лерин кантип колдонуунун мисалдары 6-таблицада берилген жана кошумча маалымат Quarkus колдонмосунда берилген.
Таблица 6: Колдоого алынган MicroProfile Health API'лерин колдонуу мисалдары.
MicroProfile Health өзгөчөлүктөрү
баяндоо
мисалдар
@Liveness
Платформа ишке ашпай калган контейнердик колдонмолорду кайра жүктөйт
Акыркы чекит:
хост: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ларды көзөмөлдөө үчүн) же операциялык эмес максаттарда (бизнес SLAs) көрсөткүчтөрдү берет. Жазгы иштеп чыгуучулар Spring Boot Actuator жана Micrometer аркылуу көрсөткүчтөрдү беришет. Өз кезегинде, Quarkus базалык көрсөткүчтөрдү (JVM жана операциялык тутум), сатуучу көрсөткүчтөрүн (Quarkus) жана колдонмо көрсөткүчтөрүн камсыз кылуу үчүн MicroProfile Metrics колдонот. MicroProfile Metrics ишке ашыруу JSON жана OpenMetrics (Prometheus) чыгаруу форматтарын колдоону талап кылат. MicroProfile Metrics API колдонуу мисалдары 7-таблицада келтирилген.
В
Таблица 7. MicroProfile Metrics API'лерин колдонуу мисалдары.
MicroProfile Metrics өзгөчөлүктөрү
баяндоо
мисалдар
@counted
Аннотацияланган объект канча жолу чакырылганын эсептеген эсептегичти билдирет
@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;
}
@Gauge
Аннотацияланган объекттин маанисин өлчөөчү ченегич сенсорду билдирет
@Metered(name = "FallbackGauge",
displayName="Fallback Gauge",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
@Metered
Аннотацияланган объекттин чалуу жыштыгын көзөмөлдөгөн эсептегич сенсорду билдирет
@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;
}
Metrics Endpoints
Колдонмо көрсөткүчтөрү
Негизги көрсөткүчтөр
Сатуучунун көрсөткүчтөрү
Бардык көрсөткүчтөр
MicroProfile Rest Client
Микросервистер көбүнчө RESTful акыркы чекиттерди камсыздайт, алар менен иштөө үчүн тиешелүү кардар API'лери талап кылынат. RESTful акыркы чекиттерин колдонуу үчүн Spring иштеп чыгуучулары адатта RestTemplate колдонушат. Quarkus бул көйгөйдү чечүү үчүн MicroProfile Rest Client APIлерди сунуштайт, аларды колдонуу мисалдары 8-таблицада келтирилген.
В
Таблица 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;
Invocation
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'лери менен кантип колдонууну карап чыктык, андан кийин аларды жүздөгөн мегабайт оперативдик эстутумду үнөмдөөчү жана ишке киргизген жергиликтүү экилик кодго компиляцияладык. миллисекунд маселеси.
Сиз буга чейин эле түшүнгөндөй, Spring жана MicroProfile API'лерди колдоо жөнүндө көбүрөөк маалыматты, ошондой эле башка көптөгөн пайдалуу маалыматты төмөнкү жерден тапса болот.
Source: www.habr.com