Pojo 序列化相容性模式

本教程將從零開始構建一個簡單的專案,以演示如何使用基於 POJO 的 Dubbo Triple,並在應用程式不改變現有介面定義的情況下升級到 Triple 協議。 **在此模式下,Triple 的使用方式與 Dubbo 協議相同。**

有關具體使用案例,請參閱:[dubbo-samples-triple/pojo](https://github.com/apache/dubbo-samples/tree/master/3-extensions/protocol/dubbo-samples-triple/src/main/java /org/apache/dubbo/sample/tri/pojo);

先決條件

建立專案

  1. 首先建立一個空的 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
    
  2. 切換到專案目錄

    $ cd tri-pojo-demo
    
  3. 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>
    
  4. 添加介面定義 src/main/java/org/apache/dubbo/Greeter.java

    package org.apache.dubbo;
    
    public interface Greeter {
       String sayHello(String name);
    }
    
  5. 添加服務端介面實現 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 + "!";
       }
    }
    
  6. 添加服務端啟動類 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();
       }
    }
    
  7. 添加客戶端啟動類 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);
        }
    }
    
  8. 編譯代碼

    $ mvn clean install
    
  9. 啟動服務端

    $ mvn org.codehaus.mojo:exec-maven-plugin:3.0.0:java -Dexec.mainClass="org.apache.dubbo.MyDubboServer"
    Dubbo triple pojo server started
    
  10. 開啟一個新的終端機並啟動客戶端

    $ mvn org.codehaus.mojo:exec-maven-plugin:3.0.0:java -Dexec.mainClass="org.apache.dubbo.MyDubboClient"
    Received reply: message: "Hello, Demo!"
    

常見問題

  1. 找不到 protobuf 類

由於 Triple 協議底層需要依賴 protobuf 協議進行傳輸,因此即使定義的服務介面沒有使用 protobuf,也需要在環境中引入 protobuf 依賴。

         <dependency>
             <groupId>com.google.protobuf</groupId>
             <artifactId>protobuf-java</artifactId>
             <version>3.19.4</version>
         </dependency>

上次修改時間:2023 年 1 月 2 日:增強英文文件 (#1798) (95a9f4f6c1c)