文章目录
dubbo-zk-demo
https://github.com/2NaCl/dubbo-demo
我们一般调用一个jvm里的类或者方法,往往都是直接new,然后调用,但是dubbo的意义在于,可以让我们去调用到在不同jvm中的方法,只通过new就肯定做不到了,它会提示我们找不到对应的方法。
咱们先不说dubbo的事,就说我们如果想实现,调用不同工程的api,我们有这样几个方法:
- 复制粘贴要用到的类过去
- 给要用的类的工程打包,然后Add as Library
- Socket网络传输
Socket网络传输
前两个不说了,很简单很基础,至于第三个,我们都学过java.net.Socket,最简单的,实现TCP BIO NIO就要用,但是太慢了,而且Socket还是遵循osi模型。从本质来讲,Socket是应用层和传输层之间的一层api封装。
所以我们就知道了,也可以用应用层的协议,也就是Http协议,更底层的也就是传输层协议,但是因为太底层了,所以一般都进行封装了,也就是Socket。
一般我们使用Socket的时候,都需要建立一个Client端,一个Server端。
在Client端,我们一般会Socket(ip,port),然后getIO()
在Server端,我们一般会监听端口,ServerSocket(port),然后接受请求,socket=server.accept(),同时getIO();
但是也有一个问题,假如我们要传输一个class,进行传输的话,我们的对象是无法被直接被传输的,就需要你Serializable一下才行。
结论就是:利用Socket调用远端方法,需要一个序列化的过程,而我们如果需要调用远端的api,并且启动多线程服务,就需要写很多繁琐的代码,所以我们就可以使用到一个叫做RMI(Remote Method Invocation) 的东西。它可以帮助我们进行封装调用远程的方法。
Socket问题所在
但是还是有一个问题存在:
假如我们客户端是C语言,服务端是java语言,那么Socket,肯定就不行了,传输层协议不行的话,就要使用http协议了,因为http协议是与语言无关的,每一个语言都有相关的封装。
那么要如何做到呢?
序列化?
你确定能反序列化解析成功?
不可能的,所以我们就要考虑其他方法
那就是将序列化的二级制字节流的格式转换成一种其他的格式
比如说,xml?
其实看看一般的网页的格式就知道了,xml是可以携带数据的,并且xml作为一种通用数据格式也是适合多语言远程通讯的
我们将以xml为数据格式的http协议网络通信称之为: WebService
WebService
既然我们使用了http+xml进行网络传输,那么就必然要好好分析一下了。
首先,网络传输时可以的,那么传输内容呢?
假如我们只想传id=1,但是xml格式就变成了
<property name="id" value="1"/>
无疑,这样很臃肿,很多没用的东西也在里面,那么效率就低了,所以xml这种格式,也就不行了
没错,json比xml好太多了
所以我们最终的手段是使用的http+json进行远程调用
最终,我们将这种远程网络通信的行为,不论是Socket,WebService,http+json,统称为RPC
RPC
从上面我们也知道了,RPC不是框架,不是架构,是一种远程网络通讯的思想,实现端到端的通信。
那么,常见的实现RPC的几种方式有Dubbo Dubbox(当当网的Dubbo二次开发) Motan(新浪网的RPC框架) GRPC Thrift
在这里说一下springcloud,和dubbo那些还是有些区别的,上面几种都是基于RPC的远程调用,而springcloud是基于http的restful api。
这里主要说一下dubbo
Dubbo
我们原本是使用的socket进行一个暴力通信,而Dubbo更像是一个封装,不过也肯定还是用一个调用请求的过程,除此之外还要有以下的功能:
- 首先会将服务端的ip登记维护到一个固定的版块
- 然后客户端去按照规则去找到ip
- ip反馈回来获取到
- 通过socket实现远程通讯
然后将全程相关等操作记录到Monitor内部,方便修改错误,但也不能只出错不预防,所以还要有容错机制,可以是重新请求,继续等待等等,这些都封装在了dubbo内部。
以上整体来说是Dubbo的架构思路。
而Dubbo的功能是什么呢,它是,高性能、轻量级,基于java RPC的框架。Dubbo提供了三个关键的功能:基于接口的远程连接,容错机制&负载均衡,服务注册和发现的自动化。
具体Demo代码可以看最上面的github地址。
单纯使用Dubbo已经可以完成了远程通信,但是我们是否可以对其进行一定的优化呢?
利用Zookeeper辅助Dubbo完成监听
上面我们简单说了Dubbo的架构和作用,但是如果实际实现的话,在注册ip的方面,其实是有很多方法可以去实现的,比如map,但是要知道,有的时候ip是会失效宕机的,这就要再手动完成一个Monitor的程序,就会很麻烦,所以我们可以借助Zookeeper
我们都知道Zookeeper拥有心跳机制,可以监察到是否这个节点还活着,所以我们就可以借助zk来完成监听了。
然后可以借助源码来看一看,在最上方贴出了。