ΠΠ΄ΡΠ°Π²ΠΎ Π½Π° ΡΠΈΡΠ΅, Π΅Π²Π΅ Π³ΠΎ ΡΡΠ΅ΡΠΈΠΎΡ ΠΏΠΎΡΡ ΠΎΠ΄ ΡΠ΅ΡΠΈΡΠ°ΡΠ° ΠΠ²Π°ΡΠΊΡΡ!
ΠΠΎΠ³Π° ΡΠ΅ ΡΠ°Π·Π²ΠΈΠ²Π°Π°Ρ Java ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠΈ, ΡΠ΅ΡΡΠΎ ΡΠ΅ Π²Π΅ΡΡΠ²Π° Π΄Π΅ΠΊΠ°
ΠΠ°Π»ΠΊΡ ΠΏΠΎΠ΄Π΅ΡΠ°Π»Π½ΠΎ, ΠΏΡΠ²ΠΎ ΡΠ΅ Π³ΠΎ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΎΠΏΡΠ΅Π³ΠΎΡ ΠΈ Π΄Π΅ΡΠ°Π»ΠΈΡΠ΅ Π·Π° ΡΠΎΠ° ΠΊΠ°ΠΊΠΎ Quarkus ΠΏΠΎΠ΄Π΄ΡΠΆΡΠ²Π° Spring API Π·Π° Π΄Π° ΠΈΠΌ ΠΏΠΎΠΊΠ°ΠΆΠ΅ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ΅ΡΠΈΡΠ΅ Π½Π° Spring ΠΊΠ°ΠΊΠΎ Π΄Π° Π³ΠΎ ΠΊΠΎΡΠΈΡΡΠ°Ρ MicroProfile API Π²ΠΎ Π½ΠΈΠ²Π½Π°ΡΠ° ΡΠ΅ΠΊΠΎΡΠ΄Π½Π΅Π²Π½Π° ΡΠ°Π±ΠΎΡΠ°. ΠΠΎΡΠΎΠ° ΡΠ΅ Π³ΠΈ ΠΏΠΎΠΊΡΠΈΠ΅ΠΌΠ΅ API-ΡΠ΅ Π½Π° MicroProfile, ΠΊΠΎΠΈ ΡΠ΅ ΠΊΠΎΡΠΈΡΠ½ΠΈ Π·Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ΅ΡΠΈΡΠ΅ Π½Π° Spring ΠΊΠΎΠ³Π° ΠΊΡΠ΅ΠΈΡΠ°Π°Ρ ΠΌΠΈΠΊΡΠΎΡΡΠ»ΡΠ³ΠΈ.
ΠΠΎΡΡΠΎ ΠΠ²Π°ΡΠΊΡΡ? ΠΡΠ²ΠΎ, ΠΎΠ²Π° Π΅ ΠΊΠΎΠ΄ΠΈΡΠ°ΡΠ΅ Π²ΠΎ ΠΆΠΈΠ²ΠΎ, ΠΎΠ΄Π½ΠΎΡΠ½ΠΎ Π°Π²ΡΠΎΠΌΠ°ΡΡΠΊΠΎ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ Π²ΡΠΈΡΡΠ²Π°ΡΠ΅ Π½Π° ΠΊΠ°ΠΊΠ²ΠΈ Π±ΠΈΠ»ΠΎ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π²ΠΎ MicroProfile API, Spring API ΠΈ Π΄ΡΡΠ³ΠΈ Java API, ΡΡΠΎ ΡΠ΅ ΠΈΠ·Π²Π΅Π΄ΡΠ²Π° ΡΠΎ ΡΠ°ΠΌΠΎ Π΅Π΄Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°: mvn quarkus:dev. ΠΡΠΎΡΠΎ, Π΄ΠΈΡΠΊΡΡΠΈΡΠ°Π½ΠΎ Π²ΠΎ
ΠΠ΅ΠΌΠ° Π΄Π° Π½Π°Π²Π»Π΅Π³ΡΠ²Π°ΠΌΠ΅ Π²ΠΎ Π΄Π΅ΡΠ°Π»ΠΈ Π·Π° MicroProfile, ΠΎΡΠ²Π΅Π½ Π΄Π° ΠΈΠΌ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ΠΌΠ΅ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ΅ΡΠΈΡΠ΅ Π½Π° Spring Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ°Ρ ΠΊΠ°ΠΊΠΎ ΠΌΠΎΠΆΠ°Ρ Π΄Π° ΠΊΠΎΡΠΈΡΡΠ°Ρ Spring API ΡΠΎ MicroProfile API Π²ΠΎ Quarkus.
ΠΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΈ ΠΈ ΠΡΠ±Π΅ΡΠ½Π΅ΡΠΈ
ΠΠ° Π΄Π° Π±ΠΈΠ΄Π΅ ΠΎΠ²ΠΎΡ Π½Π°ΠΏΠΈΡ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π΅Π½, ΠΎΠ²Π΄Π΅ ΡΠ΅ Π³ΠΈ ΠΏΠΎΠΊΡΠΈΠ΅ΠΌΠ΅ ΡΠ°ΠΌΠΎ Π°ΡΠΏΠ΅ΠΊΡΠΈΡΠ΅ Π½Π° ΠΏΠΎΠ΄Π΄ΡΡΠΊΠ°ΡΠ° Π½Π° Π²ΠΈΡΠΎΠΊΠΎ Π½ΠΈΠ²ΠΎ.
ΠΠ²Π°ΡΠΊΡΡΠΎΡ ΠΈΡΡΠΎ ΡΠ°ΠΊΠ°
ΠΠΎΠ½Π΅ΡΠ½ΠΎ, ΡΠΎ ΡΠΎΠΊΡΡΠΈΡΠ°ΡΠ΅ Π½Π° Kubernetes ΠΊΠ°ΠΊΠΎ ΡΠ΅Π»Π½Π° ΠΎΠΊΠΎΠ»ΠΈΠ½Π° Π·Π° ΡΠ°ΡΠΏΠΎΡΠ΅Π΄ΡΠ²Π°ΡΠ΅, Quarkus Π½Π΅ ΠΊΠΎΡΠΈΡΡΠΈ Java frames Π²ΠΎ ΡΠ»ΡΡΠ°ΠΈ ΠΊΠΎΠ³Π° ΡΠ»ΠΈΡΠ½Π° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡ Π΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°Π½Π° Π½Π° Π½ΠΈΠ²ΠΎ Π½Π° ΡΠ°ΠΌΠ°ΡΠ° ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ° Kubernetes. Π’Π°Π±Π΅Π»Π° 1 Π΄Π°Π²Π° ΠΌΠ°ΠΏΠ° Π½Π° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½Π°ΡΠ° ΠΊΠΎΡΠ΅ΡΠΏΠΎΠ½Π΄Π΅Π½ΡΠΈΡΠ° ΠΏΠΎΠΌΠ΅ΡΡ Kubernetes ΠΈ ΡΠΈΠΏΠΈΡΠ½ΠΈΡΠ΅ Java ΡΠ°ΠΌΠΊΠΈ ΡΡΠΎ Π³ΠΈ ΠΊΠΎΡΠΈΡΡΠ°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ΅ΡΠΈΡΠ΅ Spring.
Π’Π°Π±Π΅Π»Π° 1. ΠΠ°ΡΡΠ° Π½Π° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½Π° ΠΊΠΎΡΠ΅ΡΠΏΠΎΠ½Π΄Π΅Π½ΡΠΈΡΠ° ΠΏΠΎΠΌΠ΅ΡΡ Java ΡΠ°ΠΌΠΊΠΈ ΠΈ Kubernetes.
Π€ΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½Π°
Π’ΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π°Π»Π½Π° ΠΏΡΠΎΠ»Π΅ΡΠ½Π° ΡΠΈΠ·ΠΌΠΈΡΠΊΠ°
ΠΡΠ±Π΅ΡΠ½Π΅ΡΠΈ
ΠΡΠΊΡΠΈΠ²Π°ΡΠ΅ Π½Π° ΡΡΠ»ΡΠ³Π°ΡΠ°
ΠΡΡΠ΅ΠΊΠ°
DNS
ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° Π½Π° ΠΏΡΠΎΠ»Π΅ΡΠ΅Π½ ΠΎΠ±Π»Π°ΠΊ
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΡΡΠ΅ ΠΌΠ°ΠΏΠΈ/ΡΠ°ΡΠ½ΠΈ
ΠΠ°Π»Π°Π½ΡΠΈΡΠ°ΡΠ΅ Π½Π° ΡΠΎΠ²Π°ΡΠΎΡ
ΠΠ΅Π½ΡΠ° (ΡΡΡΠ°Π½Π° Π½Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΡ)
Π‘Π΅ΡΠ²ΠΈΡ, ΠΊΠΎΠ½ΡΡΠΎΠ»Π΅Ρ Π·Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° (ΡΡΡΠ°Π½Π° Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠΎΡ)
Π‘ΠΎΡΡΠ°Π²ΡΠ²Π°ΡΠ΅ ΠΈ ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ Π½Π° ΠΊΠΎΠ΄ΠΎΡ ΠΎΠ΄ ΠΏΡΠΈΠΌΠ΅ΡΠΎΡ
ΠΠΎ ΠΎΠ²Π°Π° ΡΡΠ°ΡΠΈΡΠ° ΡΠ΅ ΠΎΡΠ²ΡΠ½ΡΠ²Π°ΠΌΠ΅ Π½Π°
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.
ΠΠΎΠ΄Π΄ΡΠΆΠ°Π½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π·Π° ΠΏΡΠΎΠ»Π΅ΡΠ½ΠΈ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ 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 Fault Tolerance API.
ΠΠ°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ Π·Π° ΡΠΎΠ»Π΅ΡΠ°Π½ΡΠΈΡΠ° Π½Π° Π³ΡΠ΅ΡΠΊΠΈ Π½Π° ΠΌΠΈΠΊΡΠΎΠΏΡΠΎΡΠΈΠ»ΠΎΡ
ΠΠΏΠΈΡ
ΠΏΡΠΈΠΌΠ΅ΡΠΈ
@ΠΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈ
ΠΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ Π»ΠΎΠ³ΠΈΠΊΠ° Π²ΠΎ ΠΏΠΎΡΠ΅Π±Π½Π° Π½ΠΈΡΠΊΠ°
@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(); //...
}
@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). ΠΡΠΎΠ³ΡΠ°ΠΌΠ΅ΡΠΈΡΠ΅ Π·Π° ΠΏΡΠΎΠ»Π΅Ρ ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡΠ²Π°Π°Ρ ΠΌΠ΅ΡΡΠΈΠΊΠ° ΡΠΎ ΠΏΠΎΠΌΠΎΡ Π½Π° Π°ΠΊΡΡΠ°ΡΠΎΡ Π·Π° ΠΏΠΎΠ΄ΠΈΠ³Π°ΡΠ΅ ΠΏΡΠΎΠ»Π΅Ρ ΠΈ ΠΌΠΈΠΊΡΠΎΠΌΠ΅ΡΠ°Ρ. ΠΠ° Π²ΠΎΠ·Π²ΡΠ°Ρ, Quarkus ΠΊΠΎΡΠΈΡΡΠΈ MicroProfile Metrics Π·Π° Π΄Π° ΠΎΠ±Π΅Π·Π±Π΅Π΄ΠΈ ΠΎΡΠ½ΠΎΠ²Π½Π° ΠΌΠ΅ΡΡΠΈΠΊΠ° (JVM ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π΅Π½ ΡΠΈΡΡΠ΅ΠΌ), ΠΌΠ΅ΡΡΠΈΠΊΠ° Π½Π° ΠΏΡΠΎΠ΄Π°Π²Π°ΡΠΎΡ (Quarkus) ΠΈ ΠΌΠ΅ΡΡΠΈΠΊΠ° Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ. MicroProfile Metrics Π±Π°ΡΠ° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ°ΡΠ° Π΄Π° ΠΏΠΎΠ΄Π΄ΡΠΆΡΠ²Π° ΠΈΠ·Π»Π΅Π·Π½ΠΈ ΡΠΎΡΠΌΠ°ΡΠΈ JSON ΠΈ OpenMetrics (Prometheus). ΠΡΠΈΠΌΠ΅ΡΠΈ Π·Π° ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° MicroProfile Metrics API ΡΠ΅ Π΄Π°Π΄Π΅Π½ΠΈ Π²ΠΎ Π’Π°Π±Π΅Π»Π° 7.
Π
Π’Π°Π±Π΅Π»Π° 7. ΠΡΠΈΠΌΠ΅ΡΠΈ Π·Π° ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ MicroProfile Metrics API.
ΠΠ°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ Π½Π° ΠΌΠ΅ΡΡΠΈΠΊΠ° Π½Π° ΠΌΠΈΠΊΡΠΎΠΏΡΠΎΡΠΈΠ»ΠΎΡ
ΠΠΏΠΈΡ
ΠΏΡΠΈΠΌΠ΅ΡΠΈ
@Π‘ΠΌΠ΅ΡΠ°Π½ΠΎ
ΠΠ·Π½Π°ΡΡΠ²Π° Π±ΡΠΎΡΠ°Ρ ΠΊΠΎΡ Π±ΡΠΎΠΈ ΠΊΠΎΠ»ΠΊΡ ΠΏΠ°ΡΠΈ Π±ΠΈΠ» ΠΏΠΎΠ²ΠΈΠΊΠ°Π½ ΠΎΠ·Π½Π°ΡΠ΅Π½ ΠΎΠ±ΡΠ΅ΠΊΡ
@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;
}
ΠΡΠ°ΡΠ½ΠΈ ΡΠΎΡΠΊΠΈ Π½Π° ΠΌΠ΅ΡΡΠΈΠΊΠ°
ΠΠ΅ΡΡΠΈΠΊΠ° Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ°
ΠΡΠ½ΠΎΠ²Π½ΠΈ ΠΌΠ΅ΡΡΠΈΠΊΠΈ
ΠΠ΅ΡΡΠΈΠΊΠ° Π½Π° ΠΏΡΠΎΠ΄Π°Π²Π°ΡΠΎΡ
Π‘ΠΈΡΠ΅ ΠΌΠ΅ΡΡΠΈΠΊΠΈ
ΠΠ»ΠΈΠ΅Π½Ρ Π·Π° ΠΎΠ΄ΠΌΠΎΡ Π½Π° ΠΌΠΈΠΊΡΠΎΠΏΡΠΎΡΠΈΠ»
ΠΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠΈΡΠ΅ ΡΠ΅ΡΡΠΎ ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡΠ²Π°Π°Ρ RESTful ΠΊΡΠ°ΡΠ½ΠΈ ΡΠΎΡΠΊΠΈ ΡΠΎ ΠΊΠΎΠΈ ΡΠ΅ ΠΏΠΎΡΡΠ΅Π±Π½ΠΈ ΡΠΎΠΎΠ΄Π²Π΅ΡΠ½ΠΈ API Π½Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΡ Π·Π° ΡΠ°Π±ΠΎΡΠ°. ΠΠ° Π΄Π° ΠΊΠΎΡΠΈΡΡΠ°Ρ RESTful ΠΊΡΠ°ΡΠ½ΠΈ ΡΠΎΡΠΊΠΈ, ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ΅ΡΠΈΡΠ΅ Π½Π° Spring ΠΎΠ±ΠΈΡΠ½ΠΎ ΠΊΠΎΡΠΈΡΡΠ°Ρ RestTemplate. Quarkus Π½ΡΠ΄ΠΈ MicroProfile Rest Client API Π·Π° ΡΠ΅ΡΠ°Π²Π°ΡΠ΅ Π½Π° ΠΎΠ²ΠΎΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ, ΡΠΈΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠΈ ΡΠ΅ Π΄Π°Π΄Π΅Π½ΠΈ Π²ΠΎ Π’Π°Π±Π΅Π»Π° 8.
Π
Π’Π°Π±Π΅Π»Π° 8. ΠΡΠΈΠΌΠ΅ΡΠΈ Π·Π° ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ MicroProfile Rest Client API.
ΠΠ°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ Π½Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΡ Π·Π° ΠΎΠ΄ΠΌΠΎΡ Π½Π° ΠΌΠΈΠΊΡΠΎΠΏΡΠΎΡΠΈΠ»
ΠΠΏΠΈΡ
ΠΏΡΠΈΠΌΠ΅ΡΠΈ
@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 Π·Π° Π΄Π° ΡΠ°Π·Π²ΠΈΠ΅ΠΌΠ΅ Java ΠΌΠΈΠΊΡΠΎΡΡΠ»ΡΠ³ΠΈ ΠΈ ΠΏΠΎΡΠΎΠ° Π΄Π° Π³ΠΈ ΠΊΠΎΠΌΠΏΠ°ΡΠ»ΠΈΡΠ°ΠΌΠ΅ Π²ΠΎ ΠΌΠ°ΡΡΠΈΠ½ Π±ΠΈΠ½Π°ΡΠ΅Π½ ΠΊΠΎΠ΄ ΠΊΠΎΡ Π·Π°ΡΡΠ΅Π΄ΡΠ²Π° ΡΡΠΎΡΠΈΡΠΈ ΠΌΠ΅Π³Π°Π±Π°ΡΡΠΈ RAM ΠΈ ΡΠ΅ Π»Π°Π½ΡΠΈΡΠ° Π²ΠΎ ΠΏΡΠ°ΡΠ°ΡΠ΅ Π½Π° ΠΌΠΈΠ»ΠΈΡΠ΅ΠΊΡΠ½Π΄ΠΈ.
ΠΠ°ΠΊΠΎ ΡΡΠΎ Π²Π΅ΡΠ΅ ΡΠ°Π·Π±ΡΠ°Π²ΡΠ΅, ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ Π·Π° ΠΏΠΎΠ΄Π΄ΡΡΠΊΠ°ΡΠ° Π·Π° Spring ΠΈ MicroProfile API, ΠΊΠ°ΠΊΠΎ ΠΈ ΠΌΠ½ΠΎΠ³Ρ Π΄ΡΡΠ³ΠΈ ΠΊΠΎΡΠΈΡΠ½ΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ, ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π°ΡΠ΄Π΅ΡΠ΅ Π²ΠΎ
ΠΠ·Π²ΠΎΡ: www.habr.com