แแแแแกแแแแแแแ แงแแแแแก, แแ, แแแกแแแ แแแกแขแ Quarkus-แแก แกแแ แแแจแ!
Java แแแแ แแกแแ แแแกแแแแก แจแแแฃแจแแแแแแกแแก แฎแจแแ แแ แกแฏแแ แแ, แ แแ
แชแแขแ แฃแคแ แ แแแขแแแฃแ แแ, แฉแแแ แแแ แแแ แ แแแจแ แแแแแแฎแแแแแ แกแคแแ แแก แแ แแแขแแแแแก แแแแก แจแแกแแฎแแ, แแฃ แ แแแแ แฃแญแแ แก แแฎแแ แก Quarkus Spring API-แแแก, แ แแแ Spring แแแแแแแแแ แแแก แแแฉแแแแแ, แแฃ แ แแแแ แแแแแแงแแแแ MicroProfile API แแแแแแแ แงแแแแแแฆแแฃแ แแฃแจแแแแแจแ. แจแแแแแ แฉแแแ แแแแแจแฃแฅแแแ MicroProfile API-แแแก, แ แแแแแแแช แกแแกแแ แแแแแแ Spring แแแแแแแแแ แแแแกแแแแก แแแแ แแกแแ แแแกแแแแก แจแแฅแแแแกแแก.
แ แแขแแ Quarkus? แแแ แแแ แ แแแจแ, แแก แแ แแก แชแแชแฎแแแ แแแแแ แแแ, แแแฃ MicroProfile API, Spring API แแ แกแฎแแ Java API-แแแจแ แแแแแกแแแแ แ แชแแแแแแแแก แแแขแแแแขแฃแ แ แแแแแขแแแ แแแ, แ แแแแแแช แจแแกแ แฃแแแแฃแแแ แแฎแแแแ แแ แแ แแ แซแแแแแแ: mvn quarkus:dev. แแแแ แแช, แแแแฎแแแฃแแ แแงแ
แฉแแแ แแ แแแแแแฎแแแแแ แแแขแแแแแก MicroProfile-แแก แจแแกแแฎแแ, แแแ แแ แแแแกแ, แ แแ แแแแแฎแแแ แแ Spring แแแแแแแแแ แแแก แแแแก แแแแแแแจแ, แแฃ แ แแแแ แจแแฃแซแแแแ แแแแแแงแแแแ Spring API-แแแ MicroProfile API-แแแแ Quarkus-แจแ.
แแแแขแแแแแ แแแ แแ แแฃแแแ แแแขแแแ
แแ แกแขแแขแแแก แแแ แขแแแ แจแแกแแแแ แฉแฃแแแแแแ, แแฅ แแฎแแแแ แแแฆแแแ แแแแแก แแฎแแ แแแญแแ แแก แแกแแแฅแขแแแก แแแแแแฎแแแแแ.
แแแแ แแฃแกแแช
แแแแแแแก, Kubernetes-แแ, แ แแแแ แช แกแแแแแแ แแแแแแแแแแก แแแ แแแแแ แคแแแฃแกแแ แแแแ, Quarkus แแ แแงแแแแแก Java Framework-แแแก แแ แจแแแแฎแแแแแแจแ, แ แแแแกแแช แแกแแแแกแ แคแฃแแฅแชแแแแแ แแแ แฎแแ แชแแแแแแแ แแแแแ Kubernetes แแแแขแคแแ แแแก แแแแแแ. แชแฎแ แแแจแ 1 แแแชแแแฃแแแ แคแฃแแฅแชแแฃแ แ แแแ แแกแแแแแแแชแแแก แ แฃแแ Kubernetes-แกแ แแ แขแแแฃแ แฏแแแแก แฉแแ แฉแแแแก แจแแ แแก, แ แแแแแแกแแช แแงแแแแแแ Spring แแแแแแแแแ แแแ.
แชแฎแ แแแ 1. แฏแแแแก แฉแแ แฉแแแแกแ แแ แแฃแแแ แแแขแแแก แจแแ แแก แคแฃแแฅแชแแฃแ แ แแแ แแกแแแแแแแชแแแก แ แฃแแ.
แคแฃแแฅแชแแแแแแแแ
แขแ แแแแชแแฃแแ แกแแแแแแคแฎแฃแแ แฉแแฅแแ
แแฃแแแ แแแขแแแ
แกแแ แแแกแแก แแฆแแแฉแแแ
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 แแแแแแแแแ แแแก แกแแจแฃแแแแแ แแแกแชแแก แแแแแแงแแแแ 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 แแฎแแ แก แฃแญแแ แก JPA-แก Hibernate ORM-แแก แแแแแงแแแแแแ. แแกแแแ แแ แแก แแแ แแ แกแแแฎแแ Spring แแแแแแแแแ แแแแกแแแแก: Quarkus แแฎแแ แก แฃแญแแ แก แแแแแคแฎแฃแแแก แแแแแชแแแแ JPA-แก แกแแแ แแ แแแแขแแชแแแแกแ แแ แขแแแแแก. แแฎแแ แแแญแแ แแแ Spring Data JPA API-แแแแก แแแแแงแแแแแแก แแแแแแแแแแ แแแชแแแฃแแแ แชแฎแ แแแจแ 4.
ะ
แชแฎแ แแแ 4. แแฎแแ แแแญแแ แแแ Spring Data JPA API-แแแแก แแแแแงแแแแแแก แแแแแแแแแแ.
แแฎแแ แแแญแแ แแแ Spring Data JPA แคแฃแแฅแชแแแแ
แแแแแแแแแแ
CrudRepository
public interface PersonRepository
extends JpaRepository,
PersonFragment {
...
}
แกแแชแแแ
JpaRepository
PagingAndSorting Repository
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 Fault Tolerance API-แแแแก แแแแแงแแแแแแก แแแแแแแแแแ.
แแแแ แแแ แแคแแแแก แจแแชแแแแแก แขแแแแ แแแขแแแแก แแแฎแแกแแแแแแแแแ
แแฆแฌแแ แ
แแแแแแแแแแ
@แแกแแแฅแ แแแฃแแ
แแแแแแแก แจแแกแ แฃแแแแ แชแแแแ แแแแแจแ
@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 แแแแขแคแแ แแแแ แแแแแขแ แแแแแแ แแแแขแแแแแ แแแแก แฏแแแแ แแแแแแแก แกแแแชแแแแฃแ แ แกแแ แแแกแแแแก แแแแแงแแแแแแ. แแแแกแแแแแก, แ แแ แคแฃแซแแแแแแแฃแ แ แแแแขแคแแ แแ แแแแกแแฎแฃแ แแก แกแแ แแแกแแแแก แแแแแขแแ แแแแแกแแแแก, Spring แแแแแแแแแ แแแ แฉแแแฃแแแแ แแ แแงแแแแแแ แแแ แแแแฃแ HealthIndicator-แก แแ Spring Boot Actuator-แก. Quarkus-แจแ แแก แจแแแซแแแแ แแแแแแแแก MicroProfile Health-แแก แแแแแงแแแแแแ, แ แแแแแแช แแแแฃแแแกแฎแแแแแ แแฎแแ แชแแแแแแก แกแแชแแชแฎแแแกแฃแแแ แแแแแแแก แจแแแแฌแแแแแก, แแแแ แแ แจแแแซแแแแ แแแแคแแแฃแ แแ แแแฃแแ แแงแแก แกแแชแแชแฎแแแกแ แแ แแแแแงแแคแแแก แแ แแแ แแฃแแแ แจแแกแแแแฌแแแแแแ. แแฎแแ แแแญแแ แแแ MicroProfile Health API-แแแแก แแแแแงแแแแแแก แแแแแแแแแแ แแแชแแแฃแแแ แชแฎแ แแแจแ 6 แแ แแแแแขแแแแแ แแแคแแ แแแชแแ แแแชแแแฃแแแ Quarkus-แแก แกแแฎแแแแซแฆแแแแแแแจแ.
แชแฎแ แแแ 6: แแฎแแ แแแญแแ แแแ MicroProfile Health API-แแแแก แแแแแงแแแแแแก แแแแแแแแแแ.
MicroProfile แฏแแแแ แแแแแแแก แแแฎแแกแแแแแแแแแ
แแฆแฌแแ แ
แแแแแแแแแแ
@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-แแแแก แแแแแขแแ แแแแแกแแแแก) แแ แแ แแแแแ แแชแแฃแแ แแแแแแแแกแแแแก (แแแแแแกแแก SLA). แกแแแแแแคแฎแฃแแ แแแแแแแแแ แแแ แฃแแ แฃแแแแแงแแคแแ แแแขแ แแแแก Spring Boot Actuator-แแกแ แแ Micrometer-แแก แแแแแงแแแแแแ. แแแแแก แแฎแ แแ, Quarkus แแงแแแแแก MicroProfile Metrics-แก แกแแแแแแกแ แแแขแ แแแแก (JVM แแ แแแแ แแชแแฃแแ แกแแกแขแแแ), แแแแงแแแแแแแก แแแขแ แแแแก (Quarkus) แแ แแแแแแแชแแแก แแแขแ แแแแก แฃแแ แฃแแแแแกแแงแแคแแ. MicroProfile Metrics แแแแแฎแแแก, แ แแ แแแแฎแแ แชแแแแแแแ แแฎแแ แ แแแฃแญแแ แแก JSON แแ OpenMetrics (Prometheus) แแแแแแแแแแ แคแแ แแแขแแแก. MicroProfile Metrics API-แแก แแแแแงแแแแแแก แแแแแแแแแแ แแแชแแแฃแแแ แชแฎแ แแแจแ 7.
ะ
แชแฎแ แแแ 7. MicroProfile Metrics API-แแแแก แแแแแงแแแแแแก แแแแแแแแแแ.
MicroProfile Metrics แแแฎแแกแแแแแแแแแ
แแฆแฌแแ แ
แแแแแแแแแแ
@แแแแแแแแ
แแฆแแแจแแแแก แแ แแชแฎแแแแก, แ แแแแแแช แแแแแแก แ แแแแแแฏแแ แแฅแแ แแแแแซแแฎแแแฃแแ แแแแขแแ แแแฃแแ แแแแแฅแขแ
@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 แแแแ แฌแแ แขแแแแแแก แแแแแกแแงแแแแแแแ แแแแแคแฎแฃแแแก แแแแแแแแแ แแแ แฉแแแฃแแแแ แแ แแงแแแแแแ 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 แแแแแแแแแ แแแแกแแแแก, แฉแแแ แแแแแแฎแแแแ, แแฃ แ แแแแ แแแแแแแงแแแแ Spring API-แแแ MicroProfile API-แแแแ Quarkus-แจแ แฏแแแแก แแแแ แแกแแ แแแกแแแแก แแแกแแแแแแ แแแแแ แแ แจแแแแแ แแแแ แจแแแแแแแก แแฃแแแแ แแ แแแแแ แฃแ แแแแจแ, แ แแแแแแช แแแแแแแแก แแกแแแแ แแแแแแแแขแก แแแแ แแขแแฃแแ แแแฎแกแแแ แแแแก แแ แแแจแแแแแก แแแแแฌแแแแแแก แกแแแแแฎแ.
แ แแแแ แช แฃแแแ แแแฎแแแแ, แแแแแขแแแแแ แแแคแแ แแแชแแ Spring แแ MicroProfile API-แแแแก แแฎแแ แแแญแแ แแก แจแแกแแฎแแ, แแกแแแ แ แแแแ แช แแแแ แ แกแฎแแ แกแแกแแ แแแแแ แแแคแแ แแแชแแ, แจแแแแซแแแแ แแฎแแแแ แแฅ
แฌแงแแ แ: www.habr.com