Spring Cloud 系列之注册中心 Zookeeper
1.1 简介
1.1.1 概述
ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 Hbase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。ZooKeeper 的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。ZooKeeper 包含一个简单的原语集,提供 Java 和 C 的接口。ZooKeeper 代码版本中,提供了分布式独享锁、选举、队列的接口。其中分布锁和队列有 Java 和 C 两个版本,选举只有 Java 版本。
1.1.2 安装
♞ 先去 Apache 下载 ☞ Zookeeper
♞ 将 Zookeeper 安装包上传到 Linux 服务器,需要事先安装 JDK
♞ 使用 tar -zxvf
解压安装包,并进入解压目录
♞ 使用 mkdir data
创建 data 目录
♞ 进入 conf 目录 ,使用 mv zoo_sample.cfg zoo.cfg
把 zoo_sample.cfg 改名为 zoo.cfg
♞ 打开 zoo.cfg 将 dataDir 改为刚才新建的 data 目录
♞ 进入 bin 目录,使用 ./zkServer.sh start
启动, ./zkServer.sh stop
停止,./zkServer.sh status
检查状态,./zkCli.sh
启动客户端
1.1.3 相关依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
</dependency>
1.1.4 jar 包冲突
在使用 Zookeeper 做注册中心时可能应为服务器上的 Zookeeper 版本与自己使用的版本不一致导致报错(一般体现为启动类错误),此时我们就需要解决 jar 包冲突了。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
<exclusions>
<!-- 先排除自带的 zookeeper -->
<exclusion>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 再导入合适的 zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>x.x.x</version>
</dependency>
1.2 Provider
1.2.1 配置文件
server:
port: 8093
spring:
application:
name: ProviderServer
cloud:
zookeeper:
# zookeeper 默认端口 2181
connect-string: 106.52.175.xx:2181
1.2.2 启动类
/**
* Created with IntelliJ IDEA.
*
* @author Demo_Null
* @date 2020/10/29
* @description 服务提供者启动类
*/
@SpringBootApplication
@EnableDiscoveryClient // 一定要使用该注解
public class ProviderZKApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderZKApplication.class, args);
}
}
1.2.3 服务代码
/**
* Created with IntelliJ IDEA.
*
* @author Demo_Null
* @date 2020/10/29
* @description
*/
@RestController
@RequestMapping("/provider")
public class ProviderZKController {
@GetMapping("/get")
public Object get() {
return "你已经消费了_zk";
}
}
1.2.4 查看服务
启动 zookeeper 客户端,使用 ls /
可以看到有 services
使用 ls /services
查看有哪些服务注册上来了
继续使用 ls /services/服务名
获取该服务的流水号,流水号一致代表是一个服务。若服务在一定时间内未给 Zookeeper 服务响应,Zookeeper 会将其剔除,等到服务再次连上 Zookeeper 会认为是一个新的服务分配新的流水号。
使用 get /services/ProviderServer/6e0e0f01-8b5f-4c42-ac37-ad0595b428a0
获取服务信息
1.3 Consumer
1.3.1 配置文件
server:
port: 80
spring:
application:
name: ConsumerServer
cloud:
zookeeper:
connect-string: 106.52.175.xx:2181
1.3.2 启动类
/**
* Created with IntelliJ IDEA.
*
* @author Demo_Null
* @date 2020/10/29
* @description 消费者启动类
*/
@SpringBootApplication
@EnableDiscoveryClient
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
1.3.3 服务代码
/**
* Created with IntelliJ IDEA.
*
* @author Demo_Null
* @date 2020/10/29
* @description
*/
@RestController
@RequestMapping("/consumer")
public class ConsumerController {
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("/go")
public void go() {
List<ServiceInstance> providerServer = discoveryClient.getInstances("ProviderServer");
if (0 == providerServer.size()) {
return;
}
ServiceInstance serviceInstance = providerServer.get(0);
System.out.print(serviceInstance.getUri() + " --- ");
String url = serviceInstance.getUri() + "/provider/get";
RestTemplate restTemplate = new RestTemplate();
String str = restTemplate.getForObject(url, String.class);
System.out.println(str);
}
}
1.3.4 调用服务
1.4 集群
1.4.1 Zookeeper 集群
Zookeeper 集群中节点个数一般为奇数个(>=3),若集群中 Master 挂掉,剩余节点个数在半数以上时,就可以推举新的主节点,继续对外提供服务。 由于在 Spring Cloud 中使用 Zookeeper 作为注册中心比较少,这里对于集群的搭建仅作简要描述。
☞ zoo.cfg 中增加如下配置
server.1=xxx.xxx.xxx.xxx:2888:3888
server.2=xxx.xxx.xxx.xxx:2888:3888
server.3=xxx.xxx.xxx.xxx:2888:3888
☞ myid
在我们创建 data 目录中新建一个 myid 文件,在里面写 1/2/3 来表示自己是哪一个编号的机器。
☞ 启动
依次启动每个 Zookeeper 服务
1.4.2 Provider 集群
☞ 配置文件
server:
port: 8093
spring:
application:
name: ProviderServer
cloud:
zookeeper:
# zookeeper 默认端口 2181
connect-string: 106.52.175.1:2181,106.52.175.2:2181,106.52.175.3:2181
1.4.2 Consumer 集群
☞ 配置文件
server:
port: 80
spring:
application:
name: ConsumerServer
cloud:
zookeeper:
# zookeeper 默认端口 2181
connect-string: 106.52.175.1:2181,106.52.175.2:2181,106.52.175.3:2181
下一篇: Python中的Datetime
推荐阅读
-
SpringCloud之服务注册与发现Spring Cloud Eureka实例代码
-
Spring Cloud 系列之 Spring Cloud Stream
-
服务注册中心之ZooKeeper系列(一)
-
Spring-Cloud-Netflix-Eureka注册中心
-
spring cloud 入门系列七:基于Git存储的分布式配置中心--Spring Cloud Config
-
springcloud之服务注册与发现(zookeeper注册中心)-Finchley.SR2版
-
Spring Boot(二)之搭建spring cloud config配置中心
-
spring cloud alibaba之nacos配置中心
-
Spring cloud系列三 Spring Cloud 配置中心集群
-
Spring Cloud Alibaba系列使用(二)----Nacos注册中心