SpringCloud06-Zookeeper服务注册与发现

1、Zookeeper

1.1 Zookeeper简介

Zookeeper是一个分布式协调工具,可以实现注册中心功能;当Eureka停更之后,Zookeeper服务器取代Eureka服务器,zk可以作为服务注册中心

1.2 安装Zookeeper

进docker hub的官网搜索zookeeper:https://hub.docker.com/_/zookeeper?tab=tags

然后使用docker命令安装zookeeper:docker pull zookeeper:3.6.0 (这里安装的3.6.0版本)

启动docker:docker run --privileged=true -d --name zookeeper --publish 2181:2181 -d 4f58c04512fb

关闭防火墙:systemctl stop firewalld
查看防火墙状态:systemctl status firewalld

在这里插入图片描述

查看启动的容器:docker ps

进入zookeeper容器:docker exec -it d765fcf8af45 /bin/bash (d765fcf8af45 是zookeeper容器的ID)

进入bin目录下面:cd bin

查看bin下面的文件:ls

然后启动客户端:./zkCli.sh

然后就会看到下面的界面:

在这里插入图片描述

我们可以使用红框里面的命令,查看现在zookeeper里面的信息。现在是没有任何节点连接上zookeeper的,等我们的其他微服务连接上之后,再次查看就会发现其他的节点。

到此,linux上面通过docker安装zookeeper是成功的,下面开始微服务的编写并连接到zookeeper。

2、创建服务提供者payment8004

2.1 建Module

创建新的Module:cloud-provider-zk-payment8004

在这里插入图片描述

2.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>springcloud2020</artifactId>
        <groupId>com.zdw.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-provider-zk-payment8004</artifactId>
    <description>Zookeeper服务提供者</description>

    <dependencies>
        <dependency>
            <groupId>com.zdw.springcloud</groupId>
            <artifactId>cloud-api-common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <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>
            <exclusions>
                <!--先排除自带的zookeeper3.5.3-->
                <exclusion>
                    <groupId>org.apache.zookeeper</groupId>
                    <artifactId>zookeeper</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--添加zookeeper3.6.0版本-->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.6.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </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

server:
  # 8004表示注册到zookeeper服务器的支付服务提供者端口号
  port: 8004
spring:
  application:
    # 服务别名---注册zookeeper到注册中心的名称
    name: cloud-provider-zk-payment
  cloud:
    zookeeper:
      # 默认localhost:2181,我是连接Linux上面的zookeeper
      connect-string: 10.254.14.56:2181

2.4 主启动

package com.zdw.springcloud;

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

@SpringBootApplication
@EnableDiscoveryClient  //这个注解一定要加,不能忘记
public class PaymentZkMain8004 {
    public static void main(String[] args) {
        SpringApplication.run(PaymentZkMain8004.class,args);
    }
}

@EnableDiscoveryClient 这个注解用于注册服务到Zookeeper注册中心

2.5 业务编写

2.5.1 controller编写

package com.zdw.springcloud.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 PaymentZkController {

    @Value("${server.port}")
    private String serverPort;

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

2.6 测试

启动cloud-provider-zk-payment8004,然后浏览器访问:http://localhost:8004/payment/zk 是正常的。

此时我们再次查看linux上面的zookeeper的信息:

在这里插入图片描述

可以看到,zookeeper下面多了一个services,services里面有我们的cloud-provider-zk-payment服务。所以支付服务8004注册到zookeeper是成功的。

3、创建订单消费者order80

3.1 建Module

创建新的Module:cloud-consumer-zk-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>springcloud2020</artifactId>
        <groupId>com.zdw.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-consumer-zk-order80</artifactId>
    <description>订单消费者之注册中心zookeeper</description>

    <dependencies>
        <dependency>
            <groupId>com.zdw.springcloud</groupId>
            <artifactId>cloud-api-common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <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>
            <exclusions>
                <!--先排除自带的zookeeper3.5.3-->
                <exclusion>
                    <groupId>org.apache.zookeeper</groupId>
                    <artifactId>zookeeper</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--添加zookeeper3.6.0版本-->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.6.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </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:
  # 80表示注册到zookeeper服务器的订单消费者端口号
  port: 80
spring:
  application:
    # 服务别名---注册zookeeper到注册中心的名称
    name: cloud-consumer-zk-order
  cloud:
    zookeeper:
      # 默认localhost:2181,我是连接Linux上面的zookeeper
      connect-string: 10.254.14.56:2181

3.4 主启动

package com.zdw.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);
    }
}

@EnableDiscoveryClient //这个注解至关重要,不能漏掉了

3.5 业务编写

3.5.1 配置RestTemplate

package com.zdw.springcloud.config;

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 OrderZkConfig {

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

3.5.2 controller编写

package com.zdw.springcloud.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;

@RestController
@Slf4j
public class OrderZkController {

    //cloud-provider-zk-payment 是支付服务者注册到zookeeper的名称
    public static final String INVOKE_URL = "http://cloud-provider-zk-payment";

    @Resource
    private RestTemplate restTemplate;

    @GetMapping("/consumer/payment/zk")
    public String paymentInfo() {
        //通过RestTemplate调用 cloud-provider-zk-payment 的服务
        return restTemplate.getForObject(INVOKE_URL + "/payment/zk", String.class);
    }
}

3.6 测试

我们启动主启动类,之前的payment8004也是启动的,浏览器访问:http://localhost:8004/payment/zk 和 http://localhost/consumer/payment/zk 都是成功的,此时我们再次查看zookeeper的信息:

在这里插入图片描述

到此,服务提供者和服务消费者都已经注册成功。

可以通过在线json解析工具查看详情:https://www.json.cn

在这里插入图片描述

4、注册到Zookeeper的节点是临时还是持久

服务节点是临时节点还是持久节点?

我们可以停掉服务payment8004,然后等一会之后,我们再次查看zookeeper的信息,会发现cloud-provider-zk-payment8004就没有了,已经被zookeeper剔除掉了;这和Eureka的自我保护机制不同,Eureka默认开启自我保护机制,如果服务停掉了,不会立马剔除该微服务。而Zookeeper是无情的立即剔除,不会保留。所以在Zookeeper中,服务节点是临时节点。

当我们再次启动payment8004服务之后,再次查看zookeeper信息,cloud-provider-zk-payment8004又会注册成功,但是此时的流水号已经改变了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值