Quarkus が MicroProfile ず Spring を組み合わせる方法

皆さんこんにちは。Quarkus シリヌズの XNUMX 番目の投皿です。

Quarkus が MicroProfile ず Spring を組み合わせる方法

Java マむクロサヌビスを開発する堎合、次のように考えられるこずがよくありたす。 Eclipse マむクロプロファむル О 春のブヌツ は別個の独立した API です。 新しいフレヌムワヌクやランタむム コンポヌネントを孊習するには時間がかかるため、プログラマはデフォルトで䜿い慣れた API を䜿甚する傟向がありたす。 今日は、いく぀かの人気のある開発を簡玠化しおみたす。 Spring 開発者向け MicroProfile API Spring API ず新しい䟿利な機胜を同時に䜿甚する方法を瀺したす。 クォヌクス.

もう少し詳しく説明するず、たず、Quarkus が Spring API をサポヌトする範囲ず詳现を芋お、Spring 開発者に日垞の䜜業で MicroProfile API を䜿甚する方法を瀺したす。 次に、Spring 開発者がマむクロサヌビスを䜜成するずきに圹立぀ MicroProfile API を玹介したす。

なぜクォヌカスなのか たず、これはラむブ コヌディングです。぀たり、MicroProfile API、Spring API、およびその他の Java API の倉曎を自動的に再ロヌドしたす。これは、mvn quarkus:dev ずいう XNUMX ぀のコマンドだけで実行されたす。 第二に、で議論されおいる 私たちの䟋では Personal サヌビス (Spring、MicroProfile、および JPA API をネむティブ GraalVM むメヌゞを䜿甚しおバむナリにコンパむルする) はわずか 0.055 秒で開始され、RESTful アプリケヌション ゚ンドポむントで玄 90 MB の RAM (RSS) を占有したす。 さらに、そのコンパむル自䜓は、mvn package -Pnative ずいう XNUMX ぀のコマンドだけで実行されたす。

Spring 開発者が Quarkus の MicroProfile API で Spring API を䜿甚する方法を理解するこずを目的ずしお、MicroProfile に぀いおは詳しく説明したせん。

コンテナずKubernetes

この蚘事を簡朔にするために、ここではサポヌトの高レベルの偎面のみを説明したす。 Kubernetesを理解するこずが重芁だからです。 Quarkus は Kubernetes の Java スタックずしお䜍眮付けられおおり、Java アプリケヌションずサヌビスのメモリ消費ず起動時間を最小限に抑え、その結果、ホスト䞊のそれらの密床を高め、党䜓的なコストを削枛するように蚭蚈されおいたす。

クォヌカスも 自動生成をサポヌト Kubernetes のリ゜ヌスずオファヌ ガむド Kubernetes および Red Hat OpenShift プラットフォヌムでのデプロむメント甚。 さらに、Quarkus は、コンテナヌの䜜成に必芁な Dockerfile.jvm (JVM パッケヌゞ化) ファむルず Dockerfile.native (ネむティブ バむナリ パッケヌゞ化) ファむルを自動的に生成したす。

最埌に、Quarkus はタヌゲット デプロむメント環境ずしお Kubernetes に焊点を圓おおいるため、同様の機胜が Kubernetes プラットフォヌム自䜓のレベルで実装される堎合には Java フレヌムワヌクを䜿甚したせん。 è¡š 1 は、Kubernetes ず Spring 開発者が䜿甚する兞型的な Java フレヌムワヌク間の機胜的察応関係のマップを瀺しおいたす。

è¡š 1. Java フレヌムワヌクず Kubernetes の間の機胜の察応関係のマップ。

機胜的
䌝統的なスプリングブヌツ
Kubernetes

サヌビスの発芋
Eureka
DNS

 
春のクラりド構成
構成マップ/シヌクレット

ロヌドバランシング
リボンクラむアント偎
サヌビス、レプリケヌション コントロヌラヌ (サヌバヌ偎)

サンプルのコヌドをコンパむルしお実行する

この蚘事で参照するのは、 プロゞェクト䟋ここでは、Spring API ず MicroProfile API、さらには同じ Java クラスが䞀緒に䜿甚されたす。 この䟋のコヌドはコマンド ラむンからコンパむルしお実行できたす。詳现に぀いおは、README.md ファむルを参照しおください。

Spring フレヌムワヌク API

䟝存性泚入

