Quarkus 如何結合 MicroProfile 和 Spring

大家好,這是 Quarkus 系列的第三篇文章!

Quarkus 如何結合 MicroProfile 和 Spring

在開發Java微服務時,人們常認為: Eclipse 微配置文件 и 春季靴 是單獨且獨立的 API。 預設情況下,程式設計師傾向於使用他們已經習慣的 API,因為學習新框架和運行時元件需要花費大量時間。 今天我們將嘗試簡化一些流行的開發 面向 Spring 開發人員的 MicroProfile API 並向您展示如何同時使用 Spring API 和新的實用功能 誇庫斯.

更詳細地說,我們將首先了解 Quarkus 如何支援 Spring API 的範圍和細節,以向 Spring 開發人員展示如何在日常工作中使用 MicroProfile API。 然後我們將介紹 MicroProfile API,這對於 Spring 開發人員建立微服務時非常有用。

為什麼是誇庫斯? 首先,這是即時編碼,即自動重新載入 MicroProfile API、Spring API 和其他 Java API 中的任何更改,只需一個命令即可執行:mvn quarkus:dev。 其次,討論於 在我們的例子中 Person 服務(使用本機 GraalVM 映像從 Spring、MicroProfile 和 JPA API 編譯為二進位檔案)只需 0.055 秒即可啟動,並在 RESTful 應用程式端點上佔用約 90 MB RAM (RSS)。 此外,它的編譯本身只需要一個命令來執行:mvn package -Pnative。

我們不會詳細介紹 MicroProfile,只是幫助 Spring 開發人員了解如何在 Quarkus 中將 Spring API 與 MicroProfile API 結合使用。

容器和 Kubernetes

為了使本文簡單明了,我們在這裡僅介紹支援的高級方面。 Kubernetes,因為理解很重要。 Quarkus 定位為 Kubernetes 的 Java 堆疊,旨在最大限度地減少 Java 應用程式和服務的記憶體消耗和啟動時間,從而提高其在主機上的密度並降低總體成本。

誇庫斯也 支援自動生成 Kubernetes 資源和優惠 導遊 用於在 Kubernetes 和 Red Hat OpenShift 平台上部署。 此外,Quarkus 也會自動產生建立容器所需的 Dockerfile.jvm(JVM 打包)和 Dockerfile.native(原生二進位打包)檔案。

最後,透過專注於 Kubernetes 作為目標部署環境,Quarkus 在 Kubernetes 平臺本身層級實現類似功能的情況下不使用 Java 框架。 表 1 提供了 Kubernetes 與 Spring 開發人員使用的典型 Java 框架之間的功能對應關係圖。

表 1. Java 框架與 Kubernetes 之間的功能對應關係圖。

實用
傳統的 Spring Boot
Kubernetes

服務發現
尤里卡
DNS

型號
Spring雲端配置
配置映射/秘密

負載均衡
功能區(客戶端)
服務,複製控制器(伺服器端)

編譯並運行範例中的程式碼

在這篇文章中我們提到 範例專案,其中 Spring 和 MicroProfile API 甚至是相同的 Java 類別一起使用。 本範例中的程式碼可以從命令列編譯並執行,詳細資訊請參閱 README.md 檔案。

Spring 框架 API

依賴注入

Quarkus 支援一系列 上下文和依賴注入 (CDI) API 和 Spring 依賴注入 (Spring DI) API。 如果您正在使用 MicroProfile, Java EE 和 Jakarta EE,那麼你對CDI已經非常熟悉了。 另一方面,Spring 開發人員可以使用 Quarkus Extension for Spring DI API 來實現與 Spring DI 的相容。 表 2 中給出了使用受支援的 Spring DI API 的範例。

В 我們的範例中的項目 同時使用 CDI 和 Spring 依賴注入。 有關此主題的更多資訊和範例,請參閱 Quarkus 指南,名為 Spring 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;
   }
}

網頁框架

