dubbo-go icon indicating copy to clipboard operation
dubbo-go copied to clipboard

java.lang.IllegalArgumentException: Service not found:org.xxx.api.service.DataSourceService, queryDataSource

Open Trae-Young opened this issue 1 year ago • 3 comments

Environment

  • Server: Java-server, dubbo version v3.0.14
  • Client: Dubbo-go, v3.1.1
  • Protocol: Dubbo
  • Registry: Nacos, v2.1.2

Issue description

我参考这个官网学习java-server和go-client互通。https://cn.dubbo.apache.org/zh-cn/overview/mannual/golang-sdk/tutorial/develop/interflow/call_java/

java侧:org/xxx/dao/entity/DataSource.java部分代码如下: package org.xxx.dao.entity; ... import java.io.Serializable; import java.util.Date;

public class DataSource implements Serializable { private int id; private int userId; private String userName; private String name; private String note; private DbType type; private String connectionParams; private Date createTime; private Date updateTime; private String fromType;

public DataSource() {
}

}

org.xxx.api.service.DataSourceService.java部分代码如下: package org.xxx.api.service; ... import org.xxx.dao.entity.DataSource; ... import java.net.UnknownHostException; import java.util.List; import java.util.Map;

public interface DataSourceService { ... Map<String, Object> queryDataSource(int id); ... }

代码中也有DataSourceService的实现类DataSourceServiceImpl.java,代码不做赘述 dubbo-provider.xml的配置如下: <dubbo:application name="${dubbo.applicationName}" > </dubbo:application> <dubbo:config-center address="${dubbo.nacos.registryAddress}" namespace="${dubbo.nacos.namespace}"/> <dubbo:metadata-report address="${dubbo.nacos.registryAddress}"> <dubbo:parameter key="namespace" value="${dubbo.nacos.namespace}"/> </dubbo:metadata-report> <dubbo:registry id="nacos" address="${dubbo.nacos.registryAddress}" username="${dubbo.nacos.username}" password="${dubbo.nacos.password}"> <dubbo:parameter key="namespace" value="${dubbo.nacos.namespace}"/> </dubbo:registry> <dubbo:protocol id="dubbo" name="dubbo" host="10.1.5.175" port="20010"/>

    <dubbo:service ref="dataSourceService" delay="5000" interface="org.xxx.api.service.DataSourceService" timeout="3000" registry="nacos" protocol="dubbo"/>
<bean id="dataSourceService" class="org.xxx.api.service.impl.DataSourceServiceImpl"/>

Dubbo-Go端: model/models.go package model

import ( "context" "fmt" "time" )

