当前播放: 95 | 使用Zookeeper作为服务注册中心
00:00 / 00:00
高清
  • 高清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看
课程目录
第一章:初识Spring (4讲)
01 | Spring课程介绍
免费
02 | 一起认识Spring家族的主要成员
免费
03 | 跟着Spring了解技术趋势
免费
04 | 编写你的第一个Spring程序
免费
第二章:JDBC必知必会 (10讲)
05 | 如何配置单数据源
免费
06 | 如何配置多数据源
免费
07 | 那些好用的连接池们:HikariCP
08 | 那些好用的连接池们:Alibaba Druid
09 | 如何通过Spring JDBC访问数据库
10 | 什么是Spring的事务抽象(上)
11 | 什么是Spring的事务抽象(下)
12 | 了解Spring的JDBC异常抽象
免费
13 | 课程答疑(上)
14 | 课程答疑(下)
第三章:O/R Mapping实践 (9讲)
15 | 认识Spring Data JPA
16 | 定义JPA的实体对象
17 | 开始我们的线上咖啡馆实战项目:SpringBucks
18 | 通过Spring Data JPA操作数据库
19 | Spring Data JPA的Repository是怎么从接口变成Bean的
20 | 通过MyBatis操作数据库
21 | 让MyBatis更好用的那些工具:MyBatis Generator
22 | 让MyBatis更好用的那些工具:MyBatis PageHelper
23 | SpringBucks实战项目进度小结
第四章:NoSQL实践 (7讲)
24 | 通过Docker辅助开发
25 | 在Spring中访问MongoDB
26 | 在Spring中访问Redis
27 | Redis的哨兵与集群模式
28 | 了解Spring的缓存抽象
29 | Redis在Spring中的其他用法
30 | SpringBucks实战项目进度小结
第五章:数据访问进阶 (8讲)
31 | Project Reactor介绍(上)
32 | Project Reactor介绍(下)
33 | 通过Reactive的方式访问Redis
34 | 通过Reactive的方式访问MongoDB
35 | 通过Reactive的方式访问RDBMS
36 | 通过AOP打印数据访问层的摘要(上)
37 | 通过AOP打印数据访问层的摘要(下)
38 | SpringBucks实战项目进度小结
第六章:Spring MVC实践 (14讲)
39 | 编写第一个Spring MVC Controller
40 | 理解Spring的应用上下文
41 | 理解请求的处理机制
42 | 如何定义处理方法(上)
43 | 如何定义处理方法(下)
44 | Spring MVC中的视图解析机制(上)
45 | Spring MVC中的视图解析机制(下)
46 | Spring MVC中的常用视图(上)
47 | Spring MVC中的常用视图(下)
48 | 静态资源与缓存
49 | Spring MVC中的异常处理机制
50 | 了解Spring MVC的切入点
51 | SpringBucks实战项目进度小结
52 | 课程答疑
第七章:访问Web资源 (5讲)
53 | 通过RestTemplate访问Web资源
54 | RestTemplate的高阶用法
55 | 简单定制RestTemplate
56 | 通过WebClient访问Web资源
57 | SpringBucks实战项目进度小结
第八章: Web开发进阶 (9讲)
58 | 设计好的RESTful Web Service(上)
59 | 设计好的RESTful Web Service(下)
60 | 什么是HATEOAS
61 | 使用Spring Data REST实现简单的超媒体服务(上)
62 | 使用Spring Data REST实现简单的超媒体服务(下)
63 | 分布式环境中如何解决Session的问题
64 | 使用WebFlux代替Spring MVC(上)
65 | 使用WebFlux代替Spring MVC(下)
66 | SpringBucks实战项目进度小结
第九章:重新认识Spring Boot (8讲)
67 | 认识Spring Boot的组成部分
68 | 了解自动配置的实现原理
69 | 动手实现自己的自动配置
70 | 如何在低版本Spring中快速实现类似自动配置的功能
71 | 了解起步依赖及其实现原理
72 | 定制自己的起步依赖
73 | 深挖Spring Boot的配置加载机制
74 | 理解配置背后的PropertySource抽象
第十章:运行中的Spring Boot (11讲)
75 | 认识Spring Boot的各类Actuator Endpoint
76 | 动手定制自己的Health Indicator
77 | 通过Micrometer获取运行数据
78 | 通过Spring Boot Admin了解程序的运行状态
79 | 如何定制Web容器的运行参数
80 | 如何配置容器支持HTTP/2(上)
81 | 如何配置容器支持HTTP/2(下)
82 | 如何编写命令行运行的程序
83 | 了解可执行Jar背后的秘密
84 | 如何将Spring Boot应用打包成Docker镜像文件
85 | SpringBucks实战项目进度小结
第十一章:Spring Cloud及Cloud Native概述 (5讲)
86 | 简单理解微服务
87 | 如何理解云原生(Cloud Native)
88 | 12-Factor App(上)
89 | 12-Factor App(下)
90 | 认识Spring Cloud的组成部分
第十二章:服务注册与发现 (9讲)
91 | 使用Eureka作为服务注册中心
92 | 使用Spring Cloud Loadbalancer访问服务
93 | 使用Feign访问服务
94 | 深入理解服务发现背后的DiscoveryClient
95 | 使用Zookeeper作为服务注册中心
96 | 使用Consul作为服务注册中心
97 | 使用Nacos作为服务注册中心
98 | 如何定制自己的DiscoveryClient
99 | SpringBucks实战项目进度小结
第十三章:服务熔断 (7讲)
100 | 使用Hystrix实现服务熔断(上)
101 | 使用Hystrix实现服务熔断(下)
102 | 如何观察服务熔断
103 | 使用Resilience4j实现服务熔断
104 | 使用Resilience4j实现服务限流(上)
105 | 使用Resilience4j实现服务限流(下)
106 | SpringBucks实战项目进度小结
第十四章:服务配置 (7讲)
107 | 基于Git的配置中心(上)
108 | 基于Git的配置中心(下)
109 | 基于Zookeeper的配置中心
110 | 深入理解Spring Cloud的配置抽象
111 | 基于Consul的配置中心
112 | 基于Nacos的配置中心
113 | SpringBucks实战项目进度小结
第十五章:Spring Cloud Stream (4讲)
114 | 认识Spring Cloud Stream
115 | 通过Spring Cloud Stream访问RabbitMQ
116 | 通过Spring Cloud Stream访问Kafka
117 | SpringBucks实战项目进度小结
第十六章:服务链路追踪 (6讲)
118 | 通过Dapper理解链路治理
119 | 使用Spring Cloud Sleuth实现链路追踪
120 | 如何追踪消息链路
121 | 除了链路还要治理什么
122 | SpringBucks实战项目进度小结
123 | 结束语
95 | 使用Zookeeper作为服务注册中心

