这次说个在大型项目比较常见的东西,就是分布式,分布式到底是个什么东西呢?概念太大,不好说,就像刚学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这样

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

带着新人学springboot的应用11(springboot+Dubbo+Zookeeper 上)的更多相关文章

  1. 带着新人学springboot的应用01(springboot+mybatis+缓存 上)

    上一篇结束,第一次做一个这么长的系列,很多东西我也是没有说到,也许是还没有想到,哈哈哈,不过基本的东西还是说的差不多了的.假如以后碰到了不会的,随便查查资料配置一下就ok. 咳,还有大家如果把我前面的 ...

  2. 带着新人学springboot的应用04(springboot+mybatis+redis 完)

    对于缓存也说了比较多了,大家对下图这一堆配置类现在应该有些很粗略的认识了(因为我也就很粗略的认识了一下,哈哈!),咳,那么我们怎么切换这个缓存呢?(就是不用springboot提供的默认的Simple ...

  3. 带着新人学springboot的应用07(springboot+RabbitMQ 下)

    说一两句废话,强烈推荐各位小伙伴空闲时候也可以写写自己的博客!不管水平高低,不管写的怎么样,不要觉得写不好或者水平不够就不写了(咳,我以前就是这样的想法...自我反省!). 但是开始写博客之后,你会发 ...

  4. 带着新人学springboot的应用05(springboot+RabbitMQ 上)

    这次就来说说RabbitMQ,这个应该不陌生了,随便一查就知道这个是用来做消息队列的.(注意:这一节很多都是概念的东西,需要操作的比较少) 至于AMQP协议(Advanced Message Queu ...

  5. 带着新人学springboot的应用13(springboot+热部署)

    spring cloud我想做成一个系列,所以spring cloud+eureka后面会慢慢说到的,有兴趣的小伙伴可以关注后续! 这一节就简单说说springboot的热部署了(我一直想不通为什么叫 ...

  6. 带着新人学springboot的应用10(springboot+定时任务+发邮件)

    接上一节,环境一样,这次来说另外两个任务,一个是定时任务,一个是发邮件. 1.定时任务 定时任务可以设置精确到秒的准确时间去自动执行方法. 我要一个程序每一秒钟说一句:java小新人最帅 于是,我就写 ...

  7. 带着新人学springboot的应用09(springboot+异步任务)

    本来想说说检索的,不过不知道什么鬼,下载ElasticSearch太慢了,还是放一下,后面有机会再补上!今天就说个简单的东西,来说说任务. 什么叫做任务呢?其实就是类中实现了一个什么功能的方法.常见的 ...

  8. 带着新人学springboot的应用08(springboot+jpa的整合)

    这一节的内容比较简单,是springboot和jpa的简单整合,jpa默认使用hibernate,所以本质就是springboot和hibernate的整合. 说实话,听别人都说spring data ...

  9. 带着新人学springboot的应用06(springboot+RabbitMQ 中)

    上一节说了这么多废话,看也看烦了,现在我们就来用鼠标点点点,来简单玩一下这个RabbitMQ. 注意:这一节还是不用敲什么代码,因为上一节我们设置了那个可视化工具,我们先用用可视化工具熟悉一下流程. ...

随机推荐

  1. python: 列表的方法

    操作 函数 使用方法 备注 索引 index in: example.index(‘creative’) --- 1 in:example[1,] --- [’creative’, [’京东’,996 ...

  2. docker-compose模板文件

    mysql.redis.asp.net core项目应用程序三个常见的docker-compose文件模板参考: version: "3" services: mysql: res ...

  3. C#WebApi 接口参数不再困惑:传参详解

    前言:还记得刚使用WebApi那会儿,被它的传参机制折腾了好久,查阅了半天资料.如今,使用WebApi也有段时间了,今天就记录下API接口传参的一些方式方法,算是一个笔记,也希望能帮初学者少走弯路.本 ...

  4. 使用snap

    snap是一个Linux上的包管理器,其目的是提供跨平台的包管理 提到包管理我们会想到python的 pip conda等,以及 apt等等 snap提供了一个 统一的体验在各种Linux发行版上 关 ...

  5. 编程菜鸟的日记-初学尝试编程-C++ Primer Plus 第6章编程练习8

    #include <iostream> #include <fstream> #include <cstdlib> const int SIZE=20; using ...

  6. Mybatis_4.接口类和XML同时使用

    1.实体类User.java public class User { private int id; private String name; private int age; //getter.se ...

  7. icpc2018焦作-I. Distance

    第一发又超时了... 题目大意:给你n个点,然后给你n-1的数,表示两两距离,然后让你输出n个答案,第i个答案表示从这n个点里面挑i个点,然后这i个点两两之间会有一个距离,答案要求这些距离和的最大值. ...

  8. vue中添加title中的小图标

    webpack.prod.conf.js 这个文件中: 引入代码const path = require('path') :下面是进行配置: new HtmlWebpackPlugin({ filen ...

  9. python语法_模块_time_datetime_random

    模块:可以被公共调用的. time import time print(time.time()) 时间戳方式显示时间. time.sleep(3) 休眠3秒 time.clock() 计算cpu执行时 ...

  10. 操作XML

    别人已经写过很好的XML辅助类,可以直接引用后使用: 我这里自己写一个xml的操作类,目前能实现的是对一个不含集合的类可以操作,含集合的类无法将集合里的数据读取出来, 首先定义一个XML特性,用于区分 ...