使用 Triple 的 POJO 方式
本教學將示範如何從零開始構建一個簡單的專案,使用基於 POJO 的 Dubbo Triple,並在應用程式不更改現有介面定義的情況下升級到 Triple 協定。
實作原理
透過上述升級過程,我們可以輕鬆地透過修改協定類型完成升級。框架是如何幫助我們做到這一點的呢?
透過 Triple
協定的介紹,我們知道 Dubbo3 中 Triple
的資料類型是 protobuf
物件,那麼為什麼非 protobuf
的 Java 物件也可以正常傳輸呢?
這裡 Dubbo3 使用了一個巧妙的設計,首先判斷參數類型是否為 protobuf
物件,如果不是,則使用一個 protobuf
物件來包裝 request
和 response
,這樣就屏蔽了其他序列化帶來的複雜性。在 wrapper
物件內部宣告序列化類型以支援序列化擴充。
包裝器的 protobuf
的 IDL 如下
syntax = "proto3";
package org.apache.dubbo.triple;
message TripleRequestWrapper {
//hessian4
// json
string serializeType = 1;
repeated bytes args = 2;
repeated string argTypes = 3;
}
message TripleResponseWrapper {
string serializeType = 1;
bytes data = 2;
string type = 3;
}
對於請求,使用 TripleRequestWrapper
進行包裝,對於回應,使用 TripleResponseWrapper
進行包裝。
對於請求參數,可以看到 args 被
repeated
修飾,這是因為需要支援 Java 方法的多個參數。當然,序列化只能有一個。序列化的實作遵循 Dubbo2 實作的 spi。
前提條件
建立專案
首先建立一個空的 Maven 專案
$ mvn archetype:generate \ -DgroupId=org.apache.dubbo\ -DartifactId=tri-pojo-demo\ -DarchetypeArtifactId=maven-archetype-quickstart \ -DarchetypeVersion=1.4 \ -DarchetypeGroupId=org.apache.maven.archetypes \ -Dversion=1.0-SNAPSHOT
切換到專案目錄
$ cd tri-pojo-demo
在
pom.xml
中設定 JDK 版本,新增 Dubbo 相依性和外掛<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13</version> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo</artifactId> <version>3.0.8</version> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-dependencies-zookeeper-curator5</artifactId> <type>pom</type> <version>3.0.8</version> </dependency> <dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> <version>3.19.4</version> </dependency> </dependencies>
新增介面定義
src/main/java/org/apache/dubbo/Greeter.java
package org.apache.dubbo; public interface Greeter { String sayHello(String name); }
新增伺服器端介面實作
src/main/java/org/apache/dubbo/GreeterImpl.java
package org.apache.dubbo; public class GreeterImpl implements Greeter { @Override public String sayHello(String name) { return "Hello," + name + "!"; } }
新增伺服器啟動類別
src/main/java/org/apache/dubbo/MyDubboServer.java
package org.apache.dubbo; import org.apache.dubbo.common.constants.CommonConstants; import org.apache.dubbo.config.ApplicationConfig; import org.apache.dubbo.config.ProtocolConfig; import org.apache.dubbo.config.RegistryConfig; import org.apache.dubbo.config.ServiceConfig; import org.apache.dubbo.config.bootstrap.DubboBootstrap; import java.io.IOException; public class MyDubboServer { public static void main(String[] args) throws IOException { ServiceConfig<Greeter> service = new ServiceConfig<>(); service.setInterface(Greeter.class); service.setRef(new GreeterImpl()); DubboBootstrap bootstrap = DubboBootstrap. getInstance(); bootstrap. application(new ApplicationConfig("tri-pojo-server")) .registry(new RegistryConfig("zookeeper://127.0.0.1:2181")) .protocol(new ProtocolConfig(CommonConstants.TRIPLE, 50051)) .service(service) .start(); System.out.println("Dubbo triple pojo server started"); System.in.read(); } }
新增客戶端啟動類別
src/main/java/org/apache/dubbo/MyDubboClient.java
package org.apache.dubbo; import org.apache.dubbo.common.constants.CommonConstants; import org.apache.dubbo.config.ApplicationConfig; import org.apache.dubbo.config.ReferenceConfig; import org.apache.dubbo.config.RegistryConfig; import org.apache.dubbo.config.bootstrap.DubboBootstrap; public class MyDubboClient { public static void main(String[] args) { DubboBootstrap bootstrap = DubboBootstrap. getInstance(); ReferenceConfig<Greeter> ref = new ReferenceConfig<>(); ref. setInterface(Greeter. class); ref.setProtocol(CommonConstants.TRIPLE); ref. setTimeout(3000); bootstrap. application(new ApplicationConfig("tri-pojo-client")) .registry(new RegistryConfig("zookeeper://127.0.0.1:2181")) .reference(ref) .start(); Greeter greeter = ref. get(); String reply = greeter. sayHello("pojo"); System.out.println("Received reply:" + reply); } }
編譯程式碼
$ mvn clean install
啟動伺服器
$ mvn org.codehaus.mojo:exec-maven-plugin:3.0.0:java -Dexec.mainClass="org.apache.dubbo.MyDubboServer" Dubbo triple pojo server started
開啟新的終端機並啟動客戶端
$ mvn org.codehaus.mojo:exec-maven-plugin:3.0.0:java -Dexec.mainClass="org.apache.dubbo.MyDubboClient"
Received reply: message: "Hello, Demo!"