ΠΠ΄ΡΠ°Π²Π΅ΠΉΡΠ΅ Π²ΡΠΈΡΠΊΠΈ, Π΅ΡΠΎ ΡΡΠ΅ΡΠ°ΡΠ° ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡ ΠΎΡ ΠΏΠΎΡΠ΅Π΄ΠΈΡΠ°ΡΠ° Quarkus!
ΠΠΎΠ³Π°ΡΠΎ ΡΠ΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ²Π°Ρ Java ΠΌΠΈΠΊΡΠΎΡΡΠ»ΡΠ³ΠΈ, ΡΠ΅ΡΡΠΎ ΡΠ΅ ΡΠΌΡΡΠ°, ΡΠ΅
Π ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ, ΠΏΡΡΠ²ΠΎ ΡΠ΅ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΎΠ±Ρ
Π²Π°ΡΠ° ΠΈ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈΡΠ΅ Π·Π° ΡΠΎΠ²Π° ΠΊΠ°ΠΊ Quarkus ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° Spring API, Π·Π° Π΄Π° ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ Π½Π° Spring ΠΊΠ°ΠΊ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ MicroProfile API Π² Π΅ΠΆΠ΅Π΄Π½Π΅Π²Π½Π°ΡΠ° ΡΠΈ ΡΠ°Π±ΠΎΡΠ°. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΅ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ MicroProfile API, ΠΊΠΎΠΈΡΠΎ ΡΠ° ΠΏΠΎΠ»Π΅Π·Π½ΠΈ Π·Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ Π½Π° Spring ΠΏΡΠΈ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΌΠΈΠΊΡΠΎΡΡΠ»ΡΠ³ΠΈ.
ΠΠ°ΡΠΎ Quarkus? ΠΡΡΠ²ΠΎ, ΡΠΎΠ²Π° Π΅ ΠΊΠΎΠ΄ΠΈΡΠ°Π½Π΅ Π½Π° ΠΆΠΈΠ²ΠΎ, ΡΠΎΠ΅ΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΠΏΡΠ΅Π·Π°ΡΠ΅ΠΆΠ΄Π°Π½Π΅ Π½Π° Π²ΡΠΈΡΠΊΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π² MicroProfile API, Spring API ΠΈ Π΄ΡΡΠ³ΠΈ Java API, ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° ΡΠ°ΠΌΠΎ Ρ Π΅Π΄Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°: mvn quarkus:dev. ΠΠ° Π²ΡΠΎΡΠΎ ΠΌΡΡΡΠΎ, ΠΎΠ±ΡΡΠ΄Π΅Π½ΠΎ Π²
ΠΡΠΌΠ° Π΄Π° Π½Π°Π²Π»ΠΈΠ·Π°ΠΌΠ΅ Π² ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ Π·Π° MicroProfile, ΠΎΡΠ²Π΅Π½ Π·Π° Π΄Π° ΠΏΠΎΠΌΠΎΠ³Π½Π΅ΠΌ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ Π½Π° Spring Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ°Ρ ΠΊΠ°ΠΊ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ API Π½Π° Spring Ρ API Π½Π° MicroProfile Π² Quarkus.
ΠΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ ΠΈ Kubernetes
ΠΠ° Π΄Π° ΠΎΠΏΡΠΎΡΡΠΈΠΌ ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ, ΡΡΠΊ ΡΠ΅ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΡΠ°ΠΌΠΎ Π°ΡΠΏΠ΅ΠΊΡΠΈΡΠ΅ Π½Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ°ΡΠ° ΠΎΡ Π²ΠΈΡΠΎΠΊΠΎ Π½ΠΈΠ²ΠΎ.
ΠΠ²Π°ΡΠΊΡΡ ΡΡΡΠΎ
Π Π½Π°ΠΊΡΠ°Ρ, ΡΠΎΠΊΡΡΠΈΡΠ°ΠΉΠΊΠΈ ΡΠ΅ Π²ΡΡΡ Ρ Kubernetes ΠΊΠ°ΡΠΎ ΡΠ΅Π»Π΅Π²Π° ΡΡΠ΅Π΄Π° Π·Π° Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅, Quarkus Π½Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Java ΡΠ°ΠΌΠΊΠΈ Π² ΡΠ»ΡΡΠ°ΠΈΡΠ΅, ΠΊΠΎΠ³Π°ΡΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½Π° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡ Π΅ Π²Π½Π΅Π΄ΡΠ΅Π½Π° Π½Π° Π½ΠΈΠ²ΠΎΡΠΎ Π½Π° ΡΠ°ΠΌΠ°ΡΠ° ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ° Kubernetes. Π’Π°Π±Π»ΠΈΡΠ° 1 ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ ΠΊΠ°ΡΡΠ° Π½Π° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΠΎ ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ Kubernetes ΠΈ ΡΠΈΠΏΠΈΡΠ½ΠΈΡΠ΅ ΡΠ°ΠΌΠΊΠΈ Π½Π° Java, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ ΠΎΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ Π½Π° Spring.
Π’Π°Π±Π»ΠΈΡΠ° 1. ΠΠ°ΡΡΠ° Π½Π° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΠΎ ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ Java frameworks ΠΈ Kubernetes.
ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π΅Π½
Π’ΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π΅Π½ ΠΏΡΠΎΠ»Π΅ΡΠ΅Π½ Π±ΠΎΡΡΡ
Kubernetes
ΠΡΠΊΡΠΈΠ²Π°Π½Π΅ Π½Π° ΡΡΠ»ΡΠ³Π°
Eureka
DNS
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ
Spring Cloud Config
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΊΠ°ΡΡΠΈ/ΡΠ°ΠΉΠ½ΠΈ
ΠΠ°Π»Π°Π½ΡΠΈΡΠ°Π½Π΅ Π½Π° Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ΡΠΎ
ΠΠ΅Π½ΡΠ° (ΠΎΡ ΡΡΡΠ°Π½Π°ΡΠ° Π½Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠ°)
Π£ΡΠ»ΡΠ³Π°, ΠΊΠΎΠ½ΡΡΠΎΠ»Π΅Ρ Π·Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ (ΠΎΡ ΡΡΡΠ°Π½Π°ΡΠ° Π½Π° ΡΡΡΠ²ΡΡΠ°)
ΠΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π΅ ΠΈ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠ΄Π° ΠΎΡ ΠΏΡΠΈΠΌΠ΅ΡΠ°
Π ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΡΠ΅ ΠΏΠΎΠ·ΠΎΠ²Π°Π²Π°ΠΌΠ΅ Π½Π°
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
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 Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ 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. ΠΡΠΈΠΌΠ΅ΡΠΈ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Π½ΠΈΡΠ΅ 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);
}
API Π½Π° MicroProfile
Π’ΠΎΠ»Π΅ΡΠ°Π½ΡΠ½ΠΎΡΡ ΠΊΡΠΌ Π³ΡΠ΅ΡΠΊΠΈ
ΠΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈΡΠ΅ Π·Π° ΡΠΎΠ»Π΅ΡΠ°Π½ΡΠ½ΠΎΡΡ ΠΊΡΠΌ Π³ΡΠ΅ΡΠΊΠΈ ΡΠ° ΠΌΠ½ΠΎΠ³ΠΎ Π²Π°ΠΆΠ½ΠΈ Π·Π° ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΊΠ°ΡΠΊΠ°Π΄Π½ΠΈ ΠΏΠΎΠ²ΡΠ΅Π΄ΠΈ ΠΈ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° Π½Π°Π΄Π΅ΠΆΠ΄Π½ΠΈ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΠ·Π½ΠΈ Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠΈ. Π Π°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ Π½Π° Spring ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΏΡΠ΅ΠΊΡΡΠ²Π°ΡΠΈ Π·Π° ΠΎΡΠΊΠ°Π·ΠΎΡΡΡΠΎΠΉΡΠΈΠ²ΠΎΡΡ ΠΎΡ ΠΌΠ½ΠΎΠ³ΠΎ Π³ΠΎΠ΄ΠΈΠ½ΠΈ.
Π’Π°Π±Π»ΠΈΡΠ° 5. ΠΡΠΈΠΌΠ΅ΡΠΈ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Π½ΠΈ API Π·Π° ΡΠΎΠ»Π΅ΡΠ°Π½ΡΠ½ΠΎΡΡ ΠΊΡΠΌ Π³ΡΠ΅ΡΠΊΠΈ Π½Π° MicroProfile.
Π€ΡΠ½ΠΊΡΠΈΠΈ Π·Π° ΡΡΡΠΎΠΉΡΠΈΠ²ΠΎΡΡ Π½Π° Π³ΡΠ΅ΡΠΊΠΈ Π½Π° MicroProfile
ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅
ΠΡΠΈΠΌΠ΅ΡΡ
@ΠΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎ
ΠΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° Π»ΠΎΠ³ΠΈΠΊΠ° Π² ΠΎΡΠ΄Π΅Π»Π½Π° Π½ΠΈΡΠΊΠ°
@Asynchronous
@Retry
public Future<String> getSalutation() {
...
return future;
}
@ΠΡΠ΅Π³ΡΠ°Π΄Π°
ΠΠ³ΡΠ°Π½ΠΈΡΠ΅ΡΠ΅ Π±ΡΠΎΡ Π½Π° Π΅Π΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΈΡΠ΅ Π·Π°ΡΠ²ΠΊΠΈ
@Bulkhead(5)
public void fiveConcurrent() {
makeRemoteCall(); //...
}
@ΠΡΠ΅ΠΊΡΡΠ²Π°Ρ
ΠΠ½ΡΠ΅Π»ΠΈΠ³Π΅Π½ΡΠ½ΠΎ ΡΠΏΡΠ°Π²ΡΠ½Π΅ Ρ ΠΏΠΎΠ²ΡΠ΅Π΄ΠΈ ΠΈ Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ ΠΎΡ ΠΏΠΎΠ²ΡΠ΅Π΄ΠΈ
@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(); //...
}
ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΡΠ»ΡΠ³ΠΈ (Service Health)
ΠΠ»Π°ΡΡΠΎΡΠΌΠΈΡΠ΅ Kubernetes Π½Π°Π±Π»ΡΠ΄Π°Π²Π°Ρ ΠΈΠ·ΠΏΡΠ°Π²Π½ΠΎΡΡΡΠ° Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΡΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΡΠΏΠ΅ΡΠΈΠ°Π»Π½ΠΈ ΡΡΠ»ΡΠ³ΠΈ. ΠΠ° Π΄Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ Π½Π° ΠΎΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ° Π΄Π° Π½Π°Π±Π»ΡΠ΄Π°Π²Π° ΡΡΠ»ΡΠ³ΠΈΡΠ΅, ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ Π½Π° Spring ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΏΠ΅ΡΡΠΎΠ½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ HealthIndicator ΠΈ Spring Boot Actuator. Π Quarkus ΡΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° MicroProfile Health, ΠΊΠΎΠΉΡΠΎ ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ ΠΈΠ·Π²ΡΡΡΠ²Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΠΆΠΈΠ·Π½Π΅ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΡΠ°, Π½ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½ Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π° Π΅Π΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΆΠΈΠ·Π½Π΅ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΡΠ° ΠΈ Π³ΠΎΡΠΎΠ²Π½ΠΎΡΡΡΠ°. ΠΡΠΈΠΌΠ΅ΡΠΈ Π·Π° ΡΠΎΠ²Π° ΠΊΠ°ΠΊ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Π½ΠΈΡΠ΅ API Π½Π° MicroProfile Health ΡΠ° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π΅Π½ΠΈ Π² ΡΠ°Π±Π»ΠΈΡΠ° 6, Π° Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π΅Π½Π° Π² ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎΡΠΎ Π½Π° Quarkus
Π’Π°Π±Π»ΠΈΡΠ° 6: ΠΡΠΈΠΌΠ΅ΡΠΈ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Π½ΠΈ API Π½Π° MicroProfile Health.
Π₯Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ Π½Π° 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();
}
ΠΠ΅ΡΡΠΈΠΊΠ°
ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡΠ° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΡΡ ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ ΠΈΠ»ΠΈ Π·Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΈ ΡΠ΅Π»ΠΈ (Π·Π° Π½Π°Π±Π»ΡΠ΄Π΅Π½ΠΈΠ΅ Π½Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° SLA), ΠΈΠ»ΠΈ Π·Π° Π½Π΅ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΈ ΡΠ΅Π»ΠΈ (Π±ΠΈΠ·Π½Π΅Ρ SLA). Π Π°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ Π½Π° Spring ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΡΡ ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ Spring Boot Actuator ΠΈ Micrometer. ΠΠ° ΡΠ²ΠΎΠΉ ΡΠ΅Π΄ Quarkus ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° MicroProfile Metrics, Π·Π° Π΄Π° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈ Π±Π°Π·ΠΎΠ²ΠΈ ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ (JVM ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°), ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ Π½Π° Π΄ΠΎΡΡΠ°Π²ΡΠΈΠΊΠ° (Quarkus) ΠΈ ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ Π·Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. MicroProfile Metrics ΠΈΠ·ΠΈΡΠΊΠ²Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π΄Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈ ΡΠΎΡΠΌΠ°ΡΠΈ JSON ΠΈ OpenMetrics (Prometheus). ΠΡΠΈΠΌΠ΅ΡΠΈ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° API Π½Π° MicroProfile Metrics ΡΠ° Π΄Π°Π΄Π΅Π½ΠΈ Π² ΡΠ°Π±Π»ΠΈΡΠ° 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 Client
ΠΠΈΠΊΡΠΎΡΡΠ»ΡΠ³ΠΈΡΠ΅ ΡΠ΅ΡΡΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΡΡ 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, ΡΠ°Π·Π³Π»Π΅Π΄Π°Ρ ΠΌΠ΅ Π±ΡΡΠ·ΠΎ ΠΊΠ°ΠΊ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ API Π½Π° Spring Ρ API Π½Π° MicroProfile Π² Quarkus, Π·Π° Π΄Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΈΠΌ Java ΠΌΠΈΠΊΡΠΎΡΡΠ»ΡΠ³ΠΈ ΠΈ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° Π΄Π° Π³ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°ΠΌΠ΅ Π² ΡΠΎΠ±ΡΡΠ²Π΅Π½ Π΄Π²ΠΎΠΈΡΠ΅Π½ ΠΊΠΎΠ΄, ΠΊΠΎΠΉΡΠΎ ΡΠΏΠ΅ΡΡΡΠ²Π° ΡΡΠΎΡΠΈΡΠΈ ΠΌΠ΅Π³Π°Π±Π°ΠΉΡΠΈ RAM ΠΈ ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ° Π² Π²ΡΠΏΡΠΎΡ Π½Π° ΠΌΠΈΠ»ΠΈΡΠ΅ΠΊΡΠ½Π΄ΠΈ.
ΠΠ°ΠΊΡΠΎ Π²Π΅ΡΠ΅ ΡΠ°Π·Π±ΡΠ°Ρ
ΡΠ΅, ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ°ΡΠ° Π½Π° API Π½Π° Spring ΠΈ MicroProfile, ΠΊΠ°ΠΊΡΠΎ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΡΡΠ³Π° ΠΏΠΎΠ»Π΅Π·Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ Π²
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com