เจธเจพเจฐเจฟเจเจ เจจเฉเฉฐ เจนเฉเจฒเฉ, เจเฉฑเจฅเฉ เจเฉเจเจฐเจเจธ เจธเฉเจฐเฉเจเจผ เจฆเฉ เจคเฉเจเฉ เจชเฉเจธเจ เจนเฉ!
Java microservices เจฆเจพ เจตเจฟเจเจพเจธ เจเจฐเจฆเฉ เจธเจฎเฉเจ, เจเจน เจ
เจเจธเจฐ เจฎเฉฐเจจเจฟเจ เจเจพเจเจฆเจพ เจนเฉ เจเจฟ
เจฅเฉเฉเฉ เจนเฉเจฐ เจตเฉเจฐเจตเฉ เจตเจฟเฉฑเจ, เจ
เจธเฉเจ เจชเจนเจฟเจฒเจพเจ เจธเจเฉเจช เจ
เจคเฉ เจตเฉเจฐเจตเจฟเจเจ เจจเฉเฉฐ เจฆเฉเจเจพเจเจเฉ เจเจฟ เจเจฟเจตเฉเจ เจเฉเจเจฐเจเจธ เจธเจชเจฐเจฟเฉฐเจ เจกเจฟเจตเฉเจฒเจชเจฐเจพเจ เจจเฉเฉฐ เจเจน เจฆเจฟเจเจพเจเจฃ เจฒเจ เจเจฟ เจเจฟเจตเฉเจ เจธเจชเจฐเจฟเฉฐเจ API เจฆเจพ เจธเจฎเจฐเจฅเจจ เจเจฐเจฆเจพ เจนเฉ เจเจนเจจเจพเจ เจฆเฉ เจฐเฉเจเจผเจพเจจเจพ เจฆเฉ เจเฉฐเจฎ เจตเจฟเฉฑเจ เจฎเจพเจเจเฉเจฐเฉเจชเฉเจฐเฉเจซเจพเจเจฒ API เจฆเฉ เจตเจฐเจคเฉเจ เจเจฟเจตเฉเจ เจเจฐเจจเฉ เจนเฉเฅค เจซเจฟเจฐ เจ
เจธเฉเจ เจฎเจพเจเจเฉเจฐเฉเจชเฉเจฐเฉเจซเจพเจเจฒ API เจจเฉเฉฐ เจเจตเจฐ เจเจฐเจพเจเจเฉ, เจเฉ เจเจฟ เจฎเจพเจเจเฉเจฐเฉ เจธเจฐเจตเจฟเจธเจฟเจเจผ เจฌเจฃเจพเจเจฃ เจตเฉเจฒเฉ เจธเจชเจฐเจฟเฉฐเจ เจกเจฟเจตเฉเจฒเจชเจฐเจพเจ เจฒเจ เจเจชเจฏเฉเจเฉ เจนเจจเฅค
เจเฉเจเจฐเจเจธ เจเจฟเจเจ? เจธเจญ เจคเฉเจ เจชเจนเจฟเจฒเจพเจ, เจเจน เจฒเจพเจเจต เจเฉเจกเจฟเฉฐเจ เจนเฉ, เจฏเจพเจจเฉ เจฎเจพเจเจเฉเจฐเฉเจชเฉเจฐเฉเจซเจพเจเจฒ API, เจธเจชเจฐเจฟเฉฐเจ API เจ
เจคเฉ เจนเฉเจฐ เจเจพเจตเจพ API เจตเจฟเฉฑเจ เจเจฟเจธเฉ เจตเฉ เจคเจฌเจฆเฉเจฒเฉ เจฆเฉ เจเจเฉเจฎเฉเจเจฟเจ เจฐเฉเจฒเฉเจกเจฟเฉฐเจ, เจเฉ เจเจฟ เจธเจฟเจฐเจซเจผ เจเฉฑเจ เจเจฎเจพเจเจก เจจเจพเจฒ เจเฉเจคเฉ เจเจพเจเจฆเฉ เจนเฉ: mvn quarkus:devเฅค เจฆเฉเจเจพ, เจตเจฟเฉฑเจ เจเจฐเจเจพ เจเฉเจคเฉ
เจ เจธเฉเจ เจธเจชเจฐเจฟเฉฐเจ เจกเจฟเจตเฉเจฒเจชเจฐเจพเจ เจฆเฉ เจเจน เจธเจฎเจเจฃ เจตเจฟเฉฑเจ เจฎเจฆเจฆ เจเจฐเจจ เจคเฉเจ เจเจฒเจพเจตเจพ เจฎเจพเจเจเฉเจฐเฉเจชเฉเจฐเฉเจซเจพเจเจฒ เจฌเจพเจฐเฉ เจตเจฟเจธเจฅเจพเจฐ เจตเจฟเฉฑเจ เจจเจนเฉเจ เจเจพเจตเจพเจเจเฉ เจเจฟ เจเจน เจเฉเจเจฐเจเจธ เจตเจฟเฉฑเจ เจฎเจพเจเจเฉเจฐเฉเจชเฉเจฐเฉเจซเจพเจเจฒ API เจฆเฉ เจจเจพเจฒ เจธเจชเจฐเจฟเฉฐเจ API เจฆเฉ เจตเจฐเจคเฉเจ เจเจฟเจตเฉเจ เจเจฐ เจธเจเจฆเฉ เจนเจจเฅค
เจเฉฐเจเฉเจจเจฐ เจ เจคเฉ เจเฉเจฌเจฐเจจเฉเจเจธ
เจเจธ เจฒเฉเจ เจจเฉเฉฐ เจธเจงเจพเจฐเจจ เจฐเฉฑเจเจฃ เจฒเจ, เจ
เจธเฉเจ เจเฉฑเจฅเฉ เจธเจฎเจฐเจฅเจจ เจฆเฉ เจธเจฟเจฐเจซเจผ เจเฉฑเจ-เจชเฉฑเจงเจฐเฉ เจชเจนเจฟเจฒเฉเจเจ เจจเฉเฉฐ เจเจตเจฐ เจเจฐเจพเจเจเฉเฅค
เจเฉเจเจฐเจเจธ เจตเฉ
เจ เฉฐเจค เจตเจฟเฉฑเจ, เจเฉเจฌเจฐเจจเฉเจเจธ เจจเฉเฉฐ เจเจพเจฐเจเฉเจ เจกเจฟเจชเจฒเจพเจเจฎเฉเจเจ เจตเจพเจคเจพเจตเจฐเจจ เจฆเฉ เจฐเฉเจช เจตเจฟเฉฑเจ เจซเฉเจเจธ เจเจฐเจเฉ, เจเฉเจเจฐเจเจธ เจเจนเจจเจพเจ เจฎเจพเจฎเจฒเจฟเจเจ เจตเจฟเฉฑเจ เจเจพเจตเจพ เจซเจฐเฉเจฎเจตเจฐเจ เจฆเฉ เจตเจฐเจคเฉเจ เจจเจนเฉเจ เจเจฐเจฆเจพ เจนเฉ เจเจฟเฉฑเจฅเฉ เจเฉเจฌเจฐเจจเฉเจเจธ เจชเจฒเฉเจเจซเจพเจฐเจฎ เจฆเฉ เจชเฉฑเจงเจฐ 'เจคเฉ เจธเจฎเจพเจจ เจเจพเจฐเจเจธเจผเฉเจฒเจคเจพ เจฒเจพเจเฉ เจเฉเจคเฉ เจเจพเจเจฆเฉ เจนเฉเฅค เจธเจพเจฐเจฃเฉ 1 เจเฉเจฌเจฐเจจเฉเจเจธ เจ เจคเฉ เจธเจชเจฐเจฟเฉฐเจ เจกเจฟเจตเฉเจฒเจชเจฐเจพเจ เจฆเฉเจเจฐเจพ เจตเจฐเจคเฉ เจเจพเจเจฆเฉ เจเจฎ เจเจพเจตเจพ เจซเจฐเฉเจฎเจตเจฐเจ เจตเจฟเจเจเจพเจฐ เจเจพเจฐเจเจธเจผเฉเจฒ เจชเฉฑเจคเจฐ เจตเจฟเจนเจพเจฐ เจฆเจพ เจจเจเจธเจผเจพ เจชเฉเจฐเจฆเจพเจจ เจเจฐเจฆเฉ เจนเฉเฅค
เจธเจพเจฐเจฃเฉ 1. เจเจพเจตเจพ เจซเจฐเฉเจฎเจตเจฐเจ เจ เจคเฉ เจเฉเจฌเจฐเจจเฉเจเจธ เจตเจฟเจเจเจพเจฐ เจเจพเจฐเจเจธเจผเฉเจฒ เจชเฉฑเจคเจฐ เจตเจฟเจนเจพเจฐ เจฆเจพ เจจเจเจธเจผเจพเฅค
เจเจพเจฐเจเจธเจผเฉเจฒ
เจฐเจตเจพเจเจคเฉ เจฌเจธเฉฐเจค เจฌเฉเจ
เจเจฌเจฐเจจเฉเจเจฟเจธ
เจธเฉเจตเจพ เจเฉเจ
เจฏเจฐเฉเจเจพ
DNS เจจเฉเฉฐ
เจธเฉฐเจฐเจเจจเจพ
เจฌเจธเฉฐเจค เจเจฒเจพเจเจก เจธเฉฐเจฐเจเจจเจพ
เจธเฉฐเจฐเจเจจเจพ เจจเจเจธเจผเฉ/เจญเฉเจฆ
เจฒเฉเจก เจฌเฉเจฒเจธเจฟเฉฐเจ
เจฐเจฟเจฌเจจ (เจเจพเจนเจ เจชเจพเจธเฉ)
เจธเฉเจตเจพ, เจชเฉเจฐเจคเฉเจเฉเจฐเจฟเจคเฉ เจเฉฐเจเจฐเฉเจฒเจฐ (เจธเจฐเจตเจฐ เจธเจพเจเจก)
เจเจฆเจพเจนเจฐเจจ เจคเฉเจ เจเฉเจก เจจเฉเฉฐ เจเฉฐเจชเจพเจเจฒ เจเจฐเจจเจพ เจ เจคเฉ เจเจฒเจพเจเจฃเจพ
เจเจธ เจฒเฉเจ เจตเจฟเจ เจ
เจธเฉเจ เจเจผเจฟเจเจฐ เจเจฐเจฆเฉ เจนเจพเจ
เจธเจชเจฐเจฟเฉฐเจ เจซเจฐเฉเจฎเจตเจฐเจ APIs
เจจเจฟเจฐเจญเจฐเจคเจพ เจเฉเจเจพ
เจเฉเจเจฐเจเจธ เจฆเฉ เจเฉฑเจ เจธเฉเจฎเจพ เจฆเจพ เจธเจฎเจฐเจฅเจจ เจเจฐเจฆเจพ เจนเฉ
ะ
เจธเจพเจฐเจฃเฉ 2. เจธเจฎเจฐเจฅเจฟเจค Spring DI API เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจจ เจฆเฉเจเจ เจเจฆเจพเจนเจฐเจจเจพเจเฅค
เจธเจฎเจฐเจฅเจฟเจค เจธเจชเจฐเจฟเฉฐเจ เจกเฉเจเจ เจตเจฟเจธเจผเฉเจธเจผเจคเจพเจตเจพเจ
เจฎเจฟเจธเจพเจฒ
เจเฉฐเจธเจเจฐเจเจเจฐ เจเฉฐเจเฉเจเจธเจผเจจ
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, เจฎเจพเจเจเฉเจฐเฉเจชเฉเจฐเฉเจซเจพเจเจฒ เจฐเฉเจธเจ เจเจฒเจพเจเฉฐเจ, JSON-P, เจ
เจคเฉ JSON-B เจจเฉเฉฐ เจชเฉเจฐเจพเจเจฎเจฐเฉ เจตเฉเฉฑเจฌ เจชเฉเจฐเฉเจเจฐเจพเจฎเจฟเฉฐเจ เจฎเจพเจกเจฒ เจฆเฉ เจคเฉเจฐ 'เจคเฉ เจธเจฎเจฐเจฅเจจ เจเจฐเจฆเจพ เจนเฉเฅค เจธเจชเจฐเจฟเฉฐเจ เจกเจฟเจตเฉเจฒเจชเจฐ, เจเจพเจธ เจคเฉเจฐ 'เจคเฉ REST เจเฉฐเจเจฐเจซเฉเจธเจพเจ เจตเจฟเฉฑเจ, Spring Web API เจฒเจ เจเฉเจเจฐเจเจธ เจฆเฉ เจนเจพเจฒเฉเจ เจธเจฎเจฐเจฅเจจ เจคเฉเจ เจเฉเจธเจผ เจนเฉเจฃเจเฉเฅค เจธเจชเจฐเจฟเฉฐเจ เจกเฉเจเจ เจฆเฉ เจคเจฐเฉเจนเจพเจ, เจธเจชเจฐเจฟเฉฐเจ เจตเฉเฉฑเจฌ API เจธเจนเจพเจเจคเจพ เจฆเจพ เจฎเฉเฉฑเจ เจเฉเจเจพ เจธเจชเจฐเจฟเฉฐเจ เจกเจฟเจตเฉเจฒเจชเจฐเจพเจ เจจเฉเฉฐ เจฎเจพเจเจเฉเจฐเฉเจชเฉเจฐเฉเจซเจพเจเจฒ API เจฆเฉ เจจเจพเจฒ เจธเจชเจฐเจฟเฉฐเจ เจตเฉเฉฑเจฌ API เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจจ เจฆเฉ เจฏเฉเจ เจฌเจฃเจพเจเจฃเจพ เจนเฉเฅค เจธเจฎเจฐเจฅเจฟเจค เจธเจชเจฐเจฟเฉฐเจ เจตเฉเฉฑเจฌ APIs เจฆเฉ เจตเจฐเจคเฉเจ เจเจฟเจตเฉเจ เจเจฐเจจเฉ เจนเฉ เจฆเฉเจเจ เจเจฆเจพเจนเจฐเจจเจพเจ เจธเจพเจฐเจฃเฉ 3 เจตเจฟเฉฑเจ เจฆเจฟเฉฑเจคเฉเจเจ เจเจเจเจ เจนเจจ, เจ
เจคเฉ เจเจธ เจตเจฟเจธเจผเฉ 'เจคเฉ เจนเฉเจฐ เจเจพเจฃเจเจพเจฐเฉ เจ
เจคเฉ เจเจฆเจพเจนเจฐเจจเจพเจ เจจเฉเฉฐ เจเฉเจเจฐเจเจธ เจเจฟเจเจเฉเจฐเจฟเจ
เจฒ เจตเจฟเฉฑเจ เจฆเฉเจเจฟเจ เจเจพ เจธเจเจฆเจพ เจนเฉเฅค
เจธเจพเจฐเจฃเฉ 3. เจธเจฎเจฐเจฅเจฟเจค เจธเจชเจฐเจฟเฉฐเจ เจตเฉเฉฑเจฌ API เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจจ เจฆเฉเจเจ เจเจฆเจพเจนเจฐเจจเจพเจเฅค
เจธเจฎเจฐเจฅเจฟเจค เจฌเจธเฉฐเจค เจตเฉเฉฑเจฌ เจตเจฟเจธเจผเฉเจธเจผเจคเจพเจตเจพเจ
เจฎเจฟเจธเจพเจฒ
@RestController
@RequestMapping
@RestController
@RequestMapping("/person")
public class PersonSpringController {
...
...
...
}
@GetMapping
@เจชเฉเจธเจเจฎเฉเจชเจฟเฉฐเจ
@เจชเฉเจเจฎเฉเจชเจฟเฉฐเจ
@DeleteMapping
@เจชเฉเจเจฎเฉเจชเจฟเฉฐเจ
@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
เจฎเจพเจเจเฉเจฐเฉเจชเฉเจฐเฉเจซเจพเจเจฒ เจเจชเจญเฉเจเจคเจพ เจเจธ เจเฉฑเจฒ เจฆเฉ เจตเฉ เจชเฉเจฐเจธเจผเฉฐเจธเจพ เจเจฐเจจเจเฉ เจเจฟ เจเฉเจเจฐเจเจธ เจนเจพเจเจฌเจฐเจจเฉเจ ORM เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ JPA เจฆเจพ เจธเจฎเจฐเจฅเจจ เจเจฐเจฆเจพ เจนเฉเฅค เจธเจชเจฐเจฟเฉฐเจ เจกเจฟเจตเฉเจฒเจชเจฐเจพเจ เจฒเจ เจตเฉ เจเฉฐเจเฉ เจเจผเจฌเจฐ เจนเฉ: เจเฉเจเจฐเจเจธ เจเจฎ เจธเจชเจฐเจฟเฉฐเจ เจกเฉเจเจพ JPA เจเจจเฉเจเฉเจธเจผเจจเจพเจ เจ
เจคเฉ เจเจฟเจธเจฎเจพเจ เจฆเจพ เจธเจฎเจฐเจฅเจจ เจเจฐเจฆเจพ เจนเฉเฅค เจธเจฎเจฐเจฅเจฟเจค เจธเจชเจฐเจฟเฉฐเจ เจกเฉเจเจพ JPA API เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจจ เจฆเฉเจเจ เจเจฆเจพเจนเจฐเจจเจพเจ เจธเจพเจฐเจฃเฉ 4 เจตเจฟเฉฑเจ เจฆเจฟเฉฑเจคเฉเจเจ เจเจเจเจ เจนเจจเฅค
ะ
เจธเจพเจฐเจฃเฉ 4. เจธเจฎเจฐเจฅเจฟเจค เจธเจชเจฐเจฟเฉฐเจ เจกเฉเจเจพ JPA API เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจจ เจฆเฉเจเจ เจเจฆเจพเจนเจฐเจจเจพเจเฅค
เจธเจฎเจฐเจฅเจฟเจค เจฌเจธเฉฐเจค เจกเจพเจเจพ JPA เจตเจฟเจธเจผเฉเจธเจผเจคเจพเจตเจพเจ
เจฎเจฟเจธเจพเจฒ
CrudRepository
public interface PersonRepository
extends JpaRepository,
PersonFragment {
...
}
เจฐเจฟเจชเฉเจเจผเจเจฐเฉ
JpaRepository
เจชเฉเจเจฟเฉฐเจ เจ
เจคเฉ เจธเฉเจฐเจเจฟเฉฐเจ เจฐเจฟเจชเฉเจเจผเจเจฐเฉ
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
เจจเฉเจเจธ เจธเจนเจฟเจฃเจธเจผเฉเจฒเจคเจพ
เจเฉเจธเจเฉเจกเจฟเฉฐเจ เจ
เจธเจซเจฒเจคเจพเจตเจพเจ เจจเฉเฉฐ เจฐเฉเจเจฃ เจ
เจคเฉ เจญเจฐเฉเจธเฉเจฏเฉเจ เจฎเจพเจเจเฉเจฐเฉเจธเจฐเจตเจฟเจธ เจเจฐเจเฉเจเฉเจเจเจฐ เจฌเจฃเจพเจเจฃ เจฒเจ เจจเฉเจเจธ เจธเจนเจฟเจฃเจธเจผเฉเจฒเจคเจพ เจจเจฟเจฐเจฎเจพเจฃ เจฌเจนเฉเจค เจฎเจนเฉฑเจคเจตเจชเฉเจฐเจจ เจนเจจเฅค เจธเจชเจฐเจฟเฉฐเจ เจกเจฟเจตเฉเจฒเจชเจฐ เจเจ เจธเจพเจฒเจพเจ เจคเฉเจ เจจเฉเจเจธ เจธเจนเจฟเจฃเจธเจผเฉเจฒเจคเจพ เจฒเจ เจธเจฐเจเจ-เจฌเฉเจฐเฉเจเจฐ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐ เจฐเจนเฉ เจนเจจ.
เจธเจพเจฐเจฃเฉ 5. เจธเจฎเจฐเจฅเจฟเจค เจฎเจพเจเจเฉเจฐเฉเจชเฉเจฐเฉเจซเจพเจเจฒ เจซเจพเจฒเจ เจเฉเจฒเจฐเฉเจเจธ 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(); //...
}
@เจชเจฟเฉฑเจเฉ เจนเฉฑเจเจฃเจพ
เจ เจธเจซเจฒเจคเจพ เจฆเฉ เจธเจฅเจฟเจคเฉ เจตเจฟเฉฑเจ เจตเจฟเจเจฒเจชเจ เจคเจฐเจ เจจเฉเฉฐ เจเจพเจฒ เจเจฐเจจเจพ
@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(); //...
}
เจเจพเจเจ เจธเฉเจตเจพเจตเจพเจ (เจธเฉเจตเจพ เจธเจฟเจนเจค)
เจเฉเจฌเจฐเจจเฉเจเจธ เจชเจฒเฉเจเจซเจพเจฐเจฎ เจตเจฟเจธเจผเฉเจธเจผ เจธเฉเจตเจพเจตเจพเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเฉเจ เจเฉฐเจเฉเจจเจฐเจพเจ เจฆเฉ เจธเจฟเจนเจค เจฆเฉ เจจเจฟเจเจฐเจพเจจเฉ เจเจฐเจฆเฉ เจนเจจเฅค เจ
เฉฐเจกเจฐเจฒเจพเจเฉฐเจ เจชเจฒเฉเจเจซเจพเจฐเจฎ เจจเฉเฉฐ เจธเฉเจตเจพเจตเจพเจ เจฆเฉ เจจเจฟเจเจฐเจพเจจเฉ เจเจฐเจจ เจฆเฉ เจเจเจพเจเจผเจค เจฆเฉเจฃ เจฒเจ, เจธเจชเจฐเจฟเฉฐเจ เจกเจฟเจตเฉเจฒเจชเจฐ เจเจฎ เจคเฉเจฐ 'เจคเฉ เจเฉฑเจ เจเจธเจเจฎ เจนเฉเจฒเจฅ เจเฉฐเจกเฉเจเฉเจเจฐ เจ
เจคเฉ เจธเจชเจฐเจฟเฉฐเจ เจฌเฉเจ เจเจเจเฉเจเจเจฐ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเจจเฅค เจเฉเจเจฐเจเจธ เจตเจฟเฉฑเจ, เจเจน เจฎเจพเจเจเจฐเฉเจชเฉเจฐเฉเจซเจพเจเจฒ เจนเฉเจฒเจฅ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ เจเฉเจคเจพ เจเจพ เจธเจเจฆเจพ เจนเฉ, เจเฉ เจฎเฉเจฒ เจฐเฉเจช เจตเจฟเฉฑเจ เจเฉฑเจ เจเฉเจตเจฟเจคเจคเจพ เจเจพเจเจ เจเจฐเจฆเจพ เจนเฉ, เจชเจฐ เจเฉฑเจเฉ เจธเจฎเฉเจ เจเฉเจตเจฃเจคเจพ เจ
เจคเฉ เจคเจฟเจเจฐเฉ เจฆเฉ เจเจพเจเจ เจเจฐเจจ เจฒเจ เจเฉเจเจซเจฟเจเจฐ เจเฉเจคเจพ เจเจพ เจธเจเจฆเจพ เจนเฉเฅค เจธเจฎเจฐเจฅเจฟเจค เจฎเจพเจเจเฉเจฐเฉเจชเฉเจฐเฉเจซเจพเจเจฒ เจนเฉเจฒเจฅ เจเจชเฉเจเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจจ เจฆเฉเจเจ เจเจฆเจพเจนเจฐเจจเจพเจ เจธเจพเจฐเจฃเฉ 6 เจตเจฟเฉฑเจ เจฆเจฟเฉฑเจคเฉเจเจ เจเจเจเจ เจนเจจ, เจ
เจคเฉ เจเฉเจเจฐเจเจธ เจฎเฉเจจเฉเจ
เจฒ เจตเจฟเฉฑเจ เจตเจพเจงเฉ เจเจพเจฃเจเจพเจฐเฉ เจชเฉเจฐเจฆเจพเจจ เจเฉเจคเฉ เจเจ เจนเฉเฅค
เจธเจพเจฐเจฃเฉ 6: เจธเจฎเจฐเจฅเจฟเจค เจฎเจพเจเจเฉเจฐเฉเจชเฉเจฐเฉเจซเจพเจเจฒ เจนเฉเจฒเจฅ API เจฆเฉ เจตเจฐเจคเฉเจ เจฆเฉเจเจ เจเจฆเจพเจนเจฐเจฃเจพเจเฅค
เจฎเจพเจเจเฉเจฐเฉเจชเฉเจฐเฉเจซเจพเจเจฒ เจธเจฟเจนเจค เจตเจฟเจธเจผเฉเจธเจผเจคเจพเจตเจพเจ
เจตเฉเจฐเจตเจพ
เจฎเจฟเจธเจพเจฒ
@เจเฉเจตเจจเจคเจพ
เจชเจฒเฉเจเจซเจพเจฐเจฎ เจฐเฉเจฌเฉเจ เจ
เจธเจซเจฒ เจเฉฐเจเฉเจจเจฐเจพเจเจเจผเจก เจเจชเจฒเฉเจเฉเจธเจผเจจเจพเจ
เจ
เฉฐเจคเจฎ เจฌเจฟเฉฐเจฆเฉ:
เจนเฉเจธเจ: 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) เจฒเจ เจฎเฉเจเฉเจฐเจฟเจเจธ เจชเฉเจฐเจฆเจพเจจ เจเจฐเจฆเฉเจเจ เจนเจจเฅค เจธเจชเจฐเจฟเฉฐเจ เจกเจฟเจตเฉเจฒเจชเจฐ เจธเจชเจฐเจฟเฉฐเจ เจฌเฉเจ เจเจเจเฉเจเจเจฐ เจ เจคเฉ เจฎเจพเจเจเฉเจฐเฉเจฎเฉเจเจฐ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเฉเจ เจฎเฉเจเฉเจฐเจฟเจเจธ เจชเฉเจฐเจฆเจพเจจ เจเจฐเจฆเฉ เจนเจจเฅค เจฌเจฆเจฒเฉ เจตเจฟเฉฑเจ, เจเฉเจเจฐเจเจธ เจฌเฉเจธเจฒเจพเจเจจ เจฎเฉเจเฉเจฐเจฟเจเจธ (เจเฉเจตเฉเจเจฎ เจ เจคเฉ เจเจชเจฐเฉเจเจฟเฉฐเจ เจธเจฟเจธเจเจฎ), เจตเจฟเจเจฐเฉเจคเจพ เจฎเฉเจเฉเจฐเจฟเจเจธ (เจเฉเจเจฐเจเจธ), เจ เจคเฉ เจเจชเจฒเฉเจเฉเจธเจผเจจ เจฎเฉเจเฉเจฐเจฟเจเจธ เจชเฉเจฐเจฆเจพเจจ เจเจฐเจจ เจฒเจ เจฎเจพเจเจเฉเจฐเฉเจชเฉเจฐเฉเจซเจพเจเจฒ เจฎเฉเจเฉเจฐเจฟเจเจธ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเจพ เจนเฉเฅค เจฎเจพเจเจเฉเจฐเฉเจชเฉเจฐเฉเจซเจพเจเจฒ เจฎเฉเจเฉเจฐเจฟเจเจธ เจฆเฉ เจฒเฉเฉ เจนเฉ เจเจฟ เจฒเจพเจเฉเจเจฐเจจ JSON เจ เจคเฉ OpenMetrics (Prometheus) เจเจเจเจชเฉเฉฑเจ เจซเจพเจฐเจฎเฉเจเจพเจ เจฆเจพ เจธเจฎเจฐเจฅเจจ เจเจฐเจฆเจพ เจนเฉเฅค เจฎเจพเจเจเฉเจฐเฉเจชเฉเจฐเฉเจซเจพเจเจฒ เจฎเฉเจเฉเจฐเจฟเจเจธ API เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจจ เจฆเฉเจเจ เจเจฆเจพเจนเจฐเจจเจพเจ เจธเจพเจฐเจฃเฉ 7 เจตเจฟเฉฑเจ เจฆเจฟเฉฑเจคเฉเจเจ เจเจเจเจ เจนเจจเฅค
ะ
เจธเจพเจฐเจฃเฉ 7. เจฎเจพเจเจเฉเจฐเฉเจชเฉเจฐเฉเจซเจพเจเจฒ เจฎเฉเจเฉเจฐเจฟเจเจธ 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;
}
@เจเฉเจ
เจเฉฑเจ เจเฉเจ เจธเฉเจเจธเจฐ เจจเฉเฉฐ เจฆเจฐเจธเจพเจเจเจฆเจพ เจนเฉ เจเฉ เจเฉฑเจ เจเจจเฉเจเฉเจเจฟเจก เจตเจธเจคเฉ เจฆเฉ เจฎเฉเฉฑเจฒ เจจเฉเฉฐ เจฎเจพเจชเจฆเจพ เจนเฉ
@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;
}
เจฎเฉเจเฉเจฐเจฟเจเจธ เจ เฉฐเจคเจฎ เจฌเจฟเฉฐเจฆเฉ
เจเจชเจฒเฉเจเฉเจธเจผเจจ เจฎเฉเจเฉเจฐเจฟเจเจธ
เจฎเฉเจฒ เจฎเฉเจเฉเจฐเจฟเจเจธ
เจตเจฟเจเจฐเฉเจคเจพ เจฎเฉเจเฉเจฐเจฟเจเจธ
เจธเจพเจฐเฉ เจฎเจพเจชเจ
เจฎเจพเจเจเฉเจฐเฉเจชเฉเจฐเฉเจซเจพเจเจฒ เจฐเฉเจธเจ เจเจฒเจพเจเฉฐเจ
เจฎเจพเจเจเฉเจฐเฉ เจธเจฐเจตเจฟเจธเจฟเจเจผ เจ เจเจธเจฐ เจเจฐเจพเจฎเจฆเจพเจเจ เจ เฉฐเจคเจฎ เจฌเจฟเฉฐเจฆเฉ เจชเฉเจฐเจฆเจพเจจ เจเจฐเจฆเฉ เจนเจจ เจเจฟเจจเฉเจนเจพเจ เจจเจพเจฒ เจเฉฐเจฎ เจเจฐเจจ เจฒเจ เจธเฉฐเจฌเฉฐเจงเจฟเจค เจเจฒเจพเจเฉฐเจ API เจฆเฉ เจฒเฉเฉ เจนเฉเฉฐเจฆเฉ เจนเฉเฅค RESTful เจ เฉฐเจคเจฎ เจฌเจฟเฉฐเจฆเฉเจเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจจ เจฒเจ, เจธเจชเจฐเจฟเฉฐเจ เจกเจฟเจตเฉเจฒเจชเจฐ เจเจฎ เจคเฉเจฐ 'เจคเฉ RestTemplate เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเจจเฅค เจเฉเจเจฐเจเจธ เจเจธ เจธเจฎเฉฑเจธเจฟเจ เจจเฉเฉฐ เจนเฉฑเจฒ เจเจฐเจจ เจฒเจ เจฎเจพเจเจเฉเจฐเฉเจชเฉเจฐเฉเจซเจพเจเจฒ เจฐเฉเจธเจ เจเจฒเจพเจเฉฐเจ API เจฆเฉ เจชเฉเจธเจผเจเจธเจผ เจเจฐเจฆเจพ เจนเฉ, เจเจฟเจธเจฆเฉ เจตเจฐเจคเฉเจ เจฆเฉเจเจ เจเจฆเจพเจนเจฐเจฃเจพเจ เจธเจพเจฐเจฃเฉ 8 เจตเจฟเฉฑเจ เจฆเจฟเฉฑเจคเฉเจเจ เจเจเจเจ เจนเจจเฅค
ะ
เจธเจพเจฐเจฃเฉ 8. เจฎเจพเจเจเฉเจฐเฉเจชเฉเจฐเฉเจซเจพเจเจฒ เจฐเฉเจธเจ เจเจฒเจพเจเฉฐเจ 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
เจจเจคเฉเจเฉ
เจเจธ เจฌเจฒเฉเจ เจตเจฟเฉฑเจ, เจฎเฉเฉฑเจ เจคเฉเจฐ 'เจคเฉ เจธเจชเจฐเจฟเฉฐเจ เจกเจฟเจตเฉเจฒเจชเจฐเจพเจ เจจเฉเฉฐ เจจเจฟเจธเจผเจพเจจเจพ เจฌเจฃเจพเจเจ เจเจฟเจ เจนเฉ, เจ เจธเฉเจ เจเจพเจตเจพ เจฎเจพเจเจเฉเจฐเฉ เจธเจฐเจตเจฟเจธเจฟเจเจผ เจจเฉเฉฐ เจตเจฟเจเจธเจค เจเจฐเจจ เจฒเจ เจเฉเจเจฐเจเจธ เจตเจฟเฉฑเจ เจฎเจพเจเจเฉเจฐเฉเจชเฉเจฐเฉเจซเจพเจเจฒ API เจฆเฉ เจจเจพเจฒ เจธเจชเจฐเจฟเฉฐเจ API เจฆเฉ เจตเจฐเจคเฉเจ เจเจฟเจตเฉเจ เจเจฐเฉเจ เจ เจคเฉ เจซเจฟเจฐ เจเจนเจจเจพเจ เจจเฉเฉฐ เจฎเฉเจฒ เจฌเจพเจเจจเจฐเฉ เจเฉเจก เจตเจฟเฉฑเจ เจเฉฐเจชเจพเจเจฒ เจเจฐเฉ เจเฉ เจธเฉเจเจเฉเฉ เจฎเฉเจเจพเจฌเจพเจเจ RAM เจฆเฉ เจฌเจเจค เจเจฐเจฆเจพ เจนเฉ เจ เจคเฉ เจตเจฟเฉฑเจ เจฒเจพเจเจ เจเจฐเจฆเจพ เจนเฉเฅค เจฎเจฟเจฒเฉเจธเจเจฟเฉฐเจ เจฆเฉ เจเฉฑเจฒ เจนเฉเฅค
เจเจฟเจตเฉเจ เจเจฟ เจคเฉเจธเฉเจ เจชเจนเจฟเจฒเจพเจ เจนเฉ เจธเจฎเจ เจเจ เจนเฉ, เจธเจชเจฐเจฟเฉฐเจ เจ
เจคเฉ เจฎเจพเจเจเฉเจฐเฉเจชเฉเจฐเฉเจซเจพเจเจฒ API เจฒเจ เจธเจฎเจฐเจฅเจจ เจฌเจพเจฐเฉ เจนเฉเจฐ เจเจพเจฃเจเจพเจฐเฉ, เจ
เจคเฉ เจจเจพเจฒ เจนเฉ เจฌเจนเฉเจค เจธเจพเจฐเฉเจเจ เจนเฉเจฐ เจเจชเจฏเฉเจเฉ เจเจพเจฃเจเจพเจฐเฉ, เจตเจฟเฉฑเจ เจฒเฉฑเจญเฉ เจเจพ เจธเจเจฆเฉ เจนเฉ
เจธเจฐเฉเจค: www.habr.com