SpringCloud实战---第十篇:使用Zookeeper服务注册中心

举报
老司机张师傅 发表于 2022/07/26 23:22:39 2022/07/26
【摘要】 前言 说起来容易做起来难,一步一步都干完!!! 学习一定要自己动手搞一搞,不能只眼会。 学习笔记是跟着尚硅谷的视频学的:传送门 场景大纲我们以这样一个场景来学习、构建我们的微服务 安装zookeeperzookeeper是Eureka的最简单的替换方案,只需要将注册中心改成Zoookeeper即可。安装教程: Zookeeper安装教程 创建使用zookeeper的服务提供者 1. 创建c...

前言

说起来容易做起来难,一步一步都干完!!!

学习一定要自己动手搞一搞,不能只眼会。

学习笔记是跟着尚硅谷的视频学的:传送门

场景大纲

我们以这样一个场景来学习、构建我们的微服务
在这里插入图片描述


安装zookeeper

zookeeper是Eureka的最简单的替换方案,只需要将注册中心改成Zoookeeper即可。
安装教程: Zookeeper安装教程

创建使用zookeeper的服务提供者

1. 创建cloud-provider-payment8004模块

cloud-provider-payment8004

在这里插入图片描述

具体创建模块的步骤不赘述了,可以参照之前的博客:https://blog.csdn.net/weixin_43464964/article/details/121980366
工程结构
在这里插入图片描述

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>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-->
            <!--<exclusions>-->
                <!--<exclusion>-->
                    <!--<groupId>org.apache.zookeeper</groupId>-->
                    <!--<artifactId>zookeeper</artifactId>-->
                <!--</exclusion>-->
            <!--</exclusions>-->
        </dependency>
        <!--添加zookeeper3.5.7版本-->
        <!--<dependency>-->
            <!--<groupId>org.apache.zookeeper</groupId>-->
            <!--<artifactId>zookeeper</artifactId>-->
            <!--<version>3.5.7</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. application.yml

server:
  port: 8004

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

4. 启动类

package com.atguigu.springcloud;

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

/**
 * @Author: Daisen.Z
 * @Date: 2021/12/22 11:53
 * @Version: 1.0
 * @Description:
 */
// @EnableDiscoveryClient和@EnableEurekaClient共同点就是:都是能够让注册中心能够发现,扫描到改服务。
// 不同点:@EnableEurekaClient只适用于Eureka作为注册中心,@EnableDiscoveryClient 可以是其他注册中心。
@SpringBootApplication
@EnableDiscoveryClient
public class PaymentMain8004 {
    public static void main(String[] args) {
        SpringApplication.run(PaymentMain8004.class,args);
    }
}

5. PaymentController

package com.atguigu.springcloud.controller;

import com.atguigu.springcloud.entities.Payment;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Author: Daisen.Z
 * @Date: 2021/12/22 11:59
 * @Version: 1.0
 * @Description:
 */
@RestController
@Slf4j
public class PaymentController {

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

    @GetMapping("/payment/zk")
    public String paymentzk(){
        return "port:"+serverPort;
    }

}

创建工程目录将配置及各个类创建完成


测试检查环境

1. 启动测试

先启动服务器上zookeeper,再启动程序
进入zookeeper的bin目录

./zkServer.sh start

然后启动程序
在这里插入图片描述
虽然我们现在的环境是能启动成功的,但是还是要补充一下,spring-cloud-starter-zookeeper-discovery会自带的有一个zookeeper依赖,如果你服务器上安装的zookeeper比较新,和spring-cloud-starter-zookeeper-discovery版本自带的依赖不同,程序会报一个zookeeper版本冲突的问题,这里我们直接说下解决方式。

2. 解决Zookeeper版本冲突

修改POM,排除掉spring-cloud-starter-zookeeper-discovery自带的zookeeper

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
    <!--先排除自带的zookeeper3.5.3-->
    <exclusions>
        <exclusion>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
        </exclusion>
    </exclusions>
</dependency>

在这里插入图片描述
添加与服务器上zookeeper版本号相同的依赖

<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.5.7</version>
</dependency>

在这里插入图片描述
再次启动,就不会再报zookeeper版本冲突的错误了。

测试服务注册

zookeeper基本命令合集(bin目录下执行)

操作 命令
启动 ./zkServer.sh start
查看状态 ./zkServer.sh status
进入客户端 ./zkCli.sh
退出客户端 quit
关闭zookeeper ./zkServer.sh stop

1. 登录服务器上Zookeeper-client

先关闭我们的java程序
到Zookeeper安装目录的bin目录下,执行以下命令进入客户端

./zkCli.sh

在这里插入图片描述
查看zookeeper上的内容

ls /

在这里插入图片描述
只有一个zookeeper,查看zookeeper

ls /zookeeper

在这里插入图片描述
有一些zookeeper相关的信息,证明zookeeper是正常的

2. 启动程序,注册到zk上

启动我们的程序
再次在zookeeper客户端上执行ls /,查看根目录
在这里插入图片描述
发现多了个services,查看下这个文件下有什么

ls /services

在这里插入图片描述
发现我们的服务已经注册上来啦!!!
在这里插入图片描述

3. 查看注册上来的服务的信息

在zk的客户端上执行下面命令

ls /services/cloud-provider-payment

发现cloud-provider-payment服务文件夹下有一个流水号
在这里插入图片描述
好,接下来我们get一下

get /services/cloud-provider-payment/21339f58-c80f-42d8-8583-715f48130c46

获取出来了一个JSON串,用在线解析工具解析一下,能够看出是我们的微服务注册的信息,至此说明微服务成功注册进了zk。
在这里插入图片描述
在这里插入图片描述


与Eureka做对比

上篇我们知道,Eureka是CAP中的AP机制,他是带一个自我保护机制的服务挂掉后不会立马被删除,那么ZK是怎样的呢?
大家可以自己测试一下,自己动动手,把微服务注册到zk上,使用ls命令看着你注册的那个微服务,然后把微服务程序关掉,看过段时间zk是否会把微服务清理掉。

这里先说下结论,微服务注册进入zk使用的是临时节点,当微服务一段时间没发心跳会会被立马清除(没有自我保护机制),这种机制是cap中的cp,当你重新启动微服务时会重新在zookeeper上面注册(服务下面用于获取json的那个流水号会改变)。

改造80工程,通过zk调用payment/zk接口

1. 创建cloud-customerzk-order80模块

cloud-customerzk-order80

2. 添加pom依赖,pom依赖和8004一样

3. 添加配置,将8004工程的配置粘贴过来

在这里插入图片描述

4. 创建基础包

com.atguigu.springcloud

在这里插入图片描述

5. 编写启动类OrderZKMain80

package com.atguigu.springcloud;

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

/**
 * @auther zzyy
 * @create 2020-02-19 15:19
 */
@SpringBootApplication
@EnableDiscoveryClient
public class OrderZKMain80
{
    public static void main(String[] args) {
            SpringApplication.run(OrderZKMain80.class, args);
    }
}

6. 添加RestTemplate

在这里插入图片描述

7. 编写OrderZkController

在这里插入图片描述
这里我们还没有讲到Feign等远程调用,暂时还是使用RestTemplate去通过服务名调用

package com.atguigu.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;

/**
 * @auther zzyy
 * @create 2020-02-19 15:21
 */
@RestController
@Slf4j
public class OrderZKController
{
    public static final String INVOKE_URL = "http://cloud-provider-payment";

    @Resource
    private RestTemplate restTemplate;

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

8. 启动

启动zk-80和8004两个工程
到ZK客户端查看一下

ls /services

两个服务都注册上来了
在这里插入图片描述

9. 访问页面,测试

http://localhost/consumer/payment/zk

成功调用接口
在这里插入图片描述


总结

操作 命令
启动 ./zkServer.sh start
查看状态 ./zkServer.sh status
进入客户端 ./zkCli.sh
退出客户端 quit
关闭zookeeper ./zkServer.sh stop
  • 通过在服务器上zk客户端执行命令可以查看已注册服务的信息。

ls /services/服务名/流水号

  • 微服务注册到zk上属于使临时节点,当微服务一段时间没发心跳会会被立马清除(与Eureka不同,没有自我保护机制),这种机制是cap中的cp,当你重新启动微服务时会重新在zookeeper上面注册(服务下面用于获取json的那个流水号会改变)。
  • zk集群的整合也很简单,搭建zk集群,然后在程序的yml配置中把zk的地址写成多个,用逗号隔开即可,zk不是重点,不再多说。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。