Барлығына сәлем, міне, Quarkus сериясының үшінші жазбасы!
Java микросервистерін жасау кезінде жиі солай деп есептейді
Кішкене толығырақ, біз Spring әзірлеушілеріне MicroProfile API интерфейсін күнделікті жұмысында қалай пайдалану керектігін көрсету үшін алдымен Quarkus-тың Spring API интерфейстерін қалай қолдайтынының көлемі мен мәліметтерін қарастырамыз. Содан кейін біз микросервистерді жасау кезінде көктемгі әзірлеушілерге пайдалы MicroProfile API интерфейстерін қарастырамыз.
Неліктен Кваркус? Біріншіден, бұл тірі кодтау, яғни MicroProfile API, Spring API және басқа Java API интерфейстеріндегі кез келген өзгерістерді автоматты түрде қайта жүктеу, ол бір ғана пәрменмен орындалады: mvn quarkus:dev. Екіншіден, талқыланды
Біз MicroProfile туралы егжей-тегжейлі қарастырмаймыз, тек Spring әзірлеушілеріне Spring API интерфейстерін Quarkus ішіндегі MicroProfile API интерфейстерімен қалай пайдалануға болатынын түсінуге көмектесу үшін.
Контейнерлер және Кубернеталар
Бұл мақаланы қарапайым ету үшін біз мұнда қолдаудың жоғары деңгейлі аспектілерін ғана қарастырамыз.
Кваркус та
Ақырында, Kubernetes-ке мақсатты орналастыру ортасы ретінде назар аудара отырып, Quarkus ұқсас функционалдылық Kubernetes платформасының өзі деңгейінде жүзеге асырылатын жағдайларда Java құрылымдарын пайдаланбайды. 1-кестеде Kubernetes және Spring әзірлеушілері пайдаланатын типтік Java құрылымдары арасындағы функционалды сәйкестік картасы берілген.
Кесте 1. Java фреймворктері мен Кубернетес арасындағы функционалды сәйкестік картасы.
Функционалдық
Дәстүрлі көктемгі аяқ киім
Kubernetes
Қызметті табу
Eureka
DNS
Конфигурация
Spring Cloud Config
Карталарды/құпияларды конфигурациялау
Жүктемелерді теңестіру
Таспа (клиент жағы)
Қызмет, репликация контроллері (сервер жағы)
Мысалдағы кодты құрастыру және іске қосу
Бұл мақалада біз сілтеме жасаймыз
Spring Framework API интерфейстері
Тәуелділікке қарсы инъекция
Quarkus ауқымын қолдайды
В
Кесте 2. Қолдау көрсетілетін Spring DI API интерфейстерін пайдалану мысалдары.
Қолдау көрсетілетін Spring 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 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 күту ORM көмегімен JPA қолдайтынын бағалайды. Көктем әзірлеушілері үшін де жақсы жаңалық бар: Quarkus жалпы Spring Data JPA аннотациялары мен түрлерін қолдайды. Қолдау көрсетілетін Spring Data JPA API интерфейстерін пайдалану мысалдары 4-кестеде берілген.
В
Кесте 4. Қолдау көрсетілетін Spring Data JPA API интерфейстерін пайдалану мысалдары.
Қолдау көрсетілетін 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);
}
Репозиторий фрагменттері
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 ақауларға төзімділік API интерфейстерін пайдалану мысалдары.
Microprofile ақауларға төзімділік мүмкіндіктері
сипаттамасы
мысалдар
@Асинхронды
Логиканы бөлек ағында орындау
@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(); //...
}
@Кері шегіну
Сәтсіздік жағдайында балама логиканы шақыру
@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 Health мүмкіндіктері
сипаттамасы
мысалдар
@Тірілік
Платформа сәтсіз контейнерлік қолданбаларды қайта жүктейді
Соңғы нүкте:
хост: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();
}
Көрсеткіштер
Қолданбалар операциялық мақсаттарға (өнімділік SLAs бақылау үшін) немесе операциялық емес мақсаттарға (бизнес SLAs) көрсеткіштерді береді. Көктем әзірлеушілері Spring Boot Actuator және Micrometer көмегімен көрсеткіштерді қамтамасыз етеді. Өз кезегінде, Quarkus негізгі көрсеткіштерді (JVM және операциялық жүйе), жеткізуші көрсеткіштерін (Quarkus) және қолданба көрсеткіштерін қамтамасыз ету үшін MicroProfile Metrics пайдаланады. MicroProfile Metrics іске асыру JSON және OpenMetrics (Prometheus) шығыс пішімдерін қолдауды талап етеді. MicroProfile Metrics API пайдалану мысалдары 7-кестеде келтірілген.
В
Кесте 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;
}
@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;
}
Көрсеткіштердің соңғы нүктелері
Қолданба көрсеткіштері
Негізгі көрсеткіштер
Жеткізушінің көрсеткіштері
Барлық көрсеткіштер
MicroProfile Rest Client
Микросервистер жиі жұмыс істеу үшін сәйкес клиенттік API интерфейстерін қажет ететін RESTful соңғы нүктелерін қамтамасыз етеді. 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;
Шақыру
REST соңғы нүктесін шақырады
System.out.println(
restClient.getSalutation());
mp-rest/url
REST соңғы нүктесін көрсетеді
application.properties:
org.example.MyRestClient/mp-rest/url=
http://localhost:8081/myendpoint
Нәтижелері
Негізінен Spring әзірлеушілеріне бағытталған бұл блогта біз Java микросервистерін әзірлеу үшін Quarkus қаласындағы MicroProfile API интерфейстерімен Spring API интерфейстерін қалай пайдалану керектігін жылдам қарастырдық, содан кейін оларды жүздеген мегабайт жедел жадты үнемдейтін және іске қосатын жергілікті екілік кодқа құрастырдық. миллисекундтар мәселесі.
Түсінгеніңіздей, Spring және MicroProfile API интерфейстерін қолдау туралы қосымша ақпаратты, сондай-ақ басқа да көптеген пайдалы ақпаратты мына жерден табуға болады.
Ақпарат көзі: www.habr.com