目录
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