Բարև բոլորին, ահա «Quarcus» շարքի երրորդ գրառումը:
Java միկրոծառայությունների մշակման ժամանակ հաճախ ենթադրվում է, որ
Մի փոքր ավելի մանրամասն, մենք նախ կանդրադառնանք շրջանակներին և մանրամասներին, թե ինչպես է Quarkus-ն աջակցում Spring API-ներին՝ Spring ծրագրավորողներին ցույց տալու համար, թե ինչպես օգտագործել MicroProfile API-ն իրենց ամենօրյա աշխատանքում: Այնուհետև մենք կանդրադառնանք MicroProfile API-ներին, որոնք օգտակար են Spring ծրագրավորողների համար միկրոծառայություններ ստեղծելիս:
Ինչու Quarkus? Նախ, սա կենդանի կոդավորում է, այսինքն՝ MicroProfile API-ի, Spring API-ի և այլ Java API-ների ցանկացած փոփոխության ավտոմատ վերաբեռնում, որն իրականացվում է ընդամենը մեկ հրամանով՝ mvn quarkus:dev: Երկրորդ, դիտարկված է
Մենք չենք մանրամասնի MicroProfile-ի մասին, բացի այն, որ օգնենք Spring ծրագրավորողներին հասկանալ, թե ինչպես կարող են օգտագործել Spring API-ները MicroProfile API-ներով Quarkus-ում:
Կոնտեյներներ և Kubernetes
Այս հոդվածը պարզ պահելու համար մենք այստեղ կանդրադառնանք միայն աջակցության բարձր մակարդակի ասպեկտներին:
Քվարկուսը նույնպես
Վերջապես, կենտրոնանալով Kubernetes-ի վրա՝ որպես նպատակային տեղակայման միջավայրի, Quarkus-ը չի օգտագործում Java շրջանակներ այն դեպքերում, երբ նմանատիպ գործառույթն իրականացվում է հենց Kubernetes պլատֆորմի մակարդակով: Աղյուսակ 1-ը ներկայացնում է Kubernetes-ի և տիպիկ Java շրջանակների միջև ֆունկցիոնալ համապատասխանության քարտեզ, որն օգտագործվում է Spring ծրագրավորողների կողմից:
Աղյուսակ 1. Java շրջանակների և Kubernetes-ի միջև ֆունկցիոնալ համապատասխանության քարտեզ:
Ֆունկցիոնալ
Ավանդական գարնանային կոշիկներ
Կուբերնետես
Ծառայության բացահայտում
Eureka
DNS
Տեսիլ
Spring Cloud Config
Կազմաձևեք քարտեզներ/գաղտնիքներ
Բեռի հավասարակշռում
Ժապավեն (հաճախորդի կողմից)
Սպասարկում, կրկնօրինակման վերահսկիչ (սերվերի կողմ)
Կոդերի հավաքում և գործարկում օրինակից
Այս հոդվածում մենք անդրադառնում ենք
Spring Framework API-ներ
Կախվածության ներարկում
Quarkus-ն աջակցում է մի շարք
В
Աղյուսակ 2. Աջակցվող Spring DI API-ների օգտագործման օրինակներ:
Աջակցված Spring 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;
}
}
Վեբ շրջանակ
MicroProfile-ի օգտատերերին դուր կգա, որ Quarkus-ն աջակցում է JAX-RS-ին, MicroProfile Rest Client-ին, JSON-P-ին և JSON-B-ին՝ որպես վեբ ծրագրավորման հիմնական մոդել: Գարնանային ծրագրավորողները գոհ կլինեն Quarkus-ի վերջին աջակցությամբ Spring Web API-ին, մասնավորապես REST ինտերֆեյսներին: Spring DI-ի նման, Spring Web API-ի աջակցության հիմնական նպատակն է Spring ծրագրավորողներին հնարավորություն տալ օգտագործել Spring Web API-ները MicroProfile API-ների հետ համատեղ: Աջակցվող Spring Web API-ներն օգտագործելու օրինակները տրված են Աղյուսակ 3-ում, և այս թեմայի վերաբերյալ լրացուցիչ տեղեկություններ և օրինակներ կարելի է գտնել Quarkus ձեռնարկում, որը կոչվում է.
Աղյուսակ 3. Աջակցվող Spring Web API-ների օգտագործման օրինակներ:
Աջակցված Գարնանային վեբ հնարավորություններ
օրինակները
@RestController
@RequestMapping
@RestController
@RequestMapping("/person")
public class PersonSpringController {
...
...
...
}
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestParam
@RequestHeader
@MatrixVariable
@PathVariable
@CookieValue
@RequestBody
@ResponseStatus
@ExceptionHandler
@RestControllerAdvice (մասնակի)
@GetMapping(path = "/greet/{id}",
produces = "text/plain")
public String greetPerson(
@PathVariable(name = "id") long id) {
...
...
...
}
Spring DataJPA
MicroProfile-ի օգտատերերը նույնպես կգնահատեն, որ Quarkus-ն աջակցում է JPA-ին՝ օգտագործելով Hibernate ORM: Գարուն մշակողների համար կա նաև լավ նորություն. Quarkus-ն աջակցում է Spring Data JPA-ի սովորական ծանոթագրություններին և տեսակներին: Աջակցվող Spring Data JPA API-ների օգտագործման օրինակներ տրված են Աղյուսակ 4-ում:
В
Աղյուսակ 4. Աջակցվող Spring Data JPA API-ների օգտագործման օրինակներ:
Աջակցված Spring Data JPA-ի առանձնահատկությունները
օրինակները
CrudRepository
public interface PersonRepository
extends JpaRepository,
PersonFragment {
...
}
Պահոց
JpaRepository
PagingAndSortingRepository
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);
}
MicroProfile API-ներ
Սխալների հանդուրժողականություն
Սխալների հանդուրժողականության կառուցվածքները շատ կարևոր են կասկադային խափանումները կանխելու և հուսալի միկրոսերվիսային ճարտարապետություն ստեղծելու համար: Գարնանային ծրագրավորողները երկար տարիներ օգտագործում են անջատիչներ սխալների հանդուրժողականության համար:
Աղյուսակ 5. Աջակցվող MicroProfile Fault Tolerance API-ների օգտագործման օրինակներ:
MicroProfile Fault Tolerance-ի առանձնահատկությունները
Նկարագրություն
օրինակները
@Ասինխրոն
Տրամաբանության իրականացում առանձին թեմայում
@Asynchronous
@Retry
public Future<String> getSalutation() {
...
return future;
}
@Bulkhead
Սահմանափակեք միաժամանակյա հարցումների քանակը
@Bulkhead(5)
public void fiveConcurrent() {
makeRemoteCall(); //...
}
@CircuitBreaker
Խելացի խափանումների կառավարում և ձախողումներից վերականգնում
@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(); //...
}
Ստուգման ծառայություններ (Service Health)
Kubernetes հարթակները վերահսկում են բեռնարկղերի առողջությունը՝ օգտագործելով հատուկ ծառայություններ։ Որպեսզի հիմքում ընկած հարթակը վերահսկի ծառայությունները, Spring ծրագրավորողները սովորաբար օգտագործում են հատուկ HealthIndicator և Spring Boot Actuator: Quarkus-ում դա կարելի է անել MicroProfile Health-ի միջոցով, որը լռելյայն կատարում է աշխուժության ստուգում, բայց կարող է կազմաձևվել այնպես, որ միաժամանակ ստուգի աշխուժությունն ու պատրաստակամությունը: Աջակցվող MicroProfile Health API-ների օգտագործման օրինակները տրված են Աղյուսակ 6-ում, իսկ լրացուցիչ տեղեկություններ՝ Quarkus ձեռնարկում:
Աղյուսակ 6. աջակցվող MicroProfile Health API-ների օգտագործման օրինակներ:
MicroProfile Առողջության առանձնահատկությունները
Նկարագրություն
օրինակները
@Liveness
Պլատֆորմը վերագործարկում է անհաջող բեռնարկղային հավելվածները
Վերջնական կետ.
հյուրընկալող: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();
}
Չափումներ
Հավելվածները տրամադրում են չափումներ կամ գործառնական նպատակներով (արդյունավետության SLA-ները վերահսկելու համար) կամ ոչ գործառնական նպատակներով (բիզնես SLAs): Գարնանային մշակողները տրամադրում են չափումներ՝ օգտագործելով Spring Boot Actuator-ը և Micrometer-ը: Իր հերթին, Quarkus-ը օգտագործում է MicroProfile Metrics-ը` տրամադրելու բազային չափումներ (JVM և օպերացիոն համակարգ), վաճառողի չափումներ (Quarkus) և կիրառական չափումներ: MicroProfile Metrics-ը պահանջում է, որ իրականացումն աջակցի JSON և OpenMetrics (Prometheus) ելքային ձևաչափերին: MicroProfile Metrics API-ի օգտագործման օրինակները տրված են Աղյուսակ 7-ում:
В
Աղյուսակ 7. MicroProfile Metrics API-ների օգտագործման օրինակներ:
MicroProfile Metrics-ի առանձնահատկությունները
Նկարագրություն
օրինակները
@հաշված
Նշանակում է հաշվիչ, որը հաշվում է, թե քանի անգամ է կանչվել ծանոթագրված օբյեկտը
@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;
}
@Gauge
Նշանակում է չափիչ սենսոր, որը չափում է ծանոթագրված օբյեկտի արժեքը
@Metered(name = "FallbackGauge",
displayName="Fallback Gauge",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
@Metered
Նշում է հաշվիչի սենսորը, որը վերահսկում է ծանոթագրված օբյեկտի զանգի հաճախականությունը
@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;
}
Չափման վերջնակետեր
Դիմումի չափումներ
Հիմնական չափումներ
Վաճառողի չափումներ
Բոլոր չափումները
MicroProfile Rest հաճախորդ
Միկրոծառայությունները հաճախ տրամադրում են RESTful վերջնակետեր, որոնց հետ աշխատելու համար պահանջվում են համապատասխան հաճախորդի API-ներ: RESTful վերջնակետեր օգտագործելու համար Spring ծրագրավորողները սովորաբար օգտագործում են RestTemplate: Այս խնդիրը լուծելու համար Quarkus-ն առաջարկում է MicroProfile Rest Client API-ներ, որոնց օգտագործման օրինակները տրված են Աղյուսակ 8-ում:
В
Աղյուսակ 8. MicroProfile Rest Client API-ների օգտագործման օրինակներ:
MicroProfile Rest Client-ի առանձնահատկությունները
Նկարագրություն
օրինակները
@RegisterRestClient
Գրանցում է մուտքագրված Java ինտերֆեյսը որպես REST հաճախորդ
@RegisterRestClient
@Path("/")
public interface MyRestClient {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getSalutation();
}
@RestClient
Նշում է մուտքագրված 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
Արդյունքները
Այս բլոգում, որն ուղղված է հիմնականում Spring ծրագրավորողներին, մենք արագ նայեցինք, թե ինչպես կարելի է օգտագործել Spring API-ները MicroProfile API-ներով Quarkus-ում Java միկրոծառայությունների մշակման համար, այնուհետև դրանք հավաքագրել բնիկ երկուական կոդի մեջ, որը խնայում է հարյուրավոր մեգաբայթ RAM և գործարկում: միլիվայրկյանների հարց:
Ինչպես արդեն հասկացաք, Spring և MicroProfile API-ների աջակցության մասին լրացուցիչ տեղեկություններ, ինչպես նաև շատ այլ օգտակար տեղեկություններ կարելի է գտնել այստեղ.
Source: www.habr.com