Салом ба ҳама, инак мақолаи сеюм дар силсилаи Quarkus!
Ҳангоми таҳияи микросервисҳои Java, аксар вақт чунин мешуморанд
Дар тафсилоти каме, мо аввал ба миқёс ва тафсилоти он, ки Quarkus API-ҳои Spring-ро дастгирӣ мекунад, дида мебароем, то ба таҳиягарони Spring чӣ гуна истифода бурдани MicroProfile API-ро дар кори ҳаррӯзаи худ нишон диҳанд. Сипас, мо API-ҳои MicroProfile-ро фаро мегирем, ки барои таҳиягарони баҳор ҳангоми эҷоди хидматҳои хурд муфиданд.
Чаро Quarkus? Аввалан, ин рамзгузории зинда аст, яъне дубора боркунии автоматии ҳама гуна тағирот дар MicroProfile API, Spring API ва дигар API-ҳои Java, ки танҳо бо як фармон иҷро мешавад: mvn quarkus:dev. Дуюм, дар
Мо дар бораи MicroProfile тафсилот намедиҳем, ба ғайр аз он ки ба таҳиягарони Spring дар фаҳманд, ки чӣ гуна онҳо метавонанд API-ҳои Spring-ро бо API-ҳои MicroProfile дар Quarkus истифода баранд.
Контейнерҳо ва Кубернетҳо
Барои содда нигоҳ доштани ин мақола, мо дар ин ҷо танҳо ҷанбаҳои сатҳи баланди дастгирӣро фаро мегирем.
Кваркус низ
Ниҳоят, бо таваҷҷӯҳ ба Kubernetes ҳамчун муҳити ҷойгиркунии ҳадаф, Quarkus чаҳорчӯбаи Java-ро дар ҳолатҳое истифода намебарад, ки функсияҳои шабеҳ дар сатҳи худи платформаи Kubernetes амалӣ карда мешаванд. Ҷадвали 1 харитаи мукотибаи функсионалии байни Kubernetes ва чаҳорчӯбаҳои маъмулии Java, ки аз ҷониби таҳиягарони Spring истифода мешаванд, оварда шудааст.
Ҷадвали 1. Харитаи мукотибаи функсионалӣ байни чаҳорчӯбаҳои Java ва Kubernetes.
Функсияҳо
Пойгоҳи анъанавии баҳорӣ
Кубернитель
Кашфи хидмат
Eureka
DNS
Танзимот
Конфигуратсияи абрии баҳор
Танзимоти харитаҳо/сирҳо
Мувозинати бори
Лента (тарафи мизоҷ)
Хидмат, Назоратчии такрорӣ (тарафи сервер)
Тартиб додан ва иҷро кардани код аз мисол
Дар ин мақола мо ба он муроҷиат мекунем
API-ҳои Spring Framework
Тазриқи вобастагӣ
Quarkus як қатор дастгирӣ мекунад
В
Ҷадвали 2. Намунаҳои истифодаи API-ҳои Spring DI дастгирӣшаванда.
Хусусиятҳои дастгирии 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
@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 истифода баранд. Намунаҳои тарзи истифодаи API-ҳои Spring Web API дар ҷадвали 3 оварда шудаанд ва маълумоти бештар ва мисолҳоро дар ин мавзӯъ дар дарси Quarkus пайдо кардан мумкин аст.
Љадвали 3. Намунањои истифодаи API-њои Spring Web-и дастгиришаванда.
Хусусиятҳои веби баҳори дастгирӣшаванда
намунаи
@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 JPA-ро бо истифода аз Hibernate ORM дастгирӣ мекунад. Инчунин барои таҳиягарони баҳор хабари хуш ҳаст: Quarkus шарҳҳо ва намудҳои маъмулии Spring Data JPA -ро дастгирӣ мекунад. Намунаҳои истифодаи API-ҳои Spring Data JPA дастгирӣшаванда дар ҷадвали 4 оварда шудаанд.
В
Ҷадвали 4. Намунаҳои истифодаи API-ҳои Spring Data JPA дастгирӣшаванда.
Хусусиятҳои дастгирии Spring Data JPA
намунаи
CrudRepository
public interface PersonRepository
extends JpaRepository,
PersonFragment {
...
}
Почтаи электронӣ
JpaRepository
Репозиторий PagingAndSorting
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);
}
API-ҳои MicroProfile
Таҳаммулпазирии хатогиҳо
Сохторҳои таҳаммулпазирии хатогиҳо барои пешгирии нокомиҳои каскадӣ ва эҷоди меъмории боэътимоди хидматрасонии хурд хеле муҳиманд. Таҳиягарони баҳор солҳои тӯлонӣ барои таҳаммулпазирӣ ба хатогиҳо аз дастгоҳҳои барқӣ истифода мебаранд.
Ҷадвали 5. Намунаҳои истифодаи API-ҳои таҳаммулпазирии хатогиҳои MicroProfile дастгирӣшаванда.
Хусусиятҳои таҳаммулпазирии хатогиҳои 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 анҷом додан мумкин аст, ки он ба таври нобаёнӣ санҷиши зиндаро анҷом медиҳад, аммо метавонад барои ҳамзамон санҷиши зиндашавӣ ва омодагӣ танзим карда шавад. Намунаҳои тарзи истифодаи API-ҳои дастгирӣшавандаи MicroProfile Health дар ҷадвали 6 оварда шудаанд ва маълумоти иловагӣ дар дастури Quarkus оварда шудаанд.
Ҷадвали 6: Намунаҳои истифодаи API-ҳои MicroProfile Health дастгирӣшаванда.
Хусусиятҳои Health 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 Metrics MicroProfile-ро барои таъмин намудани ченакҳои асосӣ (JVM ва системаи амалиётӣ), ченакҳои фурӯшанда (Quarkus) ва ченакҳои барнома истифода мебарад. MicroProfile Metrics талаб мекунад, ки татбиқ форматҳои баромади JSON ва OpenMetrics (Prometheus) -ро дастгирӣ кунад. Намунаҳои истифодаи MicroProfile Metrics API дар ҷадвали 7 оварда шудаанд.
В
Ҷадвали 7. Намунаҳои истифодаи API-ҳои MicroProfile Metrics.
Хусусиятҳои метрикаи 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
Микросервисҳо аксар вақт нуқтаҳои ниҳоии RESTful пешниҳод мекунанд, ки барои кор бо API-ҳои мувофиқи муштарӣ талаб мекунанд. Барои истифодаи нуқтаи ниҳоӣ RESTful, таҳиягарони Spring маъмулан RestTemplate -ро истифода мебаранд. Quarkus барои ҳалли ин мушкилот API-ҳои MicroProfile Rest Client-ро пешниҳод мекунад, ки намунаҳои истифодаи онҳо дар ҷадвали 8 оварда шудаанд.
В
Ҷадвали 8. Намунаҳои истифодаи API-ҳои MicroProfile Rest Client.
Хусусиятҳои Client Rest MicroProfile
Шарҳи
намунаи
@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
Натиҷаҳо
Дар ин блог, ки асосан ба таҳиягарони баҳор нигаронида шудааст, мо зуд дида баромадем, ки чӣ тавр истифода бурдани API-ҳои Spring бо API-ҳои MicroProfile дар Кваркус барои таҳияи микросервисҳои Java ва сипас онҳоро ба коди дуии модарӣ, ки садҳо мегабайт RAM-ро сарфа мекунад ва дар он оғоз мекунад, тартиб дод. як масъалаи миллисония.
Тавре ки шумо аллакай фаҳмидед, маълумоти бештарро дар бораи дастгирии API-ҳои Spring ва MicroProfile ва инчунин бисёр дигар маълумоти муфидро дар ин саҳифа пайдо кардан мумкин аст.
Манбаъ: will.com