Aloha kākou, eia ke kolu o ka pou ma ka moʻo Quarkus!
Ke hoʻomohala nei i nā microservices Java, manaʻo pinepine ʻia kēlā
Ma kahi kikoʻī hou aku, e nānā mua mākou i ka laulā a me nā kikoʻī o ke kākoʻo ʻana o Quarkus i nā API Spring e hōʻike i nā mea hoʻomohala Spring pehea e hoʻohana ai i ka MicroProfile API i kā lākou hana i kēlā me kēia lā. A laila e uhi mākou i nā API MicroProfile, he mea pono no nā mea hoʻomohala Spring i ka wā e hana ai i nā microservices.
No ke aha ʻo Quarkus? ʻO ka mea mua, he coding ola kēia, ʻo ia hoʻi, ka hoʻouka hou ʻana i nā loli i ka MicroProfile API, Spring API a me nā API Java ʻē aʻe, i hana ʻia me hoʻokahi kauoha: mvn quarkus:dev. ʻO ka lua, kūkākūkā ʻia ma
ʻAʻole mākou e hele i nā kikoʻī e pili ana i MicroProfile, ʻokoʻa ke kōkua i nā mea hoʻomohala Spring e hoʻomaopopo pehea e hiki ai iā lākou ke hoʻohana i nā API Spring me nā API MicroProfile ma Quarkus.
ʻO nā pahu a me nā Kubernetes
No ka maʻalahi o kēia ʻatikala, e uhi wale mākou i nā ʻāpana kiʻekiʻe o ke kākoʻo ma aneʻi.
ʻO Quarkus kekahi
ʻO ka mea hope loa, ma ka nānā ʻana i nā Kubernetes ma ke ʻano he wahi hoʻolālā hoʻolālā, ʻaʻole hoʻohana ʻo Quarkus i nā frameworks Java i nā hihia i hoʻokō ʻia nā hana like ma ka pae o ka platform Kubernetes ponoʻī. Hāʻawi ka Papa 1 i ka palapala ʻāina o ka leka hana ma waena o Kubernetes a me nā ʻōnaehana Java maʻamau i hoʻohana ʻia e nā mea hoʻomohala Spring.
Papa 1. Palapala 'āina o ka pilina hana ma waena o Java frameworks a me Kubernetes.
Hanaʻia
Kāleʻa Puna Kuʻuna
Kubernetes
ʻIke lawelawe
Eureka
pākuʻina kau
hoʻonohonohoʻia
Puna Cloud Config
Hoʻopili i nā palapala ʻāina/huna
Load kaulike
Lipine (ʻaoʻao mea kūʻai aku)
ʻO ka lawelawe, ka mea hoʻoponopono hou (ʻaoʻao kikowaena)
Hoʻopili a holo i ke code mai ka laʻana
Ma keia 'atikala mākou e pili ana
Nā API no ka punawai
Pākuʻi dependence
Kākoʻo ʻo Quarkus i ka laulā o
В
Papa 2. Nā laʻana o ka hoʻohana ʻana i nā API Spring DI i kākoʻo ʻia.
Kākoʻo ʻia nā hiʻohiʻona puna DI
examples
ʻO ka mea hana hoʻoheheʻe
public PersonSpringController(
PersonSpringRepository personRepository, // injected
PersonSpringMPService personService) { // injected
this.personRepository = personRepository;
this.personService = personService;
}
@Autowired
@RestClient
SalutationRestClient salutationRestClient;
@Value("${fallbackSalutation}")
String fallbackSalutation;
@Hoʻonohonoho
@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;
}
}
Pūnaehana pūnaewele
E makemake nā mea hoʻohana MicroProfile e kākoʻo ʻo Quarkus iā JAX-RS, MicroProfile Rest Client, JSON-P, a me JSON-B ma ke ʻano he kumu hoʻohālike hoʻolālā pūnaewele. E hauʻoli nā mea hoʻomohala puna i ke kākoʻo hou o Quarkus no ka Spring Web API, ʻo ia hoʻi nā pilina REST. E like me Spring DI, ʻo ka pahuhopu nui o ke kākoʻo Spring Web API ʻo ia ka mea e hiki ai i nā mea hoʻomohala Spring ke hoʻohana i nā API Pūnaewele Puna i hui pū me nā API MicroProfile. Hāʻawi ʻia nā hiʻohiʻona o ka hoʻohana ʻana i nā Spring Web API i kākoʻo ʻia ma ka Papa 3, a ʻike ʻia nā ʻike hou aʻe a me nā hiʻohiʻona e pili ana i kēia kumuhana ma ke kumu aʻo Quarkus i kapa ʻia.
Papa 3. Nā laʻana o ka hoʻohana ʻana i nā API Pūnaewele Puna i kākoʻo ʻia.
Kākoʻo ʻia nā hiʻohiʻona pūnaewele puna
examples
@RestController
@NoiMapa
@RestController
@RequestMapping("/person")
public class PersonSpringController {
...
...
...
}
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@NoiParam
@NoiHeader
@MatrixVariable
@PathVariable
@CookieValue
@NoiKe kino
@PaneStatus
@ExceptionHandler
@RestControllerAdvice (ʻāpana)
@GetMapping(path = "/greet/{id}",
produces = "text/plain")
public String greetPerson(
@PathVariable(name = "id") long id) {
...
...
...
}
ʻIkepili Puna JPA
E mahalo pū nā mea hoʻohana MicroProfile e kākoʻo ʻo Quarkus iā JPA me ka hoʻohana ʻana i ka Hibernate ORM. Aia kekahi nūhou maikaʻi no nā mea hoʻomohala Spring: Kākoʻo ʻo Quarkus i nā hōʻike a me nā ʻano ʻano Spring Data JPA. Hāʻawi ʻia nā laʻana o ka hoʻohana ʻana i nā API JPA ʻIke Puna i kākoʻo ʻia ma ka Papa 4.
В
Papa 4. Nā laʻana o ka hoʻohana ʻana i nā API JPA ʻIkepili puna i kākoʻo ʻia.
Kākoʻo ʻia nā hiʻohiʻona ʻike puna JPA
examples
CrudRepository
public interface PersonRepository
extends JpaRepository,
PersonFragment {
...
}
Ka Hale Paʻi
JpaRepository
ʻO ka Hale Hōʻikeʻike Aʻo
public class PersonRepository extends
Repository {
Person save(Person entity);
Optional findById(Person entity);
}
Nā ʻāpana waihona
public interface PersonRepository
extends JpaRepository,
PersonFragment {
...
}
Nā ʻano nīnau i loaʻa
public interface PersonRepository extends CrudRepository {
List findByName(String name);
Person findByNameBySsn(String ssn);
Optional
findByNameBySsnIgnoreCase(String ssn);
Boolean existsBookByYearOfBirthBetween(
Integer start, Integer end);
}
Nā nīnau i wehewehe ʻia e ka mea hoʻohana
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);
}
Nā API MicroProfile
Hoʻomanawanui hewa
He mea koʻikoʻi nā hana hoʻomanawanui hewa no ka pale ʻana i nā hemahema cascading a me ka hana ʻana i nā hale hana microservice hilinaʻi. Ua hoʻohana nā mea hoʻomohala puna i nā mea hoʻokaʻawale kaapuni no ka hoʻomanawanui hewa no nā makahiki he nui.
Papa 5. Nā hiʻohiʻona o ka hoʻohana ʻana i nā API Hoʻomanawanui hewa MicroProfile i kākoʻo ʻia.
Nā hiʻohiʻona hoʻomanawanui hewa MicroProfile
hōʻikeʻano
examples
@Asynchronous
Ka hoʻokō ʻana i ka loiloi ma kahi pae ʻokoʻa
@Asynchronous
@Retry
public Future<String> getSalutation() {
...
return future;
}
@Pulkhead
E kaupalena i ka helu o nā noi like
@Bulkhead(5)
public void fiveConcurrent() {
makeRemoteCall(); //...
}
@CircuitBreaker
ʻO ka hoʻoponopono maikaʻi ʻole a me ka hoʻihoʻi ʻana mai nā hemahema
@CircuitBreaker(delay=500 // milliseconds
failureRatio = .75,
requestVolumeThreshold = 20,
successThreshold = 5)
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
@Fallback
Ke kāhea ʻana i nā loina ʻē aʻe inā ʻaʻole hiki
@Timeout(500) // milliseconds
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
public String fallback() {
return "hello";
}
E ho'āʻo hou i ka hāʻule ʻana o ke noi
@Retry(maxRetries=3)
public String getSalutation() {
makeRemoteCall(); //...
}
Ka pau ʻana o ka mana hoʻopono
@Timeout(value = 500 ) // milliseconds
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
Nā lawelawe nānā (Service Health)
Nānā nā kahua ʻo Kubernetes i ke olakino o nā ipu me ka hoʻohana ʻana i nā lawelawe kūikawā. No ka ʻae ʻana i ka paepae lalo e nānā i nā lawelawe, hoʻohana maʻamau nā mea hoʻomohala Spring i kahi HealthIndicator maʻamau a me Spring Boot Actuator. Ma Quarkus, hiki ke hana i kēia me ka MicroProfile Health, ka mea maʻamau e hana i ka nānā ola, akā hiki ke hoʻonohonoho ʻia e nānā i ka ola a me ka mākaukau. Hāʻawi ʻia nā hiʻohiʻona o ka hoʻohana ʻana i nā MicroProfile Health API i kākoʻo ʻia ma ka Papa 6, a hāʻawi ʻia nā ʻike hou aʻe ma ka manual Quarkus
Papa 6: Nā hiʻohiʻona hoʻohana o nā API Health MicroProfile i kākoʻo ʻia.
Nā hiʻohiʻona olakino MicroProfile
hōʻikeʻano
examples
@ola
ʻAʻole hiki ke hoʻomaka hou ka paepae i nā noi pahu pahu
Hopena:
mea hoʻokipa: 8080 / olakino / ola
@Liveness
public class MyHC implements HealthCheck {
public HealthCheckResponse call() {
...
return HealthCheckResponse
.named("myHCProbe")
.status(ready ? true:false)
.withData("mydata", data)
.build();
}
@Makaukau
ʻAʻole e hoʻouna ka paepae i nā kaʻa i nā noi containerized inā ʻaʻole mākaukau
Hopena:
mea hoʻokipa: 8080 / olakino / mākaukau
@Readiness
public class MyHC implements HealthCheck {
public HealthCheckResponse call() {
...
return HealthCheckResponse
.named("myHCProbe")
.status(live ? true:false)
.withData("mydata", data)
.build();
}
Nā ana
Hāʻawi nā noi i nā ana no nā kumu hana (e nānā i nā SLA hana) a i ʻole nā mea hana ʻole (nā SLA ʻoihana). Hāʻawi nā mea hoʻomohala puna i nā metric me ka hoʻohana ʻana i ka Spring Boot Actuator a me ka Micrometer. Ma ka huli ʻana, hoʻohana ʻo Quarkus i nā MicroProfile Metrics e hāʻawi i nā metric baseline (JVM a me ka ʻōnaehana hana), nā mea kūʻai aku (Quarkus), a me nā metric noi. Pono ʻo MicroProfile Metrics e kākoʻo ka hoʻokō ʻana i nā puka puka JSON a me OpenMetrics (Prometheus). Hāʻawi ʻia nā laʻana o ka hoʻohana ʻana i ka MicroProfile Metrics API ma ka Papa 7.
В
Papa 7. Nā laʻana o ka hoʻohana ʻana i nā MicroProfile Metrics API.
Nā hiʻohiʻona MicroProfile Metrics
hōʻikeʻano
examples
@Heluia
Hōʻike i kahi counter counter e helu ana i ka helu o nā manawa i kāhea ʻia ai kahi mea i hōʻike ʻia
@Counted(name = "fallbackCounter",
displayName = "Fallback Counter",
description = "Fallback Counter")
public String salutationFallback() {
return fallbackSalutation;
}
@ConcurrentGauge
Hōʻike i kahi ana e helu ana i ka helu o nā kelepona like ʻole i kahi mea i hōʻike ʻia
@ConcurrentGuage(
name = "fallbackConcurrentGauge",
displayName="Fallback Concurrent",
description="Fallback Concurrent")
public String salutationFallback() {
return fallbackSalutation;
}
@Ana
Hōʻike i kahi mea ʻike ana e ana i ka waiwai o kahi mea i hōʻike ʻia
@Metered(name = "FallbackGauge",
displayName="Fallback Gauge",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
@Metered
Hōʻike i kahi mea ʻike mika e nānā ana i ka alapine kelepona o kahi mea i hōʻike ʻia
@Metered(name = "MeteredFallback",
displayName="Metered Fallback",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
He hōʻike i loaʻa ka ʻike e pili ana i ka metadata ke loaʻa kahi noi e komo a hana i kahi metric
@Metric
@Metered(name = "MeteredFallback",
displayName="Metered Fallback",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
Hōʻike i kahi manawa e hahai ana i ka lōʻihi o kahi mea i hōʻike ʻia
@Timed(name = "TimedFallback",
displayName="Timed Fallback",
description="Fallback delay")
public String salutationFallback() {
return fallbackSalutation;
}
Nā Kiʻi Hoʻopau
Nā ana noi
Anana kumu
Mea kūʻai aku
Nā ana a pau
Mea kūʻai hoʻomaha MicroProfile
Hāʻawi pinepine nā Microservices i nā wahi hopena RESTful e koi ana i nā API mea kūʻai aku e hana pū me. No ka hoʻohana ʻana i nā wahi hopena RESTful, hoʻohana maʻamau nā mea hoʻomohala Spring i RestTemplate. Hāʻawi ʻo Quarkus i nā API Client Rest MicroProfile e hoʻoponopono i kēia pilikia, nā hiʻohiʻona o ka hoʻohana ʻana i hāʻawi ʻia ma ka Papa 8.
В
Papa 8. Nā hiʻohiʻona o ka hoʻohana ʻana i nā API Client Rest MicroProfile.
Nā hiʻohiʻona o nā mea kūʻai aku hoʻomaha MicroProfile
hōʻikeʻano
examples
@RegisterRestClient
Hoʻopaʻa inoa i kahi kikowaena Java i kākau ʻia ma ke ʻano he mea kūʻai aku REST
@RegisterRestClient
@Path("/")
public interface MyRestClient {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getSalutation();
}
@RestClient
Hōʻailona i ka hoʻokō ʻana i kahi laʻana o kahi kikowaena mea kūʻai aku REST
@Autowired // or @Inject
@RestClient
MyRestClient restClient;
Kū'ē
Kāhea i kahi hoʻopau REST
System.out.println(
restClient.getSalutation());
mp-hoomaha/url
Hōʻike i ke kiko hope REST
application.properties:
org.example.MyRestClient/mp-rest/url=
http://localhost:8081/myendpoint
Nā hopena
Ma kēia blog, i kuhikuhi nui ʻia i nā mea hoʻomohala Spring, ua nānā wikiwiki mākou i ka hoʻohana ʻana i nā API Spring me nā MicroProfile API ma Quarkus e hoʻomohala i nā microservices Java a laila hōʻuluʻulu iā lākou i loko o nā code binary maoli e mālama ai i nā haneli megabytes o RAM a hoʻomaka i loko. he mau milliseconds.
E like me kāu i hoʻomaopopo mua ai, hiki ke loaʻa ka ʻike hou aku e pili ana i ke kākoʻo no ka Spring and MicroProfile API, a me ka nui o nā ʻike pono ʻē aʻe.
Source: www.habr.com