SpringCloud&alibaba学习笔记系列3

此博客是SpringCloud&alibaba学习笔记,介绍用zookeeper代替eureka实现服务发现与注册。阐述了zookeeper作为注册中心的概述,演示服务提供者和消费者注册到zookeeper的过程,包括新建项目、配置文件、解决jar包冲突及测试等,还提及zookeeper节点特性和CAP属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SpringCloud&alibaba学习笔记系列
该笔记仅作为个人学习使用。

第三章zookeeper的服务发现与注册

官网:https://zookeeper.apache.org/

使用zookeeper代替eureka

3.1注册中心zookeeper

3.1.1概述

​ ZooKeeper是Hadoop的正式子项目,它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护、名字服务、分布式同步、组服务等。也可以实现注册中心功能;

3.1.2下载安装

下载安装这里就不赘述,详见我我的博客《离线安装zookeeper》。

3.2服务提供者

下面我们实际演示通过zookeeper作为服务注册中心和如何注册到zookeeper。

1.新建cloud-provider-payment8004

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VpPVfhWu-1606299711235)(C:\Users\sj\AppData\Roaming\Typora\typora-user-images\image-20201025160016535.png)]

2.pom文件

直接从8001拷贝过来依赖

<?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.jzt</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

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

    <dependencies>

        <!--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>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.9</version>
        </dependency>

        <dependency>
            <groupId>com.jzt</groupId>
            <artifactId>cloud-api-common</artifactId>
            <version>${project.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</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>
            <version>1.18.14</version>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

    </dependencies>
</project>
3.yml配置
server:
  port: 8004

spring:
  application:
    name: cloud-provider-payment
  cloud:
    zookeeper:
      connect-string: 192.168.31.111:2181

4.主启动类
package com.jzt;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
//import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

/**
 * 功能描述:
 *
 * @Author: sj
 * @Date: 2020/10/25 11:26
 */
@SpringBootApplication
//@EnableEurekaClient
@EnableDiscoveryClient  //使用consul或者zookeeper作为注册中心时注册服务
public class PaymentService8004 {
    public static void main(String[] args) {
        SpringApplication.run(PaymentService8004.class, args);
    }
}

5.controller
package com.jzt.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;

/**
 * 功能描述:
 *
 * @Author: sj
 * @Date: 2020/10/25 15:46
 */
@RestController
@Slf4j
public class PaymentController {
    @Value("${server.port}")
    private String port;

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

6.解决jar包冲突问题

启动后的问题:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xYsyoV3D-1606299711239)(C:\Users\sj\AppData\Roaming\Typora\typora-user-images\image-20201125181645700.png)]

这是因为springcloud的zookeeper组件自带zookeeper包,这与自己引入的zookeeper的版本不一致,最终导致出错。

可以使用 标签来去除springcloud自身依赖的zookeeper包:

 <!--zookeeper客户端-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zookeeper</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.zookeeper</groupId>
                    <artifactId>zookeeper</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.9</version>
        </dependency>
7.测试

http://localhost:8004/payment/zk

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i23V3iPi-1606299711240)(C:\Users\sj\AppData\Roaming\Typora\typora-user-images\image-20201028074655556.png)]

进入zookeeper,查看节点信息:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J6JNV88i-1606299711241)(C:\Users\sj\AppData\Roaming\Typora\typora-user-images\image-20201028075326915.png)]

在zookeeper服务器中也能够查看到我们创建的服务了!说明我们的cloud-payment-service8004已经成功注册到zookeeper注册中心。

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

zookeeper的节点时临时性的。当zookeeper接收不到注册服务的心跳时会立刻删除该服务节点。zookeeper在CAP理论中属性CP模型

3.3服务消费者

下面我们构建一个服务消费者,将它也注册到zookeeper中。

1.新建cloud-consumerzk-order80

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j85NLrxf-1606299711243)(C:\Users\sj\AppData\Roaming\Typora\typora-user-images\image-20201110071643419.png)]

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.jzt</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

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

    <dependencies>
        <!--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>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.9</version>
        </dependency>

        <dependency>
            <groupId>com.jzt</groupId>
            <artifactId>cloud-api-common</artifactId>
            <version>${project.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</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>
            <version>1.18.14</version>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

    </dependencies>
</project>
3.配置yml文件
server:
  port: 80

spring:
  application:
    name: cloud-comsumerzk-order
  cloud:
    zookeeper:
      connect-string: 192.168.31.111:2181

4.主启动类
package com.jzt;

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

/**
 * 功能描述:
 *
 * @Author: sj
 * @Date: 2020/11/10 7:21
 */
@SpringBootApplication
@EnableDiscoveryClient
public class OrderZkOrder80 {
    public static void main(String[] args) {
        SpringApplication.run(OrderZkOrder80.class, args);
    }
}

5.业务类

配置类

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

/**
 * 功能描述:
 *
 * @Author: sj
 * @Date: 2020/11/10 7:24
 */
@Configuration
public class ApplicationContextConfig {

    @Bean
    @LoadBalanced   //开启负载均衡功能
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

controller

package com.jzt.controller;

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: sj
 * @Date: 2020/11/10 7:29
 */
@RestController
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.测试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-71n7azRc-1606299711244)(C:\Users\sj\AppData\Roaming\Typora\typora-user-images\image-20201110074525330.png)]

查看zookeeper节点信息,发现cloud-consumer-order服务已经注册到zk中。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sexA1ZEm-1606299711245)(C:\Users\sj\AppData\Roaming\Typora\typora-user-images\image-20201110074642144.png)]

服务调用也能正常执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值