Skip to content

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

@jockercheng91

Description

@jockercheng91

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    help wantedEverything needs help from contributors

    Type

    No type

    Projects

    Status

    Todo

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions