ZooKeeper作为注册中心

SpringCloud整合Zookeeper

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

Zookeeper教程:https://blog.csdn.net/weixin_42837961/article/details/106233902

注意:注册微服务到zookeeper,一定要先后台启动zookeeper服务,zookeeper是一个单独的软件,需要下载和后台运行着,这样我们才能一直使用它

一、Zookeeper在Linux下载安装及部署

ZooKeeper服务器是用Java创建的,它需要在JVM上运行,所以需要使用JDK1.6及以上版本

zookeeper的安装请参考:

https://blog.csdn.net/weixin_38568503/article/details/120237040

准备工作:linux关闭防火墙

(1)Centos7默认安装了firewalld,如果没有安装的话,可以使用命令: yum install firewalld firewalld-config进行安装。

(2)安装另一个插件命令:yum install iptables-services
这个插件安装了才能执行iptables 相关的命令。

一、下面是red hat/CentOs7关闭防火墙的命令!
1:查看防火状态
systemctl status firewalld
或者
service iptables status

2:暂时关闭防火墙
systemctl stop firewalld
或者
service iptables stop


3:永久关闭防火墙,即设置开机的时候不自动启动
systemctl disable firewalld.service
或者
chkconfig iptables off

4:设置开机启用防火墙:
systemctl enable firewalld.service
或者
service iptables restart

启动防火墙:
systemctl start firewalld

5:永久关闭后重启
chkconfig iptables on

启动zk之前记得关闭防火墙:

[root@fancentos7 bin]# pwd
/opt/ZooKeeper/apache-zookeeper-3.5.8-bin/bin
[root@fancentos7 bin]# systemctl stop firewalld
[root@fancentos7 bin]# systemctl disable firewalld.service 
[root@fancentos7 bin]# systemctl status firewalld

出现以下内容说明防火墙已经关闭:
在这里插入图片描述

在linux中启动zookeeper:

当我们部署好了zookeeper好了后

就可以启动zookeeper,到解压安装的目录的bin下去启动:
如我的解压安装目录在:/usr/zookeeper/zookeeper-3.5.8目录下
1.进入到zookeeper解压后的bin目录:

cd /usr/zookeeper/zookeeper-3.5.8/bin/

2.启动:

./zkServer.sh start

或者配置了环境变量后任意目录下启动:

zkServer.sh start

3.测试,创建一个节点试试

启动之后我们要进入到zk的简易客户端才能使用命令:

即进入简易客户端的命令行:
./zkCli.sh #连接本地的zookeeper服务器
./zkCli.sh -server ip:port #连接指定的服务器

命令创建zktest 临时节:
create -e /zktest 123

特别注意:但我们配置了多台zk服务器的时候,如三台,则需要启动至少2台,zookeeper有个选举算法,当整个集群超过半数机器宕机,zookeeper会认为集群处于不可用状态。

所有,3台机器只启动一台无法连接,如果启动2台及以上就可以连接了。

然后又把其他节点上的服务开启!问题就解决了。

二、Zookeeper作为注册中心:

Zookeeper作为注册中心的原理图:
在这里插入图片描述

在这里插入图片描述

服务提供者:

在这里插入图片描述

将提供者注册到zookeeper

注意:注册微服务到zookeeper,一定要先后台启动zookeeper服务,zookeeper是一个单独的软件,需要下载和后台运行着,这样我们才能一直使用它,这里我们还需要在我们的项目中引入zookeeper的依赖并配置它

(1)先创建一个 maven模块:cloud-provider-payment8004

(2)当我们在windows或者linux安装了zookeeper后,启动之后,还需要在我们的项目pom中加入依赖的。
然后我们回到idea编辑器这边:

修改提供者的pom:(因为这里已经将zk在linux那边配置并启动完成,所以这边不需要再忙活zk)


<dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--注册中心放到第一个-->
        <!--zookeeper-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
            <!--先排除自带的3.5.3版本-->
            <exclusions>
                <exclusion>
                    <groupId>org.apache.zookeeper</groupId>
                    <artifactId>zookeeper</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--添加自己的本机版本-->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.5.8</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
            <version>2.2.2.RELEASE</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>
    </dependencies>

在这里插入图片描述

(3)将提供者注册到zookeeper 的yml配置:

server:
 port: 8004


spring:
 application:
   name: cloud-provider-payment #微服务名称,建议有
 cloud:
   zookeeper:  
   #多台zk集群的话这样配置:connect-string: 192.168.211.211:2181,192.168.211.202:2181,192.168.211.211为linux的ip
     connect-string: 192.168.211.211:2181

在这里插入图片描述
(4)主启动类:com.fan.springcloud.PaymentMain8004:

package com.fan.springcloud;

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

@SpringBootApplication
@EnableDiscoveryClient
public class PaymentMain8004 {
    public static void main(String[] args) {
        SpringApplication.run(PaymentMain8004.class,args);
    }
}

在这里插入图片描述
(5)业务类controller: controller.PaymentController :

package com.fan.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 PaymentController {
    @Value("${server.port}")
    private String serverPort;

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

在这里插入图片描述

(6)测试:启动微服务,查看我们的微服务是否注册到zookeeper中:

(6.1)我们先要连接到zookeeper的简易客户端,才能使用zk命令:(linux端的操作)

zkCli.sh [-server ip:port]

说明:

1.访问当前zookeeper,使用 ./zkCli.sh

2.访问服务器zookeeper,使用 ./zkCli.sh -server ip:port;

例如: ./zkCli.sh -server 10.60.36.116:2181

特别注意:但我们配置了多台zk服务器的时候,如三台,则需要启动至少2台,zookeeper有个选举算法,当整个集群超过半数机器宕机,zookeeper会认为集群处于不可用状态。

所有,3台机器只启动一台无法连接,如果启动2台及以上就可以连接了。

然后又把其他节点上的服务开启!问题就解决了。

在这里插入图片描述

ls / :列出根节点下所有的子节点信息
get /zookeeper
ls /zookeeper 查看旗下的节点

然后启动springboot项目8004:报错如下:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

(6.2)查看zookeeper中入驻的微服务: ls /services

linux成功查看zk服务:
在这里插入图片描述

看到上图,证明我们的微服务成功注册到了zookeeper中。

在这里插入图片描述

测试:http://localhost:8004/payment/zk
在这里插入图片描述

查看注册中心的所有服务:ls /services

在zookeeper的客户端查看流水号:
在这里插入图片描述

问题思考:注册到zookeeper中的服务节点是临时节点还是持久节点:

zookeeper 持久节点:该数据节点被创建后,就会一直存在于zookeeper服务器上,直到有删除操作来主动删除这个节点。
zookeeper临时节点:临时节点的生命周期和客户端会话绑定在一起,客户端会话失效,则这个节点就会被自动清除。

命令:ls2 /节点名

ls2命令会显示该节点的子节点信息和属性信息

当我们停止了微服务,通过命令ls /services 去从查看节点,发现已经停止的微服务的节点被删除,所以zookeeper作为注册中心是临时节点。如下所示:在这里插入图片描述

上面的步骤完成表示zookeeper已经安装好了,如果需要搭建集群的话,需要在其他的linux虚拟机中重复上面的步骤安装jdk和zookeeper

将消费者注册到zookeeper:

(1)模块名字:cloud-consumerzk-order

(2)pom:

<dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--注册中心放到第一个,eureka 服务-->
        <!--  <dependency>
              <groupId>org.springframework.cloud</groupId>
              <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
          </dependency>-->

        <!--zookeeper-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
            <!--先排除自带的3.5.3版本-->
            <exclusions>
                <exclusion>
                    <groupId>org.apache.zookeeper</groupId>
                    <artifactId>zookeeper</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--添加自己的本机版本-->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.5.8</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
            <version>2.2.2.RELEASE</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>
    </dependencies>

在这里插入图片描述

(3)yml:

server:
  port: 80

spring:
  application:
    name: cloud-consumer-order
  cloud:
    zookeeper:
      connect-string: 192.168.211.211:2181,192.168.211.202:2181

在这里插入图片描述

(4)主启动类:com.fan.springcloud.OrderZKMain80
在这里插入图片描述

(5)业务类:
在这里插入图片描述

配置bean的类:config.ApplicationContextConfig
在这里插入图片描述
controller:

package com.fan.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 {
    //public static final String PAYMENT_URL = "http://localhost:8001";
    public static final String INVOKE_URL = "http://cloud-provider-payment";
    @Resource
    private RestTemplate restTemplate;

    @GetMapping("/consumer/payment/zk")
    public String paymentInfo(){
        String result = restTemplate.getForObject(INVOKE_URL+"/payment/zk",String.class);
        return result;
    }
}

在这里插入图片描述

我们可以启动linux的简易客户端查看注册中心的服务:

启动zk注册中心服务: zkServer.sh start
进入简易客户端: zkCli.sh

查看结果如下:
在这里插入图片描述

测试:localhost:8004/payment/zk
在这里插入图片描述
再次测试controller: http://localhost/consumer/payment/zk
在这里插入图片描述


版权声明:本文为weixin_38568503原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。