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