如何使用http直接调用dubbo服务?
我们都知道dubbo服务默认是dubbo协议,如果我们使用http直接调用dubbo服务,需要把协议改为http,如下图
我们在官方的提供的项目demo模块中,把privoder.xml中protocol改为http协议,以及http服务器改为Tomcat(默认是Jetty) 然后我们启动
启动Privoder类,我们这里启动成功,注册一个DemoService实现类
我们启动消费者,使用自己封装好的http去直接去调用
这里我们已经就调用成功,并且输出了返回值,我们这里生成了一个代理对象,并且执行了sayHello方法,我们去看一下代理是如何实现的
我们实现InvocationHandler接口并实现他的invoke方法
我们方法里面调用了一些方法,我们去大致看一下这些方法,首先是checkParam方法
里面去检查了一些参数,然后并把这些值赋值给了对象本身,这里不多说了,继续看createRemoteInvocation方法
这个方法比较重要,他给我们创建了一个RemoteInvocation对象
这个对象非常重要,我们先看看他的结构
解释一下这三个属性
methodName:其实就是我们调用远程方法的名称
parameterTypes:这个是调用远程方法参数的Class类型数组
arguments:这个就是调用远程方法所传递的参数值
接着继续看上面我们的赋值,我们创建RemoteInvocation对象的时候,我们把当前调用的方法以及调用的参数类型及参数值已经set进去了,然后我们只需要把当前对象序列化传递给服务器就可以了,继续看代码
我们这里创建了Http请求连接,url为服务器ip+需要调用的类Class路径名称(http://192.168.0.108:20880/com.alibaba.dubbo.demo.DemoService)
继续往后面走
这里很重要,这里我们把上面创建的RemoteInvocation对象通过ObjectOutputStream对象序列化了,并使用http的OutputStream流写入了进去,然后我们建立连接,发送数据到服务器
处理结果,服务器返回数据,我们使用ObjectInputStream反序列化读取数据,其实服务器返回给我的对象是RemoteInvocationResult
,我们可以看看这个对象
value值就是服务器处理以后的结果,服务器是在哪里处理的呢
然后进去
总结下:
dubbo使用http协议,序列化使用的是ObjectOutputStream序列化
反序列化使用的是ObjectInputStream,客户端发起调用的对象是RemoteInvocation,服务器返回的对象是RemoteInvocationResult
思考下:
因为现在我们使用的是JDK自带的API序列化和反序列化,使用其他语言是无法调用的,那我们如何使用其他语言调用呢?是否我们可以把序列化和反序列化改为Json格式?这样是否可以实现跨语言调用呢?同学们!
事实上是可以的:
我这里使用Postman调用dubbo服务,现在已经调用成功了,而且也返回了结果
改造过程
其实就是把HttpProtocol序列化和反序列化改为Json即可
转载:https://blog.csdn.net/qq_30447037/article/details/109957439