This is an automated email from the ASF dual-hosted git repository.
xuetaoli pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/dubbo-go-samples.git
The following commit(s) were added to refs/heads/main by this push:
new 86817cc1 feat(generic): add generic call sample for both Dubbo and
Triple protocols (#1016)
86817cc1 is described below
commit 86817cc17450487e753f968050a02257fc624f31
Author: Tsukikage <[email protected]>
AuthorDate: Thu Mar 12 16:49:55 2026 +0800
feat(generic): add generic call sample for both Dubbo and Triple protocols
(#1016)
This PR refactors and enhances the generic call sample to demonstrate
both Dubbo protocol and Triple protocol generic calls between Go and Java.
| Protocol | Port | Group | Description |
|----------|-------|----------|-----------------------------------|
| Dubbo | 20000 | `dubbo` | Traditional Dubbo binary protocol |
| Triple | 50052 | `triple` | HTTP/2 based Triple protocol |
Changes:
- Remove ZooKeeper dependency in favor of direct URL connection
- Remove redundant nested directories (java-server/java-server ->
java-server)
- Add run.sh scripts for java-client and java-server
- Add Triple protocol Java client (ApiTripleConsumer)
- Enable generic CI test in start_integrate_test.sh
- Use new NewGenericService API from filter/generic (requires dubbo-go#3154)
Signed-off-by: TsukiKage <[email protected]>
---
generic/README.md | 132 +++++++------
generic/README_zh.md | 130 ++++++------
generic/build/test.sh | 92 ---------
generic/go-client/cmd/client.go | 195 ++++++++++--------
generic/go-server/cmd/server.go | 101 +++-------
generic/go-server/pkg/init.go | 1 -
generic/go-server/pkg/user_provider.go | 35 ++++
generic/go-server/pkg/user_response.go | 26 ---
.../java-client/dependency-reduced-pom.xml | 194 ------------------
.../java/org/apache/dubbo/samples/ApiConsumer.java | 75 -------
.../java/org/apache/dubbo/samples/Response.java | 92 ---------
.../src/main/resources/dubbo.properties | 8 -
generic/java-client/{java-client => }/pom.xml | 2 +-
generic/java-client/run.sh | 3 +
.../apache/dubbo/samples/ApiTripleConsumer.java | 218 +++++++++++++++++++++
.../main/java/org/apache/dubbo/samples/Gender.java | 0
.../main/java/org/apache/dubbo/samples/User.java | 0
.../org/apache/dubbo/samples/UserProvider.java | 2 +-
.../src/main/resources/dubbo.properties | 4 +
.../src/main/resources/log4j.properties | 0
.../java-server/dependency-reduced-pom.xml | 178 -----------------
.../java/org/apache/dubbo/samples/ApiProvider.java | 41 ----
.../java/org/apache/dubbo/samples/Response.java | 92 ---------
.../src/main/resources/dubbo.properties | 8 -
generic/java-server/{java-server => }/pom.xml | 4 +-
generic/java-server/run.sh | 3 +
.../java/org/apache/dubbo/samples/ApiProvider.java | 66 +++++++
.../main/java/org/apache/dubbo/samples/Gender.java | 0
.../main/java/org/apache/dubbo/samples/User.java | 0
.../org/apache/dubbo/samples/UserProvider.java | 2 +-
.../org/apache/dubbo/samples/UserProviderImpl.java | 2 +-
.../src/main/resources/dubbo.properties | 7 +
.../src/main/resources/log4j.properties | 0
start_integrate_test.sh | 2 +-
34 files changed, 620 insertions(+), 1095 deletions(-)
diff --git a/generic/README.md b/generic/README.md
index d923c2ed..38fb1ff2 100644
--- a/generic/README.md
+++ b/generic/README.md
@@ -1,88 +1,98 @@
-# Generic Call
+# Generic Call Sample
-Generic call is a mechanism that ensures information is correctly transmitted
when the client does not have interface information. It generalizes POJOs into
generic formats (such as dictionaries, strings), and is generally used in
scenarios like integration testing and gateways.
+[English](README.md) | [中文](README_zh.md)
-This example demonstrates generic calls between Dubbo-Go and Dubbo Java
services, showing how services can interoperate regardless of the language
they're implemented in.
+This sample demonstrates how to use generic invocation with both Dubbo and
Triple protocols for Go-Java interoperability. Generic invocation allows
calling remote services without generating stubs or having the service
interface locally.
-## Directory Structure
+## Layout
-- go-server: Dubbo-Go server example
-- go-client: Dubbo-Go client example with generic calls
-- java-client: Dubbo Java client example
-- java-server: Dubbo Java server example
-- build: For integration test
-
-Dubbo Java examples can be used to test interoperability with Dubbo-Go. You
can start java server with go client, or go server with java client for testing.
+```
+generic/
+├── go-server/ # Go provider (Triple protocol, port 50052)
+├── go-client/ # Go consumer with generic invocation (direct connection)
+├── java-server/ # Java provider (Triple protocol, port 50052)
+└── java-client/ # Java consumer with generic invocation
+```
## Prerequisites
-- Docker and Docker Compose for running ZooKeeper registry
-- Go 1.23+ for Dubbo-Go examples
-- Java 8+ and Maven for Dubbo Java examples
+Start ZooKeeper (required by the server for service registration):
-## Registry
+```bash
+docker run -d --name zookeeper -p 2181:2181 zookeeper:3.8
+```
-This example uses ZooKeeper as the registry. The following command starts
ZooKeeper from docker, so you need to ensure that docker and docker-compose are
installed first.
+## Run the Go Server
-```shell
-# Start ZooKeeper registry
-docker run -d --name zookeeper -p 2181:2181 zookeeper:3.4.14
+```bash
+cd generic/go-server/cmd
+go run .
```
-## Running the Examples
+The server exposes the Triple protocol on port `50052`, registers to
ZooKeeper, and serves `UserProvider` with version `1.0.0` and group `triple`.
-### Dubbo-Go Server
+## Run the Go Client
-Using Dubbo-Go as provider, you can start it from command line tool:
-
-```shell
-cd go-server/cmd && go run server.go
+```bash
+cd generic/go-client/cmd
+go run .
```
-### Dubbo-Go Client (Generic Call)
+The client uses direct URL connection (`client.WithURL`) to connect to the
server and performs generic calls via `cli.NewGenericService`. It tests both
Dubbo protocol (port 20000) and Triple protocol (port 50052).
-Using Dubbo-Go as consumer with generic calls:
+## Run the Java Server
-```shell
-cd go-client/cmd && go run client.go
-```
+Build and run from the java-server directory:
-### Dubbo Java Server
+```bash
+cd generic/java-server
+mvn clean compile exec:java
-Dexec.mainClass="org.apache.dubbo.samples.ApiProvider"
+```
-Using Dubbo Java as provider:
+## Run the Java Client
-```shell
-cd java-server/java-server
-mvn clean package
-sh run.sh
+```bash
+cd generic/java-client
+mvn clean compile exec:java
-Dexec.mainClass="org.apache.dubbo.samples.ApiTripleConsumer"
```
-### Dubbo Java Client
+The client uses `reference.setGeneric("true")` to perform generic calls.
+
+## Tested Methods
-Using Dubbo Java as consumer:
+| Method | Parameters | Return |
+|--------|------------|--------|
+| GetUser1 | String | User |
+| GetUser2 | String, String | User |
+| GetUser3 | int | User |
+| GetUser4 | int, String | User |
+| GetOneUser | - | User |
+| GetUsers | String[] | User[] |
+| GetUsersMap | String[] | Map<String, User> |
+| QueryUser | User | User |
+| QueryUsers | User[] | User[] |
+| QueryAll | - | Map<String, User> |
+
+## Expected Output
+
+Server log:
+
+```
+Generic Go server started on port 50052
+Registry: zookeeper://127.0.0.1:2181
+```
+
+Client log:
-```shell
-cd java-client/java-client
-mvn clean package
-sh run.sh
```
+[Triple] GetUser1(userId string) res: {id=A003, name=Joe, age=48, ...}
+[Triple] GetUser2(userId string, name string) res: {id=A003, name=lily,
age=48, ...}
+...
+All generic call tests completed
+```
+
+## Notes
-## Testing Interoperability
-
-This example is designed to test interoperability between Dubbo-Go and Dubbo
Java:
-
-1. Start the ZooKeeper registry
-2. Start either go-server or java-server
-3. Run either go-client or java-client to test the generic calls
-
-The client will make various generic calls to the server, including:
-- GetUser1(String userId)
-- GetUser2(String userId, String name)
-- GetUser3(int userCode)
-- GetUser4(int userCode, String name)
-- GetOneUser()
-- GetUsers(String[] userIdList)
-- GetUsersMap(String[] userIdList)
-- QueryUser(User user)
-- QueryUsers(List<User> userObjectList)
-- QueryAll()
\ No newline at end of file
+- Do NOT start Go Server and Java Server at the same time. Both listen on port
50052.
+- The Go server requires ZooKeeper for service registration.
+- The Go client uses direct URL connection and does not require ZooKeeper.
diff --git a/generic/README_zh.md b/generic/README_zh.md
index 5ed811c5..af18a2c4 100644
--- a/generic/README_zh.md
+++ b/generic/README_zh.md
@@ -1,88 +1,98 @@
-# 泛化调用
+# 泛化调用示例
-泛化调用是在客户端没有接口信息时保证信息被正确传递的手段,即把 POJO 泛化为通用格式(如字典、字符串),一般被用于集成测试、网关等场景。
+[English](README.md) | [中文](README_zh.md)
-本示例演示了 Dubbo-Go 和 Dubbo Java 服务之间的泛化调用,展示了不同语言实现的服务如何互操作。
+本示例演示了如何使用 Dubbo 和 Triple 协议进行泛化调用,实现 Go 和 Java
服务之间的互操作。泛化调用允许在没有服务接口定义的情况下调用远程服务。
## 目录结构
-- go-server: Dubbo-Go 服务端示例
-- go-client: Dubbo-Go 客户端示例(泛化调用)
-- java-client: Dubbo Java 客户端示例
-- java-server: Dubbo Java 服务端示例
-- build: 集成测试需要的脚本
+```
+generic/
+├── go-server/ # Go 服务端(Triple 协议,端口 50052)
+├── go-client/ # Go 客户端,泛化调用(直连模式)
+├── java-server/ # Java 服务端(Triple 协议,端口 50052)
+└── java-client/ # Java 客户端,泛化调用
+```
-Dubbo Java 示例可以用来测试与 Dubbo-Go 的互操作性。您可以启动 java 服务端配合 go 客户端,或者启动 go 服务端配合 java
客户端进行测试。
+## 前置条件
-## 环境准备
+启动 ZooKeeper(服务端注册服务时需要):
-- Docker 和 Docker Compose 用于运行 ZooKeeper 注册中心
-- Go 1.23+ 用于 Dubbo-Go 示例
-- Java 8+ 和 Maven 用于 Dubbo Java 示例
+```bash
+docker run -d --name zookeeper -p 2181:2181 zookeeper:3.8
+```
-## 注册中心
+## 启动 Go 服务端
-本示例使用 ZooKeeper 作为注册中心。以下命令通过 docker 启动 ZooKeeper,因此需要确保已安装 docker 和
docker-compose。
+```bash
+cd generic/go-server/cmd
+go run .
+```
-```shell
-# 启动 ZooKeeper 注册中心
-docker run -d --name zookeeper -p 2181:2181 zookeeper:3.4.14
+服务端通过 Triple 协议监听 `50052` 端口,注册到 ZooKeeper,提供 `UserProvider`
服务(version=1.0.0,group=triple)。
+
+## 启动 Go 客户端
+
+```bash
+cd generic/go-client/cmd
+go run .
```
-## 运行示例
+客户端使用直连模式(`client.WithURL`)连接服务端,通过 `cli.NewGenericService` 进行泛化调用。同时测试 Dubbo
协议(端口 20000)和 Triple 协议(端口 50052)。
-### Dubbo-Go 服务端
+## 启动 Java 服务端
-使用 Dubbo-Go 作为服务提供者,可以通过命令行工具启动:
+在 java-server 目录下构建并运行:
-```shell
-cd go-server/cmd && go run server.go
+```bash
+cd generic/java-server
+mvn clean compile exec:java
-Dexec.mainClass="org.apache.dubbo.samples.ApiProvider"
```
-### Dubbo-Go 客户端(泛化调用)
-
-使用 Dubbo-Go 作为服务消费者进行泛化调用:
+## 启动 Java 客户端
-```shell
-cd go-client/cmd && go run client.go
+```bash
+cd generic/java-client
+mvn clean compile exec:java
-Dexec.mainClass="org.apache.dubbo.samples.ApiTripleConsumer"
```
-### Dubbo Java 服务端
+客户端使用 `reference.setGeneric("true")` 进行泛化调用。
-使用 Dubbo Java 作为服务提供者:
+## 测试方法
-```shell
-cd java-server/java-server
-mvn clean package
-sh run.sh
-```
+| 方法 | 参数 | 返回值 |
+|------|------|--------|
+| GetUser1 | String | User |
+| GetUser2 | String, String | User |
+| GetUser3 | int | User |
+| GetUser4 | int, String | User |
+| GetOneUser | - | User |
+| GetUsers | String[] | User[] |
+| GetUsersMap | String[] | Map<String, User> |
+| QueryUser | User | User |
+| QueryUsers | User[] | User[] |
+| QueryAll | - | Map<String, User> |
-### Dubbo Java 客户端
+## 预期输出
-使用 Dubbo Java 作为服务消费者:
+服务端日志:
-```shell
-cd java-client/java-client
-mvn clean package
-sh run.sh
```
+Generic Go server started on port 50052
+Registry: zookeeper://127.0.0.1:2181
+```
+
+客户端日志:
+
+```
+[Triple] GetUser1(userId string) res: {id=A003, name=Joe, age=48, ...}
+[Triple] GetUser2(userId string, name string) res: {id=A003, name=lily,
age=48, ...}
+...
+All generic call tests completed
+```
+
+## 注意事项
-## 测试互操作性
-
-本示例旨在测试 Dubbo-Go 和 Dubbo Java 之间的互操作性:
-
-1. 启动 ZooKeeper 注册中心
-2. 启动 go-server 或 java-server 之一
-3. 运行 go-client 或 java-client 之一来测试泛化调用
-
-客户端将向服务端发起多种泛化调用,包括:
-- GetUser1(String userId)
-- GetUser2(String userId, String name)
-- GetUser3(int userCode)
-- GetUser4(int userCode, String name)
-- GetOneUser()
-- GetUsers(String[] userIdList)
-- GetUsersMap(String[] userIdList)
-- QueryUser(User user)
-- QueryUsers(List<User> userObjectList)
-- QueryAll()
\ No newline at end of file
+- 不要同时启动 Go 服务端和 Java 服务端,它们都监听 50052 端口。
+- Go 服务端需要 ZooKeeper 进行服务注册。
+- Go 客户端使用直连模式,不依赖 ZooKeeper。
diff --git a/generic/build/test.sh b/generic/build/test.sh
deleted file mode 100755
index def376ad..00000000
--- a/generic/build/test.sh
+++ /dev/null
@@ -1,92 +0,0 @@
-#!/bin/bash
-
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-echo "Running custom generic test script"
-
-# Check if project directory is provided
-if [ -z "$1" ]; then
- echo "Project directory not provided"
- exit 1
-fi
-
-P_DIR="$1"
-echo "Using project directory: $P_DIR"
-
-# Function to clean up
-cleanup() {
- echo "Cleaning up..."
- # Kill any running server processes
- if [ -f "/tmp/.generic-server.pid" ]; then
- kill $(cat /tmp/.generic-server.pid) 2>/dev/null || true
- rm -f /tmp/.generic-server.pid
- fi
-}
-
-# Set trap to ensure cleanup happens
-trap cleanup EXIT INT TERM
-
-# Build and start server
-echo "Building and starting server..."
-cd "$P_DIR/go-server/cmd"
-go build -o server .
-if [ $? -ne 0 ]; then
- echo "Failed to build server"
- exit 1
-fi
-
-# Start server in background
-echo "Starting server..."
-./server > server.log 2>&1 &
-SERVER_PID=$!
-echo $SERVER_PID > /tmp/.generic-server.pid
-echo "Server started with PID: $SERVER_PID"
-
-# Wait for server to start and register with Zookeeper
-echo "Waiting for server to register with Zookeeper..."
-sleep 15
-
-# Check if server is running
-if ! kill -0 $SERVER_PID 2>/dev/null; then
- echo "Server failed to start. Check server.log for details:"
- cat server.log
- exit 1
-fi
-
-# Build and run client
-echo "Building and running client..."
-cd "$P_DIR/go-client/cmd"
-go build -o client .
-if [ $? -eq 0 ]; then
- ./client
- RESULT=$?
- rm -f client
-else
- echo "Failed to build client"
- RESULT=1
-fi
-
-# Print server log if client failed
-if [ $RESULT -ne 0 ]; then
- echo "Client failed, printing server log..."
- echo "=== Server Log ==="
- cat "$P_DIR/go-server/cmd/server.log"
-fi
-
-# Clean up
-cleanup
-
-exit $RESULT
\ No newline at end of file
diff --git a/generic/go-client/cmd/client.go b/generic/go-client/cmd/client.go
index f20701f7..acd949bc 100644
--- a/generic/go-client/cmd/client.go
+++ b/generic/go-client/cmd/client.go
@@ -19,6 +19,7 @@ package main
import (
"context"
+ "os"
"time"
)
@@ -26,8 +27,8 @@ import (
"dubbo.apache.org/dubbo-go/v3"
"dubbo.apache.org/dubbo-go/v3/client"
"dubbo.apache.org/dubbo-go/v3/common/constant"
+ "dubbo.apache.org/dubbo-go/v3/filter/generic"
_ "dubbo.apache.org/dubbo-go/v3/imports"
- "dubbo.apache.org/dubbo-go/v3/registry"
hessian "github.com/apache/dubbo-go-hessian2"
@@ -39,120 +40,152 @@ import (
)
const (
- RegistryAddress = "127.0.0.1:2181"
- UserProvider = "org.apache.dubbo.samples.UserProvider"
- ServiceVersion = "1.0.0"
- ServiceGroupTriple = "dubbo"
+ TripleServerURL = "tri://127.0.0.1:50052"
+ UserProvider = "org.apache.dubbo.samples.UserProvider"
+ ServiceVersion = "1.0.0"
)
-func createServiceConnection(cli *client.Client, serviceInterface string)
(*client.Connection, error) {
- return cli.Dial(
- serviceInterface,
- client.WithGeneric(),
- client.WithVersion(ServiceVersion),
- client.WithGroup(ServiceGroupTriple),
- )
-}
-
func main() {
hessian.RegisterPOJO(&pkg.User{})
ins, err := dubbo.NewInstance(
- dubbo.WithName("generic-dubbo-client"),
- dubbo.WithRegistry(
- registry.WithZookeeper(),
- registry.WithAddress(RegistryAddress),
- ),
+ dubbo.WithName("generic-go-client"),
)
if err != nil {
- logger.Fatalf("Failed to create Dubbo instance: %v", err)
+ panic(err)
}
- tripleCli, err := ins.NewClient(
- client.WithClientProtocolDubbo(),
+ cli, err := ins.NewClient(
+ client.WithClientProtocolTriple(),
client.WithClientSerialization(constant.Hessian2Serialization),
)
if err != nil {
- logger.Fatalf("Failed to create Dubbo client: %v", err)
+ panic(err)
}
- tripleConn, err := createServiceConnection(tripleCli, UserProvider)
+ genericService, err := cli.NewGenericService(
+ UserProvider,
+ client.WithURL(TripleServerURL),
+ client.WithVersion(ServiceVersion),
+ client.WithGroup("triple"),
+ )
if err != nil {
- logger.Fatalf("Failed to create Dubbo connection: %v", err)
+ panic(err)
}
- logger.Info("\n=== Testing Dubbo Protocol ===")
- testUserService(tripleConn)
-}
+ failed := false
+ failed = runGenericTests(genericService) || failed
-func testUserService(conn *client.Connection) {
- call := func(methodName string, params []interface{}) (interface{},
error) {
- var result interface{}
- err := conn.CallUnary(
- context.TODO(),
- params,
- &result,
- methodName,
- )
- return result, err
+ if failed {
+ logger.Errorf("Some generic call tests failed")
+ os.Exit(1)
}
+ logger.Info("All generic call tests passed")
+}
- testUserID := "A003"
- testUserName := "lily"
- testUserCode := int32(1)
- testUserIDs := []string{"001", "002", "003", "004"}
+func runGenericTests(svc *generic.GenericService) bool {
+ failed := false
+ ctx := context.Background()
- testUser := &pkg.User{
- ID: "3213",
- Name: "panty",
- Age: 25,
- Time: time.Now(),
+ // GetUser1(String)
+ result, err := svc.Invoke(ctx, "GetUser1",
[]string{"java.lang.String"}, []hessian.Object{"A003"})
+ if err != nil {
+ logger.Errorf("GetUser1 failed: %v", err)
+ failed = true
+ } else {
+ logger.Infof("GetUser1(userId string) res: %+v", result)
}
- testUsers := []*pkg.User{
- {
- ID: "3212",
- Name: "XavierNiu",
- Age: 24,
- Time: time.Now().Add(4),
- },
- {
- ID: "3213",
- Name: "zhangsan",
- Age: 21,
- Time: time.Now().Add(4),
- },
+ // GetUser2(String, String)
+ result, err = svc.Invoke(ctx, "GetUser2", []string{"java.lang.String",
"java.lang.String"}, []hessian.Object{"A003", "lily"})
+ if err != nil {
+ logger.Errorf("GetUser2 failed: %v", err)
+ failed = true
+ } else {
+ logger.Infof("GetUser2(userId string, name string) res: %+v",
result)
}
- result, err := call("GetUser1", []interface{}{testUserID})
- logResult("GetUser1", result, err)
-
- result, err = call("GetUser2", []interface{}{testUserID, testUserName})
- logResult("GetUser2", result, err)
+ // GetUser3(int)
+ result, err = svc.Invoke(ctx, "GetUser3", []string{"int"},
[]hessian.Object{int32(1)})
+ if err != nil {
+ logger.Errorf("GetUser3 failed: %v", err)
+ failed = true
+ } else {
+ logger.Infof("GetUser3(userCode int) res: %+v", result)
+ }
- result, err = call("GetUser3", []interface{}{testUserCode})
- logResult("GetUser3", result, err)
+ // GetUser4(int, String)
+ result, err = svc.Invoke(ctx, "GetUser4", []string{"int",
"java.lang.String"}, []hessian.Object{int32(1), "zhangsan"})
+ if err != nil {
+ logger.Errorf("GetUser4 failed: %v", err)
+ failed = true
+ } else {
+ logger.Infof("GetUser4(userCode int, name string) res: %+v",
result)
+ }
- result, err = call("GetUser4", []interface{}{testUserCode, "zhangsan"})
- logResult("GetUser4", result, err)
+ // GetOneUser()
+ result, err = svc.Invoke(ctx, "GetOneUser", []string{},
[]hessian.Object{})
+ if err != nil {
+ logger.Errorf("GetOneUser failed: %v", err)
+ failed = true
+ } else {
+ logger.Infof("GetOneUser() res: %+v", result)
+ }
- result, err = call("GetUsers", []interface{}{testUserIDs})
- logResult("GetUsers", result, err)
+ // GetUsers(String[])
+ result, err = svc.Invoke(ctx, "GetUsers",
[]string{"[Ljava.lang.String;"}, []hessian.Object{[]string{"001", "002",
"003"}})
+ if err != nil {
+ logger.Errorf("GetUsers failed: %v", err)
+ failed = true
+ } else {
+ logger.Infof("GetUsers(userIdList []string) res: %+v", result)
+ }
- result, err = call("GetUsersMap", []interface{}{testUserIDs})
- logResult("GetUsersMap", result, err)
+ // GetUsersMap(String[])
+ result, err = svc.Invoke(ctx, "GetUsersMap",
[]string{"[Ljava.lang.String;"}, []hessian.Object{[]string{"001", "002"}})
+ if err != nil {
+ logger.Errorf("GetUsersMap failed: %v", err)
+ failed = true
+ } else {
+ logger.Infof("GetUsersMap(userIdList []string) res: %+v",
result)
+ }
- result, err = call("QueryUser", []interface{}{testUser})
- logResult("QueryUser", result, err)
+ // QueryAll()
+ result, err = svc.Invoke(ctx, "QueryAll", []string{},
[]hessian.Object{})
+ if err != nil {
+ logger.Errorf("QueryAll failed: %v", err)
+ failed = true
+ } else {
+ logger.Infof("QueryAll() res: %+v", result)
+ }
- result, err = call("QueryUsers", []interface{}{testUsers})
- logResult("QueryUsers", result, err)
-}
+ // QueryUser(User)
+ testUser := &pkg.User{
+ ID: "3213",
+ Name: "panty",
+ Age: 25,
+ Time: time.Now(),
+ }
+ result, err = svc.Invoke(ctx, "QueryUser",
[]string{"org.apache.dubbo.samples.User"}, []hessian.Object{testUser})
+ if err != nil {
+ logger.Errorf("QueryUser failed: %v", err)
+ failed = true
+ } else {
+ logger.Infof("QueryUser(user *User) res: %+v", result)
+ }
-func logResult(methodName string, result interface{}, err error) {
+ // QueryUsers(User[])
+ testUsers := []*pkg.User{
+ {ID: "3212", Name: "XavierNiu", Age: 24, Time: time.Now()},
+ {ID: "3213", Name: "zhangsan", Age: 21, Time: time.Now()},
+ }
+ result, err = svc.Invoke(ctx, "QueryUsers",
[]string{"[Lorg.apache.dubbo.samples.User;"}, []hessian.Object{testUsers})
if err != nil {
- logger.Errorf("❌ %s failed: %v", methodName, err)
+ logger.Errorf("QueryUsers failed: %v", err)
+ failed = true
} else {
- logger.Infof("✅ %s succeeded: %+v", methodName, result)
+ logger.Infof("QueryUsers(users []*User) res: %+v", result)
}
+
+ return failed
}
diff --git a/generic/go-server/cmd/server.go b/generic/go-server/cmd/server.go
index 5424ddaf..ec075493 100644
--- a/generic/go-server/cmd/server.go
+++ b/generic/go-server/cmd/server.go
@@ -17,15 +17,9 @@
package main
-import (
- "os"
- "os/signal"
- "syscall"
-)
-
import (
"dubbo.apache.org/dubbo-go/v3"
- "dubbo.apache.org/dubbo-go/v3/common"
+ "dubbo.apache.org/dubbo-go/v3/common/constant"
_ "dubbo.apache.org/dubbo-go/v3/imports"
"dubbo.apache.org/dubbo-go/v3/protocol"
"dubbo.apache.org/dubbo-go/v3/registry"
@@ -37,97 +31,46 @@ import (
)
import (
- pkg2 "github.com/apache/dubbo-go-samples/generic/go-server/pkg"
-)
-
-const (
- RegistryAddress = "127.0.0.1:2181"
- ServerName = "generic-server"
- DubboServerPort = 20004
+ "github.com/apache/dubbo-go-samples/generic/go-server/pkg"
)
func main() {
- hessian.RegisterPOJO(&pkg2.User{})
-
- ins := createDubboInstance()
-
- srv, err := ins.NewServer()
- if err != nil {
- logger.Fatalf("Failed to create server: %v", err)
- }
-
- registerService(srv, &pkg2.UserProvider{})
-
- go func() {
- logger.Info("Starting Dubbo Protocol Server...")
- if err := srv.Serve(); err != nil {
- logger.Errorf("Dubbo server failed: %v", err)
- }
- }()
+ hessian.RegisterPOJO(&pkg.User{})
- waitForShutdown()
-}
-
-func createDubboInstance() *dubbo.Instance {
ins, err := dubbo.NewInstance(
- dubbo.WithName(ServerName),
+ dubbo.WithName("generic-go-server"),
dubbo.WithRegistry(
registry.WithZookeeper(),
- registry.WithAddress(RegistryAddress),
+ registry.WithAddress("127.0.0.1:2181"),
),
dubbo.WithProtocol(
- protocol.WithID("dubbo"),
- protocol.WithDubbo(),
- protocol.WithPort(DubboServerPort),
+ protocol.WithTriple(),
+ protocol.WithPort(50052),
),
)
if err != nil {
- logger.Fatalf("Failed to create instance: %v", err)
+ panic(err)
}
- return ins
-}
-
-func registerService(srv *server.Server, service *pkg2.UserProvider) {
- serviceInfo := &common.ServiceInfo{
- InterfaceName: "org.apache.dubbo.samples.UserProvider",
- ServiceType: service,
- Methods: []common.MethodInfo{
- {Name: "GetUser1", Type: "normal", Meta:
map[string]interface{}{"params": []string{"java.lang.String"}}},
- {Name: "GetUser2", Type: "normal", Meta:
map[string]interface{}{"params": []string{"java.lang.String",
"java.lang.String"}}},
- {Name: "GetUser3", Type: "normal", Meta:
map[string]interface{}{"params": []string{"int"}}},
- {Name: "GetUser4", Type: "normal", Meta:
map[string]interface{}{"params": []string{"int", "java.lang.String"}}},
- {Name: "GetOneUser", Type: "normal", Meta:
map[string]interface{}{"params": []string{}}},
-
- {Name: "GetUsers", Type: "normal", Meta:
map[string]interface{}{"params": []string{"[Ljava.lang.String;"}}},
- {Name: "GetUsersMap", Type: "normal", Meta:
map[string]interface{}{"params": []string{"[Ljava.lang.String;"}}},
- {Name: "QueryUser", Type: "normal", Meta:
map[string]interface{}{"params": []string{"org.apache.dubbo.samples.User"}}},
- {Name: "QueryUsers", Type: "normal", Meta:
map[string]interface{}{"params": []string{"[]org.apache.dubbo.samples.User"}}},
- {Name: "QueryAll", Type: "normal", Meta:
map[string]interface{}{"params": []string{}}},
- },
- Meta: map[string]interface{}{
- "version": "1.0.0",
- "group": "dubbo",
- "protocol": "dubbo",
- },
+ srv, err := ins.NewServer(
+ server.WithServerSerialization(constant.Hessian2Serialization),
+ )
+ if err != nil {
+ panic(err)
}
- serviceOpts := []server.ServiceOption{
+ if err := srv.RegisterService(&pkg.UserProvider{},
server.WithInterface("org.apache.dubbo.samples.UserProvider"),
server.WithVersion("1.0.0"),
- server.WithGroup("dubbo"),
- server.WithProtocolIDs([]string{"dubbo"}),
+ server.WithGroup("triple"),
+ ); err != nil {
+ panic(err)
}
- if err := srv.Register(service, serviceInfo, serviceOpts...); err !=
nil {
- logger.Fatalf("Failed to register Dubbo service: %v", err)
- }
-}
+ logger.Info("Generic Go server started on port 50052")
+ logger.Info("Registry: zookeeper://127.0.0.1:2181")
-func waitForShutdown() {
- sigChan := make(chan os.Signal, 1)
- signal.Notify(sigChan, os.Interrupt, syscall.SIGTERM, syscall.SIGHUP,
syscall.SIGQUIT)
- sig := <-sigChan
- logger.Infof("Received signal: %s, shutting down...", sig.String())
- os.Exit(0)
+ if err := srv.Serve(); err != nil {
+ logger.Errorf("server stopped: %v", err)
+ }
}
diff --git a/generic/go-server/pkg/init.go b/generic/go-server/pkg/init.go
index 205f031e..e7f35d89 100644
--- a/generic/go-server/pkg/init.go
+++ b/generic/go-server/pkg/init.go
@@ -24,5 +24,4 @@ import (
func init() {
// register POJO
hessian.RegisterPOJO(&User{})
- hessian.RegisterPOJO(&UserResponse{})
}
diff --git a/generic/go-server/pkg/user_provider.go
b/generic/go-server/pkg/user_provider.go
index 8ed4445d..ec906eb6 100644
--- a/generic/go-server/pkg/user_provider.go
+++ b/generic/go-server/pkg/user_provider.go
@@ -19,6 +19,7 @@ package pkg
import (
"context"
+ "fmt"
"strconv"
"time"
)
@@ -116,3 +117,37 @@ func (u *UserProvider) Reference() string {
func (u *UserProvider) MethodMapper(_ context.Context) map[string]string {
return map[string]string{}
}
+
+// Invoke handles generic call via $invoke method
+// Parameters: methodName (string), types ([]string), args ([]interface{})
+func (u *UserProvider) Invoke(ctx context.Context, methodName string, types
[]string, args []interface{}) (interface{}, error) {
+ logger.Infof("Generic invoke: method=%s, types=%v, args=%v",
methodName, types, args)
+
+ switch methodName {
+ case "GetUser1":
+ return u.GetUser1(ctx, args[0].(string))
+ case "GetUser2":
+ return u.GetUser2(ctx, args[0].(string), args[1].(string))
+ case "GetUser3":
+ return u.GetUser3(ctx, args[0].(int32))
+ case "GetUser4":
+ return u.GetUser4(ctx, args[0].(int32), args[1].(string))
+ case "GetOneUser":
+ return u.GetOneUser(ctx)
+ case "GetUsers":
+ return u.GetUsers(ctx, args[0].([]string))
+ case "GetUsersMap":
+ return u.GetUsersMap(ctx, args[0].([]string))
+ case "QueryUser":
+ user := args[0].(*User)
+ return u.QueryUser(ctx, user)
+ case "QueryUsers":
+ users := args[0].([]*User)
+ return u.QueryUsers(ctx, users)
+ case "QueryAll":
+ return u.QueryAll(ctx)
+ default:
+ logger.Errorf("Unknown method: %s", methodName)
+ return nil, fmt.Errorf("unknown method: %s", methodName)
+ }
+}
diff --git a/generic/go-server/pkg/user_response.go
b/generic/go-server/pkg/user_response.go
deleted file mode 100644
index 3d7a3c90..00000000
--- a/generic/go-server/pkg/user_response.go
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package pkg
-
-type UserResponse struct {
- Users []*User
-}
-
-func (u *UserResponse) JavaClassName() string {
- return "org.apache.dubbo.samples.UserResponse"
-}
diff --git a/generic/java-client/java-client/dependency-reduced-pom.xml
b/generic/java-client/java-client/dependency-reduced-pom.xml
deleted file mode 100644
index 39cc097d..00000000
--- a/generic/java-client/java-client/dependency-reduced-pom.xml
+++ /dev/null
@@ -1,194 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <groupId>org.apache.dubbo</groupId>
- <artifactId>generic-dubbo-java-client</artifactId>
- <version>1.0-SNAPSHOT</version>
- <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>
- <executions>
- <execution>
- <goals>
- <goal>compile</goal>
- <goal>test-compile</goal>
- </goals>
- </execution>
- </executions>
- <configuration>
-
<protocArtifact>com.google.protobuf:protoc:3.17.3:exe:${os.detected.classifier}</protocArtifact>
- <pluginId>triple-java</pluginId>
-
<outputDirectory>build/generated/source/proto/main/java</outputDirectory>
- </configuration>
- </plugin>
- <plugin>
- <artifactId>maven-compiler-plugin</artifactId>
- <version>${maven-compiler-plugin.version}</version>
- <configuration>
- <source>${source.level}</source>
- <target>${target.level}</target>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.codehaus.mojo</groupId>
- <artifactId>build-helper-maven-plugin</artifactId>
- <executions>
- <execution>
- <phase>generate-sources</phase>
- <goals>
- <goal>add-source</goal>
- </goals>
- <configuration>
- <sources>
- <source>build/generated/source/proto/main/java</source>
- </sources>
- </configuration>
- </execution>
- </executions>
- </plugin>
- <plugin>
- <artifactId>maven-shade-plugin</artifactId>
- <version>3.2.4</version>
- <executions>
- <execution>
- <phase>package</phase>
- <goals>
- <goal>shade</goal>
- </goals>
- <configuration>
- <transformers>
- <transformer>
- <mainClass>org.apache.dubbo.samples.ApiConsumer</mainClass>
- </transformer>
- </transformers>
- </configuration>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
- <profiles>
- <profile>
- <id>javax.annotation</id>
- <dependencies>
- <dependency>
- <groupId>javax.annotation</groupId>
- <artifactId>javax.annotation-api</artifactId>
- <version>1.3.2</version>
- <scope>compile</scope>
- </dependency>
- </dependencies>
- <properties>
- <os.detected.arch>x86_64</os.detected.arch>
- <os.detected.release.version>24.04</os.detected.release.version>
- <os.detected.release.like.debian>true</os.detected.release.like.debian>
- <os.detected.name>linux</os.detected.name>
- <os.detected.release.like.ubuntu>true</os.detected.release.like.ubuntu>
- <os.detected.classifier>linux-x86_64</os.detected.classifier>
- <os.detected.release>ubuntu</os.detected.release>
- </properties>
- </profile>
- </profiles>
- <dependencies>
- <dependency>
- <groupId>org.apache.dubbo</groupId>
- <artifactId>dubbo-dependencies-zookeeper</artifactId>
- <version>3.2.0</version>
- <type>pom</type>
- <scope>compile</scope>
- <exclusions>
- <exclusion>
- <artifactId>zookeeper</artifactId>
- <groupId>org.apache.zookeeper</groupId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.13.1</version>
- <scope>test</scope>
- <exclusions>
- <exclusion>
- <artifactId>hamcrest-core</artifactId>
- <groupId>org.hamcrest</groupId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-test</artifactId>
- <version>4.3.16.RELEASE</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.testcontainers</groupId>
- <artifactId>testcontainers</artifactId>
- <version>1.12.3</version>
- <scope>test</scope>
- <exclusions>
- <exclusion>
- <artifactId>annotations</artifactId>
- <groupId>org.jetbrains</groupId>
- </exclusion>
- <exclusion>
- <artifactId>commons-compress</artifactId>
- <groupId>org.apache.commons</groupId>
- </exclusion>
- <exclusion>
- <artifactId>jaxb-api</artifactId>
- <groupId>javax.xml.bind</groupId>
- </exclusion>
- <exclusion>
- <artifactId>duct-tape</artifactId>
- <groupId>org.rnorth.duct-tape</groupId>
- </exclusion>
- <exclusion>
- <artifactId>visible-assertions</artifactId>
- <groupId>org.rnorth.visible-assertions</groupId>
- </exclusion>
- <exclusion>
- <artifactId>tcp-unix-socket-proxy</artifactId>
- <groupId>org.rnorth</groupId>
- </exclusion>
- <exclusion>
- <artifactId>jna-platform</artifactId>
- <groupId>net.java.dev.jna</groupId>
- </exclusion>
- </exclusions>
- </dependency>
- </dependencies>
- <dependencyManagement>
- <dependencies>
- <dependency>
- <groupId>org.apache.dubbo</groupId>
- <artifactId>dubbo-dependencies-bom</artifactId>
- <version>${dubbo.version}</version>
- <type>pom</type>
- <scope>import</scope>
- </dependency>
- </dependencies>
- </dependencyManagement>
- <properties>
- <maven-failsafe-plugin.version>2.21.0</maven-failsafe-plugin.version>
- <protoc.version>3.7.1</protoc.version>
- <dubbo.version>3.2.0</dubbo.version>
- <maven-compiler-plugin.version>3.7.0</maven-compiler-plugin.version>
- <source.level>1.8</source.level>
- <target.level>1.8</target.level>
- <junit.version>4.13.1</junit.version>
- <spring-test.version>4.3.16.RELEASE</spring-test.version>
- <grpc.version>1.19.0</grpc.version>
- <spring-boot.version>1.5.13.RELEASE</spring-boot.version>
- </properties>
-</project>
diff --git
a/generic/java-client/java-client/src/main/java/org/apache/dubbo/samples/ApiConsumer.java
b/generic/java-client/java-client/src/main/java/org/apache/dubbo/samples/ApiConsumer.java
deleted file mode 100644
index fe2147f8..00000000
---
a/generic/java-client/java-client/src/main/java/org/apache/dubbo/samples/ApiConsumer.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.dubbo.samples;
-
-import org.apache.dubbo.config.ProtocolConfig;
-import org.apache.dubbo.config.ReferenceConfig;
-import org.apache.dubbo.config.RegistryConfig;
-import org.apache.dubbo.config.bootstrap.DubboBootstrap;
-
-public class ApiConsumer {
- public static void main(String[] args) {
- DubboBootstrap bootstrap = DubboBootstrap.getInstance();
-
- RegistryConfig registryConfig = new
RegistryConfig("zookeeper://127.0.0.1:2181");
- ProtocolConfig protocolConfig = new ProtocolConfig("dubbo");
-
- bootstrap.application("generic-dubbo-client")
- .registry(registryConfig)
- .protocol(protocolConfig)
- .start();
-
- ReferenceConfig<UserProvider> reference = new ReferenceConfig<>();
- reference.setInterface(UserProvider.class);
- reference.setGroup("dubbo");
- reference.setVersion("1.0.0");
- reference.setGeneric("false");
-
- UserProvider userProvider = reference.get();
-
- System.out.println("\n=== Testing Dubbo Protocol ===");
-
- callGetUser(userProvider);
- callGetOneUser(userProvider);
- callGetUsers(userProvider);
- callGetUsersMap(userProvider);
- }
-
- private static void callGetUser(UserProvider userProvider) {
- System.out.println("GetUser1(String userId) res: " +
userProvider.GetUser1("A003"));
- System.out.println("GetUser2(String userId, String name) res: " +
userProvider.GetUser2("A003", "lily"));
- System.out.println("GetUser3(int userCode) res: " +
userProvider.GetUser3(1));
- System.out.println("GetUser4(int userCode, String name) res: " +
userProvider.GetUser4(1, "zhangsan"));
- }
-
- private static void callGetOneUser(UserProvider userProvider) {
- System.out.println("GetOneUser() res: " + userProvider.GetOneUser());
- }
-
- private static void callGetUsers(UserProvider userProvider) {
- System.out.println("Call GetUsers");
- String[] userIds = new String[]{"001", "002"};
- System.out.println("GetUsers res: " + userProvider.GetUsers(userIds));
- }
-
- private static void callGetUsersMap(UserProvider userProvider) {
- System.out.println("Call GetUsersMap");
- String[] userIds = new String[]{"001", "002"};
- System.out.println("GetUsersMap res: " +
userProvider.GetUsersMap(userIds));
- }
-}
\ No newline at end of file
diff --git
a/generic/java-client/java-client/src/main/java/org/apache/dubbo/samples/Response.java
b/generic/java-client/java-client/src/main/java/org/apache/dubbo/samples/Response.java
deleted file mode 100644
index 8d2cf801..00000000
---
a/generic/java-client/java-client/src/main/java/org/apache/dubbo/samples/Response.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.dubbo.samples;
-
-import java.io.Serializable;
-
-public final class Response<T> implements Serializable {
- private static final long serialVersionUID = 3727205004706510648L;
- public static final Integer OK = 200;
- public static final Integer ERR = 500;
- private Integer Status;
- private String Err;
- private T Data;
-
- public Response() {
- }
-
- public static <T> Response<T> ok() {
- Response r = new Response();
- r.Status = OK;
- return r;
- }
-
- public static <T> Response<T> ok(Object Data) {
- Response r = new Response();
- r.Status = OK;
- r.Data = Data;
- return r;
- }
-
- public static <T> Response<T> notOk(String Err) {
- Response r = new Response();
- r.Status = ERR;
- r.Err = Err;
- return r;
- }
-
- public static <T> Response<T> notOk(Integer Status, String Err) {
- Response r = new Response();
- r.Status = Status;
- r.Err = Err;
- return r;
- }
-
-// public Boolean isSuccess() {
-// return Objects.equals(this.Status, OK);
-// }
-
- public Integer getStatus() {
- return this.Status;
- }
-
- public void setStatus(Integer Status) {
- this.Status = Status;
- }
-
- public String getErr() {
- return this.Err;
- }
-
- public void setErr(String Err) {
- this.Err = Err;
- }
-
- public T getData() {
- return this.Data;
- }
-
- public void setData(T Data) {
- this.Status = OK;
- this.Data = Data;
- }
-
- public String toString() {
- return "Response{Status=" + this.Status + ", Err='" + this.Err + '\''
+ ", Data=" + this.Data + '}';
- }
-}
\ No newline at end of file
diff --git
a/generic/java-client/java-client/src/main/resources/dubbo.properties
b/generic/java-client/java-client/src/main/resources/dubbo.properties
deleted file mode 100644
index bb1ce9c4..00000000
--- a/generic/java-client/java-client/src/main/resources/dubbo.properties
+++ /dev/null
@@ -1,8 +0,0 @@
-dubbo.application.name=generic-dubbo-client
-dubbo.registry.address=zookeeper://127.0.0.1:2181
-dubbo.registry.subscribe-mode=application
-dubbo.reference.org.apache.dubbo.samples.UserProvider.application=generic-server
-dubbo.reference.org.apache.dubbo.samples.UserProvider.version=1.0.0
-dubbo.reference.org.apache.dubbo.samples.UserProvider.group=dubbo
-dubbo.reference.org.apache.dubbo.samples.UserProvider.protocol=dubbo
-dubbo.application.qos.port=22224
\ No newline at end of file
diff --git a/generic/java-client/java-client/pom.xml
b/generic/java-client/pom.xml
similarity index 99%
rename from generic/java-client/java-client/pom.xml
rename to generic/java-client/pom.xml
index dfe38864..d05ddbd3 100644
--- a/generic/java-client/java-client/pom.xml
+++ b/generic/java-client/pom.xml
@@ -75,7 +75,7 @@
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
- <version>3.4.14</version>
+ <version>3.8.4</version>
</dependency>
<dependency>
<groupId>junit</groupId>
diff --git a/generic/java-client/run.sh b/generic/java-client/run.sh
new file mode 100755
index 00000000..1d9e23c5
--- /dev/null
+++ b/generic/java-client/run.sh
@@ -0,0 +1,3 @@
+#!/bin/bash
+cd "$(dirname "$0")"
+mvn -q clean compile exec:java
-Dexec.mainClass=org.apache.dubbo.samples.ApiTripleConsumer
diff --git
a/generic/java-client/src/main/java/org/apache/dubbo/samples/ApiTripleConsumer.java
b/generic/java-client/src/main/java/org/apache/dubbo/samples/ApiTripleConsumer.java
new file mode 100644
index 00000000..ff013bb7
--- /dev/null
+++
b/generic/java-client/src/main/java/org/apache/dubbo/samples/ApiTripleConsumer.java
@@ -0,0 +1,218 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dubbo.samples;
+
+import org.apache.dubbo.config.ApplicationConfig;
+import org.apache.dubbo.config.ReferenceConfig;
+import org.apache.dubbo.config.RegistryConfig;
+import org.apache.dubbo.rpc.service.GenericService;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class ApiTripleConsumer {
+ private static final String ZOOKEEPER_ADDRESS =
"zookeeper://127.0.0.1:2181";
+ private static final String SERVICE_VERSION = "1.0.0";
+ private static final String SERVICE_GROUP = "triple";
+
+ public static void main(String[] args) {
+ System.out.println("\n========== Java Triple Generic Call Test
==========");
+ System.out.println("Registry: " + ZOOKEEPER_ADDRESS);
+ System.out.println();
+
+ ReferenceConfig<GenericService> reference = new ReferenceConfig<>();
+ reference.setApplication(new ApplicationConfig("generic-java-client"));
+ reference.setRegistry(new RegistryConfig(ZOOKEEPER_ADDRESS));
+ reference.setInterface("org.apache.dubbo.samples.UserProvider");
+ reference.setGroup(SERVICE_GROUP);
+ reference.setVersion(SERVICE_VERSION);
+ reference.setGeneric("true");
+ reference.setProtocol("tri");
+ reference.setCheck(false);
+
+ GenericService genericService = reference.get();
+
+ System.out.println("Connected to server via ZooKeeper, starting
tests...\n");
+
+ int passed = 0;
+ int failed = 0;
+
+ // ==================== 1. Basic type parameters ====================
+ System.out.println("--- 1. Basic type parameters ---");
+
+ // Test GetUser1(String)
+ try {
+ Object result = genericService.$invoke("GetUser1",
+ new String[]{"java.lang.String"},
+ new Object[]{"A003"});
+ System.out.println("[PASS] GetUser1(String): " + result);
+ passed++;
+ } catch (Exception e) {
+ System.out.println("[FAIL] GetUser1(String): " + e.getMessage());
+ failed++;
+ }
+
+ // Test GetUser2(String, String)
+ try {
+ Object result = genericService.$invoke("GetUser2",
+ new String[]{"java.lang.String", "java.lang.String"},
+ new Object[]{"A003", "lily"});
+ System.out.println("[PASS] GetUser2(String, String): " + result);
+ passed++;
+ } catch (Exception e) {
+ System.out.println("[FAIL] GetUser2(String, String): " +
e.getMessage());
+ failed++;
+ }
+
+ // Test GetUser3(int)
+ try {
+ Object result = genericService.$invoke("GetUser3",
+ new String[]{"int"},
+ new Object[]{1});
+ System.out.println("[PASS] GetUser3(int): " + result);
+ passed++;
+ } catch (Exception e) {
+ System.out.println("[FAIL] GetUser3(int): " + e.getMessage());
+ failed++;
+ }
+
+ // Test GetUser4(int, String)
+ try {
+ Object result = genericService.$invoke("GetUser4",
+ new String[]{"int", "java.lang.String"},
+ new Object[]{1, "zhangsan"});
+ System.out.println("[PASS] GetUser4(int, String): " + result);
+ passed++;
+ } catch (Exception e) {
+ System.out.println("[FAIL] GetUser4(int, String): " +
e.getMessage());
+ failed++;
+ }
+
+ // Test GetOneUser()
+ try {
+ Object result = genericService.$invoke("GetOneUser",
+ new String[]{},
+ new Object[]{});
+ System.out.println("[PASS] GetOneUser(): " + result);
+ passed++;
+ } catch (Exception e) {
+ System.out.println("[FAIL] GetOneUser(): " + e.getMessage());
+ failed++;
+ }
+
+ // ==================== 2. Array/Collection types ====================
+ System.out.println("\n--- 2. Array/Collection types ---");
+
+ // Test GetUsers(String[]) -> User[]
+ try {
+ Object result = genericService.$invoke("GetUsers",
+ new String[]{"[Ljava.lang.String;"},
+ new Object[]{new String[]{"001", "002"}});
+ System.out.println("[PASS] GetUsers(String[]): " + result);
+ passed++;
+ } catch (Exception e) {
+ System.out.println("[FAIL] GetUsers(String[]): " + e.getMessage());
+ failed++;
+ }
+
+ // Test GetUsersMap(String[]) -> Map<String, User>
+ try {
+ Object result = genericService.$invoke("GetUsersMap",
+ new String[]{"[Ljava.lang.String;"},
+ new Object[]{new String[]{"001", "002"}});
+ System.out.println("[PASS] GetUsersMap(String[]): " + result);
+ passed++;
+ } catch (Exception e) {
+ System.out.println("[FAIL] GetUsersMap(String[]): " +
e.getMessage());
+ failed++;
+ }
+
+ // Test QueryAll() -> Map<String, User>
+ try {
+ Object result = genericService.$invoke("QueryAll",
+ new String[]{},
+ new Object[]{});
+ System.out.println("[PASS] QueryAll(): " + result);
+ passed++;
+ } catch (Exception e) {
+ System.out.println("[FAIL] QueryAll(): " + e.getMessage());
+ failed++;
+ }
+
+ // ==================== 3. Custom type parameters ====================
+ System.out.println("\n--- 3. Custom type parameters ---");
+
+ // Test QueryUser(User)
+ try {
+ Map<String, Object> userParam = new HashMap<>();
+ userParam.put("class", "org.apache.dubbo.samples.User");
+ userParam.put("id", "U001");
+ userParam.put("name", "TestUser");
+ userParam.put("age", 25);
+
+ Object result = genericService.$invoke("QueryUser",
+ new String[]{"org.apache.dubbo.samples.User"},
+ new Object[]{userParam});
+ System.out.println("[PASS] QueryUser(User): " + result);
+ passed++;
+ } catch (Exception e) {
+ System.out.println("[FAIL] QueryUser(User): " + e.getMessage());
+ e.printStackTrace();
+ failed++;
+ }
+
+ // Test QueryUsers(User[])
+ try {
+ Map<String, Object> user1 = new HashMap<>();
+ user1.put("class", "org.apache.dubbo.samples.User");
+ user1.put("id", "U001");
+ user1.put("name", "User1");
+ user1.put("age", 20);
+
+ Map<String, Object> user2 = new HashMap<>();
+ user2.put("class", "org.apache.dubbo.samples.User");
+ user2.put("id", "U002");
+ user2.put("name", "User2");
+ user2.put("age", 30);
+
+ Object[] userArray = new Object[]{user1, user2};
+
+ Object result = genericService.$invoke("QueryUsers",
+ new String[]{"[Lorg.apache.dubbo.samples.User;"},
+ new Object[]{userArray});
+ System.out.println("[PASS] QueryUsers(User[]): " + result);
+ passed++;
+ } catch (Exception e) {
+ System.out.println("[FAIL] QueryUsers(User[]): " + e.getMessage());
+ e.printStackTrace();
+ failed++;
+ }
+
+ // ==================== Test summary ====================
+ System.out.println("\n========== Test Completed ==========");
+ System.out.println("Passed: " + passed + ", Failed: " + failed + ",
Total: " + (passed + failed));
+
+ if (failed > 0) {
+ System.out.println("\n[WARN] Some tests failed!");
+ } else {
+ System.out.println("\n[OK] All tests passed!");
+ }
+
+ System.exit(0);
+ }
+}
diff --git
a/generic/java-client/java-client/src/main/java/org/apache/dubbo/samples/Gender.java
b/generic/java-client/src/main/java/org/apache/dubbo/samples/Gender.java
similarity index 100%
rename from
generic/java-client/java-client/src/main/java/org/apache/dubbo/samples/Gender.java
rename to generic/java-client/src/main/java/org/apache/dubbo/samples/Gender.java
diff --git
a/generic/java-client/java-client/src/main/java/org/apache/dubbo/samples/User.java
b/generic/java-client/src/main/java/org/apache/dubbo/samples/User.java
similarity index 100%
rename from
generic/java-client/java-client/src/main/java/org/apache/dubbo/samples/User.java
rename to generic/java-client/src/main/java/org/apache/dubbo/samples/User.java
diff --git
a/generic/java-client/java-client/src/main/java/org/apache/dubbo/samples/UserProvider.java
b/generic/java-client/src/main/java/org/apache/dubbo/samples/UserProvider.java
similarity index 95%
rename from
generic/java-client/java-client/src/main/java/org/apache/dubbo/samples/UserProvider.java
rename to
generic/java-client/src/main/java/org/apache/dubbo/samples/UserProvider.java
index eabcbda1..b79e5e84 100644
---
a/generic/java-client/java-client/src/main/java/org/apache/dubbo/samples/UserProvider.java
+++
b/generic/java-client/src/main/java/org/apache/dubbo/samples/UserProvider.java
@@ -31,6 +31,6 @@ public interface UserProvider {
Map<String, User> GetUsersMap(String[] userIdList);
User QueryUser(User user);
- List<User> QueryUsers(List<User> userObjectList);
+ User[] QueryUsers(User[] userObjectList);
Map<String, User> QueryAll();
}
\ No newline at end of file
diff --git a/generic/java-client/src/main/resources/dubbo.properties
b/generic/java-client/src/main/resources/dubbo.properties
new file mode 100644
index 00000000..853a9a02
--- /dev/null
+++ b/generic/java-client/src/main/resources/dubbo.properties
@@ -0,0 +1,4 @@
+dubbo.application.name=generic-java-client
+dubbo.registry.address=zookeeper://127.0.0.1:2181
+dubbo.protocols.triple.name=tri
+dubbo.application.qos.enable=false
diff --git
a/generic/java-client/java-client/src/main/resources/log4j.properties
b/generic/java-client/src/main/resources/log4j.properties
similarity index 100%
rename from generic/java-client/java-client/src/main/resources/log4j.properties
rename to generic/java-client/src/main/resources/log4j.properties
diff --git a/generic/java-server/java-server/dependency-reduced-pom.xml
b/generic/java-server/java-server/dependency-reduced-pom.xml
deleted file mode 100644
index a6c7c8c2..00000000
--- a/generic/java-server/java-server/dependency-reduced-pom.xml
+++ /dev/null
@@ -1,178 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <groupId>org.apache.dubbo</groupId>
- <artifactId>generic-dubbo-java-server</artifactId>
- <version>1.0-SNAPSHOT</version>
- <build>
- <extensions>
- <extension>
- <groupId>kr.motd.maven</groupId>
- <artifactId>os-maven-plugin</artifactId>
- <version>1.6.1</version>
- </extension>
- </extensions>
- <defaultGoal>package</defaultGoal>
- <plugins>
- <plugin>
- <groupId>org.xolstice.maven.plugins</groupId>
- <artifactId>protobuf-maven-plugin</artifactId>
- <version>0.6.1</version>
- <executions>
- <execution>
- <goals>
- <goal>compile</goal>
- <goal>test-compile</goal>
- </goals>
- </execution>
- </executions>
- <configuration>
-
<protocArtifact>com.google.protobuf:protoc:3.17.3:exe:${os.detected.classifier}</protocArtifact>
- <pluginId>triple-java</pluginId>
-
<outputDirectory>build/generated/source/proto/main/java</outputDirectory>
- </configuration>
- </plugin>
- <plugin>
- <artifactId>maven-compiler-plugin</artifactId>
- <version>${maven-compiler-plugin.version}</version>
- <configuration>
- <source>${source.level}</source>
- <target>${target.level}</target>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.codehaus.mojo</groupId>
- <artifactId>build-helper-maven-plugin</artifactId>
- <executions>
- <execution>
- <phase>generate-sources</phase>
- <goals>
- <goal>add-source</goal>
- </goals>
- <configuration>
- <sources>
- <source>build/generated/source/proto/main/java</source>
- </sources>
- </configuration>
- </execution>
- </executions>
- </plugin>
- <plugin>
- <artifactId>maven-shade-plugin</artifactId>
- <version>3.2.4</version>
- <executions>
- <execution>
- <phase>package</phase>
- <goals>
- <goal>shade</goal>
- </goals>
- <configuration>
- <transformers>
- <transformer>
- <mainClass>org.apache.dubbo.samples.ApiProvider</mainClass>
- </transformer>
- </transformers>
- </configuration>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
- <profiles>
- <profile>
- <id>javax.annotation</id>
- <dependencies>
- <dependency>
- <groupId>javax.annotation</groupId>
- <artifactId>javax.annotation-api</artifactId>
- <version>1.3.2</version>
- </dependency>
- </dependencies>
- </profile>
- </profiles>
- <dependencies>
- <dependency>
- <groupId>org.apache.dubbo</groupId>
- <artifactId>dubbo-dependencies-zookeeper</artifactId>
- <version>3.0.12</version>
- <type>pom</type>
- <scope>compile</scope>
- <exclusions>
- <exclusion>
- <artifactId>zookeeper</artifactId>
- <groupId>org.apache.zookeeper</groupId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.13.1</version>
- <scope>test</scope>
- <exclusions>
- <exclusion>
- <artifactId>hamcrest-core</artifactId>
- <groupId>org.hamcrest</groupId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-test</artifactId>
- <version>4.3.16.RELEASE</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.testcontainers</groupId>
- <artifactId>testcontainers</artifactId>
- <version>1.12.3</version>
- <scope>test</scope>
- <exclusions>
- <exclusion>
- <artifactId>annotations</artifactId>
- <groupId>org.jetbrains</groupId>
- </exclusion>
- <exclusion>
- <artifactId>javax.annotation-api</artifactId>
- <groupId>javax.annotation</groupId>
- </exclusion>
- <exclusion>
- <artifactId>commons-compress</artifactId>
- <groupId>org.apache.commons</groupId>
- </exclusion>
- <exclusion>
- <artifactId>jaxb-api</artifactId>
- <groupId>javax.xml.bind</groupId>
- </exclusion>
- <exclusion>
- <artifactId>duct-tape</artifactId>
- <groupId>org.rnorth.duct-tape</groupId>
- </exclusion>
- <exclusion>
- <artifactId>visible-assertions</artifactId>
- <groupId>org.rnorth.visible-assertions</groupId>
- </exclusion>
- <exclusion>
- <artifactId>tcp-unix-socket-proxy</artifactId>
- <groupId>org.rnorth</groupId>
- </exclusion>
- <exclusion>
- <artifactId>jna-platform</artifactId>
- <groupId>net.java.dev.jna</groupId>
- </exclusion>
- </exclusions>
- </dependency>
- </dependencies>
- <properties>
- <maven-failsafe-plugin.version>2.21.0</maven-failsafe-plugin.version>
- <junit.version>4.13.1</junit.version>
- <maven-compiler-plugin.version>3.7.0</maven-compiler-plugin.version>
- <spring-boot.version>1.5.13.RELEASE</spring-boot.version>
- <grpc.version>1.19.0</grpc.version>
- <source.level>1.8</source.level>
- <spring-test.version>4.3.16.RELEASE</spring-test.version>
- <target.level>1.8</target.level>
- <dubbo.version>3.0.12</dubbo.version>
- <protoc.version>3.7.1</protoc.version>
- </properties>
-</project>
diff --git
a/generic/java-server/java-server/src/main/java/org/apache/dubbo/samples/ApiProvider.java
b/generic/java-server/java-server/src/main/java/org/apache/dubbo/samples/ApiProvider.java
deleted file mode 100644
index 98069d66..00000000
---
a/generic/java-server/java-server/src/main/java/org/apache/dubbo/samples/ApiProvider.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.dubbo.samples;
-
-import org.apache.dubbo.config.ServiceConfig;
-import org.apache.dubbo.config.bootstrap.DubboBootstrap;
-
-import java.util.concurrent.CountDownLatch;
-
-public class ApiProvider {
- public static void main(String[] args) throws InterruptedException {
- DubboBootstrap bootstrap = DubboBootstrap.getInstance();
-
- ServiceConfig<UserProvider> service = new ServiceConfig<>();
- service.setInterface(UserProvider.class);
- service.setRef(new UserProviderImpl());
- service.setGroup("dubbo");
- service.setVersion("1.0.0");
-
- bootstrap.service(service);
-
- bootstrap.start();
- System.out.println("dubbo service started");
- new CountDownLatch(1).await();
- }
-}
\ No newline at end of file
diff --git
a/generic/java-server/java-server/src/main/java/org/apache/dubbo/samples/Response.java
b/generic/java-server/java-server/src/main/java/org/apache/dubbo/samples/Response.java
deleted file mode 100644
index 8d2cf801..00000000
---
a/generic/java-server/java-server/src/main/java/org/apache/dubbo/samples/Response.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.dubbo.samples;
-
-import java.io.Serializable;
-
-public final class Response<T> implements Serializable {
- private static final long serialVersionUID = 3727205004706510648L;
- public static final Integer OK = 200;
- public static final Integer ERR = 500;
- private Integer Status;
- private String Err;
- private T Data;
-
- public Response() {
- }
-
- public static <T> Response<T> ok() {
- Response r = new Response();
- r.Status = OK;
- return r;
- }
-
- public static <T> Response<T> ok(Object Data) {
- Response r = new Response();
- r.Status = OK;
- r.Data = Data;
- return r;
- }
-
- public static <T> Response<T> notOk(String Err) {
- Response r = new Response();
- r.Status = ERR;
- r.Err = Err;
- return r;
- }
-
- public static <T> Response<T> notOk(Integer Status, String Err) {
- Response r = new Response();
- r.Status = Status;
- r.Err = Err;
- return r;
- }
-
-// public Boolean isSuccess() {
-// return Objects.equals(this.Status, OK);
-// }
-
- public Integer getStatus() {
- return this.Status;
- }
-
- public void setStatus(Integer Status) {
- this.Status = Status;
- }
-
- public String getErr() {
- return this.Err;
- }
-
- public void setErr(String Err) {
- this.Err = Err;
- }
-
- public T getData() {
- return this.Data;
- }
-
- public void setData(T Data) {
- this.Status = OK;
- this.Data = Data;
- }
-
- public String toString() {
- return "Response{Status=" + this.Status + ", Err='" + this.Err + '\''
+ ", Data=" + this.Data + '}';
- }
-}
\ No newline at end of file
diff --git
a/generic/java-server/java-server/src/main/resources/dubbo.properties
b/generic/java-server/java-server/src/main/resources/dubbo.properties
deleted file mode 100644
index 8c2bfa80..00000000
--- a/generic/java-server/java-server/src/main/resources/dubbo.properties
+++ /dev/null
@@ -1,8 +0,0 @@
-dubbo.application.name=generic-server
-dubbo.registry.address=zookeeper://127.0.0.1:2181
-dubbo.registry.register-mode=instance
-dubbo.protocol.name=dubbo
-dubbo.protocol.port=20004
-dubbo.service.org.apache.dubbo.UserProvider.version=1.0.0
-dubbo.service.org.apache.dubbo.UserProvider.group=dubbo
-dubbo.application.qos.port=22223
\ No newline at end of file
diff --git a/generic/java-server/java-server/pom.xml
b/generic/java-server/pom.xml
similarity index 98%
rename from generic/java-server/java-server/pom.xml
rename to generic/java-server/pom.xml
index ae6ed1cd..3531a54e 100644
--- a/generic/java-server/java-server/pom.xml
+++ b/generic/java-server/pom.xml
@@ -27,7 +27,7 @@
<properties>
<source.level>1.8</source.level>
<target.level>1.8</target.level>
- <dubbo.version>3.0.12</dubbo.version>
+ <dubbo.version>3.2.0</dubbo.version>
<junit.version>4.13.1</junit.version>
<spring-test.version>4.3.16.RELEASE</spring-test.version>
<maven-compiler-plugin.version>3.7.0</maven-compiler-plugin.version>
@@ -63,7 +63,7 @@
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
- <version>3.4.14</version>
+ <version>3.8.4</version>
</dependency>
<dependency>
<groupId>junit</groupId>
diff --git a/generic/java-server/run.sh b/generic/java-server/run.sh
new file mode 100755
index 00000000..f29baa78
--- /dev/null
+++ b/generic/java-server/run.sh
@@ -0,0 +1,3 @@
+#!/bin/bash
+cd "$(dirname "$0")"
+mvn -q clean compile exec:java
-Dexec.mainClass=org.apache.dubbo.samples.ApiProvider
diff --git
a/generic/java-server/src/main/java/org/apache/dubbo/samples/ApiProvider.java
b/generic/java-server/src/main/java/org/apache/dubbo/samples/ApiProvider.java
new file mode 100644
index 00000000..95b0ff73
--- /dev/null
+++
b/generic/java-server/src/main/java/org/apache/dubbo/samples/ApiProvider.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dubbo.samples;
+
+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.util.concurrent.CountDownLatch;
+
+public class ApiProvider {
+ private static final int DUBBO_PORT = 20000;
+ private static final int TRIPLE_PORT = 50052;
+ private static final String SERVICE_VERSION = "1.0.0";
+
+ public static void main(String[] args) throws InterruptedException {
+ // Dubbo protocol service (group=dubbo)
+ ServiceConfig<UserProvider> dubboService = new ServiceConfig<>();
+ dubboService.setInterface(UserProvider.class);
+ dubboService.setRef(new UserProviderImpl());
+ dubboService.setGroup("dubbo");
+ dubboService.setVersion(SERVICE_VERSION);
+ dubboService.setProtocol(new ProtocolConfig("dubbo", DUBBO_PORT));
+
+ // Triple protocol service (group=triple)
+ ServiceConfig<UserProvider> tripleService = new ServiceConfig<>();
+ tripleService.setInterface(UserProvider.class);
+ tripleService.setRef(new UserProviderImpl());
+ tripleService.setGroup("triple");
+ tripleService.setVersion(SERVICE_VERSION);
+ tripleService.setProtocol(new ProtocolConfig("tri", TRIPLE_PORT));
+
+ // Use direct export without registry
+ RegistryConfig registryConfig = new RegistryConfig();
+ registryConfig.setAddress("N/A");
+
+ DubboBootstrap bootstrap = DubboBootstrap.getInstance();
+ bootstrap.application("generic-java-server")
+ .registry(registryConfig)
+ .service(dubboService)
+ .service(tripleService)
+ .start();
+
+ System.out.println("Generic Java server started:");
+ System.out.println(" - Dubbo protocol on port " + DUBBO_PORT + "
(group=dubbo)");
+ System.out.println(" - Triple protocol on port " + TRIPLE_PORT + "
(group=triple)");
+
+ new CountDownLatch(1).await();
+ }
+}
diff --git
a/generic/java-server/java-server/src/main/java/org/apache/dubbo/samples/Gender.java
b/generic/java-server/src/main/java/org/apache/dubbo/samples/Gender.java
similarity index 100%
rename from
generic/java-server/java-server/src/main/java/org/apache/dubbo/samples/Gender.java
rename to generic/java-server/src/main/java/org/apache/dubbo/samples/Gender.java
diff --git
a/generic/java-server/java-server/src/main/java/org/apache/dubbo/samples/User.java
b/generic/java-server/src/main/java/org/apache/dubbo/samples/User.java
similarity index 100%
rename from
generic/java-server/java-server/src/main/java/org/apache/dubbo/samples/User.java
rename to generic/java-server/src/main/java/org/apache/dubbo/samples/User.java
diff --git
a/generic/java-server/java-server/src/main/java/org/apache/dubbo/samples/UserProvider.java
b/generic/java-server/src/main/java/org/apache/dubbo/samples/UserProvider.java
similarity index 95%
rename from
generic/java-server/java-server/src/main/java/org/apache/dubbo/samples/UserProvider.java
rename to
generic/java-server/src/main/java/org/apache/dubbo/samples/UserProvider.java
index 1c71776b..7794a866 100644
---
a/generic/java-server/java-server/src/main/java/org/apache/dubbo/samples/UserProvider.java
+++
b/generic/java-server/src/main/java/org/apache/dubbo/samples/UserProvider.java
@@ -38,7 +38,7 @@ public interface UserProvider {
User QueryUser(User user);
- List<User> QueryUsers(List<User> userObjectList);
+ User[] QueryUsers(User[] userObjectList);
Map<String, User> QueryAll();
}
\ No newline at end of file
diff --git
a/generic/java-server/java-server/src/main/java/org/apache/dubbo/samples/UserProviderImpl.java
b/generic/java-server/src/main/java/org/apache/dubbo/samples/UserProviderImpl.java
similarity index 98%
rename from
generic/java-server/java-server/src/main/java/org/apache/dubbo/samples/UserProviderImpl.java
rename to
generic/java-server/src/main/java/org/apache/dubbo/samples/UserProviderImpl.java
index 28159675..7622ad07 100644
---
a/generic/java-server/java-server/src/main/java/org/apache/dubbo/samples/UserProviderImpl.java
+++
b/generic/java-server/src/main/java/org/apache/dubbo/samples/UserProviderImpl.java
@@ -93,7 +93,7 @@ public class UserProviderImpl implements UserProvider {
}
@Override
- public List<User> QueryUsers(List<User> users) {
+ public User[] QueryUsers(User[] users) {
return users;
}
diff --git a/generic/java-server/src/main/resources/dubbo.properties
b/generic/java-server/src/main/resources/dubbo.properties
new file mode 100644
index 00000000..c0996395
--- /dev/null
+++ b/generic/java-server/src/main/resources/dubbo.properties
@@ -0,0 +1,7 @@
+dubbo.application.name=generic-java-server
+dubbo.registry.address=zookeeper://127.0.0.1:2181
+dubbo.protocols.triple.name=tri
+dubbo.protocols.triple.port=50052
+dubbo.service.org.apache.dubbo.samples.UserProvider.version=1.0.0
+dubbo.service.org.apache.dubbo.samples.UserProvider.group=triple
+dubbo.application.qos.enable=false
diff --git
a/generic/java-server/java-server/src/main/resources/log4j.properties
b/generic/java-server/src/main/resources/log4j.properties
similarity index 100%
rename from generic/java-server/java-server/src/main/resources/log4j.properties
rename to generic/java-server/src/main/resources/log4j.properties
diff --git a/start_integrate_test.sh b/start_integrate_test.sh
index c35db120..ac59d5bc 100755
--- a/start_integrate_test.sh
+++ b/start_integrate_test.sh
@@ -38,7 +38,7 @@ array+=("registry/nacos")
array+=("registry/etcd")
array+=("registry/polaris")
-# array+=("generic")
+array+=("generic")
# timeout
array+=("timeout")