Skip to content

Commit 4f5ca88

Browse files
authored
fix: ignore params type of StreamObserver (#15450)
* fix: ignore params type of StreamObserver * code format * rm test file * code format * fix: add the match logic of proto service with params type of StreamObserver * fix: support server stream only * fix: support server stream only * code format
1 parent f7553a0 commit 4f5ca88

5 files changed

Lines changed: 58 additions & 1 deletion

File tree

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
## 1. startup
2+
3+
1. run the maven plugin `dubbo:compile`, generate protobuf java file.
4+
2. run `ProviderApplication`
5+
6+
## 2. http request
7+
8+
### 2.1 sample request
9+
10+
```shell
11+
curl -v -d '{"name":"dubbo"}' -H 'Content-Type: application/json' http://127.0.0.1:50051/org.apache.dubbo.demo.hello.GreeterService/sayHello
12+
```
13+
14+
### 2.2 request async
15+
16+
```shell
17+
curl -v -d '{"name":"dubbo async"}' -H 'Content-Type: application/json' http://127.0.0.1:50051/org.apache.dubbo.demo.hello.GreeterService/sayHelloAsync
18+
```
19+
20+
### 2.3 server stream
21+
22+
```shell
23+
curl -v -d '{"name":"dubbo"}' -H 'Content-Type: application/json' http://127.0.0.1:50051/org.apache.dubbo.demo.hello.GreeterService/sayHelloStream
24+
```

dubbo-demo/dubbo-demo-spring-boot-idl/dubbo-demo-spring-boot-idl-provider/src/main/java/org/apache/dubbo/springboot/idl/demo/provider/GreeterServiceImpl.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,14 @@
1616
*/
1717
package org.apache.dubbo.springboot.idl.demo.provider;
1818

19+
import org.apache.dubbo.common.stream.StreamObserver;
1920
import org.apache.dubbo.config.annotation.DubboService;
2021
import org.apache.dubbo.demo.hello.GreeterService;
2122
import org.apache.dubbo.demo.hello.HelloReply;
2223
import org.apache.dubbo.demo.hello.HelloRequest;
2324

2425
import java.util.concurrent.CompletableFuture;
26+
import java.util.concurrent.TimeUnit;
2527

2628
import org.slf4j.Logger;
2729
import org.slf4j.LoggerFactory;
@@ -45,6 +47,22 @@ public CompletableFuture<HelloReply> sayHelloAsync(HelloRequest request) {
4547
HelloReply.newBuilder().setMessage("Hello " + request.getName()).build());
4648
}
4749

50+
@Override
51+
public void sayHelloStream(HelloRequest request, StreamObserver<HelloReply> responseObserver) {
52+
LOGGER.info("Received sayHelloStream request: {}", request.getName());
53+
for (int i = 0; i < 5; i++) {
54+
try {
55+
TimeUnit.SECONDS.sleep(1);
56+
} catch (InterruptedException e) {
57+
responseObserver.onError(e);
58+
}
59+
responseObserver.onNext(HelloReply.newBuilder()
60+
.setMessage(i + "# Hello " + request.getName())
61+
.build());
62+
}
63+
responseObserver.onCompleted();
64+
}
65+
4866
private static HelloReply toReply(String message) {
4967
return HelloReply.newBuilder().setMessage(message).build();
5068
}

dubbo-demo/dubbo-demo-spring-boot-idl/dubbo-demo-spring-boot-idl-provider/src/main/proto/helloworld.proto

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,5 @@ message HelloReply {
3232
service GreeterService {
3333
// Sends a greeting.
3434
rpc sayHello(HelloRequest) returns (HelloReply);
35+
rpc sayHelloStream(HelloRequest) returns (stream HelloReply);
3536
}

dubbo-demo/dubbo-demo-spring-boot-idl/pom.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,10 @@
7777
<groupId>com.google.protobuf</groupId>
7878
<artifactId>protobuf-java</artifactId>
7979
</dependency>
80+
<dependency>
81+
<groupId>com.google.protobuf</groupId>
82+
<artifactId>protobuf-java-util</artifactId>
83+
</dependency>
8084
<dependency>
8185
<groupId>org.apache.logging.log4j</groupId>
8286
<artifactId>log4j-slf4j-impl</artifactId>

dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/mapping/DefaultRequestMappingRegistry.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import org.apache.dubbo.common.URL;
2020
import org.apache.dubbo.common.logger.FluentLogger;
21+
import org.apache.dubbo.common.stream.StreamObserver;
2122
import org.apache.dubbo.common.utils.ClassUtils;
2223
import org.apache.dubbo.config.context.ConfigManager;
2324
import org.apache.dubbo.config.nested.RestConfig;
@@ -31,6 +32,7 @@
3132
import org.apache.dubbo.rpc.model.ReflectionMethodDescriptor;
3233
import org.apache.dubbo.rpc.model.ReflectionServiceDescriptor;
3334
import org.apache.dubbo.rpc.model.ServiceDescriptor;
35+
import org.apache.dubbo.rpc.model.StubServiceDescriptor;
3436
import org.apache.dubbo.rpc.protocol.tri.DescriptorUtils;
3537
import org.apache.dubbo.rpc.protocol.tri.TripleProtocol;
3638
import org.apache.dubbo.rpc.protocol.tri.rest.Messages;
@@ -48,6 +50,7 @@
4850

4951
import java.lang.reflect.Method;
5052
import java.util.ArrayList;
53+
import java.util.Arrays;
5154
import java.util.Collection;
5255
import java.util.IdentityHashMap;
5356
import java.util.LinkedList;
@@ -129,7 +132,14 @@ public void register(Invoker<?> invoker) {
129132
RequestMapping classMapping = resolver.resolve(serviceMeta);
130133
consumer.accept((methods) -> {
131134
Method method = methods.get(0);
132-
MethodDescriptor md = sd.getMethod(method.getName(), method.getParameterTypes());
135+
Class<?>[] paramTypes = method.getParameterTypes();
136+
MethodDescriptor md = sd.getMethod(method.getName(), paramTypes);
137+
if (md == null && sd instanceof StubServiceDescriptor) {
138+
int len = paramTypes.length;
139+
if (len > 0 && StreamObserver.class.isAssignableFrom(paramTypes[len - 1])) {
140+
md = sd.getMethod(method.getName(), Arrays.copyOf(paramTypes, len - 1));
141+
}
142+
}
133143
MethodMeta methodMeta = new MethodMeta(methods, md, serviceMeta);
134144
if (!resolver.accept(methodMeta)) {
135145
return;

0 commit comments

Comments
 (0)