Moni nonse, nayi positi yachitatu pamndandanda wa Quarkus!
Mukapanga ma microservices a Java, nthawi zambiri amakhulupirira kuti
Mwatsatanetsatane pang'ono, tiwona kaye kukula ndi tsatanetsatane wa momwe Quarkus imathandizira ma Spring APIs kuwonetsa opanga ma Spring momwe angagwiritsire ntchito MicroProfile API pantchito yawo yatsiku ndi tsiku. Kenako tidzaphimba ma MicroProfile API, omwe ndi othandiza kwa opanga ma Spring popanga ma microservices.
Chifukwa chiyani Quarks? Choyamba, uku ndiko kukopera kwamoyo, ndiko kuti, kutsitsanso zosintha zilizonse mu MicroProfile API, Spring API ndi ma API ena a Java, omwe amachitidwa ndi lamulo limodzi lokha: mvn quarkus:dev. Kachiwiri, kukambitsirana mu
Sitingafotokoze mwatsatanetsatane za MicroProfile, kupatulapo kuthandiza opanga ma Spring kumvetsetsa momwe angagwiritsire ntchito ma Spring API okhala ndi MicroProfile APIs mu Quarkus.
Containers ndi Kubernetes
Kuti nkhaniyi ikhale yosavuta, tingofotokoza za chithandizo chapamwamba apa.
Quarks komanso
Pomaliza, poyang'ana Kubernetes monga malo omwe akugwiritsidwa ntchito, Quarkus sagwiritsa ntchito machitidwe a Java pazochitika zomwe ntchito zofanana zikugwiritsidwa ntchito pamlingo wa Kubernetes pawokha. Gulu 1 limapereka mapu a makalata ogwira ntchito pakati pa Kubernetes ndi machitidwe a Java omwe amagwiritsidwa ntchito ndi opanga Spring.
Table 1. Mapu a makalata ogwira ntchito pakati pa Java frameworks ndi Kubernetes.
Yogwira
Traditional Spring Boot
Kubernetes
Kupeza ntchito
Eureka
DNS
kasinthidwe
Spring Cloud Config
Konzani Mamapu/Zinsinsi
Katundu woyeserera
Riboni (mbali ya kasitomala)
Service, Replication Controller (mbali ya seva)
Kulemba ndi kuyendetsa ma code kuchokera ku chitsanzo
Mβnkhani ino tikunena za
Spring Framework APIs
Jekeseni Wodalira
Quarks imathandizira osiyanasiyana
Π
Table 2. Zitsanzo zogwiritsira ntchito ma Spring DI APIs.
Zothandizira za Spring DI
zitsanzo
Jekeseni Wopanga
public PersonSpringController(
PersonSpringRepository personRepository, // injected
PersonSpringMPService personService) { // injected
this.personRepository = personRepository;
this.personService = personService;
}
Kubaya M'munda
@Autowired
@RestClient
SalutationRestClient salutationRestClient;
@Value("${fallbackSalutation}")
String fallbackSalutation;
@Configuration
@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 chimango
Ogwiritsa ntchito a MicroProfile angakonde kuti Quarkus imathandizira JAX-RS, MicroProfile Rest Client, JSON-P, ndi JSON-B ngati njira yoyamba yopangira mapulogalamu a pa intaneti. Opanga masika adzakondwera ndi chithandizo chaposachedwa cha Quarkus pa Spring Web API, makamaka malo a REST. Mofanana ndi Spring DI, cholinga chachikulu cha chithandizo cha Spring Web API ndikulola opanga ma Spring kuti agwiritse ntchito ma Spring Web APIs molumikizana ndi MicroProfile APIs. Zitsanzo za momwe mungagwiritsire ntchito ma API a Spring Web aperekedwa mu Table 3, ndipo zambiri ndi zitsanzo pamutuwu zitha kupezeka mu phunziro la Quarkus lotchedwa.
Table 3. Zitsanzo zogwiritsira ntchito ma API a Spring Web.
Zothandizira za Spring Web
zitsanzo
@RestController
@RequestMapping
@RestController
@RequestMapping("/person")
public class PersonSpringController {
...
...
...
}
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestParam
@RequestHeader
@MatrixVariable
@PathVariable
@CookieValue
@RequestBody
@ResponseStatus
@ExceptionHandler
@RestControllerAdvice (pang'ono)
@GetMapping(path = "/greet/{id}",
produces = "text/plain")
public String greetPerson(
@PathVariable(name = "id") long id) {
...
...
...
}
Spring DataJPA
Ogwiritsa ntchito a MicroProfile adzayamikiranso kuti Quarkus imathandizira JPA pogwiritsa ntchito Hibernate ORM. Palinso nkhani yabwino kwa opanga ma Spring: Quarkus imathandizira zolemba ndi mitundu wamba ya Spring Data JPA. Zitsanzo zogwiritsa ntchito ma API a Spring Data JPA aperekedwa mu Gulu 4.
Π
Gulu 4. Zitsanzo zogwiritsira ntchito ma API a Spring Data JPA.
Zothandizira za Spring Data JPA
zitsanzo
CrudRepository
public interface PersonRepository
extends JpaRepository,
PersonFragment {
...
}
Repository
JpaRepository
PagingAndSortingRepository
public class PersonRepository extends
Repository {
Person save(Person entity);
Optional findById(Person entity);
}
Zidutswa Zosungirako
public interface PersonRepository
extends JpaRepository,
PersonFragment {
...
}
Njira zowunikira zofufuzidwa
public interface PersonRepository extends CrudRepository {
List findByName(String name);
Person findByNameBySsn(String ssn);
Optional
findByNameBySsnIgnoreCase(String ssn);
Boolean existsBookByYearOfBirthBetween(
Integer start, Integer end);
}
Mafunso ofotokozedwa ndi ogwiritsa ntchito
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
Kulekerera zolakwa
Zopanga zolekerera zolakwika ndizofunikira kwambiri popewa kulephera kwapang'onopang'ono ndikupanga zomangamanga zodalirika za microservice. Opanga masika akhala akugwiritsa ntchito ophwanya madera kuti athe kulekerera zolakwika kwa zaka zambiri.
Table 5. Zitsanzo zogwiritsira ntchito MicroProfile Fault Tolerance APIs.
MicroProfile Fault Tolerance Features
mafotokozedwe
zitsanzo
@Asynchronous
Kuchita logic mu ulusi wina
@Asynchronous
@Retry
public Future<String> getSalutation() {
...
return future;
}
@Bulkhead
Chepetsani kuchuluka kwa zopempha nthawi imodzi
@Bulkhead(5)
public void fiveConcurrent() {
makeRemoteCall(); //...
}
@CircuitBreaker
Smart kulephera kusamalira ndi kuchira ku zolephera
@CircuitBreaker(delay=500 // milliseconds
failureRatio = .75,
requestVolumeThreshold = 20,
successThreshold = 5)
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
@Bwererani m'mbuyo
Kuyitana njira zina zomveka ngati zalephera
@Timeout(500) // milliseconds
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
public String fallback() {
return "hello";
}
Yeseraninso zikalephera
@Retry(maxRetries=3)
public String getSalutation() {
makeRemoteCall(); //...
}
Kulephera kudziletsa kutha
@Timeout(value = 500 ) // milliseconds
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
Ma checking services (Service Health)
Mapulatifomu a Kubernetes amayang'anira thanzi la zotengera pogwiritsa ntchito ntchito zapadera. Kuti alole nsanja yoyambira kuyang'anira ntchito, opanga ma Spring nthawi zambiri amagwiritsa ntchito HealthIndicator ndi Spring Boot Actuator. Ku Quarkus, izi zitha kuchitika pogwiritsa ntchito MicroProfile Health, yomwe mosakhazikika imayang'ana moyo, koma ikhoza kukonzedwa kuti iwonetsere nthawi yomweyo kukhala ndi moyo komanso kukonzekera. Zitsanzo zamomwe mungagwiritsire ntchito ma MicroProfile Health APIs aperekedwa mu Table 6, ndipo zambiri zaperekedwa mu buku la Quarkus.
Gulu 6: Zitsanzo zogwiritsidwa ntchito za MicroProfile Health APIs zothandizidwa.
Zinthu za MicroProfile Health
mafotokozedwe
zitsanzo
@Umoyo
Pulatifomu imayambiranso ntchito zomwe zidalephera
Pomaliza:
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();
}
@Kukonzeka
Pulatifomu sidzatumiza magalimoto kumapulogalamu omwe ali ndi zida ngati sizinakonzekere
Pomaliza:
host:8080/health/ready
@Readiness
public class MyHC implements HealthCheck {
public HealthCheckResponse call() {
...
return HealthCheckResponse
.named("myHCProbe")
.status(live ? true:false)
.withData("mydata", data)
.build();
}
Metrics
Mapulogalamu amapereka ma metric pazifukwa zogwirira ntchito (kuyang'anira ma SLA) kapena zolinga zosagwira ntchito (ma SLA abizinesi). Opanga masika amapereka ma metrics pogwiritsa ntchito Spring Boot Actuator ndi Micrometer. Komanso, Quarkus amagwiritsa ntchito MicroProfile Metrics kuti apereke ma metric oyambira (JVM ndi makina ogwiritsira ntchito), ma metrics ogulitsa (Quarkus), ndi ma metrics ogwiritsira ntchito. MicroProfile Metrics imafuna kuti kukhazikitsa kumathandizira mawonekedwe a JSON ndi OpenMetrics (Prometheus). Zitsanzo zogwiritsira ntchito MicroProfile Metrics API zaperekedwa mu Table 7.
Π
Table 7. Zitsanzo zogwiritsira ntchito MicroProfile Metrics APIs.
Mawonekedwe a MicroProfile Metrics
mafotokozedwe
zitsanzo
@Kuwerengera
Imatanthawuza kauntala yomwe imawerengera nthawi yomwe chinthu chofotokozera chaitanidwa
@Counted(name = "fallbackCounter",
displayName = "Fallback Counter",
description = "Fallback Counter")
public String salutationFallback() {
return fallbackSalutation;
}
@ConcurrentGauge
Imatanthawuza geji yomwe imawerengera kuchuluka kwa kuyimba nthawi imodzi kupita ku chinthu chofotokozera
@ConcurrentGuage(
name = "fallbackConcurrentGauge",
displayName="Fallback Concurrent",
description="Fallback Concurrent")
public String salutationFallback() {
return fallbackSalutation;
}
@Gauge
Kutanthauza kachipangizo kamene kamayesa kufunikira kwa chinthu cholembedwa
@Metered(name = "FallbackGauge",
displayName="Fallback Gauge",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
@Metered
Imayimira sensa ya mita yomwe imayang'anira kuchuluka kwa kuyimba kwa chinthu chofotokozera
@Metered(name = "MeteredFallback",
displayName="Metered Fallback",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
Mawu ofotokozera omwe ali ndi zambiri za metadata pempho likalandiridwa kuti mulowe kapena kupanga metric
@Metric
@Metered(name = "MeteredFallback",
displayName="Metered Fallback",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
Imawonetsa chowerengera chomwe chimatsata nthawi ya chinthu chofotokozera
@Timed(name = "TimedFallback",
displayName="Timed Fallback",
description="Fallback delay")
public String salutationFallback() {
return fallbackSalutation;
}
Mapeto a Metrics
Ma metrics ogwiritsira ntchito
Basic metrics
Ma metrics ogulitsa
Ma metrics onse
MicroProfile Rest Client
Ma Microservices nthawi zambiri amapereka zomaliza za RESTful zomwe zimafuna ma API a kasitomala kuti azigwira nawo ntchito. Kuti mugwiritse ntchito zomaliza za RESTful, opanga ma Spring nthawi zambiri amagwiritsa ntchito RestTemplate. Quarkus amapereka MicroProfile Rest Client APIs kuti athetse vutoli, zitsanzo za ntchito zomwe zaperekedwa mu Table 8.
Π
Table 8. Zitsanzo zogwiritsira ntchito MicroProfile Rest Client APIs.
Makasitomala Opumula a MicroProfile
mafotokozedwe
zitsanzo
@RegisterRestClient
Imalembetsa mawonekedwe a Java otayidwa ngati kasitomala wa REST
@RegisterRestClient
@Path("/")
public interface MyRestClient {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getSalutation();
}
@RestClient
Imawonetsa kukhazikitsidwa kwa chitsanzo cha mawonekedwe a kasitomala a REST
@Autowired // or @Inject
@RestClient
MyRestClient restClient;
Kupempha
Imayitanira kumapeto kwa REST
System.out.println(
restClient.getSalutation());
mp-mpumulo/url
Imatchula mathero a REST
application.properties:
org.example.MyRestClient/mp-rest/url=
http://localhost:8081/myendpoint
Zotsatira
Mu blog iyi, yomwe imayang'ana makamaka opanga ma Spring, tidayang'ana mwachangu momwe tingagwiritsire ntchito ma API a Spring ndi MicroProfile APIs ku Quarkus kupanga ma microservices a Java ndikuzipanga kukhala ma code a binary omwe amasunga mazana a megabytes a RAM ndikuyambitsa nkhani ya milliseconds.
Monga momwe mumamvera kale, zambiri zokhudzana ndi chithandizo cha Spring ndi MicroProfile APIs, komanso zambiri zothandiza, zitha kupezeka
Source: www.habr.com