(三)SpringCloud-Zookeeper注册中心

目录

  • 1、Zookeeper注册中心介绍
    • 1.1、Zookeeper数据结构znode
    • 1.2、会话维持
    • 1.2、Zookeeper的Leader选举过程
    • 1.3、数据一致性实现
  • 2、Zookeeper下载地址
  • 3、Zookeeper安装:单机
    • 3.1 修改zoo.cfg配置文件
    • 3.2 双击zkServer.cmd启动
    • 3.3 配置Demo地址
  • 4、Zookeeper安装:集群
    • 4.1 修改zoo.cfg配置文件
    • 4.2 在zoo.cfg中dataDir配置的目录下,创建 myid 文件
    • 4.3 修zoo.cfg中的端口,启动3台组成集群
    • 4.4 配置Demo地址
  • 5、测试Zookeeper作为注册中心Demo
    • 5.1 服务提供者provider
      • 5.1.1 添加依赖
      • 5.1.2 添加配置
      • 5.1.3 启动类添加注解@EnableDiscoveryClient
      • 5.1.4 添加一个简单的服务接口用于测试
      • 5.1.4 在8005和8006分别启动两台服务
      • 5.1.6 配置Demo地址
    • 5.2 服务消费者consumer
      • 5.2.1 添加依赖
      • 5.2.2 添加配置
      • 5.2.3 调用服务提供者provider
      • 5.2.4 启动类添加注解@EnableDiscoveryClient
      • 5.2.5 启动验证
      • 5.2.6 配置Demo地址

1、Zookeeper注册中心介绍

zookeeper 保证的是 CP。保证了满足一致性(Consistency)和分区容错性(Partition tolerance),牺牲了可用性(Availability)

了解几种常用的注册中心


1.1、Zookeeper数据结构znode

zookeeper 中的所有存储的数据是由 znode 组成的,节点也称为 znode,并以 key/value 形式存储数据,整体结构类似于 linux 文件系统的模式以树形结构存储。其中根路径以 / 开头。

通过zktools工具可以连接查看:
zktools工具下载及使用:https://blog.csdn.net/rongbaojian/article/details/82078368
(三)SpringCloud-Zookeeper注册中心_第1张图片
节点的属性说明:

字段 描述
cZxid 创建节点时的事务ID
ctime 创建节点时的时间
mZxid 最后修改节点时的事务ID
mtime 最后修改节点时的时间
pZxid 表示该节点的子节点列表最后一次修改的事务ID,添加子节点或删除子节点就会影响子节点列表,但是修改子节点的数据内容则不影响该ID(注意,只有子节点列表变更了才会变更pzxid,子节点内容变更不会影响pzxid)
cversion 子节点版本号,子节点每次修改版本号加1
dataversion 数据版本号,数据每次修改该版本号加1
aclversion 权限版本号,权限每次修改该版本号加1
ephemeralOwner 创建该临时节点的会话的sessionID。(如果该节点是持久节点,那么这个属性值为0)
dataLength 该节点的数据长度
numChildren 该节点拥有子节点的数量(只统计直接子节点的数量)

1.2、会话维持

客户端与服务端之间的连接是基于 TCP 长连接,client 端连接 server 端默认的 2181 端口,也就是 session 会话。

从第一次连接建立开始,客户端开始会话的生命周期,客户端向服务端的ping包请求,每个会话都可以设置一个超时时间。

在 zookeeper 运行过程中,客户端会在会话超时过期范围内向服务器发送请求(包括读和写)或者 ping 请求,俗称心跳检测完成会话激活,从而来保持会话的有效性。

zookeeper 的 leader 服务器再运行期间定时进行会话超时检查,时间间隔默认值是 tickTime(单位是毫秒。该值在zoo.cfg中配置,单位:毫秒),每隔 tickTime 进行一次会话超时检查。


1.2、Zookeeper的Leader选举过程

zookeeper 的 leader 选举存在两个阶段,一个是服务器启动时 leader 选举,另一个是运行过程中 leader 服务器宕机。

选举相关参数:
zxid(最新的事物ID 既 LastLoggedZxid)
服务器中存放的最大数据ID。
ID值越大说明数据越新,在选举算法中数据越新权重越大。

serverId(服务器ID 既 myid)
比如有三台服务器,编号分别是1,2,3。编号越大在选择算法中的权重越大。