type DataSource struct { Id int hessian:"id" UserId int hessian:"userId" UserName string hessian:"userName" Name string hessian:"name" Note string hessian:"note" Type string hessian:"type" // Mapped from Java enum ConnectionParams string hessian:"connectionParams" CreateTime time.Time hessian:"createTime" UpdateTime time.Time hessian:"updateTime" FromType string hessian:"fromType" }

// JavaClassName returns the fully qualified class name of the Java class. func (d *DataSource) JavaClassName() string { return "org.xxx.dao.entity.DataSource" }

func (d DataSource) String() string { return fmt.Sprintf("DataSource{ID: %d, UserID: %d, UserName: %s, Name: %s, Note: %s, Type: %s, ConnectionParams: %s, CreateTime: %v, UpdateTime: %v, FromType: %s}", d.Id, d.UserId, d.UserName, d.Name, d.Note, d.Type, d.ConnectionParams, d.CreateTime, d.UpdateTime, d.FromType)

}

// DataSourceService is the interface for the DataSource service type DataSourceService struct { QueryDataSource func(ctx context.Context, id int) (*DataSource, error) dubbo:"queryDataSource" }

main.go代码如下: package main

import ( "Dubbo-Go/model" "context" "dubbo.apache.org/dubbo-go/v3/config" _ "dubbo.apache.org/dubbo-go/v3/imports" // 导入dubbo-go需要的所有默认包 hessian "github.com/apache/dubbo-go-hessian2" "github.com/dubbogo/gost/log/logger" ) var ( dataSourceService = &model.DataSourceService{} ) func main() { hessian.RegisterPOJO(&model.DataSource{}) config.SetConsumerService(dataSourceService) err := config.Load() if err != nil { panic(err) } logger.Infof("\n\ntest") test()

}

func test() { logger.Infof("开始测试调用 queryDataSource 方法")

id := 1
logger.Infof("即将调用 queryDataSource, ID: %d", id)
dataSources1, err := dataSourceService.QueryDataSource(context.TODO(), id)
if err != nil {
	logger.Errorf("调用 queryDataSource 失败: %v", err)
}
logger.Infof("response result: %v", dataSources1)

}

dubbogo.yml文件如下: dubbo: registries: nacos: protocol: nacos timeout: 60s address: nacos://10.1.5.230:8848 namespace: dubbogo username: nacos password: nacos protocols: "dubbo": name: "dubbo" port: 20010 address: 10.1.5.175 consumer: references: DataSourceService: protocol: dubbo interface: org.xxx.api.service.DataSourceService retries: 6 timeout: 6000 logger: zap-config: level: info

Logs

在执行go run main.go之后,Go端报错如下: 2024-08-22T16:49:56.275+0800 INFO Dubbo-Go/main.go:34 开始测试调用 queryDataSource 方法 2024-08-22T16:49:56.275+0800 INFO Dubbo-Go/main.go:39 即将调用 queryDataSource, ID: 1 2024-08-22T16:49:56.276+0800 INFO impl/codec.go:169 response with exception: {SerialID:2 Type:36 ID:4 BodyLen:1085 ResponseStatus:40} 2024-08-22T16:49:56.277+0800 INFO impl/codec.go:169 response with exception: {SerialID:2 Type:36 ID:6 BodyLen:1085 ResponseStatus:40} 2024-08-22T16:49:56.278+0800 WARN proxy/proxy.go:212 [CallProxy] received rpc err: Failed to invoke the method queryDataSource in the service org.xxx.api.service.DataSourceService. Tried 1 times of the providers [dubbo://:@10.1.5.175:20010/?interface=org.xxx.api.service.DataSourceService&group=&version= dubbo://:@10.1.5.175:20010/?interface=org.xxx.api.service.DataSourceService&group=&version=] (2/1)from the registry service-discovery-registry://nacos:[email protected]:8848?registry=nacos&registry.group=&registry.label=true&registry.namespace =dubbogo&registry.preferred=false&registry.role=0&registry.timeout=60s&registry.ttl=15m&registry.weight=0&registry.zone=&remote-client-name=dubbo.registries-nacos-10.1.5.230%3A8848&simplified=false on the consumer 192.168.146.1 using the dubbo version 3.0.4. Last error is java exception:Fail to decode request due to: java.lang.IllegalArgumentException: Service not found:org.xxx.api.service.DataSourceService, queryDataSource java.lang.IllegalArgumentException: Service not found:org.xxx.api.service.DataSourceService, queryDataSource at org.apache.dubbo.rpc.protocol.dubbo.DecodeableRpcInvocation.decode(DecodeableRpcInvocation.java:204) at org.apache.dubbo.rpc.protocol.dubbo.DecodeableRpcInvocation.decode(DecodeableRpcInvocation.java:92) at org.apache.dubbo.remoting.transport.DecodeHandler.decode(DecodeHandler.java:60) at org.apache.dubbo.remoting.transport.DecodeHandler.received(DecodeHandler.java:44) at org.apache.dubbo.remoting.transport.dispatcher.ChannelEventRunnable.run(ChannelEventRunnable.java:59) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.dubbo.common.threadlocal.InternalRunnable.run(InternalRunnable.java:41) at java.lang.Thread.run(Thread.java:750) .: java exception:Fail to decode request due to: java.lang.IllegalArgumentException: Service not found:org.xxx.api.service.DataSourceService, queryDataSource java.lang.IllegalArgumentException: Service not found:org.xxx.api.service.DataSourceService, queryDataSource at org.apache.dubbo.rpc.protocol.dubbo.DecodeableRpcInvocation.decode(DecodeableRpcInvocation.java:204) at org.apache.dubbo.rpc.protocol.dubbo.DecodeableRpcInvocation.decode(DecodeableRpcInvocation.java:92) at org.apache.dubbo.remoting.transport.DecodeHandler.decode(DecodeHandler.java:60) at org.apache.dubbo.remoting.transport.DecodeHandler.received(DecodeHandler.java:44) at org.apache.dubbo.remoting.transport.dispatcher.ChannelEventRunnable.run(ChannelEventRunnable.java:59) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.dubbo.common.threadlocal.InternalRunnable.run(InternalRunnable.java:41) at java.lang.Thread.run(Thread.java:750)

2024-08-22T16:49:56.278+0800 ERROR Dubbo-Go/main.go:42 调用 queryDataSource 失败: java exception:Fail to decode request due to: java.lang.IllegalArgumentException: Service not found:org.xxx.api.service.DataSourceService, queryDataSource java.lang.IllegalArgumentException: Service not found:org.xxx.api.service.DataSourceService, queryDataSource at org.apache.dubbo.rpc.protocol.dubbo.DecodeableRpcInvocation.decode(DecodeableRpcInvocation.java:204) at org.apache.dubbo.rpc.protocol.dubbo.DecodeableRpcInvocation.decode(DecodeableRpcInvocation.java:92) at org.apache.dubbo.remoting.transport.DecodeHandler.decode(DecodeHandler.java:60) at org.apache.dubbo.remoting.transport.DecodeHandler.received(DecodeHandler.java:44) at org.apache.dubbo.remoting.transport.dispatcher.ChannelEventRunnable.run(ChannelEventRunnable.java:59) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.dubbo.common.threadlocal.InternalRunnable.run(InternalRunnable.java:41) at java.lang.Thread.run(Thread.java:750)

main.test E:/GoCode/Dubbo-Go/main.go:42 main.main E:/GoCode/Dubbo-Go/main.go:29 runtime.main D:/GO/src/runtime/proc.go:250 2024-08-22T16:49:56.279+0800 INFO Dubbo-Go/main.go:44 response result: DataSource{ID: 0, UserID: 0, UserName: , Name: , Note: , Type: , ConnectionParams: , CreateTime: 0001-01-01 00:00:00 +0000 UTC, UpdateTime: 0001-01-01 00:00:00 +0000 UTC, FromType: }

我的java端日志如下: [WARN] 2024-08-22 16:49:56.281 +0800 org.apache.dubbo.rpc.protocol.dubbo.DecodeableRpcInvocation:[95] - [DUBBO] Decode rpc invocation failed: Service not found:org.xxx.api.service.DataSourceService, queryDataSource, dubbo version: 3.0.14, current host: 10.1.5.175 java.lang.IllegalArgumentException: Service not found:org.xxx.api.service.DataSourceService, queryDataSource at org.apache.dubbo.rpc.protocol.dubbo.DecodeableRpcInvocation.decode(DecodeableRpcInvocation.java:204) at org.apache.dubbo.rpc.protocol.dubbo.DecodeableRpcInvocation.decode(DecodeableRpcInvocation.java:92) at org.apache.dubbo.remoting.transport.DecodeHandler.decode(DecodeHandler.java:60) at org.apache.dubbo.remoting.transport.DecodeHandler.received(DecodeHandler.java:44) at org.apache.dubbo.remoting.transport.dispatcher.ChannelEventRunnable.run(ChannelEventRunnable.java:59) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.dubbo.common.threadlocal.InternalRunnable.run(InternalRunnable.java:41) at java.lang.Thread.run(Thread.java:750) [INFO] 2024-08-22 16:49:56.293 +0800 org.apache.dubbo.remoting.transport.netty4.NettyServerHandler:[90] - [DUBBO] The connection of /10.1.5.175:59577 -> /10.1.5.175:20010 is disconnected., dubbo version: 3.0.14, current host: 10.1.5.175 [INFO] 2024-08-22 16:49:56.293 +0800 org.apache.dubbo.remoting.transport.netty4.NettyServerHandler:[90] - [DUBBO] The connection of /10.1.5.175:59579 -> /10.1.5.175:20010 is disconnected., dubbo version: 3.0.14, current host: 10.1.5.175 [WARN] 2024-08-22 16:49:56.293 +0800 org.apache.dubbo.remoting.transport.AbstractServer:[182] - [DUBBO] All clients has disconnected from /10.1.5.175:20010. You can graceful shutdown now., dubbo version: 3.0.14, current host: 10.1.5.175 [INFO] 2024-08-22 16:49:56.293 +0800 org.apache.dubbo.remoting.transport.netty4.NettyServerHandler:[90] - [DUBBO] The connection of /10.1.5.175:59578 -> /10.1.5.175:20010 is disconnected., dubbo version: 3.0.14, current host: 10.1.5.175

具体情况如上:这个报错查阅相关资料后,能力有限,依旧是无法解决java.lang.IllegalArgumentException: Service not found:org.xxx.api.service.DataSourceService, queryDataSource

Trae-Young avatar Aug 22 '24 09:08 Trae-Young

  • Server: Java-server, dubbo version v3.0.14
  • Client: Dubbo-go, v3.1.1
  • Protocol: Dubbo
  • Registry: Nacos, v2.1.2

Trae-Young avatar Aug 22 '24 09:08 Trae-Young

You can refer to dubbo-go-sample

FinalT avatar Aug 22 '24 11:08 FinalT

You can refer to dubbo-go-sample

I want my java programs to stay the same. Hopefully we solve problems of the go programs.

Trae-Young avatar Aug 23 '24 03:08 Trae-Young

@yangzerui

AlexStocks avatar Mar 16 '25 12:03 AlexStocks

Type Mismatch Issue in QueryDataSource Method

After debugging and reproducing the issue in my code, I've identified the problem within the QueryDataSource method:

QueryDataSource func(ctx context.Context, id int) (*DataSource, error) dubbo:"queryDataSource"

The root cause is a type mismatch: In Go, both int and int64 are typically 8 bytes, while in Java, the int type is only 4 bytes. This discrepancy prevents Java from correctly identifying the method for invocation.

Solution: Change the int parameter to int32 in the Go method.

QueryDataSource func(ctx context.Context, id int32) (*DataSource, error) dubbo:"queryDataSource"

This modification should resolve the type compatibility issue.

Enum Representation in Go

I noticed that the Java enum types you've defined are represented as strings in Go:

Type string hessian:"type" // Mapped from Java enum

To address this and ensure proper enum handling in Go, I recommend utilizing the enum generation tool provided in the dubbo-go-hessian2 repository.

You can find the tool and instructions here: dubbo-go-hessian2 enum generation tool

Using this tool will enable you to correctly represent and utilize enums in your Go code. This will improve type safety and code clarity.

Similarityoung avatar Apr 03 '25 12:04 Similarityoung