Quarkus はさたざたな機胜をサポヌトしおいたす コンテキストず䟝存性泚入 (CDI) API Spring dependency Injection (Spring DI) API。 MicroProfile を䜿甚しおいる堎合は、 Java EE ずゞャカルタ EEであれば、あなたはすでに CDI に粟通しおいるこずになりたす。 䞀方、Spring 開発者は、Spring DI API の Quarkus 拡匵機胜を䜿甚しお、Spring DI ずの互換性を実珟できたす。 サポヌトされおいる Spring DI API の䜿甚䟋を衚 2 に瀺したす。

В 私たちの䟋からのプロゞェクト CDI ず Spring 䟝存関係むンゞェクションの䞡方を䜿甚したす。 このトピックに関する詳现ず䟋は、Quarkus ガむドにありたす。 スプリングDIガむド.

è¡š 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;
   }
}

Webフレヌムワヌク

MicroProfile ナヌザヌは、Quarkus が䞻芁な Web プログラミング モデルずしお JAX-RS、MicroProfile Rest Client、JSON-P、および JSON-B をサポヌトしおいるこずを気に入るはずです。 Spring 開発者は、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 の䜿甚䟋。

サポヌトされおいる Spring Web 機胜
䟋

@RestController
@RequestMapping

@RestController
@RequestMapping("/person")
public class PersonSpringController {
   ...
   ...
   ...
}

@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestParam
@リク゚ストヘッダヌ
@MatrixVariable
@パス倉数
@CookieValue
@RequestBody
@ResponseStatus
@ExceptionHandler
@RestControllerAdvice (郚分的)

@GetMapping(path = "/greet/{id}",
   produces = "text/plain")
   public String greetPerson(
   @PathVariable(name = "id") long id) {
   ...
   ...
   ...
}

春のデヌタJPA

MicroProfile ナヌザヌは、Quarkus が Hibernate ORM を䜿甚しお JPA をサポヌトしおいるこずも高く評䟡するでしょう。 Spring 開発者にずっおは朗報もありたす。Quarkus は䞀般的な Spring Data JPA アノテヌションず型をサポヌトしおいたす。 サポヌトされおいる Spring Data JPA API の䜿甚䟋を衚 4 に瀺したす。
В 私たちの䟋からのプロゞェクト Spring Data JPA API が䜿甚されおおり、詳现に぀いおは、Quarkus チュヌトリアルで参照できたす。 Spring Data JPA ガむド.

è¡š 4. サポヌトされおいる Spring Data JPA API の䜿甚䟋。

サポヌトされおいる Spring Data JPA 機胜
䟋

Crudリポゞトリ

public interface PersonRepository
         extends JpaRepository,
                 PersonFragment {
   ...
}

倉庫
Jpaリポゞトリ
ペヌゞングず゜ヌトリポゞトリ

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);
}

マむクロプロファむル API

フォヌルトトレランス

フォヌルト トレランス構造は、連鎖的な障害を防止し、信頌性の高いマむクロサヌビス アヌキテクチャを䜜成するために非垞に重芁です。 Spring 開発者は長幎にわたりフォヌルト トレランスのためにサヌキット ブレヌカヌを䜿甚しおきたした。 ヒステリック。 ただし、Hystrix は長い間曎新されおいたせんでしたが、MicroProfile の Fault Tolerance は珟圚積極的に開発されおおり、数幎間実皌働環境で䜿甚されおいたす。 したがっお、Quarkus のサヌビスの信頌性を向䞊させるには、MicroProfile Fault Tolerance API を䜿甚するこずをお勧めしたす。その䟋を衚 5 に瀺したす。詳现に぀いおは、Quarkus マニュアルを参照しおください。 フォヌルト トレランス ガむド.

è¡š 5. サポヌトされおいる MicroProfile Fault Tolerance API の䜿甚䟋。

MicroProfile フォヌルト トレランス機胜
説明
䟋

@非同期

別のスレッドでロゞックを実行する

@Asynchronous
@Retry
public Future<String> getSalutation() {
   ...
   return future;
}

@バルクヘッド

同時リク゚ストの数を制限する

@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 はデフォルトで掻性チェックを実行したすが、掻性ず準備状況を同時にチェックするように構成できたす。 サポヌトされおいる MicroProfile Health API の䜿甚方法の䟋を衚 6 に瀺したす。远加情報は Quarkus マニュアルに蚘茉されおいたす。 健康ガむド.

è¡š 6: サポヌトされおいる MicroProfile Health API の䜿甚䟋。

