Всем привет, и с вами третий пост из серии про Quarkus!
При разработке Java-микросервисов часто считается, что
Если чуть подробнее, то сначала мы рассмотрим область применения и детали того, как Quarkus поддерживает API-интерфейсы Spring, чтобы показать Spring-разработчикам, как можно применять MicroProfile API в своей повседневной работе. Затем мы расскажем о MicroProfile API, которые пригодятся Spring-разработчикам при создании микросервисов.
Почему именно Quarkus? Во-первых, это кодирование вживую (live coding), то есть автоматическая перезагрузка любых изменений в MicroProfile API, Spring API и других Java API, которая выполняется всего одной командой: mvn quarkus:dev. Во-вторых, рассматриваемый в
Мы не будем углубляться в подробности MicroProfile, а лишь постараемся помочь Spring-разработчикам понять, как в Quarkus можно использовать API-интерфейсы Spring вместе с API-интерфейсами MicroProfile.
Контейнеры и Kubernetes
Чтобы не перегружать эту статью, мы рассмотрим здесь лишь высокоуровневые аспекты поддержки
Quarkus также
И наконец, ориентируясь на Kubernetes как на целевую среду развертывания, Quarkus не использует Java-фреймворки в тех случаях, когда аналогичный функционал реализован на уровне самой платформы Kubernetes. В таблице 1 приводится карта функционального соответствия Kubernetes и типовых Java-фреймворков, применяемых Spring-разработчиками.
Таблица 1. Карта функционального соответствия Java-фреймворков и Kubernetes.
कार्यात्मक
Традиционный Spring Boot
कुबेरनेट्स
सेवा शोध
युरेका
DNS
संरचना
Spring Cloud Config
Config Maps / Secrets
लोड बॅलेंसिंग
Ribbon (на стороне клиента)
Service, Replication Controller(на стороне сервера)
Компиляция и запуск кода из примера
В этой статье мы ссылаемся на
API-интерфейсы Spring Framework
अवलंबित्व इंजेक्शन
Quarkus поддерживает целый ряд
В
Таблица 2. Примеры использования поддерживаемых API-интерфейсов Spring DI.
Поддерживаемые функции Spring DI
उदाहरणे
कन्स्ट्रक्टर इंजेक्शन
public PersonSpringController(
PersonSpringRepository personRepository, // injected
PersonSpringMPService personService) { // injected
this.personRepository = personRepository;
this.personService = personService;
}
Field Injection
@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 в качестве основной модели веб-программирования. Spring-разработчиков приятно порадует недавно появившаяся в Quarkus поддержка Spring Web API, в частности интерфейсов, отвечающих за REST. По аналогии со Spring DI главная цель поддержки Spring Web API заключается в том, чтобы Spring-разработчики могли использовать API-интерфейсы Spring Web вместе с API-интерфейсами MicroProfile. Примеры использования поддерживаемых Spring Web API приводятся в таблице 3, а дополнительные сведения и примеры на эту тему можно найти в руководстве Quarkus, которое называется
Таблица 3. Примеры использования поддерживаемых API-интерфейсов Spring Web.
Поддерживаемые функции Spring Web
उदाहरणे
@RestController
@RequestMapping
@RestController
@RequestMapping("/person")
public class PersonSpringController {
...
...
...
}
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestParam
@RequestHeader
@MatrixVariable
@PathVariable
@CookieValue
@RequestBody
@ResponseStatus
@ExceptionHandler
@RestControllerAdvice (partial)
@GetMapping(path = "/greet/{id}",
produces = "text/plain")
public String greetPerson(
@PathVariable(name = "id") long id) {
...
...
...
}
स्प्रिंग डेटा JPA
Пользователям MicroProfile также придется по душе, что Quarkus поддерживает JPA с использованием Hibernate ORM. Для Spring-разработчиков тоже есть хорошая новость: Quarkus поддерживает общепринятые аннотации и типы Spring Data JPA. Примеры использования поддерживаемых Spring Data JPA API приводятся в таблице 4.
В
Таблица 4. Примеры использования поддерживаемых API-интерфейсов Spring Data JPA.
Поддерживаемые функции Spring Data JPA
उदाहरणे
CrudRepository
public interface PersonRepository
extends JpaRepository,
PersonFragment {
...
}
भांडार
JpaRepository
PagingAndSortingRepository
public class PersonRepository extends
Repository {
Person save(Person entity);
Optional findById(Person entity);
}
Repository Fragments
public interface PersonRepository
extends JpaRepository,
PersonFragment {
...
}
Derived query methods
public interface PersonRepository extends CrudRepository {
List findByName(String name);
Person findByNameBySsn(String ssn);
Optional
findByNameBySsnIgnoreCase(String ssn);
Boolean existsBookByYearOfBirthBetween(
Integer start, Integer end);
}
User-defined queries
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);
}
API-интерфейсы MicroProfile
Отказоустойчивость (Fault tolerance)
Конструкции Fault tolerance очень важны для предотвращения каскадных отказов и создания надежных микросервисных архитектур. Spring-разработчики уже много лет используют для отказоустойчивости circuit-breaker’ы
Таблица 5. Примеры использования поддерживаемых API-интерфейсов MicroProfile Fault Tolerance.
Функции MicroProfile Fault Tolerance
वर्णन
उदाहरणे
@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(); //...
}
Проверка сервисов (Service Health)
Kubernetes-платформы отслеживают исправность контейнеров с помощью специальных сервисов. Чтобы нижележащая платформа могла мониторить сервисы, Spring-разработчики обычно используют настраиваемые HealthIndicator и Spring Boot Actuator. В Quarkus это можно сделать с помощью MicroProfile Health, которые по умолчанию выполняют проверку работоспособности (liveness check), но могут быть настроены и на одновременную проверку liveness и readiness (готовности). Примеры использования поддерживаемых MicroProfile Health API приводятся в таблице 6, а дополнительная информация представлена в руководстве Quarkus
Таблица 6. Примеры использования поддерживаемых API-интерфейсов MicroProfile Health.
Функции MicroProfile Health
वर्णन
उदाहरणे
@Liveness
Платформа выполняет перезагрузку неисправных контейнеризованных приложений
अंतिम बिंदू:
host:8080/health/live
@Liveness
public class MyHC implements HealthCheck {
public HealthCheckResponse call() {
...
return HealthCheckResponse
.named("myHCProbe")
.status(ready ? true:false)
.withData("mydata", data)
.build();
}
@Readiness
Платформа не будет отправлять трафик на контейнеризованное приложений в случае его неготовности
अंतिम बिंदू:
host:8080/health/ready
@Readiness
public class MyHC implements HealthCheck {
public HealthCheckResponse call() {
...
return HealthCheckResponse
.named("myHCProbe")
.status(live ? true:false)
.withData("mydata", data)
.build();
}
मेट्रिक्स
Приложения предоставляют метрики или в операционных целях (для контроля SLA-показателей производительности), или в неоперационных (бизнес-показатели SLA). Spring-разработчики предоставляют метрики с помощью Spring Boot Actuator и Micrometer. В свою очередь, Quarkus использует MicroProfile Metrics для предоставления базовых метрик (JVM и операционная система), вендор-метрик (Quarkus) и метрик приложений. MicroProfile Metrics требует, чтобы реализация поддерживала выходные форматы JSON и OpenMetrics (Prometheus). Примеры использования MicroProfile Metrics API приводятся в таблице 7.
В
Таблица 7. Примеры использования API-интерфейсов MicroProfile Metrics.
Функции MicroProfile Metrics
वर्णन
उदाहरणे
@Counted
Обозначает counter-счетчик, подсчитывающий количество вызовов аннотированного объекта
@Counted(name = "fallbackCounter",
displayName = "Fallback Counter",
description = "Fallback Counter")
public String salutationFallback() {
return fallbackSalutation;
}
@ConcurrentGauge
Обозначает gauge-датчик, подсчитывающий количество параллельных вызовов аннотированного объекта
@ConcurrentGuage(
name = "fallbackConcurrentGauge",
displayName="Fallback Concurrent",
description="Fallback Concurrent")
public String salutationFallback() {
return fallbackSalutation;
}
@Gauge
Обозначает gauge-датчик, замеряющий значение аннотированного объекта
@Metered(name = "FallbackGauge",
displayName="Fallback Gauge",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
@Metered
Обозначает meter-датчик, отслеживающий частоту вызова аннотированного объекта
@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)
Метрики приложений
Базовые метрики
Вендор-метрики
Все метрики
Rest-клиент MicroProfile
Микросервисы часто предоставляют конечные точки RESTful, для работы с которыми требуются соответствующие клиентские API. Чтобы использовать конечные точки RESTful, Spring-разработчики обычно применяют RestTemplate. Quarkus же предлагает для решения этой задачи API-интерфейсы MicroProfile Rest Client, примеры использования которых приводятся в таблице 8.
В
Таблица 8. Примеры использования API-интерфейсов MicroProfile Rest Client.
Функции 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
परिणाम
В этом блоге, который в первую очередь пригодится Spring-разработчикам, мы кратко рассмотрели, как в Quarkus использовать API-интерфейсы Spring вместе API-интерфейсами MicroProfile, чтобы разрабатывать микросервисы Java и затем компилировать их в нативный двоичный код, который экономит сотни мегабайт оперативной памяти и запускается за считанные миллисекунды.
Как вы уже поняли, дополнительные сведения о поддержке API-интерфейсов Spring и MicroProfile, а также массу другой полезной информации можно найти в
स्त्रोत: www.habr.com