近期在学习Zookeeper,将服务注册进去并能够正常使用。由于Zookeeper依赖于Java和Linux,所以中间还碰到了一些虚拟机上的问题,在此记录一下,共同学习一下。


一:Zookeeper的安装与启动

Zookeeper是一个分布式协调服务,一般用来做服务注册中心。Zookeeper的数据是存储在内存中的,因此效率较高,内部数据的存储类似于windows的文件存储结构,采用分层存储。不同的是,Zookeeper的每个节点称为ZNode,每个节点下都可以存储数据,但是每个节点存储的数据不能超过1M

1:软件环境

首先需要确保linxu中已经安装了JDK7版本或以上,因为Zookeeper的服务器是由Java创建的。

2:下载安装包并解压

官网:https://zookeeper.apache.org/

点击对应版本下载即可,一般不要下载最新的,下载个稳定版即可。

 下载完成之后解压即可。

//切换到opt目录
cd /opt
//新建zookeeper文件夹
mkdir zookeeper
//切换到zookeeper文件夹
cd /opt/zookeeper
//解压到当前目录,注意这里是你下载的版本压缩包
tar -zxvf apache-zookeeper-3.7.1-bin.tar.gz

3:配置

解压完毕后,需要添加一些配置,为以后的运行做准备。

1:创建存储目录

//切换目录
cd /opt/zooKeeper/
//创建存储目录
mkdir zkdata
//进入conf目录
cd /apache-zookeeper-3.7.1-bin/conf
//拷贝一个配置文件
cp  zoo_sample.cfg  zoo.cfg
//修改zoo.cfg配置文件,指定存储目录
vim zoo.cfg
//打开文件之后按 i 进行编辑

 设置存储目录即可。

2:设置 JAVA_HOME 路径

这一步很重要,不设置的话在之后启动zookeeper客户端时会报错:

JAVA_HOME is not set and java could not be found in PATH.

原因是zookeeper在启动时会执行两个文件:zkServer.sh  和  zkEnv.sh,其中zkEnv.sh的文件中会检查JAVA_HOME,获取不到就会报错。

我们安装JDK时的JAVA_HOME设置在  /etc/profile  文件下,将其复制到zkEnv.sh中即可。注意等号前后不要有空格。

4:启动 

注意:需切换到 apache-zookeeper-3.7.1-bin/bin 目录下再执行命令。

zookeeper服务常用命令:

//启动服务
./zkServer.sh start
//查看状态
./zkServer.sh status
//停止服务
./zkServer.sh stop
//重启服务
./zkServer.sh restart

zookeeper服务端常用命令:

//连接ZooKeeper服务端
./zkCli.sh
//断开连接
quit
//查看根节点目录
ls /
//查看注册中心中的服务
ls /services
//查看指定服务
ls /services/服务名
//获取指定服务详细信息(Json格式)
get /services/服务名/服务id

至此,zookeeper安装与启动完毕。


二:虚拟机外网ping通,防火墙端口开放

1:ping通外网

上面我们的服务已经启动成功了,但是现在还不能和idea配合使用将服务注册进去,我们首先要确保我们的虚拟机能够ping通外网。

如果是使用VMware连接的虚拟机,先确认网络的连接方式。有三种。

桥接模式:让虚拟机成真正的计算机,和主机在同一个局域网下,有着相同的网关、子网掩码
NTA模式:网络地址转换,虚拟机的网络都是由主机的 DHCP 服务器进行分配的
仅主机:虚拟机只可以与主机互相访问,不可以连接外网

我这里使用的是NAT模式,只介绍下这个模式。

打开VMware的编辑 -> 虚拟网络编辑器,打开后点击 NAT设置获取网关及子网掩码,点击DHCP设置获取IP地址起始位置。如果想要更改,需要点击更改设置。

 之后进入虚拟机修改网络文件。

注意:CentOS7.x网卡文件是 ifcfg-ens33,CentOs6.x网卡文件是 ifcfg-eth0

