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訪問