ZooKeeper是一個分布式服務框架,是Apache Hadoop 的一個子項目,它主要是用來解決分布式應用中經常遇到的一些數據管理問題,如:統一命名服務、狀態同步服務、集群管理、分布式應用配置項的管理等
ZooKeeper是一個樹形結構的目錄服務,支持變更推送
在ZooKeeper中,節點分為兩類:
機器節點:
指構成集群的機器
數據節點ZNode:
指數據模型中的數據單元
ZooKeeper將所有數據存儲在內存中,數據模型是一棵樹(ZNode Tree),由斜杠(/)進行分割的路徑,就是一個ZNode,例如/services/customer
每個ZNode上都會保存自己的數據內容,同時還會保存一系列屬性信息
Znode可分為:
持久節點:指一旦這個ZNode被創建了,除非主動進行ZNode的移除操作,否則這個ZNode將一直保存在ZooKeeper上
臨時節點:它的生命周期和客戶端會話綁定,一旦客戶端會話失效,那么這個客戶端創建的所有臨時節點都會被移除
1.docker安裝
docker pull zookeeper:3.5
2.啟動
docker run --name zookeeper -p 2181:2181 -d zookeeper:3.5
3.使用
provider
依賴
<properties> <java.version>1.8</java.version> <spring-cloud.version>Greenwich.SR3</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
配置
server.port=8010
spring.application.name=service-provider
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always
spring.cloud.zookeeper.connect-string=192.168.99.100:2181
啟動類
package com.xyz.provider; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @EnableDiscoveryClient @SpringBootApplication public class ProviderApplication { public static void main(String[] args) { SpringApplication.run(ProviderApplication.class, args); } }
控制器
package com.xyz.provider.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class demoController { @RequestMapping("/hello") public String Hello() { return "hello,provider"; } }
comsumer
添加依賴
<properties> <java.version>1.8</java.version> <spring-cloud.version>Hoxton.SR1</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
配置
server.port=8015 spring.application.name=service-comsumer management.endpoints.web.exposure.include=* management.endpoint.health.show-details=always feign.client.config.default.connect-timeout=500 feign.client.config.default.read-timeout=500 spring.cloud.zookeeper.connect-string=192.168.99.100:2181
啟動類
package com.xyz.comsumer; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.context.annotation.Bean; import org.springframework.web.client.RestTemplate; @EnableFeignClients @SpringBootApplication public class ComsumerApplication { public static void main(String[] args) { SpringApplication.run(ComsumerApplication.class, args); } @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } }
控制器
package com.xyz.comsumer.controller; import com.xyz.comsumer.feign.RemoteHelloService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class FeignController { @Autowired RemoteHelloService remoteHelloService; @RequestMapping("feignTest") public String feignTest() { String result = remoteHelloService.hello(); if (result == null) { result = "出錯"; } return result; } }
啟動provider
啟動comsumer
測試 GET http://127.0.0.1:8015/feignTest
輸出
hello,provider
4.查看
在docker中進入zookeeper命令行
docker exec -it zookeeper bash
進入zookeeper的bin目錄
cd bin
使用zookeeper client訪問zookeeper服務
./zkCli.sh
查看當前 ZooKeeper 中所包含的內容
[zk: localhost:2181(CONNECTED) 1] ls / [services, zookeeper]
查看所有services
[zk: localhost:2181(CONNECTED) 2] ls /services [service-comsumer, service-provider]
查看service-comsumer的信息
[zk: localhost:2181(CONNECTED) 13] ls /services/service-comsumer [efac86a0-1d0c-47e8-8f29-998661f50e04]
根據[id]查看相關服務的詳細信息
[zk: localhost:2181(CONNECTED) 23] ls /services/service-comsumer [f8c462b5-a6e6-4861-b20d-e48cdcdda207] [zk: localhost:2181(CONNECTED) 24] get /services/service-comsumer/f8c462b5-a6e6-4861-b20d-e48cdcdda207 {"name":"service-comsumer","id":"f8c462b5-a6e6-4861-b20d-e48cdcdda207","address":"hkgi-PC","port":8015,"sslPort":null,"payload":{"@class":"org.springframework.cloud.zookeeper.discovery.ZookeeperInstance","id":"service-comsumer-1","name":"service-comsumer","metadata":{}},"registrationTimeUTC":1586917597776,"serviceType" :"DYNAMIC","uriSpec":{"parts":[{"value":"scheme","variable":true},{"value":"://","variable":false},{"value":"address","variable":true},{"value":":","variable":false},{"value":"port","variable":true}]}}