当前位置:   article > 正文

【SpringCloud笔记】(3)服务注册中心之Zookeeper

【SpringCloud笔记】(3)服务注册中心之Zookeeper

ZooKeeper

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

docker安装Zookeeper

我们使用docker启动zookeeper镜像,因为使用比较方便

拉取镜像:docker pull zookeeper

查看本地镜像:docker images

在这里插入图片描述

启动镜像:docker run --network host --name zookeeper -d zookeeper3.4.9

zookeeper:3.4.9使用host网络模式启动

查看正在运行的容器:docker ps

启动完容器后进入交互模式:docker exec -it 容器ID bash

cd到bin目录下执行zkCli.sh脚本开启客户端

在这里插入图片描述

接下来的操作与常规安装zookeeper后的操作一致

SpringCloud整合zookeeper

新建服务提供者cloud-provider-payment8004

1、pom文件

<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.mzr.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>
    </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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

2、yml文件

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


#服务别名----注册zookeeper到注册中心名称
spring:
  application:
    name: cloud-provider-payment
  cloud:
    zookeeper:
      #ip根据自己虚拟机ip调整
      connect-string: 192.168.254.130:2181
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

3、主启动类

@SpringBootApplication
@EnableDiscoveryClient //该注解用于向使用consul或者zookeeper作为服务注册中心时注册服务,不再使用@EnableEurekaClient
public class PaymentMain8004 {
    public static void main(String[] args) {
        SpringApplication.run(PaymentMain8004.class, args);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

4、controller层

@Slf4j
@RestController
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();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

5、启动微服务

发现有报错,微服务启动失败
在这里插入图片描述
原因:因为引入spring-cloud-starter-zookeeper-discovery依赖,自带的zookeeper版本与我们启动的zookeeper版本不一致(我们启动的版本:3.4.9)
在这里插入图片描述
如何解决版本jar包冲突问题?
修改pom文件,排除自带的zookeeper3.5.3,添加zookeeper3.4.9版本

    <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.4.9版本-->
    <dependency>
        <groupId>org.apache.zookeeper</groupId>
        <artifactId>zookeeper</artifactId>
        <version>3.4.9</version>
        <!-- 排除和 slf4j 冲突的 jar包 -->
        <exclusions>
            <exclusion>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
            </exclusion>
        </exclusions>
    </dependency> 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

6、启动应用,测试

访问到最后一层返回了一个json字符串

在zookeeper服务器上存在着znode节点

每一个注册的微服务都作为一个节点放在zookeeper服务器上,那么服务节点是临时节点还是持久节点?

答案:临时节点

当微服务在一定时间内没有向zookeeper发送心跳,那么zookeeper会将该znode踢掉,重新连接zookeeper服务器后,微服务id流水号会重新生成(没有自我保护机制)
在这里插入图片描述

新建服务消费者cloud-consumerzk-order80

pom文件、yml文件、主启动类与cloud-provider-payment8004相似,便不再展示

config文件

@SpringBootConfiguration
public class ApplicationContextConfig {
    @Bean
    @LoadBalanced
    public RestTemplate getTemplate(){
        return new RestTemplate();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

controller层

@RestController
@Slf4j
public class OrderController {

    public static final String INVOKE_URL = "http://cloud-provider-payment";

    @Resource
    private RestTemplate restTemplate;

    @RequestMapping("/customer/payment/zk")
    public String paymentInfo(){
        String result = restTemplate.getForObject(INVOKE_URL + "/payment/zk",String.class);
        return result;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

启动测试

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

可以看到服务消费者已经注册到zookeeper里

如果使用zookeeper集群版,那么yml文件zookeeper多个地址用逗号隔开即可

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/851623
推荐阅读
相关标签
  

闽ICP备14008679号