//修改网络文件
vim /etc/sysconfig/network-scripts/ifcfg-ens33
//按 i 开始编辑
//主要把这几个修改了
BOOTPROTO: 改成静态的,不然重启后ip会被重新分配
IPADDR: 当前虚拟机的ip,取值范围在DHCP设置中查看的ip范围
NETMASK: 子网掩码,NTA设置的固定值
GATEWAY: 网关,NTA设置的固定值
//修改之后重启网卡
systemctl restart network
//测试是否能ping通外网
ping www.baidu.com

 2:防火墙端口开放

Linux下防火墙有两种分别是 iptables firewalld,在centos7之前centos用的防火墙是iptables,自从centos7过后防火墙的使用就从iptables变成了firewalld。相较于传统的防火墙管理工具,firewalld加入了zone(区域)的概念,大体就是实现了防火墙策略之间的快速切换。

 防火墙命令:

//查看防火墙状态(running开启,dead关闭)
systemctl status firewalld
//启动防火墙
service firewalld start
//重启防火墙(服务)
service firewalld restart
//关闭防火墙
service firewalld stop
//查询端口是否开放(zookeeper默认端口号2181)
firewall-cmd --query-port=2181/tcp
//开放端口
firewall-cmd --permanent --add-port=2181/tcp
//移除端口
firewall-cmd --permanent --remove-port=2181/tcp
//重启防火墙(配置)
firewall-cmd --reload

将zookeeper端口号放行,之后才可以注册服务进去。

三:服务注册进Zookeeper

 1:添加依赖

一般添加第一个和Springboot整合的依赖即可,这里提供一个报错解决的方案。

<!--springboot整合zookeeper客户端-->
<dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
       <!--排除zookeeper自带的版本-->
       <exclusions>
          <exclusion>
             <groupId>org.apache.zookeeper</groupId>
             <artifactId>zookeeper</artifactId>
           </exclusion>
        </exclusions>
</dependency>
 <!--和linux上安装的zookeeper版本同步,该步骤省略也可以,使用默认的,个别可能会报错-->
<dependency>
       <groupId>org.apache.zookeeper</groupId>
       <artifactId>zookeeper</artifactId>
       <version>3.7.1</version>
</dependency>

2:添加配置

linux的IP加Zookeeper端口号,默认2181

#配置Spring
spring:
  application:
    name: cloud-provider-payment  #微服务名称,注册中心显示
  cloud:
    zookeeper:
      connect-string: 192.168.58.128:2181  #zookeeper机器加端口号

3:添加注解

主启动类添加注解,注意不是Eureka的注解

@SpringBootApplication
//该注解用于向使用consul或者zookeeper作为注册中心时注册服务
@EnableDiscoveryClient
public class PaymentMain8004 {

    public static void main(String[] args) {
        SpringApplication.run(PaymentMain8004.class, args);
    }

}

4:启动

项目启动成功之后可以在Zookeeper中查看注册进去的服务。

这里使用上面提到过的一些命令,可以看到我们注册进去的服务。

需要注意的是,Zookeeper默认创建的是临时节点,如果服务挂了,会在一段时间后直接清除,

大概一二十秒,而不是像Eureka那样保持心跳。在这点上,Zookeeper做的很是干脆。

[zk: localhost:2181(CONNECTED) 0] ls /
[services, zookeeper]
[zk: localhost:2181(CONNECTED) 1] ls /services
[cloud-consumer-order, cloud-provider-payment]
[zk: localhost:2181(CONNECTED) 2] ls /services/cloud-provider-payment
[04b2cf44-95a2-4d29-b452-620e7d4ec53d]
[zk: localhost:2181(CONNECTED) 3] get /services/cloud-provider-payment/04b2cf44-95a2-4d29-b452-620e7d4ec53d
//后面省略
{"name":"cloud-provider-payment","id":"04b2cf44-95a2-4d29-b452-...

其他的功能就和我们使用Eureka等注册中心一样了,每个注册进去的服务都可以通过服务名进行其他服务的调用。


到这里就结束了,这里只是介绍Zookeeper的简单入门用法。希望能够帮到大家,如果哪里有问题,欢迎大家留言指正。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