motan/dubbo支持负载均衡、zookeeper有集群的概念、zookeeper似乎也能做负载均衡,这3者是什么关系呢?
先说zooKeeper,我们都知道在与分布式框架motan/dubbo等联合使用时,zookeeper的基本功能是做注册中心,也就是多个服务提供方,将自己发布到zookeeper上。这样,服务的消费方就可以不直接硬编码服务提供方的地址,而是通过zookeeper,使用服务名称(就是一个字符串)查找到服务,从而调用服务提供方的方法。
从这个原理上说,似乎通过zookeeper来实现负载均衡是顺理成章的 —— 在zookeeper上注册多个相同功能的服务,消费方调用时,只需要通过zookeeper控制一下提供哪个服务即可(轮询、加权轮询、最小负载、IPHash...),这就实现了web层的负载均衡。
这个理解是对的。不过,当zookeeper与motan、dubbo这些框架联合使用时,一般就没有必要这么做了,可直接使用这些框架提供的负载均衡能力即可。原因,
1. zookeeper并未提供现成的负载均衡功能,只是提供了存储/注册服务、查找服务的功能,负载均衡对zookeeper来说是上层应用,需要服务实现方和消费方自己实现。理论上来说,不用zookeeper,用redis、数据库、map之类的,也完全可以达到同样的目的,只有可以存储多个服务标记,并可以通过标记查找到服务就可以自己在应用层做软负载了。
2. motan、dubbo本身就提供的负载均衡的能力,这个甚至不需要编码,只需要在配置文件中配置一下即可。
zookeeper集群是什么概念呢?
zookeeper集群是为了解决zookeeper自己单点的问题,也就是: zookeeper是注册中心,很重要,那要是zookeeper自己挂了怎么办?为了防止一个zookeeper挂了导致整个系统无法正常调用服务,可以用多个zookeeper来组成集群,一个挂了,还有别的。因此,zookeeper集群与负载均衡是没有关系的。