玩转 Spring 全家桶
丁雪丰
美团研究员,《Spring Boot 实战》、《Spring 攻略》译者,腾讯云 TVP。
97978 人已学习
新⼈⾸单¥68
课程目录
已完结/共 123 讲
第十一章:Spring Cloud及Cloud Native概述 (5讲)
玩转 Spring 全家桶
登录|注册
留言
14
收藏
沉浸
阅读
分享
手机端
回顶部
当前播放: 95 | 使用Zookeeper作为服务注册中心
00:00 / 00:00
高清
  • 高清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.75x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看
01 | Spring课程介绍
02 | 一起认识Spring家族的主要成员
03 | 跟着Spring了解技术趋势
04 | 编写你的第一个Spring程序
05 | 如何配置单数据源
06 | 如何配置多数据源
07 | 那些好用的连接池们:HikariCP
08 | 那些好用的连接池们:Alibaba Druid
09 | 如何通过Spring JDBC访问数据库
10 | 什么是Spring的事务抽象(上)
11 | 什么是Spring的事务抽象(下)
12 | 了解Spring的JDBC异常抽象
13 | 课程答疑(上)
14 | 课程答疑(下)
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实战项目进度小结
24 | 通过Docker辅助开发
25 | 在Spring中访问MongoDB
26 | 在Spring中访问Redis
27 | Redis的哨兵与集群模式
28 | 了解Spring的缓存抽象
29 | Redis在Spring中的其他用法
30 | SpringBucks实战项目进度小结
31 | Project Reactor介绍(上)
32 | Project Reactor介绍(下)
33 | 通过Reactive的方式访问Redis
34 | 通过Reactive的方式访问MongoDB
35 | 通过Reactive的方式访问RDBMS
36 | 通过AOP打印数据访问层的摘要(上)
37 | 通过AOP打印数据访问层的摘要(下)
38 | SpringBucks实战项目进度小结
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 | 课程答疑
53 | 通过RestTemplate访问Web资源
54 | RestTemplate的高阶用法
55 | 简单定制RestTemplate
56 | 通过WebClient访问Web资源
57 | SpringBucks实战项目进度小结
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实战项目进度小结
67 | 认识Spring Boot的组成部分
68 | 了解自动配置的实现原理
69 | 动手实现自己的自动配置
70 | 如何在低版本Spring中快速实现类似自动配置的功能
71 | 了解起步依赖及其实现原理
72 | 定制自己的起步依赖
73 | 深挖Spring Boot的配置加载机制
74 | 理解配置背后的PropertySource抽象
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实战项目进度小结
86 | 简单理解微服务
87 | 如何理解云原生(Cloud Native)
88 | 12-Factor App(上)
89 | 12-Factor App(下)
90 | 认识Spring Cloud的组成部分
91 | 使用Eureka作为服务注册中心
92 | 使用Spring Cloud Loadbalancer访问服务
93 | 使用Feign访问服务
94 | 深入理解服务发现背后的DiscoveryClient
95 | 使用Zookeeper作为服务注册中心
96 | 使用Consul作为服务注册中心
97 | 使用Nacos作为服务注册中心
98 | 如何定制自己的DiscoveryClient
99 | SpringBucks实战项目进度小结
100 | 使用Hystrix实现服务熔断(上)
101 | 使用Hystrix实现服务熔断(下)
102 | 如何观察服务熔断
103 | 使用Resilience4j实现服务熔断
104 | 使用Resilience4j实现服务限流(上)
105 | 使用Resilience4j实现服务限流(下)
106 | SpringBucks实战项目进度小结
107 | 基于Git的配置中心(上)
108 | 基于Git的配置中心(下)
109 | 基于Zookeeper的配置中心
110 | 深入理解Spring Cloud的配置抽象
111 | 基于Consul的配置中心
112 | 基于Nacos的配置中心
113 | SpringBucks实战项目进度小结
114 | 认识Spring Cloud Stream
115 | 通过Spring Cloud Stream访问RabbitMQ
116 | 通过Spring Cloud Stream访问Kafka
117 | SpringBucks实战项目进度小结
118 | 通过Dapper理解链路治理
119 | 使用Spring Cloud Sleuth实现链路追踪
120 | 如何追踪消息链路
121 | 除了链路还要治理什么
122 | SpringBucks实战项目进度小结
123 | 结课测试&结束语
登录 后留言

全部留言(14)

  • 最新
  • 精选
鱼筱雨
老师,我导入你的项目后,log.info()打印信息的地方; log报红,是不是哪里定义了log的全局变量?我这里为什么没有生效?

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

2019-11-06
4
。。。
老师,请教一下:在学习了注册中心后,有点不明白,注册中心(比如Zookeeper)是用来注册服务的,在注册之后我们就可以去访问它;服务器(比如tomcat),我们也可以部署我们的应用,然后访问它。这2者的区别是什么呢?

作者回复: 注册中心上注册服务的提供者,然后消费者可以通过注册中心上的信息找到要调用的目标,这就是服务的注册与发现。你说的直接部署一个应用,然后去调用它,这里你自己需要知道调用的目标在哪里,而前者不需要事先知道这个信息,是靠注册中心来解决的。

2020-07-02
3
1
杨松
老师,我把这节课的例子稍微修改一下,启动2个waiter-service,一个customer-service,当后台手动关闭一个waiter-service,马上重启customer-service然后报错,请问该怎么设置后台服务下线后马上通知到前台的调用服务?

作者回复: 没太理解你这马上重启customer-service然后报错的意思,是说调用到了你关闭的那个waiter-service么?其实zookeeper和waiter-service建立了会话,会话探活也是要时间的,发现临时会话没了,它才会通知监听的节点变更。所以其实是无法做到实时,或者准实时的,肯定有一个时间。具体可以调整zookeeper的会话超时。

2020-06-04
1
SirNicholas
D:\geektime-spring-family\Chapter 12\zk-waiter-service\src\main\java\geektime\spring\springbucks\waiter\WaiterServiceApplication.java 这个类启动报拒绝连接错误,快来人解决一下啊。

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

2019-07-05
2
1
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
1
mickey
请问,服务注册不上去是怎么原因? Zookeeper里没有services目录。谢谢。

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

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

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

2019-05-11
2
1
Longerian
老师,我在24日提了一个问题,我看你把他列出来了,但没有回复,因为我的问题前面铺垫比较长,是不是没看到最后的问题呢?😂

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

2019-06-28
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
18
收起评论