这次说个在大型项目比较常见的东西,就是分布式,分布式到底是个什么东西呢?概念太大,不好说,就像刚学javaee的人问你,什么是web啊,什么是spring啊等等,你可能觉得,这个东西我好像知道,但是用口头语言就是不好描述,这很正常!
其实,用一两次就知道了,然后你再慢慢看那些大神的原理和文字描述。
1.简要说说分布式
在这里,我就大白话大概说一说分布式是个什么鬼,也不知道对不对,详细的可以多在博客园查查相关的内容。
分布式,看名字就知道应该是要把什么东西分开布置,对于我们新手来说,那就是把所谓的web应用分开,那为什么要分开呢?写在一起部署在一台服务器多好啊,容易开发,又好维护。。。
这其实也是早期的一种方式,所有的都布置在一台服务器上。但是时代在进步,现在人手一个手机甚至多个手机,还有电脑,平板什么的,都去访问一个网站,这么高的访问量、高并发量很容易一下子就把一台服务器卡爆了,然后很多数据就会丢失,用户体验很差,最后造成用户流失,各种问题。就像淘宝,百度等这种,你很难想象如果是一台服务器,那这台服务器那要多牛才能满足几千万甚至上亿的访问量。
现在摆在明面上的修改方案有两个:
1.我很有钱,我去买一个非常牛的服务器或者话很多钱把原来的服务器升级,性能是原来的菜鸡服务器的两三倍甚至更高(这种方式也叫做纵向扩展)。
2.只有一点钱,再买一个菜鸡服务器2号,想办法把原来的那个web应用的一部分布置到这个菜鸡服务器2号上,然后再想个办法使得一些请求到原来的服务器上之后,实际上就会调用菜鸡服务器2号上的一些功能。(这也叫做横向扩展)
两种方式虽然各有优缺点:第一种方案最大的缺点是要花很多很多钱,有的时候,将性能提升一倍,花的钱都够再买几台这样的服务器了!最重要的是,这种方案是有天花板的、有瓶颈的,你还真能一直升级服务器性能么;优点就不多说,就用起来很方便,方便维护管理,开发也比较容易。
方案二的缺点是开发的难度就提升了很多,而且类似淘宝这种超大型项目,可不是一两台服务器,可能是十几台甚至几十台服务器的相互配合,维护起来也是各种困难,而且还有可能服务器之间还要相互依赖,就更为复杂了。优点却是更明显,就是性能提升无上限,你只要有这个技术水平,可以买几百台菜鸡服务器组合成分布式系统,那个性能可比最顶级的服务器高了不知道多少。
所以我们现在的问题就是怎么样使得两台服务器可以相互调用,举个例子:我在一个服务器写个controller,另外一个服务器写个service,现在就用这个controller调用service中的方法;只要这个可以成功调用,那最基本的分布式原理就懂了一点点了。
这里先理清楚一个逻辑:controller是使用别人方法的一方,而service是提供方法的一方;于是我们就称controller为服务的消费者,service成为服务的提供者。
ok,分布式系统的大概原理到这里结束,更专业的解释去看看那些大牛的博客吧!
2.什么是Zookeeper+Dubbo组合
先说Zookeeper,上文说过服务提供者和服务消费者的概念,但是你要知道服务提供者可不止那一个,而是很多很多的,假如有几百个,一部分在这台服务器,一部分在另外一台服务器里,还有一些在其他服务器里,这个时候问题来了,服务消费者要消费服务,怎么判断在哪个服务器里,你总不可能自己手动的一个一个去找吧?那就太坑爹了。
于是就有了一个Zookeeper的存在,这个单词的百度翻译是"动物园管理员",还真的有点形象,其实就是管理所有服务的管理员,只要服务提供者将自己的服务注册到Zookeeper里,服务消费者订阅了自己需要的服务;Zookeeper就能把详细的服务列表推送给服务消费者, 而且一旦服务提供者发生变化,那么Zookeeper就会自动更新自己的服务列表,并且将最新的服务列表推送给服务消费者。
有点类似于那个啥婚介所,假如一个帅哥要找女朋友,帅哥就是服务消费者,要找的女朋友就是服务提供者,而婚介所不就是Zookeeper嘛,婚介所时刻更新妹纸的最新消息,一旦有什么最新情况,肯定就会把最新情况告诉帅哥啊!哈哈哈,稍提一下
那么Dubbo又是什么呢?刚刚说到Zookeeper把最新服务列表给了服务消费者,但是服务消费者也是只看眼巴巴的看着这么多的服务,却用不了(就像去酒店点菜,看着那个菜单你能把菜单给吃了吗?),需要Dubbo里面的功能才能实现远程调用,也就是用RPC远程过程调用协议才能够调用远处的服务器里的服务。
在这里稍提一下,Dubbo是一个开源分布式框架,它的功能可以简单的看作将服务提供者注册进Zookeeper中,指定Zookeeper所在的ip地址,让服务订阅者订阅Zookeeper中的服务,还能够让服务消费者远程调用服务,以及监控等等。。。用中学语文来描述,应该叫做贯穿全文,哈哈!
下面这个图可以大概看一看流程:
3.下载并启动Zookeeper
Zookeeper的详细知识就不在这里介绍了,博客园里搜一下有很多,可以自己慢慢学习,这里只是用一下。
Zookeeper安装方式有三种:单机模式(就一个Zookeeper),伪集群模式(一台电脑下载多个Zookeeper),集群模式(多台电脑每台都下载Zookeeper)
我们就用单机模式直观一点:
下载地址:http://mirror.bit.edu.cn/apache/zookeeper/,我下载的是3.4.13版本,速度很快,很快就下好了,解压,于是可以看到下面这样的文件夹
在这里,我们需要配置一些东西,首先明确一点,这个Zookeeper是用java写的,所以需要jdk环境,最好是jdk8,jdk7也行,再低就可能出现版本问题了。
而且我们需要对zookeeper进行一些小的修改;添加创建两个文件夹data、logs,用来存放数据和日志,并且在配置文件里配置一下这两个文件夹路径(这里有个坑,这个配置文件的名字要修改,不改居然会报错),接下来演示一下:
打开改名后的配置文件
基本的配置结束,现在我们要启动它,我们怎么简单怎么来,不配置环境变量(想配置的可惜自己配置环境变量),然后进入bin文件夹
看到下面这内容监听2181端口,在等待客户端连接,就成功了(注意:这个窗口不要关了)
我们可以用客户端连接试试,再在bin目录下打开命令窗口执行下面所示命令。(其实可以直接在bin目录里双击ZkCli.cmd更简单)
可以看到下图所示,随便输入个字母h,能看到Zookeeper的很多命令,连接成功。具体的命令的使用可以自己去学习,这里就不多说了。
4.搭建基本环境
弄清楚Zookeeper和Dubbo之间的关系之后,就来简单用一下,咳,由于没有两台电脑,也木有装虚拟机(本来搞了一个virtualbox虚拟机的,貌似是我电脑配置太低了,虚拟机网速太慢了,卸载了。。。)
我就简单的用idea开两个应用吧!这里有两种方式:
第一种:类似Eclipse那种多项目查看的方式,你只需要在idea中设置File------->Setting-------->Appearance & behavior------->System Settings ,但是这种很不好用,就是每查看一个项目都要切换一下整个页面,不怎么直观。
第二种:用多模块的方式(idea推荐用多模块的方式),我用的就是多模块的方式。
注意:会用多模块的小伙伴可以直接跳一下,其实就是新建一个空项目,在空项目里新建两个只导入web模块的springboot应用(一个叫做provider,一个叫做consumer,都是1.5.xx版本)。
首先新建空项目,点击next取个名字,就会提示你要新建模块
然后就是新建一个springboot应用,后面的就和原来的一样(记住只需要web模块+1.5.xx版本),啪啪啪,我就当你新建成功了一个provider模块
继续新建第二个模块consumer
一顿简单操作,最后的目录结构就是I这样
下一节就简单使用一下分布式系统的调用。。。