Spring Cloud 注册中心之Zookeeper

774 阅读2分钟

一、简介

  • 众所周知,ZK是一个文件系统类型的数据存储服务。通过节点的不同特性,可以实现服务注册、分布式锁等操作。
  • 通过ZK的临时节点,可以实现服务的注册。当服务实例掉线之后,实例也会自动消失。因此,这是一个CP(强一致性、分区容错性),丢弃A(高可用)的操作。
  • 上一章已经介绍了Eureka注册中心,ZK作为注册中心的操作也很类似。比较可惜的是,ZK只是一个“数据库”,没办法通过网页监控,只能通过客户端看节点信息。
  • 至于Zookeeper的安装、操作、集群布置,专栏里面都有介绍

一、集群版注册中心

1. 开启zookeeper集群

  • 首先,肯定需要开启多个ZK的服务。教程

2. 注册

2.1 导包

  • 最重要的肯定是spring-cloud-starter-zookeeper-discovery,这是zookeeper注册服务的关键。
  • 值得一提的是,该starter携带的zookeeper版本有可能与服务器的zookeeper版本不一致,在运行的过程中导致异常。可以按照以下的方法,通过<exclusion>排除原始的zk,然后自己再加一个与zk服务器版本一致的<dependency>
<dependencies>
        <!-- SpringBoot整合Web组件 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- SpringBoot整合zookeeper客户端 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
            <!--先排除自带的zookeeper3.5.3-->
            <exclusions>
                <exclusion>
                    <groupId>org.apache.zookeeper</groupId>
                    <artifactId>zookeeper</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--添加zookeeper3.4.10版本-->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.10</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

2.2 配置文件

  • connect-string上,集群有多少zk服务器,就写多少地址
#8004表示注册到zookeeper服务器的支付服务提供者端口号
server:
  port: 8004
#服务别名----注册zookeeper到注册中心名称
spring:
  application:
    name: cloud-payment-service
  cloud:
    zookeeper:
      connect-string: 192.168.233.137:2181,192.168.233.131:2181,192.168.233.132:2181

2.3 主启动类

  • 通过注解@EnableDiscoveryClient就相当于在注册中心上注册了。
@SpringBootApplication
@EnableDiscoveryClient //该注解用于向使用consul或者zookeeper作为注册中心时注册服务
public class PaymentMain8004 {
    public static void main(String[] args) {
        SpringApplication.run(PaymentMain8004.class,args);
    }
}

2.4 查看节点

  • 可在zk客户端上看到,目前已经注册的服务。目测该节点应该是持久节点。 image.png
  • 也可以查看当前服务下的实例。该节点是临时节点,实例掉线就消失了。可见,该节点保存了很多实例的信息。 image.png
{
    "name":"cloud-payment-service",
    "id":"8f7df390-13a2-4d39-b5d6-0930dbcaf860",
    "address":"localhost",
    "port":8004,
    "sslPort":null,
    "payload":{
        "@class":"org.springframework.cloud.zookeeper.discovery.ZookeeperInstance",
        "id":"application-1",
        "name":"cloud-payment-service",
        "metadata":{

        }
    },
    "registrationTimeUTC":1621597527900,
    "serviceType":"DYNAMIC",
    "uriSpec":{
        "parts":[
            {
                "value":"scheme",
                "variable":true
            },
            {
                "value":"://",
                "variable":false
            },
            {
                "value":"address",
                "variable":true
            },
            {
                "value":":",
                "variable":false
            },
            {
                "value":"port",
                "variable":true
            }
        ]
    }
}