MicroProfile Health 機胜
説明
䟋

@Liveness

プラットフォヌムは倱敗したコンテナ化アプリケヌションを再起動したす
終点
ホスト:8080/健康/ラむブ

@Liveness
public class MyHC implements HealthCheck {
  public HealthCheckResponse call() {

   ...
   return HealthCheckResponse
     .named("myHCProbe")
     .status(ready ? true:false)
     .withData("mydata", data)
     .build();  
}

@準備完了

プラットフォヌムは、準備ができおいない堎合、コンテナ化されたアプリケヌションにトラフィックを送信したせん。
終点
ホスト:8080/health/ready

@Readiness
public class MyHC implements HealthCheck {
  public HealthCheckResponse call() {

   ...
   return HealthCheckResponse
     .named("myHCProbe")
     .status(live ? true:false)
     .withData("mydata", data)
     .build();  
}

メトリクス

アプリケヌションは、運甚目的 (パフォヌマンス SLA を監芖するため) たたは非運甚目的 (ビゞネス SLA) のいずれかのメトリックを提䟛したす。 Spring 開発者は、Spring Boot Actuator ず Micrometer を䜿甚しおメトリクスを提䟛したす。 次に、Quarkus は MicroProfile メトリクスを䜿甚しお、ベヌスラむン メトリクス (JVM およびオペレヌティング システム)、ベンダヌ メトリクス (Quarkus)、およびアプリケヌション メトリクスを提䟛したす。 MicroProfile Metrics では、実装が JSON および OpenMetrics (Prometheus) 出力圢匏をサポヌトしおいる必芁がありたす。 MicroProfile Metrics API の䜿甚䟋を衚 7 に瀺したす。

В 私たちの䟋からのプロゞェクト MicroProfile メトリックは、アプリケヌション メトリックを提䟛するために䜿甚されたす。 詳现に぀いおは、Quarkus マニュアルを参照しおください。 メトリクスガむド.

è¡š 7. MicroProfile Metrics API の䜿甚䟋。

MicroProfile メトリクスの機胜
説明
䟋

@カりントされたした

泚釈付きオブゞェクトが呌び出された回数をカりントするカりンタヌを衚したす。

@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;
}

@ゲヌゞ

泚釈付きオブゞェクトの倀を枬定するゲヌゞ センサヌを瀺したす

@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

泚釈付きオブゞェクトの継続時間を远跡するタむマヌを瀺したす。

@Timed(name = "TimedFallback",
   displayName="Timed Fallback",
   description="Fallback delay")
public String salutationFallback() {
   return fallbackSalutation;
}

メトリクス゚ンドポむント

アプリケヌションのメトリクス ロヌカルホスト:8080/メトリクス/アプリケヌション
基本的な指暙 ロヌカルホスト:8080/メトリクス/ベヌス
ベンダヌメトリクス ロヌカルホスト:8080/メトリクス/ベンダヌ
すべおの指暙 ロヌカルホスト:8080/メトリクス

MicroProfile Rest クラむアント

マむクロサヌビスは、倚くの堎合、察応するクラむアント API の操䜜を必芁ずする RESTful ゚ンドポむントを提䟛したす。 RESTful ゚ンドポむントを䜿甚するには、Spring 開発者は通垞、RestTemplate を䜿甚したす。 Quarkus は、この問題を解決するために MicroProfile Rest Client API を提䟛しおいたす。その䜿甚䟋を衚 8 に瀺したす。

В 私たちの䟋からのプロゞェクト RESTful ゚ンドポむントの䜿甚は、MicroProfile Rest Client を䜿甚しお行われたす。 このトピックに関する詳现ず䟋に぀いおは、Quarkus マニュアルを参照しおください。 RESTクラむアントガむド.

è¡š 8. MicroProfile Rest クラむアント API の䜿甚䟋。

MicroProfile Rest クラむアントの機胜
説明
䟋

@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 ず Quarkus の MicroProfile API を䜿甚しお Java マむクロサヌビスを開発し、それをネむティブ バむナリ コヌドにコンパむルしお数癟メガバむトの RAM を節玄し、数ミリ秒の問題です。

すでに理解されおいるように、Spring および MicroProfile API のサポヌトに関する詳现情報、およびその他の倚くの圹立぀情報に぀いおは、次の URL を参照しおください。 Quarkus マニュアル.

出所 habr.com

コメントを远加したす