1. zookeeper安装(Linux)

1.1 安装条件

想要安装zookeeper,必须先在linux中安装好jdk

1.2 下载安装包

下载地址https://zookeeper.apache.org/releases.html

  1. 进入下载目录 cd /opt/
  2. 运行命令wget+下载链接

    1.3 安装

    (1)创建和解压至安装目录

    1. mkdir /usr/local/zookeeper
    2. tar -zxcf /home/install/zookeeper-3.4.9.tar.gz -C /usr/local/zookeeper/

    (2)编辑配置文件

  3. 进入conf目录:

    [root@localhost  local]# cd zookeeper-3.4.13/conf
    
  4. 将zoo_sample.cfg这个文件复制为zoo.cfg (必须是这个文件名)

    [root@localhost  conf]# cp  zoo_sample.cfg  zoo.cfg
    
  5. 创建数据存储目录与日志目录

    mkdir /usr/local/zookeeper/zookeeper-3.4.9/dataDir
    mkdir
    
  6. 进入zoo.cfg文件进行编辑

    [root@localhost  conf]# vim zoo.cfg
    
  7. 按 i 进入编辑模式,修改以下内容:

    dataDir=/usr/local/zookeeper/zookeeper-3.4.9/dataDir
    dataLogDir=/usr/local/zookeeper/zookeeper-3.4.9/dataLogDir
    

    注意:如果想配置集群的话,请在clientPort下面添加服务器的ip。如
    server.1=192.168.180.132:2888:3888
    server.2=192.168.180.133:2888:3888
    server.3=192.168.180.134:2888:3888
    如果电脑内存比较小,zookeeper还可以设置成伪集群。也就是全部服务器采用同一个ip,但是使用不同的端口

  8. 如果是配置集群,还需要在前面配置过的dataDir路径下新增myid文件

在data目录下创建文件,文件名为“myid”, 编辑该“myid”文件,并在对应的IP的机器上输入对应的编号。
如在192.168.180.132上,“myid”文件内容就是1。在192.168.180.133上,内容就是2。

1.4 配置环境变量

[root@localhost zookeeper-3.4.13]# export ZOOKEEPER_INSTALL=/usr/local/zookeeper-3.4.9/
[root@localhost zookeeper-3.4.13]# export PATH=$PATH:$ZOOKEEPER_INSTALL/bin

1.5 启动zookeeper

  1. 进入bin目录,并启动zookeep。

如果不是在bin目录下执行,启动zookeeper时会报错: bash: ./zkServer.sh: No such file or directory
注意: ./zkServer.sh start前面的 . 不可忽略。

[root@localhost local]# cd /usr/local/zookeeper-3.4.13/bin
[root@localhost bin]# ./zkServer.sh start
  1. 启动成功效果如下:

    ZooKeeper JMX enabled by default
    Using config: /usr/local/zookeeper/zookeeper-3.4.9/bin/../conf/zoo.cfg
    Starting zookeeper ... STARTED
    
  2. zookeeper的服务端启动后,还需要启动zookeeper的客户端:(暂时可以不启动)

    [root@localhost bin]# ./zkCli.sh
    

    如果是连接多个不同的主机节点,可以使用如下命令:

    ./zkCli.sh -server 192.168.180.132:2888
    
  3. 查看状态:

    [root@iz2zefmq3ndymmurowrgunz bin]# ./zkServer.sh status
    ZooKeeper JMX enabled by default
    Using config: /usr/local/zookeeper/zookeeper-3.4.9/bin/../conf/zoo.cfg
    Mode: standalone
    

    2. 服务提供者

    Zookeeper是一个分布式协调工具,可以实现注册中心功能 关闭Linux服务器防火墙后启动Zookeeper服务器 Zookeeper服务器取代Eureka服务器,zk作为服务注册中心

2.1 创建module

新建cloud-provider-payment8004

2.2 pom

注意:
spring-cloud-starter-zookeeper-discovery自身会携带zookeeper,其版本可能与服务器的zookeeper版本不一致导致启动失败,所以最好在pom文件中将其自身携带的zookeeper排除,重新引入与服务器zookeeper版本一致的zookeeper依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>cloud2021</artifactId>
        <groupId>com.atguigu.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-provider-payment8004</artifactId>
    <dependencies>
        <!-- SpringBoot整合Web组件 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency><!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
            <groupId>com.atguigu.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </dependency>
        <!-- SpringBoot整合zookeeper客户端 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
            <!--先排除自带的zookeeper3.5.3 防止与3.4.9起冲突-->
            <exclusions>
                <exclusion>
                    <groupId>org.apache.zookeeper</groupId>
                    <artifactId>zookeeper</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--添加zookeeper3.4.9版本-->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.9</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>

2.3 yml

#8004表示注册到zookeeper服务器的支付服务提供者端口号
server:
  port: 8004

#服务别名----注册zookeeper到注册中心名称
spring:
  application:
    name: cloud-provider-payment
  cloud:
    zookeeper:
      connect-string: 8.131.53.171:2181

2.4 主启动类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient//该注解用于向使用consul或者zookeeper作为注册中心时注册服务
public class PaymentMain8004 {
    public static void main(String[] args) {
        SpringApplication.run(PaymentMain8004.class, args);
    }
}

2.5 controller

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.UUID;

@RestController
@Slf4j
public class PaymentController
{
    @Value("${server.port}")
    private String serverPort;

