Zookeeper是一个分布式服务框架,是Apache Hadoop的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务,状态同步服务,集群管理,分布式应用配置项的管理等。
简单来说Zookeeper=文件系统+监听通知机制
1,文件系统
Zookeeper维护一个类似文件系统的数据结构:
每个子目录如NameService都被称作为znode(目录节点),和文件系统一样,我们能够自由的增加、删除znode,在一个znode下增加、删除子znode,唯一的不同在于znode是可以存储数据的。
有四种类型的znode:
- PERSIST-持久化目录节点:客户端与zookeeper断开连接后,该节点依旧存在。
- PERSIST-SEQUENTIAL-持久化顺序编号目录节点:客户端与zookeeper断开连接后,该节点依旧存在,只是zookeeper给该节点名称进行顺序编号。
- EPHEMERAL-临时目录节点:客户端与zookeeper断开连接后,该节点被删除。
- EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点:客户端与zookeeper断开连接后,该节点被删除,只是zookeeper给该节点名称进行顺序编号。
2,监听通知机制
客户端注册监听它关心的目录节点,当目录节点发生(数据改变、被删除、子目录节点增加删除)时,zookeeper会通知客户端。
ZooKeeper的功能
zookeeper功能非常强大,可以实现诸如分布式应用配置管理,统一命名服务,状态同步服务,集群管理等功能。
假设程序是分布式部署在多台机器上,如果要改变程序的配置文件,需要逐台机器去修改,非常麻烦,限制把这些配置全部放到zookeeper上去,保存在zookeeper的某个目录节点中,然后所有相关应用程序对这个目录节点机进行监听,一旦配置信息发生变化,每个应用程序就会收到zookeeper的通知,然后从zookeeper获取新的配置信息应用到系统中。
linux使用docker安装zookeeper
1,搜索镜像:docker search zookeeper
2,拉取镜像:docker pull zookeeper:3.4.12
3,启动镜像:docker run --name zk01 -p 2181:2181 -d zookeeper:3.4.12
4,查看容器启动: dokcer ps
5,进入容器:docker exec -it 容器id /bin/bash
6,进入bin目录:cd bin
7,登录server:zkCli.sh -server 127.0.0.1:2181
8,查看目录: ls /
支付模块
1,POM文件
<dependencies> <dependency> <groupId>com.company.springcloud2020</groupId> <artifactId>cloud-api-commons</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId> <exclusions> <exclusion> <artifactId>zookeeper</artifactId> <groupId>org.apache.zookeeper</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.12</version> </dependency> </dependencies>
2,YML文件
server: port: 8004 spring: application: name: cloud-payment-service cloud: zookeeper: connect-string: 192.168.254.129:2181
主启动类
@SpringBootApplication @EnableDiscoveryClient public class ZkPayment8004Main { public static void main(String[] args) { SpringApplication.run(ZkPayment8004Main.class,args); } }
3,控制层
@RestController public class PaymentController { @Value("${server.port}") private String serverPort; @GetMapping("/payment/zk") public String paymentZk(){ return "zookeeper: "+serverPort+"\t"+ UUID.randomUUID().toString(); } }
订单模块
1,POM文件
<dependencies> <dependency> <groupId>com.company.springcloud2020</groupId> <artifactId>cloud-api-commons</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId> <exclusions> <exclusion> <artifactId>zookeeper</artifactId> <groupId>org.apache.zookeeper</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.12</version> </dependency> </dependencies>
2,YML文件
server:
port: 82
spring:
application:
name: cloud-order-service
cloud: zookeeper: connect-string: 192.168.254.129:2181
3,主启动类
@SpringBootApplication @EnableDiscoveryClient public class ZkOrder82Main { public static void main(String[] args) { SpringApplication.run(ZkOrder82Main.class,args); } }
4,配置文件
@Configuration public class MyConfig { @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); } }
5,控制层
@RestController public class OrderController { private final String url="http://cloud-payment-service"; @Autowired private RestTemplate restTemplate; @GetMapping("/consumer/payment/zk") public String orderZk(){ return restTemplate.getForObject(url+"/payment/zk",String.class); } }
通过http://localhost:82/consumer/payment/zk访问