á¡á¬ážáá¯á¶ážáá²áááºá¹ááá¬áá«á á€áááºááŸá¬ Quarkus á á®ážáá®ážá ááááááŒá±á¬ááºááá¯á·á áºááŒá áºáááºá
Java microservices áá»á¬ážááᯠáá®ááœááºáá±á¬á¡áá«ááœáẠáááºážááᯠáá¯á¶ááŒááºáá±á·ááŸááááºá
á¡áááºážáááºá¡áá±ážá
áááºááœááºá Spring developer áá»á¬ážá¡á¬áž áááºážááá¯á·ááá±á·á
ááºáá¯ááºáááºážááœááºááœáẠMicroProfile API ááá¯áááºááá¯á·á¡áá¯á¶ážááŒá¯ááááºááá¯ááŒáááẠQuarkus ááẠSpring APIs ááᯠáááºáá²á·ááá¯á·áá¶á·ááá¯ážáá±ážáááºááá¯ááá·áº áááºáááºááŸáá·áºá¡áá±ážá
áááºá¡áá»ááºá¡áááºáá»á¬ážááᯠáŠážá
áœá¬ááŒáá·áºááŸá¯áá«áááºá ááá¯á·áá±á¬áẠááá¯ááºáááá¯áááºáá±á¬ááºááŸá¯áá»á¬ážááᯠáááºáá®ážááá·áºá¡áá« Spring developer áá»á¬ážá¡ááœáẠá¡áá¯á¶ážáááºááá·áº MicroProfile APIs áá»á¬ážááᯠá¡áá»á¯á¶ážáááºáá«áááºá
Quarkus á¡áááºááŒá±á¬áá·áºáááºážá ááááŠážá
áœá¬á áááºážááẠááá¯ááºááá¯ááºáá¯ááºáá±ážááŒááºážááŒá
áºáááºá ááá¯ááá¯áááºááŸá¬á ááá¯áááºááŸá¬á á¡áááá·áºáá
áºáá¯áááºážááŒáá·áºáá¯ááºáá±á¬ááºááá·áº MicroProfile APIá Spring API ááŸáá·áº á¡ááŒá¬ážáá±á¬ Java API áá»á¬ážááœáẠá¡ááŒá±á¬ááºážá¡áá²áá»á¬ážááᯠá¡ááá¯á¡áá»á±á¬ááºááŒááºáááºá
áááºááŒááºážááŒá
áºáááº- mvn quarkus:devá áá¯áááá¡áá±áá²á· ááœá±ážááœá±ážáá²á·áá«áááºá
Spring developer áá»á¬áž Quarkus ááœáẠMicroProfile APIs áá»á¬ážááŒáá·áº Spring APIs áá»á¬ážááᯠáááºááá¯á·á¡áá¯á¶ážááŒá¯áááŒá±á¬ááºáž áá¬ážáááºá á±ááẠáá°áá®ááŒááºážááŸááœá²á MicroProfile á¡ááŒá±á¬ááºážá¡áá±ážá áááºááŸááºážááŒáááºááá¯ááºáá«á
ááœááºááááºáá¬áá»á¬ážááŸáá·áº Kubernetes
á€áá±á¬ááºážáá«ážááᯠááá¯ážááá¯ážááŸááºážááŸááºážáá¬ážáááºá áá»áœááºá¯ááºááá¯á·ááẠá€áá±áá¬ááœáẠáá¶á·ááá¯ážááŸá¯á á¡ááá·áºááŒáá·áºáá¬ážáá±á¬ ááá¹ááá»á¬ážááá¯áᬠááŒá¯á¶áá¯á¶áá«áááºá
Quarkus áááºážáá«áá«áááºá
áá±á¬ááºáá¯á¶ážá¡áá±ááŒáá·áºá Kubernetes ááᯠáá áºááŸááºááŒáá·áºáá»ááºááŸá¯áááºáááºážáá»ááºá¡ááŒá Ạá¡á¬áá¯á¶á áá¯ááºááŒááºážááŒáá·áº Kubernetes ááááºáá±á¬ááºážá¡ááá·áºááœáẠá¡áá¬ážáá°áá¯ááºáá±á¬ááºááá¯ááºá áœááºážááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºááá·áºááá á¹á áá»á¬ážááœáẠQuarkus ááẠJava áá°áá±á¬ááºáá»á¬ážááᯠá¡áá¯á¶ážáááŒá¯áá«á ááá¬áž 1 ááẠKubernetes ááŸáá·áº Spring developer áá»á¬ážá¡áá¯á¶ážááŒá¯ááá·áº áá¯á¶ááŸáẠJava áá°áá±á¬ááºáá»á¬ážááŒá¬ážááœáẠáá¯ááºáá±á¬ááºááá¯ááºáá±á¬ á á¬áá±ážá á¬áá°ááŒá±áá¯á¶ááᯠáá¶á·ááá¯ážáá±ážáá«áááºá
ááá¬áž áá Java áá°áá±á¬ááºáá»á¬ážááŸáá·áº Kubernetes á¡ááŒá¬áž áá¯ááºáá±á¬ááºááá¯ááºáá±á¬ á á¬áá±ážá á¬áá°ááŒá±áá¯á¶á
functional
ááá¯ážáá¬ááœá±áŠážáááááº
Kubernetes
áááºáá±á¬ááºááŸá¯ááŸá¬ááœá±ááœá±á·ááŸáááŸá¯
áá°áá®áá¬
DNS ááá¯
configuration
Spring Cloud Config
ááŒá±áá¯á¶áá»á¬áž/áá»áŸáá¯á·ááŸááºáá»ááºáá»á¬ážááᯠá
á®á
ááºáááºááŸááºáá«á
áááºáá»áááºááœááº
áá²ááŒáá¯áž (áá±á¬ááºáááºáááº)
áááºáá±á¬ááºááŸá¯á áá°ážáá°ááááºážáá»á¯ááºáááááᬠ(áá¬áá¬áááºááŒááºáž)
ááá°áá¬á០áá¯ááºááᯠá á¯á ááºážááŒá®áž run áá«á
á€áá±á¬ááºážáá«ážááá»áœááºá¯ááºááá¯á·ááá¯ážáá¬áž
Spring Framework API áá»á¬áž
ááŸá®ááá¯ááá¯áž
Quarkus ááẠá¡ááœá¬á¡áá±ážááᯠáá¶á·ááá¯ážáá±ážáááºá
Ð
ááá¬áž 2á áá¶á·ááá¯ážáá¬ážáá±á¬ Spring DI APIs áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááŒááºáž á¥ááá¬áá»á¬ážá
Spring DI á¡ááºá¹áá«áááºáá»á¬ážááᯠáá¶á·ááá¯ážáá¬ážáááºá
á¥ááá¬
Constructor Injection á
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 developer áá»á¬ážááẠá¡áá°ážáááŒáá·áº REST á¡ááºáá¬áá±á·á
áºáá»á¬áž á¡áá°ážáááŒáá·áº Spring Web API á¡ááœáẠQuarkus á áááŒá¬áá±ážáá®á áá¶á·ááá¯ážáá°áá®ááŸá¯ááᯠááŸá
áºáááºáááºááŒá
áºáááºá Spring DI áá²á·ááá¯á·ááẠSpring Web API áá¶á·ááá¯ážááŸá¯á á¡ááááááºážááá¯ááºááŸá¬ Spring Web API áá»á¬ážááᯠMicroProfile APIs áá»á¬ážááŸáá·áºá¡áá° ááœá²áááºá¡áá¯á¶ážááŒá¯ááá¯ááºá
á±ááẠSpring developer áá»á¬ážá¡á¬áž ááœáá·áºáá±ážáááºááŒá
áºáááºá áá¶á·ááá¯ážáá¬ážáá±á¬ Spring Web APIs áá»á¬ážááᯠááá¬áž 3 ááœáẠáá±ážáá±á¬ááºááááºááŒá
áºááŒá®ážá á€á¡ááŒá±á¬ááºážá¡áá¬ááŸáá·áºáááºáááºááá·áº áá±á¬ááºáááºá¡áá»ááºá¡áááºáá»á¬ážááŸáá·áº ááá°áá¬áá»á¬ážááᯠQuarkus áááºáááºážá
á¬ááœáẠááœá±á·ááá¯ááºáááº
ááá¬áž 3. áá¶á·ááá¯ážáá¬ážáá±á¬ Spring Web APIs ááᯠá¡áá¯á¶ážááŒá¯ááŒááºáž á¥ááá¬áá»á¬ážá
áá¶á·ááá¯ážáá¬ážáá±á¬ Spring áááºá¡ááºá¹áá«áááºáá»á¬áž
á¥ááá¬
@RestController
@RequestMapping
@RestController
@RequestMapping("/person")
public class PersonSpringController {
...
...
...
}
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestParam
@RequestHeader
@MatrixVariable
@PathVariable
@CookieValue
@RequestBody
@áá¯á¶á·ááŒááºááŸá¯á¡ááŒá±á¡áá±
@ExceptionHandler
@RestControllerAdvice (áá
áºá
áááºáá
áºááá¯ááºáž)
@GetMapping(path = "/greet/{id}",
produces = "text/plain")
public String greetPerson(
@PathVariable(name = "id") long id) {
...
...
...
}
Spring DataJPA
MicroProfile á¡áá¯á¶ážááŒá¯áá°áá»á¬ážááẠHibernate ORM ááᯠá¡áá¯á¶ážááŒá¯á Quarkus ááẠJPA ááᯠáá¶á·ááá¯ážáá±ážááá·áºá¡ááœááºáááºáž ááá±á¬áá»áá«áááá·áºáááºá Spring developer áá»á¬ážá¡ááœáẠááááºážáá±á¬ááºážáááºáž ááŸááá«áááº- Quarkus ááẠáá¯á¶ Spring Data JPA ááŸááºáá»ááºáá»á¬ážááŸáá·áº á¡áá»áá¯ážá¡á
á¬ážáá»á¬ážááᯠáá¶á·ááá¯ážáá±ážáá«áááºá áá¶á·ááá¯ážáá¬ážáá±á¬ Spring Data JPA API áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááŒááºážá á¥ááá¬áá»á¬ážááᯠááá¬áž 4 ááœáẠáá±á¬áºááŒáá¬ážáááºá
Ð
ááá¬áž 4. áá¶á·ááá¯ážáá¬ážáá±á¬ Spring Data JPA APIs áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááŒááºáž á¥ááá¬áá»á¬ážá
áá¶á·ááá¯ážáá¬ážáá±á¬ Spring Data JPA á¡ááºá¹áá«áááºáá»á¬áž
á¥ááá¬
CrudRepository
public interface PersonRepository
extends JpaRepository,
PersonFragment {
...
}
repository
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 áá»á¬áž
á¡ááŸá¬ážáá¶ááá¯ááºáááºááŸááááºá
Fault tolerance constructs áá»á¬ážááẠcascading áá»ááŸá¯á¶ážááŸá¯áá»á¬ážááᯠáá¬ááœááºáááºááŸáá·áº áá¯á¶ááŒááºá
áááºáá»ááá±á¬ microservice Architecture áá»á¬ážááᯠáááºáá®ážáááºá¡ááœáẠá¡ááœááºá¡áá±ážááŒá®ážáá«áááºá Spring developer áá»á¬ážááẠá¡ááŸá¬ážá¡ááœááºážáá¶ááá¯ááºáááºááŸááááºá¡ááœáẠcircuit-breakers ááᯠááŸá
áºáá±á«ááºážáá»á¬ážá
áœá¬ á¡áá¯á¶ážááŒá¯áá²á·ááŒáááºá
ááá¬áž 5. áá¶á·ááá¯ážáá¬ážáá±á¬ MicroProfile Fault Tolerance APIs ááᯠá¡áá¯á¶ážááŒá¯ááŒááºážá á¥ááá¬áá»á¬ážá
MicroProfile Fault Tolerance á¡ááºá¹áá«áááºáá»á¬áž
áá±á«áºááŒáá»ááº
á¥ááá¬
@Asynchronous
áá®ážááŒá¬ážá á¬ááœá²áá áºáá¯ááœáẠáá¯áá¹áááá±áááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºááŒááºážá
@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(); //...
}
áááºáá±á¬ááºááŸá¯áá»á¬áž (Service Health) á á áºáá±ážááŒááºážá
Kubernetes ááááºáá±á¬ááºážáá»á¬ážááẠá¡áá°ážáááºáá±á¬ááºááŸá¯áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯á ááœááºááááºáá¬áá»á¬ážá áá»ááºážáá¬áá±ážááᯠá
á±á¬áá·áºááŒáá·áºáááºá á¡á±á¬ááºááŒá±ááááºáá±á¬ááºážááᯠáááºáá±á¬ááºááŸá¯áá»á¬ážááᯠá
á±á¬áá·áºááŒáá·áºááœáá·áºááŒá¯ááẠSpring developer áá»á¬ážááẠáá¯á¶ááŸááºá¡á¬ážááŒáá·áº á
áááºááŒáá¯áẠHealthIndicator ááŸáá·áº Spring Boot Actuator ááᯠá¡áá¯á¶ážááŒá¯ááŒáááºá Quarkus ááœááºá áááºážááẠáá¯á¶ááŸááºá¡á¬ážááŒáá·áº á¡áááºááŸááºáá±ááŸá¯ááᯠá
á
áºáá±ážáá±ážááá·áº MicroProfile Health ááᯠá¡áá¯á¶ážááŒá¯á áá¯ááºáá±á¬ááºááá¯ááºáá±á¬áºáááºáž á¡áááºááŸááºááŸá¯ááŸáá·áº á¡áááºááá·áºááŒá
áºááŸá¯ááᯠáá
áºááŒáá¯ááºááẠá
á
áºáá±ážááẠááŒááºáááºáááºááŸááºááá¯ááºáááºá áá¶á·ááá¯ážáá¬ážáá±á¬ MicroProfile Health APIs áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯áááºážááá°áá¬áá»á¬ážááᯠááá¬áž 6 ááœáẠáá±ážáá±á¬ááºáá¬ážááŒá®áž áá±á¬ááºáááºá¡áá»ááºá¡áááºáá»á¬ážááᯠQuarkus manual ááœáẠáá±ážáá¬ážáááºá
ááá¬áž 6- áá¶á·ááá¯ážáá¬ážáá±á¬ MicroProfile Health API áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááŸá¯ ááá°áá¬áá»á¬ážá
MicroProfile áá»ááºážáá¬áá±ážá¡ááºá¹áá«áááºáá»á¬áž
áá±á«áºááŒáá»ááº
á¥ááá¬
@ááŸááºáááºááŒááºáž
ááááºáá±á¬ááºážááẠáá¡á±á¬ááºááŒááºáá±á¬ containerized applications áá»á¬ážááᯠááŒááºáááºá
áááºáááºá
á¡áá¯á¶ážááŸááº-
áááºáá¶áá±á¬ááºááœááºáá±ážáá°- 8080/health/live
@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 áá»á¬ážááᯠá á±á¬áá·áºááŒáá·áºáááº) ááá¯á·ááá¯áẠáá¯ááºáááºážáá±á¬ááºááœááºááŸá¯ááá¯ááºáá±á¬áááºááœááºáá»ááºáá»á¬áž (á á®ážááœá¬ážáá±áž SLAs) á¡ááœáẠáááºááá áºáá»á¬ážááᯠáá±ážáá«áááºá Spring developer áá»á¬ážááẠSpring Boot Actuator ááŸáá·áº Micrometer ááᯠá¡áá¯á¶ážááŒá¯á áááºááá áºáá»á¬ážááᯠáá±ážáááºá áá áºáááºá Quarkus ááẠá¡ááŒá±áá¶ááá¯ááºážáááºááá áºáá»á¬áž (JVM ááŸáá·áº áááºáááºááŸá¯á áá áº)á áá±á¬ááºážáá»áá°áááºááá áºáá»á¬áž (Quarkus) ááŸáá·áº á¡ááá®áá±ážááŸááºážáááºááá áºáá»á¬ážááᯠáá¶á·ááá¯ážáá±ážáááºá¡ááœáẠMicroProfile Metrics ááᯠá¡áá¯á¶ážááŒá¯áá«áááºá MicroProfile Metrics á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯ááẠJSON ááŸáá·áº OpenMetrics (Prometheus) á¡ááœááºáá±á¬áºáááºáá»á¬ážááᯠáá¶á·ááá¯ážáá±ážáááºááá¯á¡ááºáááºá MicroProfile Metrics API ááá¯á¡áá¯á¶ážááŒá¯ááŒááºážáááá°áá¬áá»á¬ážááᯠááá¬áž 7 ááœááºáá±á¬áºááŒáá¬ážáááºá
Ð
ááá¬áž 7. MicroProfile Metrics APIs ááá¯á¡áá¯á¶ážááŒá¯ááŒááºážáááá°áá¬áá»á¬ážá
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
ááŸááºáá¯á¶áááºáá¬ážáá±á¬ á¡áá¬ááá¹áá¯áá áºáá¯á áááºááá¯ážááᯠááá¯ááºážáá¬ááá·áº gauge sensor ááᯠáááºááœáŸááºážáááºá
@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
Microservices áá»á¬ážááẠáááºááá¯ááºáᬠclient APIs áá»á¬ážááŸáá·áº á¡áá¯ááºáá¯ááºááẠááá¯á¡ááºáá±á¬ RESTful endpoints áá»á¬ážááᯠáá±ážáá±á·ááŸááááºá RESTful endpoints ááá¯á¡áá¯á¶ážááŒá¯ááẠSpring developer áá»á¬ážááẠáá¯á¶ááŸááºá¡á¬ážááŒáá·áº RestTemplate ááá¯á¡áá¯á¶ážááŒá¯áááºá Quarkus ááẠá€ááŒá¿áá¬ááá¯ááŒá±ááŸááºážááẠMicroProfile Rest Client API áá»á¬ážááᯠáá±ážáá±á¬ááºáááºá ááá¬áž 8 ááœááºáá±á¬áºááŒáá¬ážáá±á¬á¡áá¯á¶ážááŒá¯ááŸá¯ááá°áá¬áá»á¬ážá
Ð
ááá¬áž 8. MicroProfile Rest Client APIs ááá¯á¡áá¯á¶ážááŒá¯ááŒááºážáááá°áá¬áá»á¬ážá
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;
Invocation
REST á¡áá¯á¶ážááŸááºááᯠáá±á«áºááá¯áá«á
System.out.println(
restClient.getSalutation());
mp-rest/url
REST á¡áá¯á¶ážááŸááºááᯠáááºááŸááºáááºá
application.properties:
org.example.MyRestClient/mp-rest/url=
http://localhost:8081/myendpoint
ááááºáá»á¬ážááá¯
Spring developer áá»á¬ážá¡ááœáẠá¡ááááááºááœááºááá·áº á€ááá±á¬á·ááºááœááºá Java microservices áá»á¬ážááᯠááœá¶á·ááŒáá¯ážááá¯ážáááºá á±ááẠQuarkus ááŸá Spring APIs ááŸáá·áº MicroProfile APIs áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯áááºážááᯠá¡ááŒááºááŒáá·áºááŸá¯áá²á·ááŒá®áž áááºážááá¯á·ááᯠRAM áá¬ááŸáá·áºáá»á®áá±á¬ áá®áá«ááá¯ááºáá»á¬áž áááºáá¬á á±áá±á¬ áá°áááºáž binary áá¯ááºá¡ááŒá Ạá á¯á ááºážááŒá®áž á áááºá¡áá¯á¶ážááŒá¯ááá¯ááºáá«áááºá áá®áá®á áá¹ááá·áºáá»á¬ážá
áááºáá¬ážáááºááŒá®ážáá¬ážááŒá
áºááá·áºá¡ááá¯ááºáž Spring ááŸáá·áº MicroProfile APIs áá»á¬ážá¡ááœáẠáá¶á·ááá¯ážááŸá¯ááá¯ááºáᬠá¡áá»ááºá¡áááºáá»á¬ážá
áœá¬á¡ááŒáẠá¡ááŒá¬ážá¡áá¯á¶ážáááºáá±á¬ á¡áá»ááºá¡áááºáá»á¬ážá
áœá¬ááᯠááœáẠááœá±á·ááá¯ááºáá«áááºá
source: www.habr.com