epoch (逻辑时钟 既 PeerEpoch)

  • 每个服务器都会给自己投票,或者叫投票次数,同一轮投票过程中的逻辑时钟值是相同的。
  • 每投完一次票这个数据就会增加,然后与接收到的其它服务器返回的投票信息中的数值相比。
  • 如果收到低于当前轮次的投票结果,该投票无效,需更新到当前轮次和当前的投票结果。

详细推举过程参考:https://www.cnblogs.com/veblen/p/10992103.html


1.3、数据一致性实现

主要依赖 ZAB 协议来实现分布式数据一致性。
ZAB 协议分为两部分:

  • 消息广播
    Zookeeper 使用单一的主进程 Leader(主节点) 来接收和处理客户端所有事务请求,并采用 ZAB 协议的原子广播协议将事务请求以 Proposal 提议从Leader广播到所有 Follower(从节点) 节点,当集群中有过半的Follower 服务器进行正确的 ACK 反馈,那么Leader就会再次向所有的 Follower 服务器发送commit 消息,将此次提案进行提交。

  • 崩溃恢复
    Leader 服务器出现崩溃,或者由于网络原理导致 Leader 服务器失去了与过半 Follower 的通信,那么就会进入崩溃恢复模式,需要选举出一个新的 Leader 服务器。恢复时会选举zxid最大的节点作为新的leader,并且新 leader 会将事务日志中尚未提交的消息进行处理。


2、Zookeeper下载地址

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


3、Zookeeper安装:单机

3.1 修改zoo.cfg配置文件

将 conf 目录下的 zoo_sample.cfg 文件,复制一份,重命名为 zoo.cfg:
(三)SpringCloud-Zookeeper注册中心_第2张图片
修改数据存储和日志存储目录:
(三)SpringCloud-Zookeeper注册中心_第3张图片

(三)SpringCloud-Zookeeper注册中心_第4张图片


3.2 双击zkServer.cmd启动

双击运行zookeeper-3.4.11\bin目录下的zkServer.cmd文件(三)SpringCloud-Zookeeper注册中心_第5张图片


3.3 配置Demo地址

gitee地址中的 cloud-zk-server模块的zookeeper-3.4.11目录


4、Zookeeper安装:集群

4.1 修改zoo.cfg配置文件

dataDir=../tmp/zookeeper
clientPort=2182

#server.A=B:C:D配置项
#A:这是一个数字,表示服务器编号
#B:A服务器的IP地址
#C:通讯端口,即A服务器与集群中的 Leader 服务器交换信息的端口
#D:选举通讯端口,表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于 B 都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。

server.1=localhost:2881:3881
server.2=localhost:2882:3882
server.3=localhost:2883:3883

(三)SpringCloud-Zookeeper注册中心_第6张图片


4.2 在zoo.cfg中dataDir配置的目录下,创建 myid 文件

文件添加上一步 server 配置的对应 A 数字。数字越大,在进行leader选举是权重越大
(三)SpringCloud-Zookeeper注册中心_第7张图片


4.3 修zoo.cfg中的端口,启动3台组成集群

一键启动zookeeper集群.cmd文件内容(用于一键启动集群):

@echo off
start /D "./zookeeper-2182/bin/" zkServer.cmd
start /D "./zookeeper-2183/bin/" zkServer.cmd
start /D "./zookeeper-2184/bin/" zkServer.cmd

(三)SpringCloud-Zookeeper注册中心_第8张图片


4.4 配置Demo地址

gitee地址中的 cloud-zk-server模块的zookeeper-cluster目录


5、测试Zookeeper作为注册中心Demo


5.1 服务提供者provider

5.1.1 添加依赖


<dependency>
    <groupId>org.springframework.cloudgroupId>
    <artifactId>spring-cloud-starter-zookeeper-discoveryartifactId>
    <exclusions>
        
        <exclusion>
            <groupId>org.apache.zookeepergroupId>
            <artifactId>zookeeperartifactId>
        exclusion>
    exclusions>
dependency>
<dependency>
    <groupId>org.apache.zookeepergroupId>
    <artifactId>zookeeperartifactId>
    <version>3.4.11version>
dependency>

5.1.2 添加配置

spring:
  application:
    name: cloud-zk-provider-payment8005-6 #服务别名----注册zookeeper到注册中心名称
  devtools:
    restart:
      enabled: false  #关闭自启动
  cloud:
    zookeeper:
      #connect-string: 127.0.0.1:2181 #注册中心地址,多注册中心用逗号分隔
      connect-string: 127.0.0.1:2182,127.0.0.1:2183,127.0.0.1:2184 #注册中心地址,多注册中心用逗号分隔
      discovery:
        register: true  #是否启动服务注册
        enabled: true #开启服务发现
        # instance-id: ${spring.application.name}_${server.port} #用于向zookeeper注册的ID,默认为随机 UUID。
        root: /yyyL #实例注册的根节点,默认为/services


