近期在学习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整合的依赖即可,这里提供一个报错解决的方案。
org.springframework.cloud
spring-cloud-starter-zookeeper-discovery
org.apache.zookeeper
zookeeper
org.apache.zookeeper
zookeeper
3.7.1
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的简单入门用法。希望能够帮到大家,如果哪里有问题,欢迎大家留言指正。