SpringBoot------分布式系统理论及Zookeeper安装教程

分布式Dubbo+Zookeeper+SpringBoot

分布式系统:是若干个独立计算机的集合,这些计算机对于用户来说就像单个相关系统。是由一组通过网络进行通信,为了完成共同的任务而协调工作的计算机节点组成的系统,分布式建立在网络之上。
为了利用更少的资源,利益最大化。
不同服务器的两种通信方式:Http、RPC。
Http、RPC(远程过程调用,简单的理解是一个节点请求另一个节点提供的服务)
nginx负载均衡
Dubbo官方文档地址:

https://dubbo.apache.org/zh/docs/v2.7/user/preface/background/

分布式系统之间的通信有两种方式:Http以及RPC
HTTP:无状态的通信协议,基于网络。

什么是RPC(Remote Procedure Call)协议?

Remote Procedure Call即远程过程调用,是一种进程剪得通信方式,是一种技术思想,不是规范,它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数。同样是用于通信,远程调用是相对于本地调用而言。
本地调用:单体系统,方法之间的相互调用,只需要new即可,这是非常普通的本地函数调用,在同一个地址空间,或者说在同一块内存,通过方法栈和参数栈就可以实现。
远程调用流程图:
在这里插入图片描述
RPC的两个核心模块:通讯、序列化。
通讯:是为了传输。SpringCloud里有Gateway API网关就可以使用http和RPC。
序列化:数据传输需要转换,序列化----反序列化。
贴个地址。RPC通俗易懂的的讲解。

https://www.jianshu.com/p/2accc2840a1b

Dubbo+Zookeeper+SpringBoot使用RPC
SpringCloud 使用HTTP RESTFul风格。

Dubbo:高可用的RPC框架。是专注于通信框架。

Dubbo以及Zookeeper安装

Dubbo是Apache下的高性能,轻量级的开源Java RPC框架
三大核心能力:面向接口的远程调用方法、智能容错和负载均衡、服务自动注册和发现。
async:异步
sync:同步
Provider:生产者,暴露服务的服务提供方,提供服务者在启动时,向注册中心注册自己提供的服务。
Registry:注册中心,注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长链接推送变更数据给消费者。
Consumer:消费者,调用远程服务的服务消费方,服务消费者在启动时,向注册中心订阅自己所需要的服务,服务消费者,从提供者列表中,基于负载均衡算法,选一台提供进行调用,如果调用失败,再选另一台调用。
Monitor:监控中心,服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
Container:容器。
涉及发布者模式订阅者模式。设计模式。
在这里插入图片描述

Zookeeper注册中心:

Zookeeper下载与安装:
下载网址:

https://zookeeper.apache.org/releases.html

可能版本不同,下载的文件内容也不同,3.4.14版本(教程中使用的),和3.7.0版本(我下载的)。
在这里插入图片描述
1.运行zkServer.cmd(windows运行cmd,Linux运行sh)
2.运行可能会出现闪退的情况:处理方法
右键以notepad++方式打开zkServer.cmd。在endlocal钱加上pause,这样双击打开时,有错误能显示出来,不会闪退。
在这里插入图片描述
再次双击运行zkServer.cmd
在这里插入图片描述
报错提示:“E:\Program Files\zookeeper\apache-zookeeper-3.7.0-bin\bin…\conf\zoo.cfg”
文件名、目录名或卷标语法不正确。

而文件目录中能够看到,文件夹里并没有这个文件。
在这里插入图片描述
将zoo_sample.cfg复制一份。之后将该文件改名为zoo.cfg。查看该文件内容
在这里插入图片描述
其中各配置项的含义,解释如下:

1.tickTime:Client-Server通信心跳时间
Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。tickTime以毫秒为单位。
tickTime=2000

2.initLimit:Leader-Follower初始通信时限
集群中的follower服务器(F)与leader服务器(L)之间初始连接时能容忍的最多心跳数(tickTime的数量)。
initLimit=5

3.syncLimit:Leader-Follower同步通信时限
集群中的follower服务器与leader服务器之间请求和应答之间能容忍的最多心跳数(tickTime的数量)。
syncLimit=2

4.dataDir:数据文件目录
Zookeeper保存数据的目录,默认情况下,Zookeeper将写数据的日志文件也保存在这个目录里。
dataDir=/home/michael/opt/zookeeper/data

5.clientPort:客户端连接端口
客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。
clientPort=2181

6.服务器名称与地址:集群信息(服务器编号,服务器地址,LF通信端口,选举端口)
这个配置项的书写格式比较特殊,规则如下:
server.N=YYY:A:B

server.1=itcast05:2888:3888
server.2=itcast06:2888:3888
server.3=itcast07:2888:3888

7.ZK为什么设置为奇数个?
zookeeper有这样一个特性:集群中只要有过半的机器是正常工作的,那么整个集群对外就是可用的。也就是说如果有2个zookeeper,那么只要有1个死了zookeeper就不能用了,因为1没有过半,所以2个zookeeper的死亡容忍度为0;同理,要是有3个zookeeper,一个死了,还剩下2个正常的,过半了,所以3个zookeeper的容忍度为1;同理你多列举几个:2 -> 0; 3 -> 1; 4 - >1; 5 -> 2; 6 -> 2会发现一个规律,2n和2n-1的容忍度是一样的,都是n-1,所以为了更加高效,何必增加那一个不必要的zookeeper呢。
之后Zookeeper启动还是曝:文件名、目录名或卷标语法不正确
解决办法:将call %JAVA% 改为 call JAVA
之后Zookeeper启动又曝:zookeeper.audit.enable
解决办法:增加 “-Dzookeeper.audit.enable=true”

echo on
call JAVA "-Dzookeeper.audit.enable=true" "-Dzookeeper.log.dir=%ZOO_LOG_DIR%" "-Dzookeeper.root.logger=%ZOO_LOG4J_PROP%" "-Dzookeeper.log.file=%ZOO_LOG_FILE%" "-XX:+HeapDumpOnOutOfMemoryError" "-XX:OnOutOfMemoryError=cmd /c taskkill /pid %%%%p /t /f" -cp "%CLASSPATH%" %ZOOMAIN% "%ZOOCFG%" %*
pause
endlocal

具体原因比较复杂参考:

https://blog.csdn.net/u011702673/article/details/109963726

Zookeeper.cmd启动后,窗口不要关闭,关闭后Zookeeper就会自动停止。
之后再启动zkCli.cmd,发现也是闪退。之后将配置文件的修改步骤与Zookeeper.cmd一致:

setlocal
call "%~dp0zkEnv.cmd"

set ZOO_LOG_FILE=zookeeper-%USERNAME%-cli-%COMPUTERNAME%.log

set ZOOMAIN=org.apache.zookeeper.ZooKeeperMain
call JAVA "-Dzookeeper.audit.enable=true" "-Dzookeeper.log.dir=%ZOO_LOG_DIR%" "-Dzookeeper.root.logger=%ZOO_LOG4J_PROP%" "-Dzookeeper.log.file=%ZOO_LOG_FILE%" -cp "%CLASSPATH%" %ZOOMAIN% %*
pause
endlocal

再次启动zkCli.cmd。就没问题了
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/cz_chen_zhuo/article/details/117222934