āĻ¸āĻŦāĻžāĻāĻā§ āĻšā§āĻ¯āĻžāĻ˛ā§, āĻāĻāĻžāĻ¨ā§ āĻā§āĻ¯āĻŧāĻžāĻ°ā§āĻāĻžāĻ¸ āĻ¸āĻŋāĻ°āĻŋāĻā§āĻ° āĻ¤ā§āĻ¤ā§āĻ¯āĻŧ āĻĒā§āĻ¸ā§āĻ!
āĻāĻžāĻāĻž āĻŽāĻžāĻāĻā§āĻ°ā§āĻ¸āĻžāĻ°ā§āĻāĻŋāĻ¸ āĻŦāĻŋāĻāĻžāĻļ āĻāĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ, āĻāĻāĻŋ āĻĒā§āĻ°āĻžāĻ¯āĻŧāĻļāĻ āĻŦāĻŋāĻļā§āĻŦāĻžāĻ¸ āĻāĻ°āĻž āĻšāĻ¯āĻŧ
āĻāĻāĻā§ āĻŦāĻŋāĻ¸ā§āĻ¤āĻžāĻ°āĻŋāĻ¤āĻāĻžāĻŦā§, āĻāĻŽāĻ°āĻž āĻĒā§āĻ°āĻĨāĻŽā§ āĻ¸ā§āĻĒā§āĻ°āĻŋāĻ āĻĄā§āĻā§āĻ˛āĻĒāĻžāĻ°āĻĻā§āĻ° āĻ¤āĻžāĻĻā§āĻ° āĻĻā§āĻ¨āĻ¨ā§āĻĻāĻŋāĻ¨ āĻāĻžāĻā§ āĻŽāĻžāĻāĻā§āĻ°ā§āĻĒā§āĻ°ā§āĻĢāĻžāĻāĻ˛ āĻāĻĒāĻŋāĻāĻ āĻā§āĻāĻžāĻŦā§ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻ¤ā§ āĻšāĻ¯āĻŧ āĻ¤āĻž āĻĻā§āĻāĻžāĻ¨ā§āĻ° āĻāĻ¨ā§āĻ¯ āĻ¸ā§āĻĒā§āĻ°āĻŋāĻ āĻāĻĒāĻŋāĻāĻ āĻ¸āĻŽāĻ°ā§āĻĨāĻ¨ āĻāĻ°ā§ āĻāĻŋāĻāĻžāĻŦā§ āĻā§āĻ¯āĻŧāĻžāĻ°ā§āĻāĻžāĻ¸ āĻ¸ā§āĻĒā§āĻ°āĻŋāĻ āĻāĻĒāĻŋāĻāĻ āĻ¸āĻŽāĻ°ā§āĻĨāĻ¨ āĻāĻ°ā§ āĻ¤āĻžāĻ° āĻĒāĻ°āĻŋāĻ§āĻŋ āĻāĻŦāĻ āĻŦāĻŋāĻļāĻĻ āĻĻā§āĻāĻŦāĨ¤ āĻ¤āĻžāĻ°āĻĒāĻ°ā§ āĻāĻŽāĻ°āĻž āĻŽāĻžāĻāĻā§āĻ°ā§āĻĒā§āĻ°ā§āĻĢāĻžāĻāĻ˛ APIāĻā§āĻ˛āĻŋ āĻāĻāĻžāĻ° āĻāĻ°āĻŦ, āĻ¯āĻž āĻŽāĻžāĻāĻā§āĻ°ā§āĻ¸āĻžāĻ°ā§āĻāĻŋāĻ¸ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻ¸ā§āĻĒā§āĻ°āĻŋāĻ āĻĄā§āĻā§āĻ˛āĻĒāĻžāĻ°āĻĻā§āĻ° āĻāĻ¨ā§āĻ¯ āĻāĻĒāĻ¯ā§āĻā§āĨ¤
āĻā§āĻ¯āĻŧāĻžāĻ°ā§āĻāĻžāĻ¸ āĻā§āĻ¨? āĻĒā§āĻ°āĻĨāĻŽāĻ¤, āĻāĻāĻŋ āĻšāĻ˛ āĻ˛āĻžāĻāĻ āĻā§āĻĄāĻŋāĻ, āĻ
āĻ°ā§āĻĨāĻžā§ āĻŽāĻžāĻāĻā§āĻ°ā§āĻĒā§āĻ°ā§āĻĢāĻžāĻāĻ˛ āĻāĻĒāĻŋāĻāĻ, āĻ¸ā§āĻĒā§āĻ°āĻŋāĻ āĻāĻĒāĻŋāĻāĻ āĻāĻŦāĻ āĻ
āĻ¨ā§āĻ¯āĻžāĻ¨ā§āĻ¯ āĻāĻžāĻāĻž āĻāĻĒāĻŋāĻāĻ-āĻāĻ° āĻ¯ā§āĻā§āĻ¨ā§ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ā§āĻ° āĻ¸ā§āĻŦāĻ¯āĻŧāĻāĻā§āĻ°āĻŋāĻ¯āĻŧ āĻ°āĻŋāĻ˛ā§āĻĄāĻŋāĻ, āĻ¯āĻž āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻāĻāĻāĻŋ āĻāĻŽāĻžāĻ¨ā§āĻĄā§āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§ āĻāĻ°āĻž āĻšāĻ¯āĻŧ: mvn quarkus:devāĨ¤ āĻĻā§āĻŦāĻŋāĻ¤ā§āĻ¯āĻŧāĻ¤, āĻŦāĻŋāĻŦā§āĻāĻ¨āĻž āĻāĻ°āĻž āĻšāĻ¯āĻŧ
āĻāĻŽāĻ°āĻž āĻŽāĻžāĻāĻā§āĻ°ā§āĻĒā§āĻ°ā§āĻĢāĻžāĻāĻ˛ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻā§ āĻŦāĻŋāĻ¸ā§āĻ¤āĻžāĻ°āĻŋāĻ¤ āĻāĻ˛ā§āĻāĻ¨āĻž āĻāĻ°āĻŦ āĻ¨āĻž, āĻ¸ā§āĻĒā§āĻ°āĻŋāĻ āĻĄā§āĻā§āĻ˛āĻĒāĻžāĻ°āĻĻā§āĻ° āĻŦā§āĻāĻ¤ā§ āĻ¸āĻžāĻšāĻžāĻ¯ā§āĻ¯ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻ¯ā§ āĻ¤āĻžāĻ°āĻž āĻā§āĻāĻžāĻŦā§ āĻ¸ā§āĻĒā§āĻ°āĻŋāĻ āĻāĻĒāĻŋāĻāĻ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§ āĻā§āĻ¯āĻŧāĻžāĻ°ā§āĻāĻžāĻ¸ā§ āĻŽāĻžāĻāĻā§āĻ°ā§āĻĒā§āĻ°ā§āĻĢāĻžāĻāĻ˛ API āĻāĻ° āĻ¸āĻžāĻĨā§āĨ¤
āĻ§āĻžāĻ°āĻ āĻāĻŦāĻ āĻā§āĻŦāĻžāĻ°āĻ¨ā§āĻāĻ¸
āĻāĻ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻāĻŋāĻā§ āĻ¸āĻšāĻ āĻ°āĻžāĻāĻ¤ā§, āĻāĻŽāĻ°āĻž āĻāĻāĻžāĻ¨ā§ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻāĻā§āĻ-āĻ¸ā§āĻ¤āĻ°ā§āĻ° āĻ¸āĻšāĻžāĻ¯āĻŧāĻ¤āĻžāĻ° āĻĻāĻŋāĻāĻā§āĻ˛āĻŋ āĻāĻāĻžāĻ° āĻāĻ°āĻŦā§ˇ
āĻā§āĻ¯āĻŧāĻžāĻ°ā§āĻāĻžāĻ¸āĻ
āĻ āĻŦāĻļā§āĻˇā§, āĻ˛āĻā§āĻˇā§āĻ¯ āĻ¸ā§āĻĨāĻžāĻĒāĻ¨āĻžāĻ° āĻĒāĻ°āĻŋāĻŦā§āĻļ āĻšāĻŋāĻ¸āĻžāĻŦā§ Kubernetes-āĻ āĻĢā§āĻāĻžāĻ¸ āĻāĻ°ā§, Quarkus āĻāĻžāĻāĻž āĻĢā§āĻ°ā§āĻŽāĻāĻ¯āĻŧāĻžāĻ°ā§āĻ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ āĻ¨āĻž āĻ¯ā§āĻāĻžāĻ¨ā§ āĻāĻāĻ āĻ§āĻ°āĻ¨ā§āĻ° āĻāĻžāĻ°ā§āĻ¯āĻāĻžāĻ°āĻŋāĻ¤āĻž āĻā§āĻŦāĻžāĻ°āĻ¨ā§āĻāĻ¸ āĻĒā§āĻ˛ā§āĻ¯āĻžāĻāĻĢāĻ°ā§āĻŽā§āĻ° āĻ¸ā§āĻ¤āĻ°ā§āĻ āĻĒā§āĻ°āĻ¯āĻŧā§āĻ āĻāĻ°āĻž āĻšāĻ¯āĻŧāĨ¤ āĻ¸āĻžāĻ°āĻŖāĻŋ 1 āĻā§āĻŦāĻžāĻ°āĻ¨ā§āĻāĻ¸ āĻāĻŦāĻ āĻ¸ā§āĻĒā§āĻ°āĻŋāĻ āĻĄā§āĻā§āĻ˛āĻĒāĻžāĻ°āĻĻā§āĻ° āĻĻā§āĻŦāĻžāĻ°āĻž āĻŦā§āĻ¯āĻŦāĻšā§āĻ¤ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻāĻžāĻāĻž āĻĢā§āĻ°ā§āĻŽāĻāĻ¯āĻŧāĻžāĻ°ā§āĻāĻā§āĻ˛āĻŋāĻ° āĻŽāĻ§ā§āĻ¯ā§ āĻāĻžāĻ°ā§āĻ¯āĻāĻ°ā§ āĻāĻŋāĻ āĻŋāĻĒāĻ¤ā§āĻ°ā§āĻ° āĻāĻāĻāĻŋ āĻŽāĻžāĻ¨āĻāĻŋāĻ¤ā§āĻ° āĻ¸āĻ°āĻŦāĻ°āĻžāĻš āĻāĻ°ā§āĨ¤
āĻ¸āĻžāĻ°āĻŖā§ 1. āĻāĻžāĻāĻž āĻĢā§āĻ°ā§āĻŽāĻāĻ¯āĻŧāĻžāĻ°ā§āĻ āĻāĻŦāĻ āĻā§āĻŦāĻžāĻ°āĻ¨ā§āĻāĻ¸ā§āĻ° āĻŽāĻ§ā§āĻ¯ā§ āĻāĻžāĻ°ā§āĻ¯āĻāĻ°ā§ āĻāĻŋāĻ āĻŋāĻĒāĻ¤ā§āĻ°ā§āĻ° āĻŽāĻžāĻ¨āĻāĻŋāĻ¤ā§āĻ°āĨ¤
āĻā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻŽā§āĻ˛āĻ
āĻāĻ¤āĻŋāĻšā§āĻ¯āĻŦāĻžāĻšā§ āĻŦāĻ¸āĻ¨ā§āĻ¤ āĻŦā§āĻ
Kubernetes
āĻĒāĻ°āĻŋāĻˇā§āĻŦāĻž āĻāĻŦāĻŋāĻˇā§āĻāĻžāĻ°
āĻāĻāĻ°ā§āĻāĻž
āĻĄāĻŋāĻāĻ¨āĻāĻ¸
āĻāĻ¨āĻĢāĻŋāĻāĻžāĻ°ā§āĻļāĻ¨
āĻ¸ā§āĻĒā§āĻ°āĻŋāĻ āĻā§āĻ˛āĻžāĻāĻĄ āĻāĻ¨āĻĢāĻŋāĻāĻžāĻ°ā§āĻļāĻ¨
āĻŽāĻžāĻ¨āĻāĻŋāĻ¤ā§āĻ°/āĻ¸āĻŋāĻā§āĻ°ā§āĻ āĻāĻ¨āĻĢāĻŋāĻāĻžāĻ° āĻāĻ°ā§āĻ¨
āĻāĻžāĻ°āĻ¸āĻžāĻŽā§āĻ¯ āĻ˛ā§āĻĄ āĻāĻ°ā§āĻ¨
āĻĢāĻŋāĻ¤āĻž (āĻā§āĻ˛āĻžāĻ¯āĻŧā§āĻ¨ā§āĻ āĻ¸āĻžāĻāĻĄ)
āĻ¸āĻžāĻ°ā§āĻāĻŋāĻ¸, āĻ°ā§āĻĒā§āĻ˛āĻŋāĻā§āĻļāĻ¨ āĻāĻ¨ā§āĻā§āĻ°ā§āĻ˛āĻžāĻ° (āĻ¸āĻžāĻ°ā§āĻāĻžāĻ° āĻ¸āĻžāĻāĻĄ)
āĻāĻĻāĻžāĻšāĻ°āĻŖ āĻĨā§āĻā§ āĻā§āĻĄ āĻāĻŽā§āĻĒāĻžāĻāĻ˛ āĻāĻŦāĻ āĻ°āĻžāĻ¨ āĻāĻ°āĻž
āĻāĻ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ā§ āĻāĻŽāĻ°āĻž āĻāĻ˛ā§āĻ˛ā§āĻ āĻāĻ°āĻŋ
āĻ¸ā§āĻĒā§āĻ°āĻŋāĻ āĻĢā§āĻ°ā§āĻŽāĻāĻ¯āĻŧāĻžāĻ°ā§āĻ API
āĻāĻ¨āĻā§āĻāĻļāĻ¨ āĻ¨āĻŋāĻ°ā§āĻāĻ°āĻ¤āĻž
āĻā§āĻ¯āĻŧāĻžāĻ°ā§āĻāĻžāĻ¸ āĻāĻāĻāĻŋ āĻĒāĻ°āĻŋāĻ¸ā§āĻŽāĻž āĻ¸āĻŽāĻ°ā§āĻĨāĻ¨ āĻāĻ°ā§
Đ
āĻ¸āĻžāĻ°āĻŖāĻŋ 2. āĻ¸āĻŽāĻ°ā§āĻĨāĻŋāĻ¤ āĻ¸ā§āĻĒā§āĻ°āĻŋāĻ DI API āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻžāĻ° āĻāĻĻāĻžāĻšāĻ°āĻŖāĨ¤
āĻ¸āĻŽāĻ°ā§āĻĨāĻŋāĻ¤ āĻ¸ā§āĻĒā§āĻ°āĻŋāĻ 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;
}
}
āĻāĻ¯āĻŧā§āĻŦ āĻĢā§āĻ°ā§āĻŽāĻāĻ¯āĻŧāĻžāĻ°ā§āĻ
āĻŽāĻžāĻāĻā§āĻ°ā§āĻĒā§āĻ°ā§āĻĢāĻžāĻāĻ˛ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻāĻžāĻ°ā§āĻ°āĻž āĻĒāĻāĻ¨ā§āĻĻ āĻāĻ°āĻŦā§āĻ¨ āĻ¯ā§ āĻā§āĻ¯āĻŧāĻžāĻ°ā§āĻāĻžāĻ¸ āĻĒā§āĻ°āĻžāĻĨāĻŽāĻŋāĻ āĻāĻ¯āĻŧā§āĻŦ āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽāĻŋāĻ āĻŽāĻĄā§āĻ˛ āĻšāĻŋāĻ¸āĻžāĻŦā§ JAX-RS, āĻŽāĻžāĻāĻā§āĻ°ā§āĻĒā§āĻ°ā§āĻĢāĻžāĻāĻ˛ āĻ°ā§āĻ¸ā§āĻ āĻā§āĻ˛āĻžāĻ¯āĻŧā§āĻ¨ā§āĻ, JSON-P, āĻāĻŦāĻ JSON-B āĻ¸āĻŽāĻ°ā§āĻĨāĻ¨ āĻāĻ°ā§āĨ¤ āĻ¸ā§āĻĒā§āĻ°āĻŋāĻ āĻĄā§āĻā§āĻ˛āĻĒāĻžāĻ°āĻ°āĻž āĻ¸ā§āĻĒā§āĻ°āĻŋāĻ āĻāĻ¯āĻŧā§āĻŦ API, āĻŦāĻŋāĻļā§āĻˇ āĻāĻ°ā§ REST āĻāĻ¨ā§āĻāĻžāĻ°āĻĢā§āĻ¸ā§āĻ° āĻāĻ¨ā§āĻ¯ āĻā§āĻ¯āĻŧāĻžāĻ°ā§āĻāĻžāĻ¸ā§āĻ° āĻ¸āĻžāĻŽā§āĻĒā§āĻ°āĻ¤āĻŋāĻ āĻ¸āĻŽāĻ°ā§āĻĨāĻ¨ā§ āĻ¸āĻ¨ā§āĻ¤ā§āĻˇā§āĻ āĻšāĻŦā§āĨ¤ āĻ¸ā§āĻĒā§āĻ°āĻŋāĻ āĻĄāĻŋāĻāĻ-āĻāĻ° āĻŽāĻ¤ā§, āĻ¸ā§āĻĒā§āĻ°āĻŋāĻ āĻāĻ¯āĻŧā§āĻŦ API āĻ¸āĻŽāĻ°ā§āĻĨāĻ¨ā§āĻ° āĻŽā§āĻ˛ āĻ˛āĻā§āĻˇā§āĻ¯ āĻšāĻ˛ āĻ¸ā§āĻĒā§āĻ°āĻŋāĻ āĻĄā§āĻā§āĻ˛āĻĒāĻžāĻ°āĻĻā§āĻ° āĻŽāĻžāĻāĻā§āĻ°ā§āĻĒā§āĻ°ā§āĻĢāĻžāĻāĻ˛ API-āĻāĻ° āĻ¸āĻžāĻĨā§ āĻāĻāĻ¤ā§āĻ°ā§ āĻ¸ā§āĻĒā§āĻ°āĻŋāĻ āĻāĻ¯āĻŧā§āĻŦ API āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻ¤ā§ āĻ¸āĻā§āĻˇāĻŽ āĻāĻ°āĻžāĨ¤ āĻāĻŋāĻāĻžāĻŦā§ āĻ¸āĻŽāĻ°ā§āĻĨāĻŋāĻ¤ āĻ¸ā§āĻĒā§āĻ°āĻŋāĻ āĻāĻ¯āĻŧā§āĻŦ āĻāĻĒāĻŋāĻāĻ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻ¤ā§ āĻšāĻ¯āĻŧ āĻ¤āĻžāĻ° āĻāĻĻāĻžāĻšāĻ°āĻŖ āĻ¸āĻžāĻ°āĻŖāĻŋ 3-āĻ¤ā§ āĻĻā§āĻāĻ¯āĻŧāĻž āĻšāĻ¯āĻŧā§āĻā§ āĻāĻŦāĻ āĻāĻ āĻŦāĻŋāĻˇāĻ¯āĻŧā§ āĻāĻ°āĻ āĻ¤āĻĨā§āĻ¯ āĻ āĻāĻĻāĻžāĻšāĻ°āĻŖ āĻā§āĻ¯āĻŧāĻžāĻ°ā§āĻāĻžāĻ¸ āĻāĻŋāĻāĻā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ˛-āĻ āĻĒāĻžāĻāĻ¯āĻŧāĻž āĻ¯āĻžāĻŦā§
āĻ¸āĻžāĻ°āĻŖāĻŋ 3. āĻ¸āĻŽāĻ°ā§āĻĨāĻŋāĻ¤ āĻ¸ā§āĻĒā§āĻ°āĻŋāĻ āĻāĻ¯āĻŧā§āĻŦ API āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻžāĻ° āĻāĻĻāĻžāĻšāĻ°āĻŖāĨ¤
āĻ¸āĻŽāĻ°ā§āĻĨāĻŋāĻ¤ āĻ¸ā§āĻĒā§āĻ°āĻŋāĻ āĻāĻ¯āĻŧā§āĻŦ āĻŦā§āĻļāĻŋāĻˇā§āĻā§āĻ¯
āĻāĻĻāĻžāĻšāĻ°āĻŖ
@āĻ°ā§āĻ¸ā§āĻ āĻāĻ¨ā§āĻā§āĻ°ā§āĻ˛āĻžāĻ°
@RequestMapping
@RestController
@RequestMapping("/person")
public class PersonSpringController {
...
...
...
}
@āĻā§āĻāĻŽā§āĻ¯āĻžāĻĒāĻŋāĻ
@āĻĒā§āĻ¸ā§āĻāĻŽā§āĻ¯āĻžāĻĒāĻŋāĻ
@āĻĒā§āĻāĻŽā§āĻ¯āĻžāĻĒāĻŋāĻ
@āĻĄāĻŋāĻ˛āĻŋāĻāĻŽā§āĻ¯āĻžāĻĒāĻŋāĻ
@āĻĒā§āĻ¯āĻžāĻāĻŽā§āĻ¯āĻžāĻĒāĻŋāĻ
@RequestParam
@RequestHeader
@MatrixVariable
@āĻĒāĻžāĻĨāĻā§āĻ°āĻŋāĻ¯āĻŧā§āĻŦāĻ˛
@āĻā§āĻāĻŋāĻā§āĻ¯āĻžāĻ˛ā§
@RequestBody
@ āĻ°ā§āĻ¸āĻĒāĻ¨ā§āĻ¸ āĻ¸ā§āĻā§āĻ¯āĻžāĻāĻžāĻ¸
@ āĻŦā§āĻ¯āĻ¤āĻŋāĻā§āĻ°āĻŽ āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻ˛āĻžāĻ°
@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(); //...
}
āĻā§āĻāĻŋāĻ āĻ¸āĻžāĻ°ā§āĻāĻŋāĻ¸ (āĻĒāĻ°āĻŋāĻˇā§āĻŦāĻž āĻ¸ā§āĻŦāĻžāĻ¸ā§āĻĨā§āĻ¯)
Kubernetes āĻĒā§āĻ˛ā§āĻ¯āĻžāĻāĻĢāĻ°ā§āĻŽāĻā§āĻ˛āĻŋ āĻŦāĻŋāĻļā§āĻˇ āĻĒāĻ°āĻŋāĻˇā§āĻŦāĻžāĻā§āĻ˛āĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ āĻāĻ¨ā§āĻā§āĻāĻ¨āĻžāĻ°āĻā§āĻ˛āĻŋāĻ° āĻ¸ā§āĻŦāĻžāĻ¸ā§āĻĨā§āĻ¯ āĻĒāĻ°ā§āĻ¯āĻŦā§āĻā§āĻˇāĻŖ āĻāĻ°ā§āĨ¤ āĻ
āĻ¨ā§āĻ¤āĻ°ā§āĻ¨āĻŋāĻšāĻŋāĻ¤ āĻĒā§āĻ˛ā§āĻ¯āĻžāĻāĻĢāĻ°ā§āĻŽāĻāĻŋāĻā§ āĻĒāĻ°āĻŋāĻˇā§āĻŦāĻžāĻā§āĻ˛āĻŋ āĻ¨āĻŋāĻ°ā§āĻā§āĻˇāĻŖ āĻāĻ°āĻžāĻ° āĻ
āĻ¨ā§āĻŽāĻ¤āĻŋ āĻĻā§āĻāĻ¯āĻŧāĻžāĻ° āĻāĻ¨ā§āĻ¯, āĻ¸ā§āĻĒā§āĻ°āĻŋāĻ āĻŦāĻŋāĻāĻžāĻļāĻāĻžāĻ°ā§āĻ°āĻž āĻ¸āĻžāĻ§āĻžāĻ°āĻŖāĻ¤ āĻāĻāĻāĻŋ āĻāĻžāĻ¸ā§āĻāĻŽ āĻšā§āĻ˛āĻĨ āĻāĻ¨ā§āĻĄāĻŋāĻā§āĻāĻ° āĻāĻŦāĻ āĻ¸ā§āĻĒā§āĻ°āĻŋāĻ āĻŦā§āĻ āĻ
ā§āĻ¯āĻžāĻāĻā§āĻ¯āĻŧā§āĻāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§āĨ¤ āĻā§āĻ¯āĻŧāĻžāĻ°ā§āĻāĻžāĻ¸ā§, āĻāĻāĻŋ āĻŽāĻžāĻāĻā§āĻ°ā§āĻĒā§āĻ°ā§āĻĢāĻžāĻāĻ˛ āĻšā§āĻ˛āĻĨ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ āĻāĻ°āĻž āĻ¯ā§āĻ¤ā§ āĻĒāĻžāĻ°ā§, āĻ¯āĻž āĻĄāĻŋāĻĢāĻ˛ā§āĻāĻāĻžāĻŦā§ āĻāĻāĻāĻŋ āĻā§āĻŦāĻ¨ā§āĻ¤āĻ¤āĻž āĻĒāĻ°ā§āĻā§āĻˇāĻž āĻāĻ°ā§, āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻāĻāĻ āĻ¸āĻžāĻĨā§ āĻ¸āĻā§āĻŦāĻ¤āĻž āĻāĻŦāĻ āĻĒā§āĻ°āĻ¸ā§āĻ¤ā§āĻ¤āĻŋ āĻĒāĻ°ā§āĻā§āĻˇāĻž āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻ¨āĻĢāĻŋāĻāĻžāĻ° āĻāĻ°āĻž āĻ¯ā§āĻ¤ā§ āĻĒāĻžāĻ°ā§āĨ¤ āĻā§āĻāĻžāĻŦā§ āĻ¸āĻŽāĻ°ā§āĻĨāĻŋāĻ¤ āĻŽāĻžāĻāĻā§āĻ°ā§āĻĒā§āĻ°ā§āĻĢāĻžāĻāĻ˛ āĻšā§āĻ˛āĻĨ āĻāĻĒāĻŋāĻāĻ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻŦā§āĻ¨ āĻ¤āĻžāĻ° āĻāĻĻāĻžāĻšāĻ°āĻŖ āĻ¸āĻžāĻ°āĻŖāĻŋ 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();
}
āĻŽā§āĻā§āĻ°āĻŋāĻā§āĻ¸
āĻ ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻā§āĻļāĻ¨āĻā§āĻ˛āĻŋ āĻšāĻ¯āĻŧ āĻ āĻĒāĻžāĻ°ā§āĻļāĻ¨āĻžāĻ˛ āĻāĻĻā§āĻĻā§āĻļā§āĻ¯ā§ (āĻĒāĻžāĻ°āĻĢāĻ°āĻŽā§āĻ¯āĻžāĻ¨ā§āĻ¸ āĻāĻ¸āĻāĻ˛āĻāĻā§āĻ˛āĻŋ āĻ¨āĻŋāĻ°ā§āĻā§āĻˇāĻŖ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯) āĻŦāĻž āĻ -āĻ āĻĒāĻžāĻ°ā§āĻļāĻ¨āĻžāĻ˛ āĻāĻĻā§āĻĻā§āĻļā§āĻ¯ā§ (āĻŦā§āĻ¯āĻŦāĻ¸āĻžāĻ¯āĻŧāĻŋāĻ āĻāĻ¸āĻāĻ˛āĻ) āĻāĻ¨ā§āĻ¯ āĻŽā§āĻā§āĻ°āĻŋāĻā§āĻ¸ āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻāĻ°ā§āĨ¤ āĻ¸ā§āĻĒā§āĻ°āĻŋāĻ āĻĄā§āĻā§āĻ˛āĻĒāĻžāĻ°āĻ°āĻž āĻ¸ā§āĻĒā§āĻ°āĻŋāĻ āĻŦā§āĻ āĻ ā§āĻ¯āĻžāĻāĻā§āĻ¯āĻŧā§āĻāĻ° āĻāĻŦāĻ āĻŽāĻžāĻāĻā§āĻ°ā§āĻŽāĻŋāĻāĻžāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ āĻŽā§āĻā§āĻ°āĻŋāĻā§āĻ¸ āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻāĻ°ā§āĨ¤ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤ā§, āĻā§āĻ¯āĻŧāĻžāĻ°ā§āĻāĻžāĻ¸ āĻŦā§āĻ¸āĻ˛āĻžāĻāĻ¨ āĻŽā§āĻā§āĻ°āĻŋāĻā§āĻ¸ (āĻā§āĻāĻŋāĻāĻŽ āĻāĻŦāĻ āĻ āĻĒāĻžāĻ°ā§āĻāĻŋāĻ āĻ¸āĻŋāĻ¸ā§āĻā§āĻŽ), āĻā§āĻ¨ā§āĻĄāĻ° āĻŽā§āĻā§āĻ°āĻŋāĻā§āĻ¸ (āĻā§āĻ¯āĻŧāĻžāĻ°ā§āĻāĻžāĻ¸) āĻāĻŦāĻ āĻ ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻā§āĻļāĻ¨ āĻŽā§āĻā§āĻ°āĻŋāĻā§āĻ¸ āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻāĻ°āĻ¤ā§ āĻŽāĻžāĻāĻā§āĻ°ā§āĻĒā§āĻ°ā§āĻĢāĻžāĻāĻ˛ āĻŽā§āĻā§āĻ°āĻŋāĻā§āĻ¸ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§āĨ¤ āĻŽāĻžāĻāĻā§āĻ°ā§āĻĒā§āĻ°ā§āĻĢāĻžāĻāĻ˛ āĻŽā§āĻā§āĻ°āĻŋāĻā§āĻ¸ā§āĻ° āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨ āĻ¯ā§ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ JSON āĻāĻŦāĻ OpenMetrics (Prometheus) āĻāĻāĻāĻĒā§āĻ āĻĢāĻ°ā§āĻŽā§āĻ¯āĻžāĻāĻā§āĻ˛āĻŋāĻā§ āĻ¸āĻŽāĻ°ā§āĻĨāĻ¨ āĻāĻ°ā§ā§ˇ āĻŽāĻžāĻāĻā§āĻ°ā§āĻĒā§āĻ°ā§āĻĢāĻžāĻāĻ˛ āĻŽā§āĻā§āĻ°āĻŋāĻā§āĻ¸ āĻāĻĒāĻŋāĻāĻ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°ā§āĻ° āĻāĻĻāĻžāĻšāĻ°āĻŖ āĻ¸āĻžāĻ°āĻŖāĻŋ 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;
}
āĻŽā§āĻā§āĻ°āĻŋāĻā§āĻ¸ āĻāĻ¨ā§āĻĄāĻĒāĻ¯āĻŧā§āĻ¨ā§āĻ
āĻ
ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻā§āĻļāĻ¨ āĻŽā§āĻā§āĻ°āĻŋāĻā§āĻ¸
āĻŦā§āĻ¸āĻŋāĻ āĻŽā§āĻā§āĻ°āĻŋāĻā§āĻ¸
āĻŦāĻŋāĻā§āĻ°ā§āĻ¤āĻž āĻŽā§āĻā§āĻ°āĻŋāĻā§āĻ¸
āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻŽā§āĻā§āĻ°āĻŋāĻā§āĻ¸
āĻŽāĻžāĻāĻā§āĻ°ā§āĻĒā§āĻ°ā§āĻĢāĻžāĻāĻ˛ āĻ°ā§āĻ¸ā§āĻ āĻā§āĻ˛āĻžāĻ¯āĻŧā§āĻ¨ā§āĻ
āĻŽāĻžāĻāĻā§āĻ°ā§āĻ¸āĻžāĻ°ā§āĻāĻŋāĻ¸āĻā§āĻ˛āĻŋ āĻĒā§āĻ°āĻžāĻ¯āĻŧāĻ RESTful āĻāĻ¨ā§āĻĄāĻĒāĻ¯āĻŧā§āĻ¨ā§āĻ āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻāĻ°ā§ āĻ¯ā§āĻā§āĻ˛āĻŋāĻ° āĻ¸āĻžāĻĨā§ āĻāĻžāĻ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻ¸āĻāĻļā§āĻ˛āĻŋāĻˇā§āĻ āĻā§āĻ˛āĻžāĻ¯āĻŧā§āĻ¨ā§āĻ APIāĻā§āĻ˛āĻŋāĻ° āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨ āĻšāĻ¯āĻŧā§ˇ RESTful āĻāĻ¨ā§āĻĄāĻĒāĻ¯āĻŧā§āĻ¨ā§āĻ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻ¤ā§, āĻ¸ā§āĻĒā§āĻ°āĻŋāĻ āĻĄā§āĻā§āĻ˛āĻĒāĻžāĻ°āĻ°āĻž āĻ¸āĻžāĻ§āĻžāĻ°āĻŖāĻ¤ RestTemplate āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§āĨ¤ āĻā§āĻ¯āĻŧāĻžāĻ°ā§āĻāĻžāĻ¸ āĻāĻ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨ā§āĻ° āĻāĻ¨ā§āĻ¯ āĻŽāĻžāĻāĻā§āĻ°ā§āĻĒā§āĻ°ā§āĻĢāĻžāĻāĻ˛ āĻ°ā§āĻ¸ā§āĻ āĻā§āĻ˛āĻžāĻ¯āĻŧā§āĻ¨ā§āĻ āĻāĻĒāĻŋāĻāĻ āĻ āĻĢāĻžāĻ° āĻāĻ°ā§, āĻ¯āĻžāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°ā§āĻ° āĻāĻĻāĻžāĻšāĻ°āĻŖ āĻ¸āĻžāĻ°āĻŖāĻŋ 8 āĻ āĻĻā§āĻāĻ¯āĻŧāĻž āĻāĻā§āĨ¤
Đ
āĻ¸āĻžāĻ°āĻŖā§ 8. āĻŽāĻžāĻāĻā§āĻ°ā§āĻĒā§āĻ°ā§āĻĢāĻžāĻāĻ˛ āĻ°ā§āĻ¸ā§āĻ āĻā§āĻ˛āĻžāĻ¯āĻŧā§āĻ¨ā§āĻ API āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻžāĻ° āĻāĻĻāĻžāĻšāĻ°āĻŖāĨ¤
āĻŽāĻžāĻāĻā§āĻ°ā§āĻĒā§āĻ°ā§āĻĢāĻžāĻāĻ˛ āĻŦāĻŋāĻļā§āĻ°āĻžāĻŽ āĻā§āĻ˛āĻžāĻ¯āĻŧā§āĻ¨ā§āĻ āĻŦā§āĻļāĻŋāĻˇā§āĻā§āĻ¯
āĻŦāĻŋāĻŦāĻ°āĻŖ
āĻāĻĻāĻžāĻšāĻ°āĻŖ
@āĻ°ā§āĻāĻŋāĻ¸ā§āĻāĻžāĻ°āĻ°ā§āĻ¸ā§āĻāĻā§āĻ˛āĻžāĻ¯āĻŧā§āĻ¨ā§āĻ
REST āĻā§āĻ˛āĻžāĻ¯āĻŧā§āĻ¨ā§āĻ āĻšāĻŋāĻ¸āĻžāĻŦā§ āĻāĻāĻāĻŋ āĻāĻžāĻāĻĒ āĻāĻ°āĻž āĻāĻžāĻāĻž āĻāĻ¨ā§āĻāĻžāĻ°āĻĢā§āĻ¸ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻ¨ āĻāĻ°ā§
@RegisterRestClient
@Path("/")
public interface MyRestClient {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getSalutation();
}
@āĻ°ā§āĻ¸ā§āĻ āĻā§āĻ˛āĻžāĻ¯āĻŧā§āĻ¨ā§āĻ
āĻāĻāĻāĻŋ āĻāĻžāĻāĻĒ āĻāĻ°āĻž 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-āĻāĻ° āĻŽāĻžāĻāĻā§āĻ°ā§āĻĒā§āĻ°ā§āĻĢāĻžāĻāĻ˛ API-āĻāĻ° āĻ¸āĻžāĻĨā§ āĻ¸ā§āĻĒā§āĻ°āĻŋāĻ API-āĻā§āĻ˛āĻŋ āĻā§āĻāĻžāĻŦā§ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻŦ āĻāĻŦāĻ āĻ¤āĻžāĻ°āĻĒāĻ°ā§ āĻ¸ā§āĻā§āĻ˛āĻŋāĻā§ āĻ¨ā§āĻāĻŋāĻ āĻŦāĻžāĻāĻ¨āĻžāĻ°āĻŋ āĻā§āĻĄā§ āĻāĻŽā§āĻĒāĻžāĻāĻ˛ āĻāĻ°āĻŦ āĻ¯āĻž āĻļāĻ¤ āĻļāĻ¤ āĻŽā§āĻāĻžāĻŦāĻžāĻāĻ āĻ°âā§āĻ¯āĻžāĻŽ āĻ¸āĻāĻ°āĻā§āĻˇāĻŖ āĻāĻ°ā§ āĻāĻŦāĻ āĻ˛āĻā§āĻ āĻāĻ°ā§āĨ¤ āĻŽāĻŋāĻ˛āĻŋāĻ¸ā§āĻā§āĻ¨ā§āĻĄā§āĻ° āĻŦā§āĻ¯āĻžāĻĒāĻžāĻ°āĨ¤
āĻāĻĒāĻ¨āĻŋ āĻāĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§āĻ āĻŦā§āĻāĻ¤ā§ āĻĒā§āĻ°ā§āĻā§āĻ¨, āĻ¸ā§āĻĒā§āĻ°āĻŋāĻ āĻāĻŦāĻ āĻŽāĻžāĻāĻā§āĻ°ā§āĻĒā§āĻ°ā§āĻĢāĻžāĻāĻ˛ API-āĻāĻ° āĻāĻ¨ā§āĻ¯ āĻ¸āĻŽāĻ°ā§āĻĨāĻ¨ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻā§ āĻāĻ°āĻ āĻ¤āĻĨā§āĻ¯, āĻ¸ā§āĻāĻ¸āĻžāĻĨā§ āĻ
āĻ¨ā§āĻ¯āĻžāĻ¨ā§āĻ¯ āĻ
āĻ¨ā§āĻ āĻĻāĻ°āĻāĻžāĻ°ā§ āĻ¤āĻĨā§āĻ¯ āĻĒāĻžāĻāĻ¯āĻŧāĻž āĻ¯āĻžāĻŦā§
āĻāĻ¤ā§āĻ¸: www.habr.com