Bonjou tout moun, men twazyèm pòs nan seri Quarkus la!
Lè w ap devlope mikwosèvis Java, yo souvan kwè sa
Nan yon ti kras plis detay, nou pral premye gade nan sijè ki abòde lan ak detay sou fason Quarkus sipòte Spring API yo montre devlopè Spring yo kijan pou yo itilize API MicroProfile nan travay chak jou yo. Lè sa a, nou pral kouvri API MicroProfile yo, ki itil pou devlopè Spring lè yo kreye mikwosèvis.
Poukisa Quarkus? Premyèman, sa a se kodaj ap viv, se sa ki, rechaje otomatik nenpòt chanjman ki fèt nan API MicroProfile, Spring API ak lòt API Java, ki fèt ak yon sèl kòmand: mvn quarkus:dev. Dezyèmman, diskite nan
Nou p ap antre nan detay sou MicroProfile, lòt pase pou ede devlopè Spring yo konprann kijan yo ka itilize API Spring ak API MicroProfile nan Quarkus.
Kontenè ak Kubernetes
Pou kenbe atik sa a senp, nou pral sèlman kouvri aspè wo nivo sipò isit la.
Quarkus tou
Finalman, lè li konsantre sou Kubernetes kòm anviwònman deplwaman sib, Quarkus pa sèvi ak kad Java nan ka kote fonksyonalite menm jan an aplike nan nivo platfòm Kubernetes li menm. Tablo 1 bay yon kat jeyografik korespondans fonksyonèl ant Kubernetes ak kad Java tipik yo itilize pa devlopè Spring yo.
Tablo 1. Kat korespondans fonksyonèl ant kad Java ak Kubernetes.
Fonksyonèl
Bòt prentan tradisyonèl yo
Kubernetes
Dekouvèt sèvis
Eureka
dns
nou konte ofri sèvis
Spring Cloud Config
Config Maps/Sekrè
Balans chaj
Riban (bò kliyan)
Sèvis, Kontwolè Replikasyon (bò sèvè)
Konpile ak kouri kòd ki soti nan egzanp lan
Nan atik sa a nou refere a
Spring Framework APIs
Piki Depandans
Quarkus sipòte yon seri de
В
Tablo 2. Egzanp yo itilize Spring DI API yo.
Sipòte Spring DI Karakteristik
egzanp
Konstriksyon piki
public PersonSpringController(
PersonSpringRepository personRepository, // injected
PersonSpringMPService personService) { // injected
this.personRepository = personRepository;
this.personService = personService;
}
@Autowired
@RestClient
SalutationRestClient salutationRestClient;
@Value("${fallbackSalutation}")
String fallbackSalutation;
@Konfigurasyon
@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;
}
}
Web kad
Itilizatè MicroProfile pral renmen ke Quarkus sipòte JAX-RS, MicroProfile Rest Client, JSON-P, ak JSON-B kòm modèl prensipal pwogramasyon entènèt. Devlopè Spring yo pral kontan ak dènye sipò Quarkus pou Spring Web API, an patikilye koòdone REST. Menm jan ak Spring DI, objektif prensipal sipò Spring Web API se pou pèmèt devlopè Spring yo sèvi ak Spring Web API ansanm ak API MicroProfile. Egzanp sou fason pou itilize Spring Web API yo bay yo nan Tablo 3, epi yo ka jwenn plis enfòmasyon ak egzanp sou sijè sa a nan leson patikilye Quarkus ki rele.
Tablo 3. Egzanp yo itilize Spring Web API yo.
Sipòte karakteristik entènèt Spring
egzanp
@RestController
@RequestMapping
@RestController
@RequestMapping("/person")
public class PersonSpringController {
...
...
...
}
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestParam
@RequestHeader
@MatrixVariable
@PathVariable
@CookieValue
@RequestBody
@ResponseStatus
@ExceptionHandler
@RestControllerAdvice (pasyèl)
@GetMapping(path = "/greet/{id}",
produces = "text/plain")
public String greetPerson(
@PathVariable(name = "id") long id) {
...
...
...
}
Spring DataJPA
Itilizatè MicroProfile yo pral apresye tou ke Quarkus sipòte JPA lè l sèvi avèk Hibernate ORM la. Genyen tou yon bon nouvèl pou devlopè Spring: Quarkus sipòte komen Spring Data JPA anotasyon ak kalite. Egzanp yo sèvi ak API Spring Data JPA yo bay nan Tablo 4.
В
Tablo 4. Egzanp yo sèvi ak Spring Data JPA API yo.
Sipòte Spring Data JPA Features
egzanp
CrudRepository
public interface PersonRepository
extends JpaRepository,
PersonFragment {
...
}
Repository
JpaRepository
PagingAndSortingRepository
public class PersonRepository extends
Repository {
Person save(Person entity);
Optional findById(Person entity);
}
Fragman depo
public interface PersonRepository
extends JpaRepository,
PersonFragment {
...
}
Metòd rechèch ki sòti
public interface PersonRepository extends CrudRepository {
List findByName(String name);
Person findByNameBySsn(String ssn);
Optional
findByNameBySsnIgnoreCase(String ssn);
Boolean existsBookByYearOfBirthBetween(
Integer start, Integer end);
}
Rekèt yo defini itilizatè yo
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 APIs
Fòt tolerans
Konstriksyon tolerans fay yo trè enpòtan pou anpeche echèk kaskad ak kreye achitekti mikwosèvis serye. Devlopè prentan yo te itilize disjoncteurs pou tolerans fòt pou anpil ane.
Tablo 5. Egzanp sou itilizasyon API MicroProfile Fault Tolerance ki sipòte yo.
MicroProfile Fault Tolerance Features
Deskripsyon
egzanp
@Asynchrone
Egzekite lojik nan yon fil separe
@Asynchronous
@Retry
public Future<String> getSalutation() {
...
return future;
}
@Bulkhead
Limite kantite demann similtane
@Bulkhead(5)
public void fiveConcurrent() {
makeRemoteCall(); //...
}
@CircuitBreaker
Manyen echèk entelijan ak rekiperasyon nan echèk
@CircuitBreaker(delay=500 // milliseconds
failureRatio = .75,
requestVolumeThreshold = 20,
successThreshold = 5)
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
@Fallback
Rele lojik altènatif nan ka ta gen echèk
@Timeout(500) // milliseconds
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
public String fallback() {
return "hello";
}
Reesye sou demann echèk
@Retry(maxRetries=3)
public String getSalutation() {
makeRemoteCall(); //...
}
Delè kontwòl echèk
@Timeout(value = 500 ) // milliseconds
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
Tcheke sèvis (Service Health)
Platfòm Kubernetes kontwole sante veso yo lè l sèvi avèk sèvis espesyal. Pou pèmèt platfòm ki kache a kontwole sèvis yo, devlopè Spring yo anjeneral itilize yon HealthIndicator koutim ak Spring Boot Actuator. Nan Quarkus, sa ka fèt lè l sèvi avèk MicroProfile Health, ki pa default fè yon chèk liveness, men yo ka konfigirasyon an menm tan tcheke liveness ak preparasyon pou. Men kèk egzanp sou fason pou itilize API MicroProfile Health ki sipòte yo nan Tablo 6, epi yo bay plis enfòmasyon nan manyèl Quarkus.
Tablo 6: Egzanp itilizasyon API MicroProfile Health ki sipòte yo.
Karakteristik MicroProfile Health
Deskripsyon
egzanp
@Viv
Redemaraj platfòm la echwe aplikasyon nan veso yo
Pwen final:
host:8080/health/live
@Liveness
public class MyHC implements HealthCheck {
public HealthCheckResponse call() {
...
return HealthCheckResponse
.named("myHCProbe")
.status(ready ? true:false)
.withData("mydata", data)
.build();
}
@Preparasyon
Platfòm lan p ap voye trafik nan aplikasyon pou kontenè si li pa pare
Pwen final:
lame:8080/sante/pare
@Readiness
public class MyHC implements HealthCheck {
public HealthCheckResponse call() {
...
return HealthCheckResponse
.named("myHCProbe")
.status(live ? true:false)
.withData("mydata", data)
.build();
}
Metrik
Aplikasyon yo bay metrik swa pou rezon operasyonèl (pou kontwole pèfòmans SLA) oswa rezon ki pa operasyonèl (SLA biznis). Devlopè Spring bay mezi lè l sèvi avèk Spring Boot Actuator ak Mikwomèt. Nan vire, Quarkus itilize MicroProfile Metrics pou bay paramèt debaz (JVM ak sistèm opere), paramèt vandè (Quarkus), ak paramèt aplikasyon. MicroProfile Metrics mande pou aplikasyon an sipòte fòma pwodiksyon JSON ak OpenMetrics (Prometheus). Egzanp yo sèvi ak MicroProfile Metrics API yo bay nan Tablo 7.
В
Tablo 7. Egzanp yo sèvi ak MicroProfile Metrics API.
Karakteristik MicroProfile Metrics
Deskripsyon
egzanp
@Konte
Vle di yon kontwa ki konte kantite fwa yo te rele yon objè anote
@Counted(name = "fallbackCounter",
displayName = "Fallback Counter",
description = "Fallback Counter")
public String salutationFallback() {
return fallbackSalutation;
}
@ConcurrentGauge
Li vle di yon kalib ki konte kantite apèl konkouran pou yon objè anote
@ConcurrentGuage(
name = "fallbackConcurrentGauge",
displayName="Fallback Concurrent",
description="Fallback Concurrent")
public String salutationFallback() {
return fallbackSalutation;
}
@Kalib
Vle yon detèktè kalib ki mezire valè yon objè anote
@Metered(name = "FallbackGauge",
displayName="Fallback Gauge",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
@Metered
Vle di yon detèktè mèt ki kontwole frekans apèl yon objè anote
@Metered(name = "MeteredFallback",
displayName="Metered Fallback",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
Yon anotasyon ki gen enfòmasyon sou metadata lè yo resevwa yon demann pou antre oswa pwodui yon metrik
@Metric
@Metered(name = "MeteredFallback",
displayName="Metered Fallback",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
Endike yon revèy ki swiv dire a nan yon objè anote
@Timed(name = "TimedFallback",
displayName="Timed Fallback",
description="Fallback delay")
public String salutationFallback() {
return fallbackSalutation;
}
Metrik pwen final yo
Paramèt aplikasyon yo
Paramèt debaz yo
Paramèt vandè yo
Tout mezi
MicroProfile Rest Kliyan
Mikwosèvis yo souvan bay pwen final RESTful ki mande API kliyan korespondan pou travay avèk yo. Pou itilize pwen final RESTful, devlopè Spring anjeneral itilize RestTemplate. Quarkus ofri MicroProfile Rest Client API pou rezoud pwoblèm sa a, yo bay egzanp sou itilizasyon yo nan Tablo 8.
В
Tablo 8. Egzanp yo sèvi ak API MicroProfile Rest Client.
Karakteristik MicroProfile Rest Kliyan
Deskripsyon
egzanp
@RegisterRestClient
Anrejistre yon koòdone Java tape kòm yon kliyan REST
@RegisterRestClient
@Path("/")
public interface MyRestClient {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getSalutation();
}
@RestClient
Make aplikasyon an nan yon egzanp nan yon koòdone kliyan REST tape
@Autowired // or @Inject
@RestClient
MyRestClient restClient;
Envokasyon
Rele yon pwen final REST
System.out.println(
restClient.getSalutation());
mp-rès/url
Espesifye pwen final REST la
application.properties:
org.example.MyRestClient/mp-rest/url=
http://localhost:8081/myendpoint
Rezilta
Nan blog sa a, ki vize prensipalman devlopè Spring, nou te pran yon gade rapid sou fason pou itilize API Spring ak API MicroProfile nan Quarkus pou devlope mikwosèvis Java epi konpile yo nan kòd binè natif natal ki sove plizyè santèn megabyte RAM epi lanse nan yon kesyon de milisgond.
Kòm ou te deja konprann, ou ka jwenn plis enfòmasyon sou sipò pou API Spring ak MicroProfile, ansanm ak anpil lòt enfòmasyon itil, nan
Sous: www.habr.com