使用 IDL 定義跨語言服務

從零開始的 Demo,示範如何基於 IDL 定義 Dubbo 服務並使用 Triple 協定

使用 IDL 定義服務具有更好的跨語言友善性。對於 Dubbo3 的新使用者,我們推薦這種方法。然而,Triple 協定並非與 IDL 強綁定。您也可以使用 Java 介面 + Pojo 來定義服務並啟用 Triple 協定。詳情請參閱 範例

更多 Triple 和 IDL 的用法,請參考 官方範例

先決條件

建立專案

  1. 首先建立一個空的 Maven 專案

    $ mvn archetype:generate \
        -DgroupId=org.apache.dubbo \
        -DartifactId=tri-stub-demo \
        -DarchetypeArtifactId=maven-archetype-quickstart \
        -DarchetypeVersion=1.4 \
        -DarchetypeGroupId=org.apache.maven.archetypes \
        -Dversion=1.0-SNAPSHOT
    
  2. 切換到專案目錄

    $ cd tri-stub-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>
        <dubbo.version>3.1.7</dubbo.version>
    </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>${dubbo.version}</version>
       </dependency>
       <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo-dependencies-zookeeper-curator5</artifactId>
        <type>pom</type>
        <version>${dubbo.version}</version>
       </dependency>
        <dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java</artifactId>
            <version>3.19.4</version>
        </dependency>
    </dependencies>
    
    <build>
        <extensions>
            <extension>
                <groupId>kr.motd.maven</groupId>
                <artifactId>os-maven-plugin</artifactId>
                <version>1.6.1</version>
            </extension>
        </extensions>
        <plugins>
            <plugin>
                <groupId>org.xolstice.maven.plugins</groupId>
                <artifactId>protobuf-maven-plugin</artifactId>
                <version>0.6.1</version>
                <configuration>
                    <protocArtifact>com.google.protobuf:protoc:3.19.4:exe:${os.detected.classifier}</protocArtifact>
                    <protocPlugins>
                        <protocPlugin>
                            <id>dubbo</id>
                            <groupId>org.apache.dubbo</groupId>
                            <artifactId>dubbo-compiler</artifactId>
                            <version>${dubbo.version}</version>
                            <mainClass>org.apache.dubbo.gen.tri.Dubbo3TripleGenerator</mainClass>
                        </protocPlugin>
                    </protocPlugins>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    
  4. 新增介面定義檔案 src/main/proto/hello.proto,Dubbo 使用 Protobuf 作為 IDL

    syntax = "proto3";
    
    option java_multiple_files = true;
    option java_package = "org.apache.dubbo.hello";
    option java_outer_classname = "HelloWorldProto";
    option objc_class_prefix = "HLW";
    
    package helloworld;
    
    message HelloRequest {
        string name = 1;
    }
    
    message HelloReply {
        string message = 1;
    }
    service Greeter{
        rpc greet(HelloRequest) returns (HelloReply);
    }
    
  5. 編譯 IDL

    $ mvn clean install
    

    編譯成功後,您可以在 target/generated-sources/protobuf/java 目錄中看到生成的程式碼檔案

    $ ls org/apache/dubbo/hello/
    DubboGreeterTriple.java HelloReply.java HelloRequest.java HelloWorldProto.java
    Greeter.java HelloReplyOrBuilder.java HelloRequestOrBuilder.java
    
  6. 新增伺服器介面實作 src/main/java/org/apache/dubbo/GreeterImpl.java

    package org.apache.dubbo;
    
    import org.apache.dubbo.hello.DubboGreeterTriple;
    import org.apache.dubbo.hello.HelloReply;
    import org.apache.dubbo.hello.HelloRequest;
    
    public class GreeterImpl extends DubboGreeterTriple. GreeterImplBase {
       @Override
       public HelloReply greet(HelloRequest request) {
          return HelloReply. newBuilder()
          .setMessage("Hello," + request.getName() + "!")
          .build();
       }
    }
    
  7. 新增伺服器啟動類別 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 org.apache.dubbo.hello.Greeter;
    
    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-stub-server"))
                   .registry(new RegistryConfig("zookeeper://127.0.0.1:2181"))
                   .protocol(new ProtocolConfig(CommonConstants.TRIPLE, 50051))
                   .service(service)
                   .start();
           System.out.println("Dubbo triple stub server started");
           System.in.read();
       }
    }
    
  8. 新增客戶端啟動類別 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;
    import org.apache.dubbo.hello.Greeter;
    import org.apache.dubbo.hello.HelloReply;
    import org.apache.dubbo.hello.HelloRequest;
    
    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.setProxy(CommonConstants.NATIVE_STUB);
          ref. setTimeout(3000);
          bootstrap. application(new ApplicationConfig("tri-stub-client"))
             .registry(new RegistryConfig("zookeeper://127.0.0.1:2181"))
             .reference(ref)
             .start();
    
          Greeter greeter = ref. get();
          HelloRequest request = HelloRequest.newBuilder().setName("Demo").build();
          HelloReply reply = greeter. greet(request);
          System.out.println("Received reply:" + reply);
        }
    }
    
  9. 編譯程式碼

    $ mvn clean install
    
  10. 啟動伺服器

$ mvn org.codehaus.mojo:exec-maven-plugin:3.0.0:java -Dexec.mainClass="org.apache.dubbo.MyDubboServer"
Dubbo triple stub server started
  1. 開啟新的終端機並啟動客戶端
$ mvn org.codehaus.mojo:exec-maven-plugin:3.0.0:java -Dexec.mainClass="org.apache.dubbo.MyDubboClient"
Received reply: message: "Hello, Demo!"

最後修改日期:2023 年 3 月 29 日:idl.md 中的拼寫錯誤 (#2465) (5db863851a0)