MicroProfile 使用者會喜歡 Quarkus 支援 JAX-RS、MicroProfile Rest Client、JSON-P 和 JSON-B 作為主要 Web 程式設計模型。 Spring 開發人員將對 Quarkus 最近對 Spring Web API(特別是 REST 介面)的支援感到滿意。 與 Spring DI 類似,Spring Web API 支援的主要目標是使 Spring 開發人員能夠將 Spring Web API 與 MicroProfile API 結合使用。 表 3 中提供如何使用受支援的 Spring Web API 的範例,有關此主題的更多資訊和範例可以在名為「Quarkus」的 Quarkus 教程中找到。 春季網路指南.

表 3. 使用受支援的 Spring Web API 的範例。

支援的 Spring Web 功能
Примеры

@RestController
@RequestMapping

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

@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestParam
@RequestHeader
@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 註解和類型。 表 4 中給出了使用受支援的 Spring Data JPA API 的範例。
В 我們的範例中的項目 使用 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);
}

MicroProfile API

容錯能力

容錯構造對於防止級聯故障和創建可靠的微服務架構非常重要。 Spring 開發人員多年來一直使用斷路器來實現容錯。 海斯特里克斯。 不過,Hystrix 已經很久沒有更新了,但 MicroProfile 的容錯現在正在積極開發,並且已經有幾年的生產使用了。 因此,為了提高Quarkus中服務的可靠性,建議使用MicroProfile容錯API,其範例如表5所示。更多資訊請參閱Quarkus手冊 容錯指南.

表 5. 使用受支援的 MicroProfile 容錯 API 的範例。

MicroProfile 容錯功能
描述
Примеры

@非同步

在單獨的執行緒中執行邏輯

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

@艙壁

限制同時請求的數量

@Bulkhead(5)
public void fiveConcurrent() {
   makeRemoteCall(); //...
}

@斷路器

智慧故障處理和故障恢復

@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(); //...
}

檢查服務(服務運作狀況)

Kubernetes 平台使用特殊服務監控容器的運作狀況。 為了讓底層平台能夠監控服務,Spring 開發人員通常使用自訂的 HealthIndicator 和 Spring Boot Actuator。 在 Quarkus 中,這可以使用 MicroProfile Health 來完成,它預設執行活性檢查,但可以配置為同時檢查活性和就緒性。 表 6 中提供瞭如何使用支援的 MicroProfile Health API 的範例,Quarkus 手冊中提供了更多信息 健康指南.

表 6:支援的 MicroProfile Health API 的使用範例。

MicroProfile 健康功能
描述
Примеры

@活躍度

平台重新啟動失敗的容器化應用程式
終點:
主持人: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)或非操作目的(業務 SLA)的指標。 Spring 開發人員使用 Spring Boot Actuator 和 Micrometer 提供指標。 反過來,Quarkus 使用 MicroProfile Metrics 提供基準指標(JVM 和作業系統)、供應商指標 (Quarkus) 和應用程式指標。 MicroProfile Metrics 要求實作支援 JSON 和 OpenMetrics (Prometheus) 輸出格式。 表 7 中給出了使用 MicroProfile Metrics API 的範例。

В 我們的範例中的項目 MicroProfile Metrics 用於提供應用程式指標。 有關更多信息,請參閱 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(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;
}

指標端點

應用指標 本地:8080/指標/應用程式
基本指標 本地:8080/指標/基礎
供應商指標 本地:8080/指標/供應商
所有指標 本地:8080/指標

MicroProfile Rest 用戶端

微服務通常提供需要對應客戶端 API 才能使用的 RESTful 端點。 要使用 RESTful 端點,Spring 開發人員通常使用 RestTemplate。 Quarkus 提供了 MicroProfile Rest Client API 來解決這個問題,表 8 中給出了其使用範例。

В 我們的範例中的項目 RESTful 端點的使用是透過 MicroProfile Rest Client 完成的。 有關此主題的更多資訊和範例可以在 Quarkus 手冊中找到 休息客戶指南.

表 8. 使用 MicroProfile Rest Client 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 開發人員,我們快速了解如何在Quarkus 中使用Spring API 和MicroProfile API 來開發Java 微服務,然後將它們編譯為本機二進位程式碼,從而節省數百兆的RAM 並在幾毫秒的事情。

正如您已經了解的,有關 Spring 和 MicroProfile API 支援的更多信息,以及許多其他有用的信息,可以在 誇庫斯手冊.

來源: www.habr.com

添加評論