Hej alla, här är det tredje inlägget i Quarkus-serien!
När man utvecklar Java-mikrotjänster tror man ofta att
I lite mer detalj kommer vi först att titta på omfattningen och detaljerna om hur Quarkus stöder Spring API:er för att visa Spring-utvecklare hur man använder MicroProfile API i sitt dagliga arbete. Sedan kommer vi att täcka MicroProfile API, som är användbara för Spring-utvecklare när de skapar mikrotjänster.
Varför Quarkus? För det första är detta livekodning, det vill säga automatisk omladdning av eventuella ändringar i MicroProfile API, Spring API och andra Java API:er, som utförs med bara ett kommando: mvn quarkus:dev. För det andra diskuteras i
Vi kommer inte att gå in på detaljer om MicroProfile, annat än att hjälpa Spring-utvecklare att förstå hur de kan använda Spring API:er med MicroProfile API:er i Quarkus.
Containers och Kubernetes
För att hålla den här artikeln enkel kommer vi bara att täcka de höga aspekterna av support här.
Quarkus också
Slutligen, genom att fokusera på Kubernetes som måldistributionsmiljön, använder Quarkus inte Java-ramverk i de fall där liknande funktionalitet implementeras på Kubernetes-plattformens nivå. Tabell 1 ger en karta över den funktionella överensstämmelsen mellan Kubernetes och typiska Java-ramverk som används av Spring-utvecklare.
Tabell 1. Karta över funktionell överensstämmelse mellan Java-ramverk och Kubernetes.
funktionell
Traditionell vårkänga
Kubernetes
Service upptäckt
Eureka
DNS
konfiguration
Spring Cloud Config
Konfigurera kartor/hemligheter
Lastbalansering
Band (klientsidan)
Service, Replikeringskontroller (serversidan)
Kompilera och köra koden från exemplet
I den här artikeln hänvisar vi till
Spring Framework API:er
Beroende på injektion
Quarkus stöder en rad
В
Tabell 2. Exempel på användning av Spring DI API:er som stöds.
Fjäder DI-funktioner som stöds
Примеры
Konstruktörinsprutning
public PersonSpringController(
PersonSpringRepository personRepository, // injected
PersonSpringMPService personService) { // injected
this.personRepository = personRepository;
this.personService = personService;
}
@Autowired
@RestClient
SalutationRestClient salutationRestClient;
@Value("${fallbackSalutation}")
String fallbackSalutation;
@Konfiguration
@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 ramverk
MicroProfile-användare kommer att älska att Quarkus stöder JAX-RS, MicroProfile Rest Client, JSON-P och JSON-B som den primära webbprogrammeringsmodellen. Spring-utvecklare kommer att vara nöjda med Quarkus senaste stöd för Spring Web API, särskilt REST-gränssnitt. I likhet med Spring DI är huvudmålet med Spring Web API-stöd att göra det möjligt för Spring-utvecklare att använda Spring Web API:er tillsammans med MicroProfile API:er. Exempel på hur man använder Spring Web API:er som stöds finns i Tabell 3, och mer information och exempel om detta ämne finns i Quarkus handledning som heter
Tabell 3. Exempel på användning av Spring Web API:er som stöds.
Våra webbfunktioner som stöds
Примеры
@RestController
@RequestMapping
@RestController
@RequestMapping("/person")
public class PersonSpringController {
...
...
...
}
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestParam
@RequestHeader
@MatrixVariable
@PathVariable
@CookieValue
@RequestBody
@ResponseStatus
@ExceptionHandler
@RestControllerAdvice (delvis)
@GetMapping(path = "/greet/{id}",
produces = "text/plain")
public String greetPerson(
@PathVariable(name = "id") long id) {
...
...
...
}
Vårdata JPA
MicroProfile-användare kommer också att uppskatta att Quarkus stöder JPA med Hibernate ORM. Det finns också goda nyheter för Spring-utvecklare: Quarkus stöder vanliga Spring Data JPA-anteckningar och typer. Exempel på användning av Spring Data JPA API:er som stöds ges i tabell 4.
В
Tabell 4. Exempel på användning av Spring Data JPA API:er som stöds.
Fjäderdata JPA-funktioner som stöds
Примеры
CrudRepository
public interface PersonRepository
extends JpaRepository,
PersonFragment {
...
}
förvaret
JpaRepository
PagingAndSortingRepository
public class PersonRepository extends
Repository {
Person save(Person entity);
Optional findById(Person entity);
}
Förvarsfragment
public interface PersonRepository
extends JpaRepository,
PersonFragment {
...
}
Härledda frågemetoder
public interface PersonRepository extends CrudRepository {
List findByName(String name);
Person findByNameBySsn(String ssn);
Optional
findByNameBySsnIgnoreCase(String ssn);
Boolean existsBookByYearOfBirthBetween(
Integer start, Integer end);
}
Användardefinierade frågor
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 API:er
Feltolerans
Feltoleranskonstruktioner är mycket viktiga för att förhindra kaskadfel och skapa pålitliga mikrotjänstarkitekturer. Fjäderutvecklare har använt effektbrytare för feltolerans i många år.
Tabell 5. Exempel på användning av MicroProfile Fault Tolerance API:er som stöds.
MicroProfile Feltoleransfunktioner
beskrivning
Примеры
@Asynkron
Utför logik i en separat tråd
@Asynchronous
@Retry
public Future<String> getSalutation() {
...
return future;
}
@Skott
Begränsa antalet samtidiga förfrågningar
@Bulkhead(5)
public void fiveConcurrent() {
makeRemoteCall(); //...
}
@Strömbrytare
Smart felhantering och återhämtning från fel
@CircuitBreaker(delay=500 // milliseconds
failureRatio = .75,
requestVolumeThreshold = 20,
successThreshold = 5)
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
@Retirera
Anropar alternativ logik vid fel
@Timeout(500) // milliseconds
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
public String fallback() {
return "hello";
}
Försök igen på begäran misslyckande
@Retry(maxRetries=3)
public String getSalutation() {
makeRemoteCall(); //...
}
Tidsgräns för felkontroll
@Timeout(value = 500 ) // milliseconds
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
Kontrolltjänster (Service Health)
Kubernetes-plattformar övervakar tillståndet hos containrar med hjälp av speciella tjänster. För att tillåta den underliggande plattformen att övervaka tjänster, använder Spring-utvecklare vanligtvis en anpassad HealthIndicator och Spring Boot Actuator. I Quarkus kan detta göras med hjälp av MicroProfile Health, som som standard utför en liveness-kontroll, men kan konfigureras för att samtidigt kontrollera liveness och beredskap. Exempel på hur man använder de stödda MicroProfile Health API:erna finns i Tabell 6, och ytterligare information finns i Quarkus manual
Tabell 6: Användningsexempel på MicroProfile Health API:er som stöds.
MicroProfile Health-funktioner
beskrivning
Примеры
@Livighet
Plattformen startar om misslyckade containeriserade applikationer
Slutpunkt:
värd:8080/hälsa/live
@Liveness
public class MyHC implements HealthCheck {
public HealthCheckResponse call() {
...
return HealthCheckResponse
.named("myHCProbe")
.status(ready ? true:false)
.withData("mydata", data)
.build();
}
@Beredskap
Plattformen kommer inte att skicka trafik till containeriserade applikationer om den inte är klar
Slutpunkt:
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();
}
Metrik
Applikationer tillhandahåller mätvärden för antingen operativa ändamål (för att övervaka prestanda-SLA) eller icke-operativa ändamål (affärs-SLA). Spring-utvecklare tillhandahåller mätvärden med hjälp av Spring Boot Actuator och Micrometer. Quarkus använder i sin tur MicroProfile Metrics för att tillhandahålla baslinjemått (JVM och operativsystem), leverantörsmått (Quarkus) och applikationsmått. MicroProfile Metrics kräver att implementeringen stöder JSON och OpenMetrics (Prometheus) utdataformat. Exempel på användning av MicroProfile Metrics API ges i Tabell 7.
В
Tabell 7. Exempel på användning av MicroProfile Metrics API:er.
MicroProfile Metrics funktioner
beskrivning
Примеры
@Räknat
Betecknar en räknare som räknar antalet gånger ett kommenterat objekt har anropats
@Counted(name = "fallbackCounter",
displayName = "Fallback Counter",
description = "Fallback Counter")
public String salutationFallback() {
return fallbackSalutation;
}
@ConcurrentGauge
Betecknar en mätare som räknar antalet samtidiga anrop till ett kommenterat objekt
@ConcurrentGuage(
name = "fallbackConcurrentGauge",
displayName="Fallback Concurrent",
description="Fallback Concurrent")
public String salutationFallback() {
return fallbackSalutation;
}
@Mätare
Betecknar en mätsensor som mäter värdet på ett kommenterat objekt
@Metered(name = "FallbackGauge",
displayName="Fallback Gauge",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
@Mätad
Betecknar en mätarsensor som övervakar samtalsfrekvensen för ett kommenterat objekt
@Metered(name = "MeteredFallback",
displayName="Metered Fallback",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
En anteckning som innehåller information om metadata när en begäran tas emot om att ange eller producera ett mått
@Metric
@Metered(name = "MeteredFallback",
displayName="Metered Fallback",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
Indikerar en timer som spårar varaktigheten av ett kommenterat objekt
@Timed(name = "TimedFallback",
displayName="Timed Fallback",
description="Fallback delay")
public String salutationFallback() {
return fallbackSalutation;
}
Mätvärdes slutpunkter
Applikationsstatistik
Grundläggande mått
Leverantörsmått
Alla mätvärden
MicroProfile Rest Client
Mikrotjänster tillhandahåller ofta RESTful-slutpunkter som kräver motsvarande klient-API:er att arbeta med. För att använda RESTful-slutpunkter använder Spring-utvecklare vanligtvis RestTemplate. Quarkus erbjuder MicroProfile Rest Client API:er för att lösa detta problem, exempel på användning ges i Tabell 8.
В
Tabell 8. Exempel på användning av MicroProfile Rest Client API:er.
MicroProfile Rest Client-funktioner
beskrivning
Примеры
@RegisterRestClient
Registrerar ett maskinskrivet Java-gränssnitt som en REST-klient
@RegisterRestClient
@Path("/")
public interface MyRestClient {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getSalutation();
}
@RestClient
Markerar implementeringen av en instans av ett skrivet REST-klientgränssnitt
@Autowired // or @Inject
@RestClient
MyRestClient restClient;
Åkallan
Anropar en REST-slutpunkt
System.out.println(
restClient.getSalutation());
mp-rest/url
Anger REST-slutpunkten
application.properties:
org.example.MyRestClient/mp-rest/url=
http://localhost:8081/myendpoint
Resultat av
I den här bloggen, som främst riktar sig till Spring-utvecklare, tog vi en snabb titt på hur man använder Spring API:erna med MicroProfile API:erna i Quarkus för att utveckla Java-mikrotjänster och sedan kompilera dem till inbyggd binär kod som sparar hundratals megabyte RAM och lanseras i en fråga om millisekunder.
Som du redan förstått kan mer information om support för Spring och MicroProfile API:er, samt mycket annan användbar information, hittas i
Källa: will.com