转 https://www.cnblogs.com/h--d/p/12643306.html

  ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等

基于Spring Cloud实现服务的发布与调用。而在18年7月份,Eureka2.0宣布停更了,将不再进行开发,所以对于公司技术选型来说,可能会换用其他方案做注册中心。本章学习便是使用ZooKeeper作为注册中心。

  本章使用的zookeeper版本是 3.6.0

  项目架构图如下:

    

搭建服务提供者

  1、新建一个maven项目(test-springcloud-provider-payment8004)

    结构如下:

    

  2、引入依赖,编辑pom文件

1 <!-- spring-cloud 整合 zookeeper -->
2 <dependency>
3 <groupId>org.springframework.cloud</groupId>
4 <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
5 </dependency>

    完整pom文件如下:

1 <?xml version="1.0" encoding="UTF-8"?>
2 <project xmlns="http://maven.apache.org/POM/4.0.0"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5 <parent>
6 <artifactId>test-springcloud</artifactId>
7 <groupId>com.test</groupId>
8 <version>1.0-SNAPSHOT</version>
9 </parent>
10 <modelVersion>4.0.0</modelVersion>
11
12 <artifactId>test-springcloud-provider-payment8004</artifactId>
13
14 <dependencies>
15
16 <!-- spring-cloud 整合 zookeeper -->
17 <dependency>
18 <groupId>org.springframework.cloud</groupId>
19 <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
20 <!-- 排除自带的zookeeper jar包 -->
21 <exclusions>
22 <exclusion>
23 <groupId>org.apache.zookeeper</groupId>
24 <artifactId>zookeeper</artifactId>
25 </exclusion>
26 </exclusions>
27 </dependency>
28
29 <!-- zookeeper 引入对应版本的zookeeper -->
30 <dependency>
31 <groupId>org.apache.zookeeper</groupId>
32 <artifactId>zookeeper</artifactId>
33 <version>3.6.0</version>
34 <exclusions>
35 <exclusion>
36 <groupId>org.slf4j</groupId>
37 <artifactId>slf4j-log4j12</artifactId>
38 </exclusion>
39 <exclusion>
40 <groupId>log4j</groupId>
41 <artifactId>log4j</artifactId>
42 </exclusion>
43 </exclusions>
44 </dependency>
45
46 <!-- spring boot -->
47 <dependency>
48 <groupId>org.springframework.boot</groupId>
49 <artifactId>spring-boot-starter-web</artifactId>
50 </dependency>
51 <dependency>
52 <groupId>org.springframework.boot</groupId>
53 <artifactId>spring-boot-starter-actuator</artifactId>
54 </dependency>
55
56 <dependency>
57 <groupId>org.springframework.boot</groupId>
58 <artifactId>spring-boot-devtools</artifactId>
59 <scope>runtime</scope>
60 <optional>true</optional>
61 </dependency>
62 <dependency>
63 <groupId>org.projectlombok</groupId>
64 <artifactId>lombok</artifactId>
65 <optional>true</optional>
66 </dependency>
67
68 <dependency>
69 <groupId>org.springframework.boot</groupId>
70 <artifactId>spring-boot-starter-test</artifactId>
71 <scope>test</scope>
72 </dependency>
73
74 </dependencies>
75
76 <build>
77 <finalName>test-springcloud-provider-payment8004</finalName>
78 </build>
79
80 </project> pom.xml

    需要注意,由于通过spring-cloud-starter-zookeeper-discovery依赖引入的zookeeper jar包,于zookeeper服务器版本不一致导致的,导致项目启动失败

    报错:Caused by: org.apache.zookeeper.KeeperException$UnimplementedException: KeeperErrorCode = Unimplemented for /services/xx/xxx

    解决:引入对于版本的 zookeeper jar包,本章使用的zookeeper版本是3.6.0,所以引入zookeeper-3.6.0.jar,如下:

1 <!-- spring-cloud 整合 zookeeper -->
2 <dependency>
3 <groupId>org.springframework.cloud</groupId>
4 <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
5 <!-- 排除自带的zookeeper jar包 -->
6 <exclusions>
7 <exclusion>
8 <groupId>org.apache.zookeeper</groupId>
9 <artifactId>zookeeper</artifactId>
10 </exclusion>
11 </exclusions>
12 </dependency>
13
14 <!-- zookeeper 引入对应版本的zookeeper -->
15 <dependency>
16 <groupId>org.apache.zookeeper</groupId>
17 <artifactId>zookeeper</artifactId>
18 <version>3.6.0</version>
19 <exclusions>
20 <exclusion>
21 <groupId>org.slf4j</groupId>
22 <artifactId>slf4j-log4j12</artifactId>
23 </exclusion>
24 <exclusion>
25 <groupId>log4j</groupId>
26 <artifactId>log4j</artifactId>
27 </exclusion>
28 </exclusions>
29 </dependency> pom.xml

  3、编辑配置文件application.yml

 1 # 端口
2 server:
3 port: 8004
4
5 spring:
6 application:
7 name: cloud-payment-service
8 cloud:
9 zookeeper:
10 # 集群模式用逗号隔开
11 connect-string: 127.0.0.1:2181

  4、编写主启动类

1 // 启用服务发现
2 @EnableDiscoveryClient
3 @SpringBootApplication
4 public class PaymentMain8004 {
5 public static void main(String[] args) {
6 SpringApplication.run(PaymentMain8004.class, args);
7 }
8 }

  5、编写Controller

 1 @RestController
2 @Slf4j
3 public class PaymentController {
4
5 @Value("${server.port}")
6 private String serverPort;
7
8 @RequestMapping(value = "payment/zk")
9 public String paymentzk(){
10 return "springcloud with zookeeper:" + serverPort + "\t" + UUID.randomUUID();
11 }
12 }

  6、启动项目,测试

    1)使用地址:http://localhost:8004/payment/zk

      

    2)使用zookeeper客户端连接到zookeeper服务中,查看节点信息

      

      json格式如下:

{
"name": "cloud-payment-service",
"id": "4f3db6b1-7d3a-4b3e-ac7a-159289573440",
"address": "192.168.1.4",
"port": 8004,
"sslPort": null,
"payload": {
"@class": "org.springframework.cloud.zookeeper.discovery.ZookeeperInstance",
"id": "application-1",
"name": "cloud-payment-service",
"metadata": {}
},
"registrationTimeUTC": 1586166066913,
"serviceType": "DYNAMIC",
"uriSpec": {
"parts": [{
"value": "scheme",
"variable": true
}, {
"value": "://",
"variable": false
}, {
"value": "address",
"variable": true
}, {
"value": ":",
"variable": false
}, {
"value": "port",
"variable": true
}]
}
}

  7、测试zookeeper的服务节点是临时节点还是永久节点?

    通过关闭应用服务,在zookeeper客户端中是用命令:ls /services/cloud-payment-service,

    查看服务之后存在,然后启动服务,查看节点ID是否相同

    

    通过测试验证:zookeeper的服务节点是临时节点

搭建服务消费者

  1、新建一个maven项目(test-springcloud-order7999)

    项目结构如下:

    

  2、引入pom依赖,同上(与服务提供者依赖相同)

  3、编辑application.yml文件

 1 # 端口
2 server:
3 port: 7999
4
5 spring:
6 application:
7 name: cloud-order
8 cloud:
9 zookeeper:
10 connect-string: 127.0.0.1

  4、编写主启动类

1 @SpringBootApplication
2 public class OrderMain7999 {
3 public static void main(String[] args) {
4 SpringApplication.run(OrderMain7999.class, args);
5 }
6 }

  5、编辑配置类,注入RestTemplate对象

 1 @Configuration
2 public class AppConfig {
3
4 /**
5 * 注入restTemplate,请用请求rest接口
6 * @return
7 */
8 @Bean
9 // 标注此注解后,RestTemplate就具有了客户端负载均衡能力
10 // 负载均衡技术依赖于的是Ribbon组件~
11 // RestTemplate都塞入一个loadBalancerInterceptor 让其具备有负载均衡的能力
12 @LoadBalanced
13 public RestTemplate restTemplate(){
14 return new RestTemplate();
15 }
16 }

  6、编辑Controller

 1 @RestController
2 @Slf4j
3 public class OrderController {
4
5 public static final String PAYMENT_URL = "http://cloud-payment-service";
6
7 @Autowired
8 private RestTemplate restTemplate;
9
10 @GetMapping("/consumer/payment/zk")
11 public String paymentzk(){
12 return restTemplate.getForObject(PAYMENT_URL + "/payment/zk", String.class);
13 }
14
15 }

  7、启动项目测试

    1)访问地址:http://localhost:7999/consumer/payment/zk

    

    2)使用zookeeper客户端登录zookeeper服务器查看

        

springcloud 02-zookeeper的更多相关文章

  1. springcloud集成zookeeper,并使用configserver作为服务的配置中心

    1.springcloud集成zookeeper: 做法: 出现问题: 版本不一致导致出现keepError: 解决:服务器的zookeeper要与客户端的zookeeper一致,才可以. 2.使用c ...

  2. Zookeeper详解(02) - zookeeper安装部署-单机模式-集群模式

    Zookeeper详解(02) - zookeeper安装部署-单机模式-集群模式 安装包下载 官网首页:https://zookeeper.apache.org/ 历史版本下载地址:http://a ...

  3. SpringCloud用Zookeeper做服务注册与发现中心代码实现

    一:Zookeeper用的是3.5.5版本,SpringBoot用的是2.1.6版本,SpringCloud用的是Greenwich.SR2版本,JDK用的是1.8: 服务提供者product-ser ...

  4. vagrant+java+springcloud+redis+zookeeper镜像下载(&制作详解)

    文章很长,建议收藏起来,慢慢读! 备注:持续更新中..... 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 + 涨薪必备 疯 ...

  5. ZooKeeper 02 - ZooKeeper集群的节点为什么是奇数个

    目录 1 关于节点个数的说明 2 ZooKeeper集群的容错数 3 ZooKeeper集群可用的标准 4 为什么不能是偶数个节点 4.1 防止由脑裂造成的集群不可用 4.2 奇数个节点更省资源 4. ...

  6. springcloud使用zookeeper作为config的配置中心

    https://blog.csdn.net/CSDN_Stephen/article/details/78856323 仓库更新了,本地如何更新: 使用configserver作为配置中心: http ...

  7. 02.ZooKeeper的Java客户端使用

    1.ZooKeeper常用客户端比较 1.ZooKeeper常用客户端     zookeeper的常用客户端有3种,分别是:zookeeper原生的.Apache Curator.开源的zkclie ...

  8. zookeeper代替eureka与springcloud整合

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

  9. 学习一下 SpringCloud (二)-- 服务注册中心 Eureka、Zookeeper、Consul、Nacos

    (1) 相关博文地址: 学习一下 SpringCloud (一)-- 从单体架构到微服务架构.代码拆分(maven 聚合): https://www.cnblogs.com/l-y-h/p/14105 ...

  10. SpringCloud之使用Zookeeper作为注册中心

    SpringCloud之使用Zookeeper作为注册中心 linux安装zookeeper 安装zookeeper 关闭linux防火墙 启动zookeeper 1 创建项目导入依赖和配置文件 &l ...

随机推荐

  1. c#显示和隐藏另外一个进程

    1 /// <summary> 2 /// 0-关闭窗口 1-正常大小显示 2最小化窗口 3-最大化窗口 3 /// </summary> 4 /// <param na ...

  2. 小程序canvas2D绘制印章,话不多说,直接上代码

    效果图:  CanvasContext 是旧版的接口,不维护了, 新版 Canvas 2D 接口与 Web 一致 官方文档: https://developers.weixin.qq.com/mini ...

  3. 关于vlc"编解码器暂不支持: VLC 无法解码格式“MIDI” (MIDI Audio)"解决

    解决办法 sudo apt install vlc-plugin-fluidsynth

  4. Flink SQL管理平台flink-streaming-platform-web安装搭建

    文章都在个人博客网站:https://www.ikeguang.com/ 同步,欢迎访问. 最近看到有人在用flink sql的页面管理平台,大致看了下,尝试安装使用,比原生的flink sql界面确 ...

  5. python 中变量的命名规则与注释

    变量命名规则 1.变量名必须是大小写英文字母.数字或下划线 _ 的组合,不能用数字开头,并且对大小写敏感 2.关键字不能用于命名变量,关键字一共有35个,以下为关键字的获取 注释 代码注释提高了代码的 ...

  6. python中使用pip 安装第三方库报错归类及解决方式

    1.  离线安装virtualenv报错,安装命令:python setup.py install 解决方式:升级setuptools 2.  安装第三方库时安装失败,安装命令:pip install ...

  7. [OpenCV实战]51 基于OpenCV实现图像极坐标变换与逆变换

    在图像处理领域中,经常通过极坐标与笛卡尔直角坐标的互转来实现图像中圆形转为方形,或者通过极坐标反变换实现方形转圆形.例如钟表的表盘,人眼虹膜,医学血管断层都需要用到极坐标变换来实现圆转方. 文章目录 ...

  8. [seaborn] seaborn学习笔记3-直方图Histogramplot

    文章目录 3 直方图Histogramplot 1. 基本直方图的绘制 Basic histogram 2. 数据分布与密度信息显示 Control rug and density on seabor ...

  9. 经典 backbone 总结

    目录 目录 VGG ResNet Inceptionv3 Resnetv2 ResNeXt Darknet53 DenseNet CSPNet VoVNet 一些结论 参考资料 VGG VGG网络结构 ...

  10. python进阶之路13 二分法 三元表达式 各种生成式 匿名函数

    算法简介及二分法 1.什么是算法 算法就是解决问题的有效方法 不是所有的算法都很高效也有不合格的算法 2.算法应用场景 推荐算法(抖音视频推送 淘宝商品推送) 成像算法(AI相关)...... 几乎涵 ...