认识 Zookeeper
Zookeeper
- A Distributed Coordination Service for Distributed Applications
一个面向分布式应用的分布式协调服务 - 官网 : http://zookeeper.apache.org
设计目标
- 简单
用起来和文件系统类似 - 多副本
一般 使用的时候是3副本或者5副本 至少是3个节点 其中一个为leader节点 其他为follow节点 - 有序
操作是根据一个时间戳来排序的 - 快
读多写少时 速度快
使用 Zookeeper 作为注册中心
Spring Cloud Zookeeper
- 在maven中加入 spring-cloud-starter-zookeeper-discovery 依赖
- 在 springcloud中 使用 Apache Curator 作为 Zookeeper 的客户端
简单配置
- 在 application.properties 中配置 spring.cloud.zookeeper.connect-string=localhost:2181
告诉它需要找到哪个 Zookeeper 注册上去 在生产环境中 最少要3副本 最好为5副本
提示
- 需要注意是 Zookeeper 的版本
• 3.5.x 是最新版本 但是还是 Beta(测试),但很多人在生产中使用它 3.4为稳定版本 两者都普遍被使用 根据实际情况进行使用
使用 Zookeeper 作为注册中心的问题
两篇文章值得阅读
- 《阿里巴巴为什么不用 Zookeeper 做服务发现》
- 《Eureka! Why You Shouldn’t Use ZooKeeper for Service Discovery》
核心思想
- 在实践中,注册中心不能因为自身的任何原因破坏服务之间本身的可连通性
- 注册中心需要的是 AP,而 Zookeeper 是 CP
• CAP :一致性、可用性、分区容忍性
一致性:是指在同一时刻,分布式系统中的所有数据备份为相同值
可用性:指集群中的某一个节点故障宕机后,集群还能响应客户端请求。
分区容忍性:当分布式系统中因为一些原因导致无法通信而分成多个分区,系统还能正常对外服务。
通过 Docker 启动 Zookeeper
官方指引
- https://hub.docker.com/_/zookeeper
获取镜像
- docker pull zookeeper:3.5
运行 Zookeeper 镜像
- docker run --name zookeeper -p 2181:2181 -d zookeeper:3.5
例子
分为两个模块 zk-customer-service 和 zk-waiter-service
目录
zk-customer-service
需要修改的代码
application.properties
server.port=0
management.endpoint.health.show-details=always
spring.cloud.zookeeper.connect-string=localhost:2181
bootstrap.properties
spring.application.name=customer-service
在pom文件中 将 Eureka 换为 zookeeper 增加zookeeper支持
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
</dependency>
zk-waiter-service
需要修改的代码
application.properties
spring.jpa.hibernate.ddl-auto=none
spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.format_sql=true
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always
info.app.author=hui
info.app.encoding=@project.build.sourceEncoding@
server.port=0
spring.cloud.zookeeper.connect-string=localhost:2181
bootstrap.properties
spring.application.name=waiter-service
在pom文件中 将 Eureka 换为 zookeeper 增加zookeeper支持
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
</dependency>
结果
在控制台 我们可以看到 zk-customer-service 成功的通过 Zookeeper 访问到了 zk-waiter-service
同样 我们打开 docker 中的 Zookeeper 可以看到注册进去服务的信息
Zookeeper 命令
获取镜像:
docker pull zookeeper:3.5
运行:
docker run --name zookeeper -p 2181:2181 -d zookeeper:3.5
操作:
在docker中进入zookeeper命令行;
docker exec -it zookeeper bash
进入zookeeper的bin目录:
cd bin
使用zookeeper client访问zookeeper服务:
./zkCli.sh
查看
ls /
查看所有services:
ls /services
查看waiter-service的信息:
ls /services/waiter-service
根据[id]查看相关服务的详细信息(id是动态的):
ls /services/waiter-service/[id]
示例:
ls /services/waiter-service/51c51677-488c-431f-9566-ccbeec5bef04
获取相关服务的详细信息(id是动态的):
get /services/waiter-service/[id]
示例:
get /services/waiter-service/51c51677-488c-431f-9566-ccbeec5bef04
获取相关服务的详细信息(id是动态的):
get /services/customer-service/[id]
示例:
get /services/customer-service/fd56228b-9b90-4052-99ce-307dd78fe05a