Dubbo 3.3.0-beta 版本正式發佈

近日,Apache Dubbo 發佈了 3.3 分支大版本 3.3.0-beta.1,相較於 3.2 系列版本,3.3.0-beta 引入了一些重量級的功能升級,按照社區規劃,3.3 也將是 Dubbo3 非常重要的一個里程碑大版本,在 3.3.0 首個正式版本之後 Dubbo3 將正式進入長期穩定維護態,即標誌着 Dubbo3 作爲面向雲原生時代的下一代微服務框架將具備規劃的所有核心功能。

讓我們先快速看一下 3.3.0-beta.1 版本爲我們帶來了哪些核心能力升級吧:

  • 全新升級的 Triple 協議,Triple 協議可同時運行在 HTTP1/2 之上,與 gRPC 保持 100% 兼容的同時,支持 cURL 和瀏覽器直接訪問。
  • 新發布一系列 Spring Boot Starter 組件,包括 Zookeeper, Nacos, Sentinel 等,大幅降低開發過程中的依賴管理負擔。
  • Rest 風格的編程註解支持(涵蓋 Spring MVC、JAX-RS),藉助 Dubbo 的多協議發佈機制,可以輕鬆的將 RPC 服務發佈爲標準的 HTTP 端點,簡化前端接入成本。
  • Dubbo AOT(GraalVM Native Image)正式發佈,特定場景下啓動速度提升 10 倍,內存等資源消耗降低 4 倍。
  • 升級 JDK 21 支持,增加 Project Loom 協程支持。
  • 可觀測性進一步提升,進一步提升 metrics 統計指標,簡化 tracing 等使用。

接下來,我們將對其中的一些重點功能進行更深入的講解。

Spring Boot Starters

3.3.0-beta.1 版本發佈的 Starter 組件,可以大幅簡化 Spring Boot 用戶的應用開發,以 Zookeeper 註冊中心爲例,新版本的開發只需要增加以下一個依賴即可。可以通過 https://start.dubbo.apache.org 生成項目快速體驗。

<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-zookeeper-spring-boot-starter</artifactId>
</dependency>

同樣的,還有 dubbo-curator5-zookeeper-spring-boot-starter、 dubbo-nacos-spring-boot-starter、 dubbo-sentinel-spring-boot-starter、 dubbo-seata-spring-boot-starter 、 dubbo-observability-spring-boot-starter、 dubbo-tracing-otel-zipkin-spring-boot-starter 等。

Dubbo AOT 靜態化(GraalVM Native Image)

Dubbo AOT 是 Dubbo 3.3.0-beta 版本發佈的靜態化方案支持,它基於 GraalVM Native Image 實現,旨在大幅提升 Dubbo 應用的啓動與運行速度。可以通過 https://start.dubbo.apache.org 快速生成包含 GraalVM 支持的項目,快速體驗,以下是測試環境的一些運行效果總結。

Native 的可視性文件比 Jar 包方式的啓動耗時降低了 12 倍+,在客戶端應用,它的啓動耗時降低了 11 倍+。所以在剛剛提到的 Serverless 場景上,它能提供一個非常好的啓動速度。在擴容的時候能夠達到秒級,甚至達到毫秒級。

通過靜態化執行文件執行後,比都爲 Jar 包的情況,第一次調用的耗時降低 6 倍。這第一次調用代表的是預熱的時長,以及第一次需要解析的類,包括資源的情況等等。這讓我們在 Serverless 場景下能夠瞬間達到性能峯值。

在 Dubbo 應用的基礎上,它的內存損耗也降低大概 3.5 倍。Native 靜態化執行文件可以做到 60M 的內存佔比,在客戶端它的內存損耗也大概降低了 4 倍。

Triple 協議升級

Triple 協議是 Dubbo3 設計的基於 HTTP 的 RPC 通信協議規範,它完全兼容 gRPC 協議,支持 Request-Response、Streaming 流式等通信模型,可同時運行在 HTTP/1 和 HTTP/2 之上。

你可以使用 cURL 等標準 HTTP 工具直接訪問發佈的 Triple 服務,大幅降低測試與前端接入成本。

curl \
 --header 'Content-Type: application/json' \
 --data '{"sentence": "Hello World"}' \
 http://localhost:8080/apache.dubbo.demo.example.v1.ExampleService/Say

Dubbo 框架提供了 Triple 協議的多種語言實現,它們可以幫助你構建瀏覽器、gRPC 兼容的 HTTP API 接口。Dubbo 框架同時支持 Protobuf-first 和 Interface-first 編程模式,即不綁定 IDL 的服務定義與開發模式,比如在 Dubbo Java 中,你可以選擇使用 Java Interface 和 Pojo 類定義 Dubbo 服務,並將其發佈爲基於 Triple 協議通信的微服務。

以下是 Triple 協議的多語言實現佈局,目前已經支持了瀏覽器端的 Dubbo-web,後端的 Java、Go、Node.js、Rust 等,未來會提供 Mobile 端以及更多後端語言實現。

Rest 協議升級

基於 Dubbo 的多協議發佈能力,rest 風格的 http 服務發佈可以有非常多的應用場景,它可以讓你在增加少量註解代碼的情況下(當前支持 Spring MVC、JAX-RS 兩套註解模式),將之前的 RPC 服務發佈爲標準的 rest 風格 HTTP 服務。這在很多場景將會非常有用,比如以下是一個 Dubbo 與 Spring Cloud 體系互通的用例。

我們要實現以下互通目標,讓左邊的 Spring 應用能夠調用到右側的 Dubbo 應用。我們可以利用 Dubbo 的多協議發佈機制,爲一些服務配置多協議(tcp & http)發佈,讓這個 Dubbo 應用同時服務 Dubbo 微服務體系和 Spring Cloud 微服務體系。

爲了實現這個效果,我們只需要在配置中增加多協議配置即可:

dubbo:
  protocols:
    - id: rest
      name: rest
      port: 8090
    - id: dubbo
      name: dubbo
      port: 20880

同時,@DubboService 服務註解中也配置爲多協議發佈。

@DubboService(protocol="rest,dubbo")
public class UserServiceImpl implements UserService {}

這樣,我們就成功的將 UserService 服務以 dubbo 和 rest 兩種協議發佈了出去(多端口多協議的方式),dubbo 協議爲 Dubbo 體系服務,rest 協議爲 Spring Cloud 體系服務。

爲了發佈標準的 rest 風格服務,記得在接口上增加註解,在這裏我們使用 Spring MVC 註解。

@RestController
@RequestMapping("/users")
public interface UserService {
    @GetMapping(value = "/list")
    List<User> getUsers();
}

可觀測性(Metrics & Tracing)

首先,是大幅提升了 Metrics、Tracing 的易用性,對於 Spring Boot 用戶而言,只需要添加一個依賴即可。

開啓 Metrics:

<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-observability-spring-boot-starter</artifactId>
</dependency>

開啓 Tracing:

<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-tracing-otel-zipkin-spring-boot-starter</artifactId>
</dependency>

其次,在監控指標的豐富度上進一步提升。

JDK 21 與協程

3.3.0-beta 版本可支持平滑升級到 JDK 21 版本,同時,增加了 Project Loom 協程支持,只需要配置 setThreadPool(virtual) 即可實現協程模型開啓。

具體實現上,是我們在新版本增加了以下 Threadpool SPI 實現:

virtual=org.apache.dubbo.common.threadpool.support.loom.VirtualThreadPool

 

/**
 * Creates a thread pool that use virtual thread
 *
 * @see Executors#newVirtualThreadPerTaskExecutor()
 */
public class VirtualThreadPool implements ThreadPool {
    @Override
    public Executor getExecutor(URL url) {
        String name = url.getParameter(THREAD_NAME_KEY, (String) url.getAttribute(THREAD_NAME_KEY, DEFAULT_THREAD_NAME));
        return Executors.newThreadPerTaskExecutor(
            Thread.ofVirtual()
                .name(name, 1)
                .factory());
    }
}

Roadmap

對於 Dubbo3 而言,當前社區維護有 3.1、3.2、3.3 三個大的版本,其中 3.2 是當前推薦的穩定生產版本,3.3 正處於 beta 階段,在接下來幾個月將取代 3.2 成爲最新穩定版本。

截止 3.3.0-beta.1 版本,整個 Dubbo3 規劃的核心功能均已開發完成。從這個版本開始,Dubbo3 將進入長期穩定維護階段,這意味着我們將不會再爲任何的 Dubbo3 新版本引入新的功能規劃,社區將專注在已有功能的迭代與穩定性保證上。基於這樣的基調,我們制定未來半年的社區 Roadmap:https://github.com/apache/dubbo/issues/13065

關於面向未來的新功能,我們將在 Dubbo4 中持續探索,歡迎持續關注社區進展。

作者:Apache Dubbo社區

原文鏈接

本文爲阿里雲原創內容,未經允許不得轉載。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章