小言_互联网的博客

如何使用http和Postman直接调用dubbo服务?

398人阅读  评论(0)

如何使用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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场