blob: b18d34fbfb724ac46a4ea9e3cebedeec1b4fecaa [file] [log] [blame] [view]
---
type: docs
title: "POJO way to use Triple"
linkTitle: "POJO way to use Triple"
weight: 2
---
This tutorial will demonstrate how to use Dubbo Triple based on POJO by building a simple project from scratch, and upgrade to the Triple protocol while the application does not change the existing interface definition.
### Implementation principle
Through the upgrade process described above, we can easily complete the upgrade by modifying the protocol type. How does the framework help us do this?
Through the introduction of the `Triple` protocol, we know that the data type of `Triple` in Dubbo3 is a `protobuf` object, so why non-`protobuf` java objects can also be transmitted normally.
Here Dubbo3 uses an ingenious design, first judge whether the parameter type is a `protobuf` object, if not. Use a `protobuf` object to wrap `request` and `response`, which shields the complexity brought by other serialization. Declare the serialization type inside the `wrapper` object to support serialization extensions.
The IDL of `protobuf` of wrapper is as follows:
```proto
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;
}
```
For requests, use `TripleRequestWrapper` for wrapping, and for responses, use `TripleResponseWrapper` for wrapping.
> For request parameters, you can see that args is modified by `repeated`, this is because multiple parameters of the java method need to be supported. Of course, serialization can only be one. The implementation of serialization follows the spi implemented by Dubbo2
### precondition
- [JDK](https://jdk.java.net/) version >= 8
- Installed [Maven](https://maven.apache.org/)
- Installed and started [Zookeeper](https://zookeeper.apache.org/)
### Create project
1. First create an empty maven project
```
$ 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. Switch to the project directory
```
$ cd tri-pojo-demo
```
3. Set JDK version in `pom.xml`, add Dubbo dependencies and plugins
```xml
<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. Add interface definition `src/main/java/org/apache/dubbo/Greeter.java`
```java
package org.apache.dubbo;
public interface Greeter {
String sayHello(String name);
}
```
5. Add server-side interface implementation `src/main/java/org/apache/dubbo/GreeterImpl.java`
```java
package org.apache.dubbo;
public class GreeterImpl implements Greeter {
@Override
public String sayHello(String name) {
return "Hello," + name + "!";
}
}
```
6. Add server startup class `src/main/java/org/apache/dubbo/MyDubboServer.java`
```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. Add the client startup class `src/main/java/org/apache/dubbo/MyDubboClient.java`
```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. Compile the code
```
$ mvn clean install
```
9. Start the server
```
$ mvn org.codehaus.mojo:exec-maven-plugin:3.0.0:java -Dexec.mainClass="org.apache.dubbo.MyDubboServer"
Dubbo triple pojo server started
```
10. Open a new terminal and start the client
```
$ mvn org.codehaus.mojo:exec-maven-plugin:3.0.0:java -Dexec.mainClass="org.apache.dubbo.MyDubboClient"
Received reply: message: "Hello, Demo!"
```