欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

带着新人学springboot的应用11(springboot+Dubbo+Zookeeper 上)

程序员文章站 2022-11-08 15:03:04
这次说个在大型项目比较常见的东西,就是分布式,分布式到底是个什么东西呢?概念太大,不好说,就像刚学javaee的人问你,什么是web啊,什么是spring啊等等,你可能觉得,这个东西我好像知道,但是用口头语言就是不好描述,这很正常! 其实,用一两次就知道了,然后你再慢慢看那些大神的原理和文字描述。 ......

  这次说个在大型项目比较常见的东西,就是分布式,分布式到底是个什么东西呢?概念太大,不好说,就像刚学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中的服务,还能够让服务消费者远程调用服务,以及监控等等。。。用中学语文来描述,应该叫做贯穿全文,哈哈!

  下面这个图可以大概看一看流程:

带着新人学springboot的应用11(springboot+Dubbo+Zookeeper 上)

 

 

 3.下载并启动zookeeper

  zookeeper的详细知识就不在这里介绍了,博客园里搜一下有很多,可以自己慢慢学习,这里只是用一下。

     zookeeper安装方式有三种:单机模式(就一个zookeeper),伪集群模式(一台电脑下载多个zookeeper),集群模式(多台电脑每台都下载zookeeper)

    我们就用单机模式直观一点:

  下载地址:http://mirror.bit.edu.cn/apache/zookeeper/,我下载的是3.4.13版本,速度很快,很快就下好了,解压,于是可以看到下面这样的文件夹

带着新人学springboot的应用11(springboot+Dubbo+Zookeeper 上)

 

   在这里,我们需要配置一些东西,首先明确一点,这个zookeeper是用java写的,所以需要jdk环境,最好是jdk8,jdk7也行,再低就可能出现版本问题了。

  而且我们需要对zookeeper进行一些小的修改;添加创建两个文件夹data、logs,用来存放数据和日志,并且在配置文件里配置一下这两个文件夹路径(这里有个坑,这个配置文件的名字要修改,不改居然会报错),接下来演示一下:

带着新人学springboot的应用11(springboot+Dubbo+Zookeeper 上)

带着新人学springboot的应用11(springboot+Dubbo+Zookeeper 上)

 

  打开改名后的配置文件

带着新人学springboot的应用11(springboot+Dubbo+Zookeeper 上)

 

   基本的配置结束,现在我们要启动它,我们怎么简单怎么来,不配置环境变量(想配置的可惜自己配置环境变量),然后进入bin文件夹

带着新人学springboot的应用11(springboot+Dubbo+Zookeeper 上)

带着新人学springboot的应用11(springboot+Dubbo+Zookeeper 上)

 

  看到下面这内容监听2181端口,在等待客户端连接,就成功了(注意:这个窗口不要关了)

带着新人学springboot的应用11(springboot+Dubbo+Zookeeper 上)

 

  我们可以用客户端连接试试,再在bin目录下打开命令窗口执行下面所示命令。(其实可以直接在bin目录里双击zkcli.cmd更简单)

带着新人学springboot的应用11(springboot+Dubbo+Zookeeper 上)

 

  可以看到下图所示,随便输入个字母h,能看到zookeeper的很多命令,连接成功。具体的命令的使用可以自己去学习,这里就不多说了。

带着新人学springboot的应用11(springboot+Dubbo+Zookeeper 上)

 

 

 

4.搭建基本环境

  弄清楚zookeeper和dubbo之间的关系之后,就来简单用一下,咳,由于没有两台电脑,也木有装虚拟机(本来搞了一个virtualbox虚拟机的,貌似是我电脑配置太低了,虚拟机网速太慢了,卸载了。。。)

  我就简单的用idea开两个应用吧!这里有两种方式:

  第一种:类似eclipse那种多项目查看的方式,你只需要在idea中设置file------->setting-------->appearance & behavior------->system settings ,但是这种很不好用,就是每查看一个项目都要切换一下整个页面,不怎么直观。

带着新人学springboot的应用11(springboot+Dubbo+Zookeeper 上)

 

  第二种:用多模块的方式(idea推荐用多模块的方式),我用的就是多模块的方式。

   注意:会用多模块的小伙伴可以直接跳一下,其实就是新建一个空项目,在空项目里新建两个只导入web模块的springboot应用(一个叫做provider,一个叫做consumer,都是1.5.xx版本)。

  首先新建空项目,点击next取个名字,就会提示你要新建模块

带着新人学springboot的应用11(springboot+Dubbo+Zookeeper 上)

带着新人学springboot的应用11(springboot+Dubbo+Zookeeper 上)

 

  然后就是新建一个springboot应用,后面的就和原来的一样(记住只需要web模块+1.5.xx版本),啪啪啪,我就当你新建成功了一个provider模块

 带着新人学springboot的应用11(springboot+Dubbo+Zookeeper 上)

  

   继续新建第二个模块consumer

带着新人学springboot的应用11(springboot+Dubbo+Zookeeper 上)

 

  一顿简单操作,最后的目录结构就是i这样

带着新人学springboot的应用11(springboot+Dubbo+Zookeeper 上)

 

  下一节就简单使用一下分布式系统的调用。。。