转 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. [CS61A] Lecture 5&6&7. Environments & Design & Functions Examples & Homework 2: Higher Order Functions

    [CS61A] Lecture 5&6&7. Environments & Design & Functions Examples & Homework 2: ...

  2. RabbitMq消息手动应答、放回队列重新消费、设置队列消息持久化、分发模式

    RabbitMq消息手动应答,放回队列重新消费,设置队列消息持久化 消息应答 概念 消费者完成一个任务可能需要一段时间,如果其中一个消费者处理一个长的任务并仅只完成了部分突然它挂掉了,会发生什么情况. ...

  3. 报错:com.mysql.jdbc.MysqlDataTruncation: Data truncation xxxx

    报错 Out of range value for column 'pk' at row 1:表的字段长度不够 Data too long for column 'ip' at row 1:表的字段长 ...

  4. Flask(一)

    pip install flask 依赖wsgi flask框架是基于werkzegu的wsgi实现,flask没有自己的wsgi 用户一旦请求,就会调用app.__call__方法 flask 路由 ...

  5. 基于python的数学建模---轮廓系数的确定

    直接上代码 from sklearn import metrics import matplotlib.pyplot as plt from sklearn.cluster import KMeans ...

  6. pyinstaller打包TVM/RPC相关脚本及DSO文件

    0. 创建anaconda env numpy中MKL/BLAS库占用很大空间.使用如下命令创建新环境,并替换numpy. conda create -n extranumpy python=3.8. ...

  7. 春秋云境 CVE-2022-24663复现

    靶标介绍: 远程代码执行漏洞,任何订阅者都可以利用该漏洞发送带有"短代码"参数设置为 PHP Everywhere 的请求,并在站点上执行任意 PHP 代码.P.S. 存在常见用户 ...

  8. 关于mysql远程连接失败的问题解决

    解决办法 mysql 数据库user表配置密码 mysql 数据库user表配置plugin字段为mysql_native_password mysql 数据库user表host字段更改为% mysq ...

  9. go语言的grpc环境安装

    本文直接用安装包的方式安装. 源码编译安装参考:https://www.cnblogs.com/abc36725612/p/14288333.html 环境 golang的docker image d ...

  10. Netty-BIO、NIO、AIO、零拷贝-2

    Java BIO 编程 一.I/O 模型 1.I/O 模型简单的理解:就是用什么样的通道进行数据的发送和接收,很大程度上决定了程序通信的性能 2.Java 共支持 3 种网络编程模型/IO 模式:BI ...