赞
踩
近期在学习Zookeeper,将服务注册进去并能够正常使用。由于Zookeeper依赖于Java和Linux,所以中间还碰到了一些虚拟机上的问题,在此记录一下,共同学习一下。
Zookeeper是一个分布式协调服务,一般用来做服务注册中心。Zookeeper的数据是存储在内存中的,因此效率较高,内部数据的存储类似于windows的文件存储结构,采用分层存储。不同的是,Zookeeper的每个节点称为ZNode,每个节点下都可以存储数据,但是每个节点存储的数据不能超过1M。
首先需要确保linxu中已经安装了JDK7版本或以上,因为Zookeeper的服务器是由Java创建的。
官网:https://zookeeper.apache.org/
点击对应版本下载即可,一般不要下载最新的,下载个稳定版即可。
下载完成之后解压即可。
- //切换到opt目录
- cd /opt
- //新建zookeeper文件夹
- mkdir zookeeper
- //切换到zookeeper文件夹
- cd /opt/zookeeper
- //解压到当前目录,注意这里是你下载的版本压缩包
- tar -zxvf apache-zookeeper-3.7.1-bin.tar.gz
解压完毕后,需要添加一些配置,为以后的运行做准备。
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中即可。注意等号前后不要有空格。
注意:需切换到 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安装与启动完毕。
上面我们的服务已经启动成功了,但是现在还不能和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
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端口号放行,之后才可以注册服务进去。
一般添加第一个和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>
linux的IP加Zookeeper端口号,默认2181
- #配置Spring
- spring:
- application:
- name: cloud-provider-payment #微服务名称,注册中心显示
- cloud:
- zookeeper:
- connect-string: 192.168.58.128:2181 #zookeeper机器加端口号
主启动类添加注解,注意不是Eureka的注解
- @SpringBootApplication
- //该注解用于向使用consul或者zookeeper作为注册中心时注册服务
- @EnableDiscoveryClient
- public class PaymentMain8004 {
-
- public static void main(String[] args) {
- SpringApplication.run(PaymentMain8004.class, args);
- }
-
- }
项目启动成功之后可以在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的简单入门用法。希望能够帮到大家,如果哪里有问题,欢迎大家留言指正。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。