5.1.3 启动类添加注解@EnableDiscoveryClient

@SpringBootApplication
@EnableDiscoveryClient  // @EnableDiscoveryClient和@EnableEurekaClient共同点就是:都是能够让注册中心能够发现,扫描到该服务。
                        // 不同点:@EnableEurekaClient只适用于Eureka作为注册中心,@EnableDiscoveryClient可以是其他注册中心
public class ZkProviderPayment8005_6Start {
    public static void main(String[] args) {
        SpringApplication.run(ZkProviderPayment8005_6Start.class,args);
    }
}

5.1.4 添加一个简单的服务接口用于测试

功能:接口会返回当前服务提供者的端口。

@RestController
public class PaymentController {
    @Value("${server.port}")
    private String serverPort;

    // 127.0.0.1:8005/study/payment/zk
    @RequestMapping(value = "/payment/zk")
    public String paymentzk()
    {
        return "springcloud with zookeeper: "+serverPort+"\t"+ UUID.randomUUID().toString();
    }

}

5.1.4 在8005和8006分别启动两台服务

启动后访问:127.0.0.1:8005/study/payment/zk 和 127.0.0.1:8006/study/payment/zk
(三)SpringCloud-Zookeeper注册中心_第9张图片

5.1.6 配置Demo地址

gitee地址中的cloud-zk-provider-payment8005-6模块


5.2 服务消费者consumer

5.2.1 添加依赖


<dependency>
    <groupId>org.springframework.cloudgroupId>
    <artifactId>spring-cloud-starter-zookeeper-discoveryartifactId>
    <exclusions>
        
        <exclusion>
            <groupId>org.apache.zookeepergroupId>
            <artifactId>zookeeperartifactId>
        exclusion>
    exclusions>
dependency>
<dependency>
    <groupId>org.apache.zookeepergroupId>
    <artifactId>zookeeperartifactId>
    <version>3.4.11version>
dependency>

5.2.2 添加配置

spring:
  application:
    name: cloud-zk-provider-payment8005-6 #服务别名----注册zookeeper到注册中心名称
  devtools:
    restart:
      enabled: false  #关闭自启动
  cloud:
    zookeeper:
      #connect-string: 127.0.0.1:2181 #注册中心地址,多注册中心用逗号分隔
      connect-string: 127.0.0.1:2182,127.0.0.1:2183,127.0.0.1:2184 #注册中心地址,多注册中心用逗号分隔
      discovery:
        register: true  #是否启动服务注册
        enabled: true #开启服务发现
        # instance-id: ${spring.application.name}_${server.port} #用于向zookeeper注册的ID,默认为随机 UUID。
        root: /yyyL #实例注册的根节点,默认为/services


5.2.3 调用服务提供者provider

赋予RestTemplate负载均衡的能力:

@Configuration
public class ApplicationContextBean {
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate()
    {
        return new RestTemplate();
    }
}

通过服务提供者配置的spring.application.name调用服务提供者:

@RestController
@Slf4j
public class OrderZKController
{
    public static final String INVOKE_URL = "http://cloud-zk-provider-payment8005-6/study";

    @Resource
    private RestTemplate restTemplate;

    @RequestMapping(value = "/consumer/payment/zk")
    public String paymentInfo()
    {
        String result = restTemplate.getForObject(INVOKE_URL+"/payment/zk", String.class);
        log.info("消费者调用支付服务(zookeeper)--->result:" + result);
        return result;
    }
}

5.2.4 启动类添加注解@EnableDiscoveryClient

@SpringBootApplication
@EnableDiscoveryClient
public class ZkOrder80Start {
    public static void main(String[] args) {
        SpringApplication.run(ZkOrder80Start.class,args);
    }
}


5.2.5 启动验证

访问 http://127.0.0.1/study/consumer/payment/zk
交替返回springcloud with zookeeper: 8006 *********************springcloud with zookeeper: 8005 *********************


5.2.6 配置Demo地址

gitee地址中的cloud-zk-consumer-order80模块


你可能感兴趣的:(SpringCloud,zookeeper,linux,云原生,spring,cloud)