95 | 使用Zookeeper作为服务注册中心

丁雪丰
平安壹钱包高级架构师,《Spring Boot实战》《Spring攻略》译者,InfoQ社区编辑
123讲 123课时,1300分钟25019
订阅¥129
2
登录 后留言

精选留言(12)

  • ABC
    整理了一下需要使用到的命令:



    获取镜像:

    docker pull zookeeper:3.5
    运行:

    docker run --name zookeeper -p 2181:2181 -d zookeeper:3.5
    操作:

    在docker中进入zookeeper命令行;
    docker exec -it zookeeper bash
    进入zookeeper的bin目录:
    cd bin
    使用zookeeper client访问zookeeper服务:
    ./zkCli.sh
    查看
    ls /
    查看所有services:
    ls /services
    查看waiter-service的信息:
    ls /services/waiter-service
    根据[id]查看相关服务的详细信息(id是动态的):
    ls /services/waiter-service/[id]
    示例:

    ls /services/waiter-service/54ef0739-0627-478f-ad5a-4b7287854da4
    获取相关服务的详细信息(id是动态的):
    get /services/waiter-service/[id]
    示例:

    get /services/waiter-service/54ef0739-0627-478f-ad5a-4b7287854da4
    获取相关服务的详细信息(id是动态的):
    get /services/customer-service/[id]
    示例:

    get /services/customer-service/9df270b5-637a-451e-b69c-14f222f4cf3a
    2019-05-15
    2
  • 白马度和
    zookeeper副本不建议超过7个,不让复制成本太大。
    2019-08-16
    1
  • 远东通信-应用软件
    zookeeper服务端使用3.4.x版本的话需要修改pom文件,排除<exclusions>
    <exclusion>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    </exclusion>
    </exclusions>
    重新添加zookeeper 3.4.x版本就不会报错了
    2019-07-31
    1
  • 鱼筱雨
    老师,我导入你的项目后,log.info()打印信息的地方;
    log报红,是不是哪里定义了log的全局变量?我这里为什么没有生效?

    作者回复: 加了@Slf4j注解,用了Lombok,你可以回到课程前面看看第一个答疑视频。IDEA中需要安装Lombok插件。

    2019-11-06
  • 极客-月
    Sleep extension too large (1050). Pinning to 500
    Opening socket connection to server 127.0.0.1/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
    Socket connection established to 127.0.0.1/127.0.0.1:2181, initiating session
    Client session timed out, have not heard from server in 30001ms for sessionid 0x0, closing socket connection and attempting reconnect
    Sleep extension too large (1500). Pinning to 500
    Opening socket connection to server 0:0:0:0:0:0:0:1/0:0:0:0:0:0:0:1:2181. Will not attempt to authenticate using SASL (unknown error)
    Socket connection established to 0:0:0:0:0:0:0:1/0:0:0:0:0:0:0:1:2181, initiating session
    Client session timed out, have not heard from server in 30001ms for sessionid 0x0, closing socket connection and attempting reconnect

    丁老师, waiter-server 已经正常注册,但是customer-server启动时无法访问,一直循环报这个
    2019-07-11
  • SirNicholas
    D:\geektime-spring-family\Chapter 12\zk-waiter-service\src\main\java\geektime\spring\springbucks\waiter\WaiterServiceApplication.java
    这个类启动报拒绝连接错误,快来人解决一下啊。

    作者回复: 请问启动报了什么错呢?连什么东西拒绝连接了?是不是你本地ZK没启动呀

    2019-07-05
    1
  • SirNicholas
    java.net.ConnectException: Connection refused: no further information
    百度说三种可能:
    1 网络不通,端口不可用等;
    2 zookeeper服务程序未正常启动;
    3 防火墙未关闭;
    我都解决了。但是还是报这个错误,对着视频步骤复制的。希望能有人帮我早点解决,真的怒了
    2019-07-05
  • Longerian
    老师,我在24日提了一个问题,我看你把他列出来了,但没有回复,因为我的问题前面铺垫比较长,是不是没看到最后的问题呢?😂

    作者回复: 前面回答了,我隔一段时间处理一次留言,所以回答不一定及时,抱歉

    2019-06-28
  • Longerian
    把zk-waiter-service 扩展了一下,CoffeeOrderController 提供获取订单列表的接口:

    @GetMapping(value = "/", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
        @ResponseBody
        public List<CoffeeOrder> listOrder() {
            log.info("List order");
            List<CoffeeOrder> order = orderService.list();
            return order;
        }

    CoffeeOrderService 提供了实现:

        public List<CoffeeOrder> list() {
            return orderRepository.findAll(Sort.by("id"));
        }

    zk-customer-service 在按id查询一个订单后,再执行一下查询所有订单的接口:

        private void queryAllOrder() {
            ParameterizedTypeReference<List<CoffeeOrder>> ptr = new ParameterizedTypeReference<List<CoffeeOrder>>() {};
            ResponseEntity<List<CoffeeOrder>> list = restTemplate.exchange("http://waiter-service/order/", HttpMethod.GET, null, ptr);
            list.getBody().forEach(o -> log.info("itr order: {}", o));
        }

    问题来了,获取订单列表的时候,每个订单输出的信息并没有包含具体的咖啡信息(可以看到下面items字段都是null):

    itr order: CoffeeOrder(id=1, customer=Lily, items=null, state=INIT, createTime=Mon Jun 24 15:12:21 CST 2019, updateTime=Mon Jun 24 15:12:21 CST 2019)
    itr order: CoffeeOrder(id=2, customer=Lily, items=null, state=INIT, createTime=Mon Jun 24 15:14:26 CST 2019, updateTime=Mon Jun 24 15:14:26 CST 2019)
    itr order: CoffeeOrder(id=3, customer=Li Lei, items=null, state=INIT, createTime=Mon Jun 24 15:16:48 CST 2019, updateTime=Mon Jun 24 15:16:48 CST 2019)

    看WaiterServiceApplication输出的日志,可以看到并没有执行关联查询查具体的coffee信息:

    Hibernate:
        select
            coffeeorde0_.id as id1_1_,
            coffeeorde0_.create_time as create_t2_1_,
            coffeeorde0_.update_time as update_t3_1_,
            coffeeorde0_.customer as customer4_1_,
            coffeeorde0_.state as state5_1_
        from
            t_order coffeeorde0_
        order by
            coffeeorde0_.id asc

    这是为什么呢?我自己新建工程重写一遍也是如此,同样的代码逻辑,按照本章之前的教程做下来、不做服务化改造的时候都是正常的。

    作者回复: Hibernate有懒加载,你设置eager模式把懒加载关了,就能直接把集合也加载出来了。

    2019-06-24
  • mickey
    请问,服务注册不上去是怎么原因? Zookeeper里没有services目录。谢谢。

    作者回复: 是不是没连上ZK呢?看看配置的地址对不对。

    2019-06-04
  • WL
    老师再请教一下, 我这边zk用的是3.4.10的版本, 项目启动报错Caused by: org.apache.zookeeper.KeeperException$UnimplementedException: KeeperErrorCode = Unimplemented for /services/waiter-service/113ec288- 查到是zk版本不对, 后来换成3.5的版本就可以了, 想问下老师在项目依赖中怎么看zk客户端适用的zk版本, 比如项目中spring-boot-actuator 2.1.4.RELEASE我怎么能知道这个客户端适用的zk版本

    作者回复: 看Maven依赖的版本,我IDE里装了MavenHelper插件可以图形化地看到依赖,你也可以用mvn dependency:tree命令打印所有依赖

    2019-05-11
  • WL
    老师请问一下多机房的zk脑列问题影响比较大这一点是像阿里那篇文章说的成为孤岛的机房同机房的服务无法调用吗, 还有其他问题吗? dubbo本身在消费者端有缓存生产者信息, 服务调用时也不用通过zk, 服务还可以调用, 所以我好像没看出来在dubbo中多机房部署zk有啥更严重的问题.

    作者回复: 那文章的意思就是服务注册中心本身不应该造成服务不可用,因此像ZK造成服务不通是不允许出现的情况。Dubbo的确是在本地有缓存,但在ZK出问题时,另一个机房的服务和本机房ZK断了,它可能会认为大量服务节点下线了,情况也比较复杂,所以尽量还是别跨机房部署吧,更何况哪怕一个机房里都有可能有网络问题……

    2019-05-11
收起评论
看过的人还看
从0开始学架构

李运华  资深技术专家

59讲 | 39228 人已学习

¥99
Java核心技术面试精讲

杨晓峰  前Oracle首席工程师

43讲 | 43534 人已学习

拼团 ¥79 原价 ¥99
MySQL实战45讲

林晓斌  网名丁奇,前阿里资深技术专家

48讲 | 44078 人已学习

拼团 ¥79 原价 ¥99
Java并发编程实战

王宝令  资深架构师

50讲 | 15484 人已学习

拼团 ¥79 原价 ¥99