    @RequestMapping(value = "/payment/zk")
    public String paymentzk()
    {
        return "springcloud with zookeeper: "+serverPort+"\t"+ UUID.randomUUID().toString();
    }
}

2.6 启动

启动8004注册进zookeeper(要先启动zookeeper的server)

(1)测试一

浏览器 - http://localhost:8004/payment/zk
image.png

(2)测试二

zookeeper客户端操作

[root@iz2zefmq3ndymmurowrgunz bin]# ./zkCli.sh 
[zk: localhost:2181(CONNECTED) 0] ls /
[services, zookeeper]
[zk: localhost:2181(CONNECTED) 4] ls /services
[cloud-provider-payment]
[zk: localhost:2181(CONNECTED) 5] ls /services/cloud-provider-payment
[e22e5c8f-e1e1-4e65-93b8-90fcebbf41ae]
[zk: localhost:2181(CONNECTED) 6] get /services/cloud-provider-payment/e22e5c8f-e1e1-4e65-93b8-90fcebbf41ae
{"name":"cloud-provider-payment","id":"e22e5c8f-e1e1-4e65-93b8-90fcebbf41ae","address":"192.168.2.110","port":8004,"sslPort":null,"payload":{"@class":"org.springframe
work.cloud.zookeeper.discovery.ZookeeperInstance","id":"application-1","name":"cloud-provider-payment","metadata":{}},"registrationTimeUTC":1629016049250,"serviceType":"DYNAMIC","uriSpec":{"parts":[{"value":"scheme","variable":true},{"value":"://","variable":false},{"value":"address","variable":true},{"value":":","variable":false},{"value":"port","variable":true}]}}cZxid = 0x5
ctime = Sun Aug 15 16:27:31 CST 2021
mZxid = 0x5
mtime = Sun Aug 15 16:27:31 CST 2021
pZxid = 0x5
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x17b48cef87f0000
dataLength = 534

json格式化get /services/cloud-provider-payment/e22e5c8f-e1e1-4e65-93b8-90fcebbf41ae的结果:

{
    "name": "cloud-provider-payment",
    "id": "e22e5c8f-e1e1-4e65-93b8-90fcebbf41ae",
    "address": "192.168.2.110",
    "port": 8004,
    "sslPort": null,
    "payload": {
        "@class": "org.springframe
work.cloud.zookeeper.discovery.ZookeeperInstance",
        "id": "application-1",
        "name": "cloud-provider-payment",
        "metadata": {

        }
    },
    "registrationTimeUTC": 1629016049250,
    "serviceType": "DYNAMIC",
    "uriSpec": {
        "parts": [
            {
                "value": "scheme",
                "variable": true
            },
            {
                "value": "://",
                "variable": false
            },
            {
                "value": "address",
                "variable": true
            },
            {
                "value": ":",
                "variable": false
            },
            {
                "value": "port",
                "variable": true
            }
        ]
    }
}

2.7 临时还是持久节点

ZooKeeper的服务节点是临时节点,服务节点宕机,zookeeper立即删除该节点

实际测试过程中,停止服务后,节点并没有立即删除services下的服务名目录,而是删除了服务目录下的实例

3. 服务消费者

订单服务注册进zookeeper

3.1 创建module

新建cloud-consumerzk-order80

3.2 pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>LearnCloud</artifactId>
        <groupId>com.lun.springcloud</groupId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-consumerzk-order80</artifactId>

    <dependencies>
        <!-- SpringBoot整合Web组件 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- SpringBoot整合zookeeper客户端 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
            <!--先排除自带的zookeeper-->
            <exclusions>
                <exclusion>
                    <groupId>org.apache.zookeeper</groupId>
                    <artifactId>zookeeper</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--添加zookeeper3.4.9版本-->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.9</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>

3.3 yml

server:
  port: 80

#服务别名----注册zookeeper到注册中心名称
spring:
  application:
    name: cloud-consumer-order
  cloud:
    zookeeper:
      connect-string: 127.0.0.1:2181 # 192.168.111.144:2181 #

3.4 主启动类

package com.atguigu.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class OrderZKMain80 {
    public static void main(String[] args) {
        SpringApplication.run(OrderZKMain80.class,args);
    }
}

3.5 业务类

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class ApplicationContextConfig
{
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate()
    {
        return new RestTemplate();
    }
}
import javax.annotation.Resource;

@RestController
@Slf4j
public class OrderZKController
{
    public static final String INVOKE_URL = "http://cloud-provider-payment";

    @Resource
    private RestTemplate restTemplate;

    @GetMapping(value = "/consumer/payment/zk")
    public String paymentInfo()
    {
        String result = restTemplate.getForObject(INVOKE_URL+"/payment/zk",String.class);
        return result;
    }
}

3.6 测试

(1)测试一

运行ZooKeeper服务端,cloud-consumerzk-order80,cloud-provider-payment8004。
打开ZooKeeper客户端:

[zk: localhost:2181(CONNECTED) 8] ls /services
[cloud-provider-payment, cloud-consumer-order]
[zk: localhost:2181(CONNECTED) 9]

(2)测试二

http://localhost/consumer/payment/zk

image.png

4. 项目地址

git@github.com:muzhiyi1996/Cloud2021.git
https://github.com/muzhiyi1996/Cloud2021.git
Zookeeper20210815分支