大家好,這是 Quarkus 系列的第三篇文章!
在開發Java微服務時,人們常認為:
更詳細地說,我們將首先了解 Quarkus 如何支援 Spring API 的範圍和細節,以向 Spring 開發人員展示如何在日常工作中使用 MicroProfile API。 然後我們將介紹 MicroProfile API,這對於 Spring 開發人員建立微服務時非常有用。
為什麼是誇庫斯? 首先,這是即時編碼,即自動重新載入 MicroProfile API、Spring API 和其他 Java API 中的任何更改,只需一個命令即可執行:mvn quarkus:dev。 其次,討論於
我們不會詳細介紹 MicroProfile,只是幫助 Spring 開發人員了解如何在 Quarkus 中將 Spring API 與 MicroProfile API 結合使用。
容器和 Kubernetes
為了使本文簡單明了,我們在這裡僅介紹支援的高級方面。
誇庫斯也
最後,透過專注於 Kubernetes 作為目標部署環境,Quarkus 在 Kubernetes 平臺本身層級實現類似功能的情況下不使用 Java 框架。 表 1 提供了 Kubernetes 與 Spring 開發人員使用的典型 Java 框架之間的功能對應關係圖。
表 1. Java 框架與 Kubernetes 之間的功能對應關係圖。
實用
傳統的 Spring Boot
Kubernetes
服務發現
尤里卡
DNS
型號
Spring雲端配置
配置映射/秘密
負載均衡
功能區(客戶端)
服務,複製控制器(伺服器端)
編譯並運行範例中的程式碼
在這篇文章中我們提到
Spring 框架 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 作為主要 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 的範例。
В
表 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 開發人員多年來一直使用斷路器來實現容錯。
表 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 的範例。
В
表 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;
}
指標端點
應用指標
基本指標
供應商指標
所有指標
MicroProfile Rest 用戶端
微服務通常提供需要對應客戶端 API 才能使用的 RESTful 端點。 要使用 RESTful 端點,Spring 開發人員通常使用 RestTemplate。 Quarkus 提供了 MicroProfile Rest Client API 來解決這個問題,表 8 中給出了其使用範例。
В
表 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