weibocom / motan-php

83 stars 30 forks source link

php客户端java服务序列化问题 #3

Closed dreamshit closed 6 years ago

dreamshit commented 6 years ago

服务提供方: java 服务调用方: php 两种情况: 1、服务提供方无法处理请求参数; 2、服务调用方无法解析返回结果 1: java服务方法

    public String sayHello(String name) {
        System.out.println("name: " + name);
        return "hello " + "GD" + " !";
    }

php调用

$rs = $cx->sayHello(['name'=>'']);

异常:

{"errcode":400,"errmsg":"call fail over 3 times.Exception:process request fail. errmsg:error_message: SimpleSerialization not support type:class java.lang.String, status: 503, error_code: 10001,r=-2620754180148297728","errtype":1}Motan\Protocol\Header Object
(
    [_magic:Motan\Protocol\Header:private] => 61937
    [_msg_type:Motan\Protocol\Header:private] => 1
    [_version_status:Motan\Protocol\Header:private] => 9
    [_serialize:Motan\Protocol\Header:private] => 8
    [_request_id:Motan\Protocol\Header:private] => 1.5825989893561E+19
)
Array
(
    [M_e] => {"errcode":400,"errmsg":"call fail over 3 times.Exception:process request fail. errmsg:error_message: SimpleSerialization not support type:class java.lang.String, status: 503, error_code: 10001,r=-2620754180148297728","errtype":1}
)

2: java服务方法

    public String sayHello() {
        return "hello GD !";
    }

php调用同1,可以调用到服务,并返回结果,但是php无法解析 异常

PHP Fatal error:  Uncaught Exception: Fail to Decode response body, got a no support type! in /home/wwwroot/zepra.com/motan/src/Motan/Serialize/Motan.php:104
Stack trace:
#0 /home/wwwroot/zepra.com/motan/src/Motan/Endpointer.php(96): Motan\Serialize\Motan->deserialize(NULL, '\nhello GD !')
#1 /home/wwwroot/zepra.com/motan/src/Motan/Client.php(102): Motan\Endpointer->call()
#2 /home/wwwroot/zepra.com/motan/test.php(13): Motan\Client->__call('sayHello', Array)
#3 {main}
  thrown in /home/wwwroot/zepra.com/motan/src/Motan/Serialize/Motan.php on line 104

Motan.php 104行 type为10

dreamshit commented 6 years ago

java端服务:采用硬编码形式提供服务; php端调用:安装motan-go,启动的agent,配置服务形式; 采用zookeeper注册中心, 协议motan2 是否需要贴java服务启动代码和agent配置文件(协议:motan2,序列化:simple)?

dreamshit commented 6 years ago

换了下java端参数的形式,使用Map可以正常接收,但是我看Simple序列化中是支持String/Map/byte[]的。我看源码中是会判断instanceof String的,但是还是会到异常中提示个obj的类型是:java.lang.String

dreamshit commented 6 years ago

回复内容Motan.php的104行还是无法解析, java返回String:

Motan/Endpointer.php(96): Motan\Serialize\Motan->deserialize(NULL, '\nhello GD !')

java返回Map:

Motan/Endpointer.php(96): Motan\Serialize\Motan->deserialize(NULL, 'H\x04name\nhello GD...')

java返回utf-8编码byte[]

Motan/Endpointer.php(96): Motan\Serialize\Motan->deserialize(NULL, '*hello GD !')
idevz commented 6 years ago

@dreamshit 你的问题 1 中,Java 服务端定义的方法参数为 string public String sayHello(String name),但是你 PHP 调用的时候,确是 sayHello(['name'=>'']) map,所以报错 SimpleSerialization not support type:class java.lang.String。 你的问题 2 ,我这里复现不出来,但是请确保你客户端调用的方法传参与服务端定义的形参保持一致。 另外你可以参考我们 Motan 生态的一个 motan-example项目,里面有所有 Motan 支持的跨语言调用,以及 Weibo-Mesh 的用例。

dreamshit commented 6 years ago

@idevz 谢谢你的回复。第一个问题我去咨询了公司php同事,确实是错误的。第二个问题。感谢example项目,我发现我的问题并正常处理了。问题原因:原来只是java之间的rpc调用。服务端没有设置setSerialization。加上后可正常调用。 再次感谢