ืืขืื ืึทืืขืืขื, ืืึธ ืก ืืขืจ ืืจืื ืคึผืึธืกืื ืืื ืื ืงืืืึทืจืงืืก ืกืขืจืืข!
ืืืขื ืืขืืืขืืึธืคึผืื ื Java ืืืงืจืึธืกืขืจืืืืกืขืก, ืขืก ืืื ืึธืคื ืืขืืืืืื ืึทื
ืืื ืึท ืืืกื ืืขืจ ืืขืืึทื, ืืืจ ืืืขืื ืขืจืฉืืขืจ ืงืืงื ืืื ืื ืคืึทืจื ืขื ืืื ืืขืืึทืืืก ืคืื ืืื Quarkus ืฉืืืฆื ืกืคึผืจืื ื ืึทืคึผืืก ืฆื ืืืืึทืื ืกืคึผืจืื ื ืืขืืืขืืึธืคึผืขืจืก ืืื ืฆื ื ืืฆื ืื ืืืงืจืึธืคึผืจืึธืคืืืข ืึทืคึผื ืืื ืืืืขืจ ืืึธื-ืฆื-ืืึธื ืึทืจืืขื. ืืขืจื ืึธื ืืืจ ืืขืงื ืื ืืืงืจืึธืคึผืจืึธืคืืืข ืึทืคึผืืก, ืืืึธืก ืืขื ืขื ื ืืฆืืง ืคึฟืึทืจ ืกืคึผืจืื ื ืืขืืืขืืึธืคึผืขืจืก ืืืขื ืงืจืืืืืื ื ืืืงืจืึธ ืืึทืืื ืื ืืก.
ืคืืจืืืืก ืงืืืืจืงืืก? ืคืืจืกืืื, ืืึธืก ืืื ืืขืื ืงืึธืืืจืื ื, ืืึธืก ืืื, ืึธืืึทืืึทืืืง ืจืืืึธืืืื ื ืคืื ืงืืื ืขื ืืขืจืื ืืขื ืืื ืื ืืืงืจืึธืคึผืจืึธืคืืืข ืึทืคึผื, ืกืคึผืจืื ื ืึทืคึผื ืืื ืื ืืขืจืข ื'ืืื ืึทืคึผืืก, ืืืึธืก ืืื ืืืจืืืขืงืึธืื ืืื ืืืืื ืืืื ืืึทืคึฟืขื: mvn quarkus:dev. ืฆืืืืืื ืก, ืืึทืืจืึทืื ืืื
ืืืจ ืืืขืื ื ืืฉื ืืืื ืืื ืืขืืึทื ืืืขืื ืืืงืจืึธืคึผืจืึธืคืืืข, ืึทืืืฅ ืฆื ืืขืืคึฟื ืกืคึผืจืื ื ืืขืืืขืืึธืคึผืขืจืก ืคึฟืึทืจืฉืืืื ืืื ืืื ืงืขื ืขื ื ืืฆื ืกืคึผืจืื ื ืึทืคึผืืก ืืื ืืืงืจืึธืคึผืจืึธืคืืืข ืึทืคึผืืก ืืื Quarkus.
ืงืึทื ืืืื ืขืจื ืืื ืงืืืขืจื ืขืืขืก
ืฆื ืืึทืืื ืืขื ืึทืจืืืงื ืคึผืฉืื, ืืืจ ืืืขืื ืืืืื ืืขืงื ืื ืืืื-ืืืจืื ืึทืกืคึผืขืงืฅ ืคืื ืฉืืืฆื ืืึธ.
ืงืืืึทืจืงืืก ืืืื
ืฆืื ืกืืฃ, ืืืจื ืคืึธืืงืืกืื ื ืืืืฃ Kubernetes ืืื ืื ืฆืื ืืืคึผืืืืืึทื ื ืกืืืืืืข, Quarkus ืืื ื ืืฉื ื ืืฆื Java ืคืจืึทืืขืืืึธืจืงืก ืืื ืงืึทืกืขืก ืืืขื ืขื ืืขื ืคืึทื ืืงืฉืึทื ืึทืืืื ืืื ืืืคึผืืึทืืขื ืึทื ืืืืฃ ืืขืจ ืืืจืื ืคืื ืื Kubernetes ืคึผืืึทืืคืึธืจืืข ืืื. ืืืฉ 1 ืืื ืึท ืืึทืคึผืข ืคืื โโืื ืคืึทื ืืงืฉืึทื ืึทื ืงืึธืจืขืกืคึผืึธื ืืขื ืฅ ืฆืืืืฉื Kubernetes ืืื ืืืคึผืืฉ ื'ืืื ืคืจืึทืืขืืืึธืจืงืก ืืขื ืืฆื ืืืจื ืกืคึผืจืื ื ืืขืืืขืืึธืคึผืขืจืก.
ืืืฉ 1. ืืึทืคึผืข ืคืื โโืคืึทื ืืงืฉืึทื ืึทื ืงืึธืจืขืกืคึผืึธื ืืขื ืฅ ืฆืืืืฉื ื'ืืื ืคืจืึทืืขืืืึธืจืงืก ืืื ืงืืืขืจื ืขืืขืก.
ืคืึทื ืืงืฉืึทื ืึทื
ืืจืึทืืืฆืืึธื ืขื ืคืจืืืื ื ืฉืืืืื
Kubernetes
ืกืขืจืืืืก ืืคืืขืงืื ื
ืืืจืืงืึท
ืื ืก
ืงืึธื ืคืืืืจืึทืืืึธื
ืคืจืืืื ื ืงืืึธืื ืงืึธื ืคืื
ืงืึธื ืคืื ืืึทืคึผืก / ืกืขืงืจืขืฅ
ืืึทืกืข ืืึทืืึทื ืกืื ื
ืืขื ื (ืงืืืขื ื ืืืึทื)
ืกืขืจืืืืก, ืจืขืคึผืืึทืงืืืฉืึทื ืงืึธื ืืจืึธืืืขืจ (ืกืขืจืืืขืจ ืืืึทื)
ืงืึทืืคึผืืืืื ื ืืื ืืืืคื ืื ืงืึธื ืคึฟืื ืืขื ืืืึทืฉืคึผืื
ืืื ืืขื ืึทืจืืืงื ืืืจ ืึธืคึผืฉืืงื ืฆื
ืคืจืืืื ื ืคืจืึทืืขืืืึธืจืง ืึทืคึผืืก
ืืขืคึผืขื ืืขื ืกื ืื ืืืฉืขืงืฉืึทื
ืงืืืึทืจืงืืก ืฉืืืฆื ืึท ืงืืื ืคืื
ะ
ืืืฉ 2. ืืืืฉืคืืื ืคืื ื ืืฆื ืื ืืขืฉืืืฆื ืกืคึผืจืื ื ืื ืึทืคึผืืก.
ืฉืืืฆื ืกืคึผืจืื ื ืื ืคึฟืขืึดืงืืืื
ืขืงืกืึทืืคึผืืขืก
ืงืึธื ืกืืจืืงืืึธืจ ืื ืืืฉืขืงืฉืึทื
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;
}
}
ืืืขื ืคืจืืืืืืขืจืง
ืืืงืจืึธืคึผืจืึธืคืืืข ื ืืฆืขืจืก ืืืขืื ืืืืข ืึทื Quarkus ืฉืืืฆื JAX-RS, MicroProfile Rest Client, JSON-P ืืื JSON-B ืืื ืื ืขืจืฉืืืง ืืืขื ืคึผืจืึธืืจืึทืืืื ื ืืึธืืขื. ืคืจืืืื ื ืืขืืืขืืึธืคึผืขืจืก ืืืขืื ืืืื ืฆืืคืจืืื ืืื ืื ืืขืฆืืข ืฉืืืฆื ืคืื Quarkus ืคึฟืึทืจ ืื ืกืคึผืจืื ื ืืืขื ืึทืคึผื, ืกืคึผืขืฆืืขื REST ืื ืืขืจืคืืืกืื. ืขื ืืขื ืฆื Spring DI, ืืขืจ ืืืืคึผื ืฆืื ืคืื ืกืคึผืจืื ื ืืืขื ืึทืคึผื ืฉืืืฆื ืืื ืฆื ืืขืื ืกืคึผืจืื ื ืืขืืืขืืึธืคึผืขืจืก ืฆื ื ืืฆื ืกืคึผืจืื ื ืืืขื ืึทืคึผืืก ืืื ืงืึทื ืืืฉืึทื ืืงืฉืึทื ืืื ืืืงืจืึธืคึผืจืึธืคืืืข ืึทืคึผืืก. ืืืืฉืคืืื ืคืื ืืื ืฆื ื ืืฆื ืื ืืขืฉืืืฆื ืกืคึผืจืื ื ืืืขื ืึทืคึผืืก ืืขื ืขื ืฆืืืขืฉืืขืื ืืื ืืืฉ 3, ืืื ืืขืจ ืืื ืคึฟืึธืจืืึทืฆืืข ืืื ืืืืฉืคืืื ืืืืฃ ืืขื ืืขืืข ืงืขื ืขื ืืืื ืืขืคึฟืื ืขื ืืื ืื Quarkus ืืืืึธืจืืึทื ืืขืจืืคื
ืืืฉ 3. ืืืืฉืคืืื ืคืื ื ืืฆื ืื ืฉืืืฆื ืกืคึผืจืื ื ืืืขื ืึทืคึผืืก.
ืฉืืืฆื ืกืคึผืจืื ื ืืืขื ืคึฟืขืึดืงืืืื
ืขืงืกืึทืืคึผืืขืก
@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) {
...
...
...
}
ืคืจืืืื ื ืืึทืืึท ืืืฉืคึผืึท
ืืืงืจืึธืคึผืจืึธืคืืืข ื ืืฆืขืจืก ืืืขืื ืืืื ืึธืคึผืฉืึทืฆื ืึทื Quarkus ืฉืืืฆื JPA ื ืืฆื ืื Hibernate ORM. ืขืก ืืื ืืืื ืืื ื ืืึทืขืก ืคึฟืึทืจ ืกืคึผืจืื ื ืืขืืืขืืึธืคึผืขืจืก: Quarkus ืฉืืืฆื ืคึผืจืึธืกื ืกืคึผืจืื ื ืืึทืืึท ืืืฉืคึผืึท ืึทื ืึทืืืืฉืึทื ื ืืื ืืืืคึผืก. ืืืืฉืคืืื ืคืื ื ืืฆื ืื ืืขืฉืืืฆื Spring Data JPA APIs ืืขื ืขื ืืขืืขืื ืืื ืืึทืืืข 4.
ะ
ืืืฉ 4. ืืืืฉืคืืื ืคืื ื ืืฆื ืืขืฉืืืฆื ืกืคึผืจืื ื ืืึทืืึท ืืืฉืคึผืึท ืึทืคึผืืก.
ืฉืืืฆื ืกืคึผืจืื ื ืืึทืืึท ืืืฉืคึผืึท ืคึฟืขืึดืงืืืื
ืขืงืกืึทืืคึผืืขืก
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);
}
ืืืงืจืึธืคึผืจืึธืคืืืข ืึทืคึผืืก
ืฉืืื ืืึธืืขืจืึทื ืฅ
ืฉืืื ืืึธืืขืจืึทื ืฅ ืงืึทื ืกืืจืึทืงืฉืึทื ื ืืขื ืขื ืืืืขืจ ืืืืืืืง ืคึฟืึทืจ ืคึผืจืขืืืขื ืืื ื ืงืึทืกืงืืืืื ื ืคืืืืืขืจื ืืื ืงืจืืืืืื ื ืคืึทืจืืึธืืืขื ืืืงืจืึธืกืขืจืืืืก ืึทืจืงืึทืืขืงืืฉืขืจื. ืคืจืืืื ื ืืขืืืขืืึธืคึผืขืจืก ืืึธืื ืฉืืื ื ืืฆื ืงืจืืึทื-ืืจืืืงืขืจื ืคึฟืึทืจ ืฉืืื ืืึธืืขืจืึทื ืฅ ืคึฟืึทืจ ืคืืืข ืืึธืจื.
ืืืฉ 5. ืืืืฉืคืืื ืคืื ื ืืฆื ืืขืฉืืืฆื ืืืงืจืึธืคึผืจืึธืคืืืข ืฉืืื ืืึธืืขืจืึทื ืฅ ืึทืคึผืืก.
ืืืงืจืึธืคึผืจืึธืคืืืข ืฉืืื ืืึธืืขืจืึทื ืฅ ืคึฟืขืึดืงืืืื
ืืึทืฉืจืืึทืืื ื
ืขืงืกืึทืืคึผืืขืก
@ืึทืกืื ืืฉืจืึธื ืึธืืก
ืขืงืกืึทืงืืืืื ื ืืึธืืืง ืืื ืึท ืืึทืืื ืืขืจ ืคืึธืืขื
@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(); //...
}
ืืฉืขืง ืกืขืจืืืืกืขืก (ืกืขืจืืืืก ืืขืืื ื)
Kubernetes ืคึผืืึทืืคืึธืจืืก ืืึธื ืืืึธืจ ืื ืืขืืื ื ืคืื ืงืึทื ืืืื ืขืจื ื ืืฆื ืกืคึผืขืฆืืขื ืืึทืืื ืื ืืก. ืฆื ืืึธืื ืื ืึทื ืืขืจืืืืื ื ืคึผืืึทืืคืึธืจืืข ืฆื ืืึธื ืืืึธืจ ืกืขืจืืืืกืขืก, ืกืคึผืจืื ื ืืขืืืขืืึธืคึผืขืจืก ืืืคึผืืงืื ื ืืฆื ืึท ืื ืื HealthIndicator ืืื Spring Boot Actuator. ืืื Quarkus, ืืึธืก ืงืขื ืขื ืืืื ืืขืืื ืืื ืืืงืจืึธืคึผืจืึธืคืืืข ืืขืืื ื, ืืืึธืก ืืืจื ืคืขืืืงืืึทื ืคึผืขืจืคืึธืจืื ืึท ืืืืืื ืึทืก ืืฉืขืง, ืึธืืขืจ ืงืขื ืขื ืืืื ืงืึทื ืคืืืืขืจื ืฆื ืกืืืืึทืืืืื ืืึทืกืื ืงืึธื ืืจืึธืืืจื ืืขืื ืืื ืืจืืืืงืืึทื. ืืืืฉืคืืื ืคืื ืืื ืฆื ื ืืฆื ืื ืฉืืืฆื ืืืงืจืึธืคึผืจืึธืคืืืข ืืขืืื ื ืึทืคึผืืก ืืขื ืขื ืฆืืืขืฉืืขืื ืืื ืืืฉ 6, ืืื ื ืึธื ืืื ืคึฟืึธืจืืึทืฆืืข ืืื ืฆืืืขืฉืืขืื ืืื ืื Quarkus ืืึทื ืืึทื
ืืืฉ 6: ืืึทื ืืฅ ืืืืฉืคืืื ืคืื ืืขืฉืืืฆื ืืืงืจืึธืคึผืจืึธืคืืืข ืืขืืื ื ืึทืคึผืืก.
ืืืงืจืึธืคึผืจืึธืคืืืข ืืขืืื ื ืคึฟืขืึดืงืืืื
ืืึทืฉืจืืึทืืื ื
ืขืงืกืึทืืคึผืืขืก
@ืืขืื ืก
ืื ืคึผืืึทืืคืึธืจืืข ืจืขืืึธืึธื ืืืจืืคืึทื ืงืึทื ืืึทืืึทื ืืืื ืึทืคึผืืึทืงืืืฉืึทื ื
ืกืืฃ ืคืื ื:
ืืึทืืขืืึธืก: 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();
}
ืืขืืจืืงืก
ืึทืคึผืคึผืืืงืึทืืืึธื ืก ืฆืืฉืืขืื ืืขืืจืืงืก ืคึฟืึทืจ ืึทืคึผืขืจืืืฉืึทื ืึทื ืฆืืืขืงื (ืฆื ืืึธื ืืืึธืจ ืคืึธืจืฉืืขืืื ื SLAs) ืึธืืขืจ ื ืื-ืึทืคึผืขืจืืืฉืึทื ืึทื ืฆืืืขืงื (ืืขืฉืขืคื SLAs). ืกืคึผืจืื ื ืืขืืืขืืึธืคึผืขืจืก ืฆืืฉืืขืื ืืขืืจืืงืก ื ืืฆื ืกืคึผืจืื ื ืืึธืึธื ืึทืงืืืึทืืึธืจ ืืื ืืืงืจืึธืืขืืขืจ. ืืื ืงืขืจ, Quarkus ื ืืฆื ืืืงืจืึธืคึผืจืึธืคืืืข ืืขืืจืืงืก ืฆื ืฆืืฉืืขืื ืืึทืกืขืืื ืข ืืขืืจืืงืก (ืืืฉืืื ืืื ืึธืคึผืขืจืืืืื ื ืกืืกืืขื), ืคืึทืจืงืืืคืขืจ ืืขืืจืืงืก (ืงืืืึทืจืงืืก) ืืื ืึทืคึผืืึทืงืืืฉืึทื ืืขืืจืืงืก. ืืืงืจืึธืคึผืจืึธืคืืืข ืืขืืจืืงืก ืจืืงืืืืืขืจื ืึทื ืื ืืืคึผืืึทืืขื ืืืืฉืึทื ืฉืืืฆื JSON ืืื OpenMetrics (ืคึผืจืึธืืขืืืขืืก) ืจืขืืืืืึทื ืคึฟืึธืจืืึทืืืจืื ืืขื. ืืืืฉืคืืื ืคืื ื ืืฆื ืื MicroProfile Metrics API ืืขื ืขื ืืขืืขืื ืืื ืืึทืืืข 7.
ะ
ืืืฉ 7. ืืืืฉืคืืื ืคืื ื ืืฆื ืืืงืจืึธืคึผืจืึธืคืืืข ืืขืืจืืงืก ืึทืคึผืืก.
ืืืงืจืึธืคึผืจืึธืคืืืข ืืขืืจืืง ืคึฟืขืึดืงืืืื
ืืึทืฉืจืืึทืืื ื
ืขืงืกืึทืืคึผืืขืก
@ืืขืจืขืื ื
ืืื ืึธืืฅ ืึท ืืึธืืืึทื ืง ืืึธืืืึทื ืง ืืืึธืก ืฆืืืื ืื ื ืืืขืจ ืคืื ืืื ืึท ืึทื ืึธืืืืืื ืืืืคืขืฅ ืืื ืืขืจืืคื
@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;
}
@ืืึธืก
ืืื ืึธืืฅ ืึท ืืึธืก ืกืขื ืกืขืจ ืืืึธืก ืืขืกืื ืื ืืืขืจื ืคืื ืึท ืึทื ืึทืืืืืื ืืืืคืขืฅ
@Metered(name = "FallbackGauge",
displayName="Fallback Gauge",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
@ืืขืืขืจืขื
ืืื ืึธืืฅ ืึท ืืขืืขืจ ืกืขื ืกืขืจ ืืืึธืก ืืึธื ืืืึธืจืก ืื ืจืืคื ืึธืคืืงืืึทื ืคืื ืึท ืึทื ืึทืืืืืื ืืืืคืขืฅ
@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 ืขื ืืคึผืึธืื ืฅ ืืืึธืก ืืึทืจืคื ืงืึธืจืึทืกืคึผืึทื ืืื ื ืงืืืขื ื ืึทืคึผืืก ืฆื ืึทืจืืขืื ืืื. ืฆื ื ืืฆื RESTful ืขื ืืคึผืึธืื ืฅ, ืกืคึผืจืื ื ืืขืืืขืืึธืคึผืขืจืก ืืืคึผืืงืื ื ืืฆื RestTemplate. Quarkus ืึธืคืคืขืจืก ืืืงืจืึธืคึผืจืึธืคืืืข ืจืขืกื ืงืืืขื ื ืึทืคึผืืก ืฆื ืกืึธืืืืข ืืขื ืคึผืจืึธืืืขื, ืืืืฉืคืืื ืคืื ื ืืฆื ืคืื ืืืึธืก ืืขื ืขื ืืขืืขืื ืืื ืืืฉ 8.
ะ
ืืืฉ 8. ืืืืฉืคืืื ืคืื ื ืืฆื ืืืงืจืึธืคึผืจืึธืคืืืข ืจืขืกื ืงืืืขื ื ืึทืคึผืืก.
ืืืงืจืึธืคึผืจืึธืคืืืข ืจืขืกื ืงืืืขื ื ืคึฟืขืึดืงืืืื
ืืึทืฉืจืืึทืืื ื
ืขืงืกืึทืืคึผืืขืก
@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
ืจืขืืืืืึทืื ืคืื
ืืื ืืขื ืืืึธื, ืึทืืืขื ืืคึฟืจื ืฆื ืกืคึผืจืื ื ืืขืืืขืืึธืคึผืขืจืก, ืืืจ ืืึธืื ืึท ืฉื ืขื ืงืืง ืืื ืฆื ื ืืฆื ืื ืกืคึผืจืื ื ืึทืคึผืืก ืืื ืื ืืืงืจืึธืคึผืจืึธืคืืืข ืึทืคึผืืก ืืื Quarkus ืฆื ืึทื ืืืืืงืืขื Java ืืืงืจืึธืกืขืจืืืืกื ืืื ืืขืจื ืึธื ืฆืื ืืืคื ืขืืขื ืืื ืืื ืืขืืืืจื ืืืื ืขืจื ืงืึธื ืืืึธืก ืกืึทืืืขืก ืืื ืืขืจืืขืจ ืคืื ืืขืืืืืื ืคืื ืืึทืจืึทื ืืื ืืึธื ืืฉืื ืืื. ืึท ืขื ืื ืคืื ืืืืืกืขืงืึทื ืื.
ืืื ืืืจ ืฉืืื ืคืืจืฉืืื ืขื, ืืขืจ ืืื ืคึฟืึธืจืืึทืฆืืข ืืืขืื ืฉืืืฆื ืคึฟืึทืจ ืื ืกืคึผืจืื ื ืืื ืืืงืจืึธืคึผืจืึธืคืืืข ืึทืคึผืืก, ืืื ืืขืืื ื ืืื ืึท ืคึผืืึทืฅ ืคืื ืื ืืขืจืข ื ืืฆืืง ืืื ืคึฟืึธืจืืึทืฆืืข, ืงืขื ืขื ืืืื ืืขืคึฟืื ืขื ืืื
ืืงืืจ: www.habr.com