SpringCloud集成Zookeeper使用


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM