【SpringCloud07】SpringCloud 整合Zookeeper注册中心

导读:本篇文章讲解 【SpringCloud07】SpringCloud 整合Zookeeper注册中心,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

1.Zookeeper注册中心

  • zookeeper是一个分布式协调工具,可以实现注册中心功能
  • 关闭Linux服务器防火墙启动zookeeper服务器
  • zookeeper服务器取代Eureka服务器,zookeeper作为服务注册中心
    在这里插入图片描述

2.服务提供者

1.新建cloud-provider-payment8004

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">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.atguigu.springcloud</groupId>
        <artifactId>cloud2022</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>cloud-provider-payment8004</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <!--eureka client-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
        </dependency>
        <!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
        <dependency>
            <groupId>com.atguigu.springcloud</groupId>
            <artifactId>cloud-api-common</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </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.YML

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

#服务别名----注册到zookeeper注册中心名称
spring:
  application:
    name: cloud-provider-payment
  cloud:
    zookeeper:
      connect-string: 192.168.100.130: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: ASuLe
 * @Date: 2023/1/12 21:42
 * @Version: 1.0
 * @Description: 文件作用详细描述....
 */
@SpringBootApplication
//@EnableDiscoveryClient该注解用于向使用consul或者zookeeper作为注册中心时注册服务
@EnableDiscoveryClient
public class PaymentMain8004 {
    public static void main(String[] args) {
        SpringApplication.run(PaymentMain8004.class, args);
    }
}

5.Controller

package com.atguigu.springcloud.controller;

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

import java.util.UUID;

/**
 * 简要描述
 *
 * @Author: ASuLe
 * @Date: 2023/1/12 21:44
 * @Version: 1.0
 * @Description: 文件作用详细描述....
 */
@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();
    }
}

6.启动8004注册进zookeeper

关闭防火墙
命令: systemctl stop firewalld

启动zookeeper服务
命令: ./zkServer.sh start
在这里插入图片描述
启动客户端,默认端口2181
命令: ./zkCli.sh
在这里插入图片描述

查看根节点
命令: ls /
在这里插入图片描述

获取/zookeeper这个节点下面的数据
命令: get /zookeeper
在这里插入图片描述

7.验证测试

在这里插入图片描述

问题:启动失败
原因:坐标天生带有3.5.3,而我们的zookeeper版本是3.5.7,说明两个版本存在jar包冲突

在这里插入图片描述
在这里插入图片描述
解决:

  1. 解决zookeeper版本jar包版本冲突问题
  2. 引入新的POM排除zk冲突
  3. 启动过程中发现zookeeper里面自带了slf4j这个jar包,会和starter中的冲突,需要排除
<!--SpringBoot整合zookeeper客户端-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
        </exclusion>
        <exclusion>
            <artifactId>slf4j-log4j12</artifactId>
            <groupId>org.slf4j</groupId>
        </exclusion>
    </exclusions>
</dependency>
<!--添加zookeeper3.5.7版本-->
<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.5.7</version>
    <exclusions>
        <exclusion>
            <artifactId>slf4j-log4j12</artifactId>
            <groupId>org.slf4j</groupId>
        </exclusion>
    </exclusions>
</dependency>

在这里插入图片描述
8004启动成功
在这里插入图片描述
连上zookeeper客户端进行判断

命令: ls / and ls /services

在这里插入图片描述
在这里插入图片描述
访问
在这里插入图片描述

8.验证测试2

命令: ls /services/cloud-provider-payment

在这里插入图片描述

命令: ls /services/cloud-provider-payment/46e8d426-14fc-4eff-a02a-cba2e0615e77

在这里插入图片描述

命令: get /services/cloud-provider-payment/46e8d426-14fc-4eff-a02a-cba2e0615e77

在这里插入图片描述
使用json在线工具校验

{
    "name": "cloud-provider-payment",
    "id": "46e8d426-14fc-4eff-a02a-cba2e0615e77",
    "address": "localhost",
    "port": 8004,
    "sslPort": null,
    "payload": {
        "@class": "org.springframework.cloud.zookeeper.discovery.ZookeeperInstance",
        "id": "application-1",
        "name": "cloud-provider-payment",
        "metadata": {}
    },
    "registrationTimeUTC": 1673536594333,
    "serviceType": "DYNAMIC",
    "uriSpec": {
        "parts": [
            {
                "value": "scheme",
                "variable": true
            },
            {
                "value": "://",
                "variable": false
            },
            {
                "value": "address",
                "variable": true
            },
            {
                "value": ":",
                "variable": false
            },
            {
                "value": "port",
                "variable": true
            }
        ]
    }
}

9.思考

问题: 服务节点是临时节点还是持久节点?

测试:假如8004宕机,会不会每隔一段时间之后(心跳时间范围以内)是有自我保护机制还是直接删除呢?
在这里插入图片描述

答案: 临时节点

测试:再次启动8004
在这里插入图片描述

流水号已经改变,所以是直接删除的

3.服务消费者

1.新建cloud-consumerzk-order80

2.POM

<dependencies>
   <!--SpringBoot整合zookeeper客户端-->
   <dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
       <exclusions>
           <exclusion>
               <groupId>org.apache.zookeeper</groupId>
               <artifactId>zookeeper</artifactId>
           </exclusion>
           <exclusion>
               <artifactId>slf4j-log4j12</artifactId>
               <groupId>org.slf4j</groupId>
           </exclusion>
       </exclusions>
   </dependency>
   <!--添加zookeeper3.5.7版本-->
   <dependency>
       <groupId>org.apache.zookeeper</groupId>
       <artifactId>zookeeper</artifactId>
       <version>3.5.7</version>
       <exclusions>
           <exclusion>
               <artifactId>slf4j-log4j12</artifactId>
               <groupId>org.slf4j</groupId>
           </exclusion>
       </exclusions>
   </dependency>
   <!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
   <dependency>
       <groupId>com.atguigu.springcloud</groupId>
       <artifactId>cloud-api-common</artifactId>
       <version>${project.version}</version>
   </dependency>
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-web</artifactId>
   </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>

3.YML

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

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

4.主启动

package com.atguigu.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * 简要描述
 *
 * @Author: ASuLe
 * @Date: ${DATE} ${TIME}
 * @Version: 1.0
 * @Description: 文件作用详细描述....
 */
@SpringBootApplication
public class OrderZKMain80 {
    public static void main(String[] args) {
        SpringApplication.run(OrderZKMain80.class, args);
    }
}

5.业务类

使用RestTemplate 进行远程调用

package com.atguigu.springcloud.config;

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

/**
 * 简要描述
 *
 * @Author: ASuLe
 * @Date: 2023/1/12 23:52
 * @Version: 1.0
 * @Description: 文件作用详细描述....
 */
@Configuration
public class ApplicationContextConfig {


    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate(){
        return new 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;

/**
 * 简要描述
 *
 * @Author: ASuLe
 * @Date: 2023/1/12 23:54
 * @Version: 1.0
 * @Description: 文件作用详细描述....
 */
@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;
    }
}

6.验证测试

命令: ls /services发现新增了cloud-consumerzk-order80
在这里插入图片描述

7.访问测试地址

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/81882.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!