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

在開發Java微服務時,人們常認為: и 是單獨且獨立的 API。 預設情況下,程式設計師傾向於使用他們已經習慣的 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
為了使本文簡單明了,我們在這裡僅介紹支援的高級方面。 ,因為理解很重要。 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 支援一系列 和 Spring 依賴注入 (Spring DI) API。 如果您正在使用 MicroProfile, ,那麼你對CDI已經非常熟悉了。 另一方面,Spring 開發人員可以使用 Quarkus Extension for Spring DI API 來實現與 Spring DI 的相容。 表 2 中給出了使用受支援的 Spring DI API 的範例。
В 同時使用 CDI 和 Spring 依賴注入。 有關此主題的更多資訊和範例,請參閱 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 作為主要 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 教程中找到,名為 .
表 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
