apache/dubbo

[Bug] Cannot directly call APISIX gateway via @DubboReference annotation (Triple protocol)

Open

#15968 opened on Jan 5, 2026

View on GitHub
 (4 comments) (0 reactions) (0 assignees)Java (41,524 stars) (26,453 forks)batch import
help wanted

Description

Pre-check

  • I am sure that all the content I provide is in English.

Search before asking

  • I had searched in the issues and found no similar issues.

Apache Dubbo Component

Java SDK (apache/dubbo)

Dubbo Version

  • Dubbo Version: 3.3.0

  • APISIX Version: Unknown (tested with HTTP/1.1 enabled)

  • JDK Version: 1.8.0_452

  • Framework: Spring Boot 2.7.18

  • Protocol: Triple (tri)

Steps to reproduce this issue

step1: Deploy APISIX Gateway and configure service discovery via Nacos Follow the official documentation to deploy APISIX and complete service discovery with Nacos: https://cn.dubbo.apache.org/zh-cn/blog/2024/04/22/%E4%BD%BF%E7%94%A8-apache-apisix-%E4%BB%A3%E7%90%86-dubbo-%E6%9C%8D%E5%8A%A1triple%E5%8D%8F%E8%AE%AE/ Key configurations:

  • APISIX listens on 10.216.23.40:8090.
  • Route rule: Proxy requests to /com.example.edu.initializer.samples.dubbo3.DemoService/* to the backend Dubbo Triple service (discovered via Nacos).

step2: Verify APISIX proxy works via curl Execute the following curl command and get a successful response:

curl http://10.216.23.40:8090/com.example.edu.initializer.samples.dubbo3.DemoService/sayHello -i

Curl response (successful):

HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 12
Connection: keep-alive
alt-svc: h2=":24395"
Server: APISIX/3.2.2

"Hello null"

step3:Call via @DubboReference annotation and trigger exception Consumer code with @DubboReference:

@DubboReference(
        interfaceClass = DemoService.class,
        protocol = "tri",
        url = "tri://10.216.23.40:8090/com.example.edu.initializer.samples.dubbo3.DemoService/sayHello"
)
private DemoService demoService;

Trigger the call in consumer application:

String result = demoService.sayHello("test");

exception happened:

Caused by: org.apache.dubbo.rpc.RpcException: java.util.concurrent.ExecutionException: org.apache.dubbo.rpc.StatusRpcException: CANCELLED
	at org.apache.dubbo.rpc.AsyncRpcResult.getAppResponse(AsyncRpcResult.java:181) ~[dubbo-3.3.0.jar:3.3.0]
	at org.apache.dubbo.rpc.AsyncRpcResult.recreate(AsyncRpcResult.java:246) ~[dubbo-3.3.0.jar:3.3.0]
	at org.apache.dubbo.rpc.proxy.InvocationUtil.invoke(InvocationUtil.java:64) ~[dubbo-3.3.0.jar:3.3.0]
	at org.apache.dubbo.rpc.proxy.InvokerInvocationHandler.invoke(InvokerInvocationHandler.java:81) ~[dubbo-3.3.0.jar:3.3.0]
	at com.iflytek.edu.initializer.samples.dubbo3.DemoServiceDubboProxy0.sayHello(DemoServiceDubboProxy0.java) ~[classes/:na]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_452]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_452]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_452]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_452]
	at org.apache.dubbo.config.spring.util.LazyTargetInvocationHandler.invoke(LazyTargetInvocationHandler.java:54) ~[dubbo-3.3.0.jar:3.3.0]
	at com.iflytek.edu.initializer.samples.dubbo3.DemoServiceDubboProxy0.sayHello(DemoServiceDubboProxy0.java) ~[classes/:na]
	at com.iflytek.edu.initializer.samples.dubbo3.consumer.base.ConsumerApplication.lambda$commandLineRunner$0(ConsumerApplication.java:34) [classes/:na]
	at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:765) [spring-boot-2.7.18.jar:2.7.18]
	... 14 common frames omitted
Caused by: java.util.concurrent.ExecutionException: org.apache.dubbo.rpc.StatusRpcException: CANCELLED
	at java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:357) ~[na:1.8.0_452]
	at java.util.concurrent.CompletableFuture.get(CompletableFuture.java:1908) ~[na:1.8.0_452]
	at org.apache.dubbo.rpc.AsyncRpcResult.getAppResponse(AsyncRpcResult.java:172) ~[dubbo-3.3.0.jar:3.3.0]
	... 26 common frames omitted
Caused by: org.apache.dubbo.rpc.StatusRpcException: CANCELLED
	at org.apache.dubbo.rpc.TriRpcStatus.asException(TriRpcStatus.java:260) ~[dubbo-3.3.0.jar:3.3.0]
	at org.apache.dubbo.rpc.protocol.tri.call.UnaryClientCallListener.onClose(UnaryClientCallListener.java:53) ~[dubbo-3.3.0.jar:3.3.0]
	at org.apache.dubbo.rpc.protocol.tri.call.TripleClientCall.onComplete(TripleClientCall.java:126) ~[dubbo-3.3.0.jar:3.3.0]
	at org.apache.dubbo.rpc.protocol.tri.call.TripleClientCall.onCancelByRemote(TripleClientCall.java:112) ~[dubbo-3.3.0.jar:3.3.0]
	at org.apache.dubbo.rpc.protocol.tri.call.TripleClientCall.onClose(TripleClientCall.java:143) ~[dubbo-3.3.0.jar:3.3.0]
	at org.apache.dubbo.common.threadpool.serial.SerializingExecutor.run(SerializingExecutor.java:105) ~[dubbo-3.3.0.jar:3.3.0]
	at org.apache.dubbo.common.threadpool.ThreadlessExecutor$RunnableWrapper.run(ThreadlessExecutor.java:151) ~[dubbo-3.3.0.jar:3.3.0]
	at org.apache.dubbo.common.threadpool.ThreadlessExecutor.waitAndDrain(ThreadlessExecutor.java:77) ~[dubbo-3.3.0.jar:3.3.0]
	at org.apache.dubbo.rpc.AsyncRpcResult.get(AsyncRpcResult.java:220) ~[dubbo-3.3.0.jar:3.3.0]
	at org.apache.dubbo.rpc.protocol.AbstractInvoker.waitForResultIfSync(AbstractInvoker.java:293) ~[dubbo-3.3.0.jar:3.3.0]
	at org.apache.dubbo.rpc.protocol.AbstractInvoker.invoke(AbstractInvoker.java:195) ~[dubbo-3.3.0.jar:3.3.0]
	at org.apache.dubbo.rpc.listener.ListenerInvokerWrapper.invoke(ListenerInvokerWrapper.java:71) ~[dubbo-3.3.0.jar:3.3.0]
	at org.apache.dubbo.rpc.filter.RpcExceptionFilter.invoke(RpcExceptionFilter.java:40) ~[dubbo-3.3.0.jar:3.3.0]
	at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CopyOfFilterChainNode.invoke(FilterChainBuilder.java:349) ~[dubbo-3.3.0.jar:3.3.0]
	at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CallbackRegistrationInvoker.invoke(FilterChainBuilder.java:197) ~[dubbo-3.3.0.jar:3.3.0]
	at org.apache.dubbo.rpc.protocol.ReferenceCountInvokerWrapper.invoke(ReferenceCountInvokerWrapper.java:106) ~[dubbo-3.3.0.jar:3.3.0]
	at org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker.invokeWithContext(AbstractClusterInvoker.java:412) ~[dubbo-3.3.0.jar:3.3.0]
	at org.apache.dubbo.rpc.cluster.support.FailoverClusterInvoker.doInvoke(FailoverClusterInvoker.java:82) ~[dubbo-3.3.0.jar:3.3.0]
	at org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker.invoke(AbstractClusterInvoker.java:366) ~[dubbo-3.3.0.jar:3.3.0]
	at org.apache.dubbo.rpc.cluster.router.RouterSnapshotFilter.invoke(RouterSnapshotFilter.java:46) ~[dubbo-3.3.0.jar:3.3.0]
	at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CopyOfFilterChainNode.invoke(FilterChainBuilder.java:349) ~[dubbo-3.3.0.jar:3.3.0]
	at org.apache.dubbo.monitor.support.MonitorFilter.invoke(MonitorFilter.java:109) ~[dubbo-3.3.0.jar:3.3.0]
	at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CopyOfFilterChainNode.invoke(FilterChainBuilder.java:349) ~[dubbo-3.3.0.jar:3.3.0]
	at org.apache.dubbo.rpc.cluster.filter.support.MetricsClusterFilter.invoke(MetricsClusterFilter.java:57) ~[dubbo-3.3.0.jar:3.3.0]
	at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CopyOfFilterChainNode.invoke(FilterChainBuilder.java:349) ~[dubbo-3.3.0.jar:3.3.0]
	at org.apache.dubbo.rpc.protocol.dubbo.filter.FutureFilter.invoke(FutureFilter.java:53) ~[dubbo-3.3.0.jar:3.3.0]
	at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CopyOfFilterChainNode.invoke(FilterChainBuilder.java:349) ~[dubbo-3.3.0.jar:3.3.0]
	at org.apache.dubbo.spring.security.filter.ContextHolderParametersSelectedTransferFilter.invoke(ContextHolderParametersSelectedTransferFilter.java:40) ~[dubbo-3.3.0.jar:3.3.0]
	at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CopyOfFilterChainNode.invoke(FilterChainBuilder.java:349) ~[dubbo-3.3.0.jar:3.3.0]
	at org.apache.dubbo.metrics.filter.MetricsFilter.invoke(MetricsFilter.java:86) ~[dubbo-3.3.0.jar:3.3.0]
	at org.apache.dubbo.rpc.cluster.filter.support.MetricsConsumerFilter.invoke(MetricsConsumerFilter.java:38) ~[dubbo-3.3.0.jar:3.3.0]
	at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CopyOfFilterChainNode.invoke(FilterChainBuilder.java:349) ~[dubbo-3.3.0.jar:3.3.0]
	at org.apache.dubbo.rpc.cluster.filter.support.ConsumerClassLoaderFilter.invoke(ConsumerClassLoaderFilter.java:40) ~[dubbo-3.3.0.jar:3.3.0]
	at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CopyOfFilterChainNode.invoke(FilterChainBuilder.java:349) ~[dubbo-3.3.0.jar:3.3.0]
	at org.apache.dubbo.rpc.cluster.filter.support.ConsumerContextFilter.invoke(ConsumerContextFilter.java:119) ~[dubbo-3.3.0.jar:3.3.0]
	at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CopyOfFilterChainNode.invoke(FilterChainBuilder.java:349) ~[dubbo-3.3.0.jar:3.3.0]
	at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CallbackRegistrationInvoker.invoke(FilterChainBuilder.java:197) ~[dubbo-3.3.0.jar:3.3.0]
	at org.apache.dubbo.rpc.cluster.support.wrapper.AbstractCluster$ClusterFilterInvoker.invoke(AbstractCluster.java:101) ~[dubbo-3.3.0.jar:3.3.0]
	at org.apache.dubbo.rpc.cluster.support.wrapper.MockClusterInvoker.invoke(MockClusterInvoker.java:107) ~[dubbo-3.3.0.jar:3.3.0]
	at org.apache.dubbo.rpc.cluster.support.wrapper.ScopeClusterInvoker.invoke(ScopeClusterInvoker.java:156) ~[dubbo-3.3.0.jar:3.3.0]
	... 25 common frames omitted

apisix acesslog:

172.16.12.131 - - [05/Jan/2026:23:18:37 +0800] - "PRI * HTTP/2.0" 400 229 0.270 "-" "-" - - - "://"

What you expected to happen

The @DubboReference annotation should correctly send Triple protocol requests (adapted to HTTP/1.1 via configuration) to the APISIX gateway, and successfully receive the response from the backend service.

Anything else

No response

Are you willing to submit a pull request to fix on your own?

  • Yes I am willing to submit a pull request on my own!

Code of Conduct

Contributor guide