79--JT项目17(SOA/RPC思想/zookeeper集群搭建)
1.关于HttpClient调用说明
1.1 分析
1).httpClient使用时需要接收几个用户的URL请求? 2个
2).跨域/httpClient代码调用分别为多少层
说明:
1.JSONP是基于浏览器的,解决跨域问题的。而httpClient是基于代码模拟http请求,获取服务端的参数的,功能上类似,但是经过的环节不同。
2.安全性不同 JSONP的全部信息都可以通过浏览器进行监控,但是HttpClient浏览器不能监控
3.代码调用层级不同 跨域:4层 httpClient:6层
适用场景:如果从服务端获取数据,js可以直接解析,使用JSONP,如果服务端的程序返回值需要进一步处理,这时候使用httpClient。
2.SOA思想
2.1 SOA思想介绍
面向服务的架构(SOA)是一个组件模型,它将应用程序的不同功能单元(称为服务)进行拆分,并通过这些服务之间定义良好的接口和协议联系起来。接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构件在各种各样的系统中的服务可以以一种统一和通用的方式进行交互。
3.RPC(统称/思想)
3.1 RPC介绍
RPC是远程过程调用(Remote Procedure Call)的缩写形式。由不同的服务之间进行的通讯就称之为RPC,RPC通讯用户无需了解协议的细节.像调用本地服务一样简单. RPC调用本质就是代理思想的应用.
总结: 服务A想要完成某项任务,但是自己手中没有该资源,则通知服务B 帮我去完成该操作. 这样的操作方式称之为RPC
3.2 如何给老婆解释什么是RPC
一个阳光明媚的早晨,老婆又在翻看我订阅的技术杂志。
“老公,什么是RPC呀,为什么你们程序员那么多黑话!”,老婆还是一如既往的好奇。
“RPC,就是Remote Procedure Call的简称呀,翻译成中文就是远程过程调用嘛”,我一边看着书,一边漫不经心的回答着。
“啥?你在说啥?谁不知道翻译成中文是什么意思?你个废柴,快给我滚去洗碗!”
“我去。。。”,我如梦初醒,我对面坐着的可不是一个程序员,为了不去洗碗,我瞬间调动起全部脑细胞,星辰大海在我脑中汇聚,灵感涌现…
“是这样,远程过程调用,自然是相对于本地过程调用来说的嘛。”
“嗯哼,那先给老娘讲讲,本地过程调用是啥子?”
“本地过程调用,就好比你现在在家里,你要想洗碗,那你直接把碗放进洗碗机,打开洗碗机开关就可以洗了。这就叫本地过程调用。”
“哎呦,我可不干,那啥是远程过程调用?”
“远程嘛,那就是你现在不在家,跟姐妹们浪去了,突然发现碗还没洗,打了个电话过来,叫我去洗碗,这就是远程过程调用啦”,多么通俗易懂的解释,我真是天才!
“哦!我明白了”,说着,老婆开始收拾包包。
“你这是干啥去哦”
“我?我要出门浪去呀,待会记得接收我的远程调用哦,哦不,咱们要专业点,应该说,待会记得接收我的RPC哦!”
作者:柳树之
链接:https://www.jianshu.com/p/2accc2840a1b
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
4.注册中心
注册中心不提供负载均衡功能, 只提供一致性功能
4.1 无注册中心业务分析
说明:
1.使用传统的架构设计,所有的请求都经过NGINX负责中转,则nginx负载很大,如果nginx出现了问题,则直接影响用户.
2.如果服务器的数量改变了,则必然要修改nginx的配置文件.
需求: 1.保证nginx负载压力不要太高.
2.如果服务器数量发生变化,则可以自动的更新配置.,无需人为的干预
4.2 注册中心原理说明
原理说明:
1).当服务器启动时,会将自己的服务名称/IP:PORT写入注册中心.
2).当注册中心接收提供者数据时,会动态的维护服务列表数据.
3).当消费者服务器启动时,会链接注册中心.获取服务列表数据.
4).当请求注册中心之后,则将服务列表保存到本地(消费者内存中),方便以后使用.
5).根据已知的服务提供者 利用负载均衡机制挑选其中一个进行访问.
6).当注册中心利用心跳检查机制发现服务提供者宕机时,会"同步更新"注册列表,并且"同步所有消费者的服务列表".
4.3 为什么集群中的节点数量是奇数台
公式: 剩余的主节点 > N/2(当主机宕机后剩余的节点数)
分析:
1个节点能否搭建集群? 1-1 > 0.5 假 不能搭建集群
2个节点能否搭建集群? 2-1 > 1 假 不能搭建集群
3个节点能否搭建集群? 3-1 > 1.5 真 可以搭建集群
4个节点能否搭建集群> 4-1 > 2 真 可以搭建集群
分析集群宕机的条件:
3个节点最多允许宕机1台. 奇数
4个节点最多允许宕机1台 偶数
奇数台和偶数台容灾能力相同.所以为了节省资源,一般集群都是奇数台.
结论:1).搭建集群最小单位 3台.
2).一般集群搭建都是奇数台.
5. Zookeeper介绍
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
ZooKeeper包含一个简单的原语集,提供Java和C的接口。
ZooKeeper代码版本中,提供了分布式独享锁、选举、队列的接口,代码在zookeeper-3.4.3\src\recipes。其中分布锁和队列有Java和C两个版本,选举只有Java版本。
总结:Zookeeper负责服务的协调调度.当客户端发起请求时,返回正确的服务器地址.
6.centos安装配置zookeeper
6.1. Zookeeper下载
网址: http://zookeeper.apache.org/releases.html
其他下载地址: http://mirrors.hust.edu.cn/apache/zookeeper/
6.2. Zookeeper安装
安装前提, 确保已经安装了JDK环境 关于jdk的配置: [配置jdk]
上传安装文件并解压即可, 解压命令 tar -xvf 包名.tar.gz
6.3. 修改配置文件
在zookeeper解压的根目录下创建两个目录, data和log mkdir data log
进入conf目录, 配置文件就在里面, 里面只有一个zoo_sample.cfg
的简单位置文件, 我们可以复制一份, 自己修改
假设复制文件名为zoo.cfg
, 编辑文件如下
# 数据目录, 即创建的data目录
dataDir=/usr/local/src/zookeeper/data
# 日志目录, 即创建的log目录
dataLogDir=/usr/local/src/zookeeper/log
# 端口号, 默认2181
clientPort=2181
6.4. 启动zookeeper
跳转到bin目录中 zk启动关闭命令如下.
# 可以在最后面跟上配置文件的位置, 启动指定配置文件, 不加默认启动zoo.cfg
sh zkServer.sh start 或者 ./zkServer.sh start
sh zkServer.sh stop
sh zkServer.sh status
7.Zookeeper集群搭建
为了方便测试, 在同一台linux上使用不同端口号代表不同zookeeper主机, 端口号为2181, 2182, 2183
7.1. 准备文件夹
在zookeeper根目录下创建zkCluster目录, 此目录为测试集群目录 mkdir zkCluster
在zkCluster目录下, 创建zk1, zk2, zk3 目录 mkdir zk1 zk2 zk3
分别在zk1, zk2, zk3 目录中创建data和log目录, 快捷指令 mkdir {zk1,zk2,zk3}/{data,log}
7.2. 添加myid文件
关于myid文件: myid的值是zoo.cfg文件里定义的server.A项A的值,Zookeeper 启动时会读取这个文件,拿到里面的数据与 zoo.cfg 里面的配置信息比较从而判断到底是那个server,只是一个标识作用。
分别在zk1, zk3, zk2 中创建myid文件, 文件内容分别为 1, 2, 3 数字, 为服务的编号
7.3. 编辑配置文件
我们首先创建一个配置文件, 修改之后复制三份, 节省时间
进入conf目录, 将zoo_sample.cfg复制为zoo1.cfg, 然后对其进行修改
使用vim等工具打开zoo1.cfg, 修改内容如下:
# 数据目录
dataDir=/usr/local/src/zookeeper/zkCluster/zk1/data
# 日志目录
dataLogDir=/usr/local/src/zookeeper/zkCluster/zk1/log
# 端口号
clientPort=2181
# 配置集群
# server.myid文件编号=ip地址:LF通信端口:选举端口
# 如果3个zookeeper不在同一台服务器, 通信端口和选举端口一样也没有关系, ip不同即可
server.1=192.168.126.129:2887:3887
server.2=192.168.126.129:2888:3888
server.3=192.168.126.129:2889:3889
修改完成之后, 我们把此文件再次复制为zoo2.cfg和zoo3.cfg, 然后修改对应的dataDir
, dataLogDir
, clientPort
即可,其他的都不需要修改
关于配置文件的详细介绍如下:
①、tickTime:基本事件单元,这个时间是作为Zookeeper服务器之间或客户端与服务器之间维持心跳的时间间隔,每隔tickTime时间就会发送一个心跳;最小 的session过期时间为2倍tickTime
②、dataDir:存储内存中数据库快照的位置,除非另有说明,否则指向数据库更新的事务日志。注意:应该谨慎的选择日志存放的位置,使用专用的日志存储设备能够大大提高系统的性能,如果将日志存储在比较繁忙的存储设备上,那么将会很大程度上影像系统性能。
③、client:监听客户端连接的端口。
④、initLimit:允许follower连接并同步到Leader的初始化连接时间,以tickTime为单位。当初始化连接时间超过该值,则表示连接失败。
⑤、syncLimit:表示Leader与Follower之间发送消息时,请求和应答时间长度。如果follower在设置时间内不能与leader通信,那么此follower将会被丢弃。
⑥、server.A=B:C:D
A:其中 A 是一个数字,表示这个是服务器的编号;
B:是这个服务器的 ip 地址;
C:Leader选举的端口;
D:Zookeeper服务器之间的通信端口。
7.4. 启动集群
通过下面的命令按顺序启动zk集群 (在bin目录下, 其3个配置文件都在conf目录下)
sh zkServer.sh start ../conf/zoo1.cfg
sh zkServer.sh stop ../conf/zoo2.cfg
sh zkServer.sh status ../conf/zoo3.cfg
如果启动失败, 说明配置文件有问题, 重新配置修改即可
然后使用 sh zkServer.sh status ../conf/zoo1.cfg
分别检测运行状态
结果如下:
[root@localhost bin]# sh zkServer.sh status ../conf/zoo1.cfg
ZooKeeper JMX enabled by default
Using config: ../conf/zoo1.cfg
Client port found: 2181. Client address: localhost.
Mode: follower
[root@localhost bin]# sh zkServer.sh status ../conf/zoo2.cfg
ZooKeeper JMX enabled by default
Using config: ../conf/zoo2.cfg
Client port found: 2182. Client address: localhost.
Mode: leader
[root@localhost bin]# sh zkServer.sh status ../conf/zoo3.cfg
ZooKeeper JMX enabled by default
Using config: ../conf/zoo3.cfg
Client port found: 2183. Client address: localhost.
Mode: follower
如图:
可见, 按顺序启动后, 2为主机, 1和3为从机,
我们试着把第二台主机关闭(假设宕机) sh zkServer.sh stop ,,/conf/zoo2.cfg
关闭后发现3为主机, 1为从机
这和zookeeper的选举机制有关
7.5 zookeeper选举机制
- zk选举采用最大值(myid)优先的机制.
- 超过半数以上人数同意即可成为领导者(主机)
- 只有当主机宕机后(心跳检测结果为宕机), 才会重新选举, 即有领导者的时候, 即使新添加了主机, 也不会选举
图解
(按顺序启动1,2,3)
选举案例
目前有5台服务器,每台服务器均没有数据,它们的编号分别是1,2,3,4,5,按编号依次启动,它们的选择举过程如下:
- 服务器1启动,给自己投票,然后发投票信息,由于其它机器还没有启动所以它收不到反馈信息,服务器1的状态一直属于Looking(选举状态)。
- 服务器2启动,给自己投票,同时与之前启动的服务器1交换结果,由于服务器2的编号大所以服务器2胜出,但此时投票数没有大于半数,所以两个服务器的状态依然是LOOKING。
- 服务器3启动,给自己投票,同时与之前启动的服务器1,2交换信息,由于服务器3的编号最大所以服务器3胜出,此时投票数正好大于半数,所以服务器3成为领导者,服务器1,2成为小弟。
- 服务器4启动,给自己投票,同时与之前启动的服务器1,2,3交换信息,尽管服务器4的编号大,但之前服务器3已经胜出,所以服务器4只能成为小弟。
- 服务器5启动,后面的逻辑同服务器4成为小弟。
面试题:
如果zk中有7台服务器.编号分别为1-7,并且依次启动.
问题1:谁当主机??? 4当主机
问题2: 哪几台永远不能当主机??? 123永远不能当主机.