微服务架构实战 160 讲
杨波
拍拍贷研发总监、资深架构师、微服务技术专家
48732 人已学习
新⼈⾸单¥98
课程目录
已完结/共 171 讲
微服务架构实战 160 讲
登录|注册
留言
12
收藏
沉浸
阅读
分享
手机端
回顶部
当前播放: 53 | Zuul网关代码剖析(Code Review)
00:00 / 00:00
高清
  • 高清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.75x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看
01 | 第一模块课程介绍
02 | 微服务安全要解决什么问题
03 | 白话 OAuth2
04 | OAuth2 的正式定义
05 | OAuth2 有哪些典型模式
06 | OAuth2 模式该如何选型
07 | Spring Security OAuth2 架构简介
08 |【实验】授权码模式授权服务器
09 |【实验】简化模式授权服务器
10 |【实验】密码模式授权服务器
11 |【实验】客户端模式授权服务器
12 | 实验一扩展环节
13 |【实验】Web 应用接入授权服务器
14 | 实验二扩展环节
15 | 什么是 JWT 令牌
16 |【实验】授权服务器支持 JWT 令牌
17 | 实验三扩展环节
18 |【实验】Android 无线应用接入授权服务器
19 |【实验】AngularJS 单页应用实验和课后扩展
20 |【实验】GitHub社交登录实验和课后扩展
21 | 【实验】OAuth2安全风险CSRF实验
22 | OpenId Connect简介
23 | 下一代微服务安全架构
24 | 参考资源和后续课程预览
25 | Apollo作者的产品介绍
26 | 第二模块课程介绍
27 | 课程概述
28 | 业务需求
29 | 配置定义和场景
30 | 开关驱动开发原理
31 | 携程 Apollo 配置中心介绍
32 | Apollo核心概念
33 | Apollo快速起步(Lab01)
34 | Apollo快速起步扩展实验
35 | Apollo架构设计之服务器端
36 | Apollo架构设计之客户端
37 | Apollo架构设计之高可用和监控
38 | Apollo分布式部署指南
39 | Apollo Java客户端和多语言接入
40 | Apollo Client API实操(Lab02)
41 | Apollo Client和Spring集成~XML方式(Lab03)
42 | Apollo Client和Spring集成~代码方式(Lab04)
43 | Apollo Client和Spring Boot集成(Lab05)
44 | Apollo开放平台接入实操(Lab06)
45 | Spring Cloud Config简介
46 | Apollo vs Spring Cloud Config
47 | Apollo FAQ和开发常见问题
48 | 参考资源和后续课程预览
49 | 第三模块课程介绍
50 | Zuul网关和基本应用场景
51 | Zuul网关高级应用场景
52 | Zuul网关架构剖析
53 | Zuul网关代码剖析(Code Review)
54 | Zuul网关过滤器管理工具(Code Review)
55 | 前置过滤器实验(Lab01)
56 | 路由过滤器实验(Lab02)
57 | 后置过滤器实验(Lab03)
58 | Zuul网关对接Apollo(Lab04)
59 | Zuul网关生产部署实践
60 | Zuul网关路由管理实践
61 | 基于网关的两层路由体系
62 | Spring Cloud Zuul(Lab05)
63 | Zuul2.0简介
64 | Zuul网关生产最佳实践
65 | 参考资源和后续课程预览
66 | 第四模块课程介绍
67 | 调用链监控业务需求
68 | 调用链监控原理
69 | 调用链监控产品和比较
70 | 点评 CAT 背景介绍
71 | CAT 典型报表
72 | CAT 告警简介
73 | CAT 架构设计
74 |【实验】CAT 本地部署
75 | CAT 埋点案例和代码剖析(Code Review)
76 |【实验】CAT 埋点案例
77 | Zuul 网关集成 CAT 代码剖析(Code Review)
78 |【实验】Zuul 网关集成 CAT
79 | CAT 生产埋点实践
80 | CAT 生产部署实践
81 | CAT 生产治理实践
82 | Spring Cloud Sleuth 简介
83 |【实验】Spring Cloud Sleuth
84 | 参考资源和后续课程预览
85 | 第五模块课程介绍
86 | 容错限流需求
87 | 容错限流原理
88 | Netflix Hystrix 背景介绍
89 | Hystrix 设计原理
90 | Hystrix 主要概念
91 | 信号量 vs 线程池隔离
92 | Hystrix 主要配置项
93 |【实验】Hystrix 基础实验
94 | Hystrix 模拟案例分析 (Code Review)
95 |【实验】Hystrix + Dashboard 实验(上)
96 |【实验】Hystrix + Dashboard 实验(下)
97 | 网关集成 Hystrix (Code Review)
98 |【实验】Spring Cloud Hystrix 实验
99 | Netflix Turbine 简介
100 | Hystrix 生产最佳实践
101 | 参考资源和后续课程预览
102 | 第六模块课程介绍
103 | 服务发现需求和模式(上)
104 | 服务发现需求和模式(下)
105 | Netflix Eureka 和 Ribbon 背景介绍
106 | Eureka 和 Ribbon 架构设计原理
107 |【实验】Spring Cloud Eureka 和 Ribbon 基础实战
108 |【实验】Spring Cloud Eureka 和 Ribbon 高级实验
109 | Spring Cloud Eureka 和 Ribbon 主要配置项
110 | Eureka进阶:自保护模式
111 | Eureka进阶:健康检查和蓝绿部署
112 |【实验】Spring Cloud Zuul、Eureka 和 Ribbon 集成实验(上)
113 |【实验】Spring Cloud Zuul、Eureka 和 Ribbon 集成实验(下)
114 | 常用服务发现组件比较
115 | ServiceMesh 和 Istio 简介
116 | 基于 Eureka、Zuul 和容器云的持续交付架构
117 | 参考资源和后续课程预览
118 | 第七模块课程介绍
119 | 监控模式分类
120 | BusDevOps 和测量驱动开发 MDD
121 | Prometheus 简介
122 | Prometheus 架构设计
123 | Prometheus 基本概念
124 |【实验】Prometheus 起步查询实验(上)
125 |【实验】Prometheus起步查询实验(中)
126 |【实验】Prometheus起步查询实验(下)
127 |【实验】Prometheus + Grafana 展示实验(上)
128 |【实验】Prometheus + Grafana 展示实验(下)
129 |【实验】Prometheus + Alertmanager 告警实验(上)
130 |【实验】Prometheus + Alertmanager 告警实验(下)
131 |【实验】Java 应用埋点和监控实验
132 |【实验】NodeExporter 系统监控实验
133 |【实验】Spring Boot Actuator 监控实验
134 | Prometheus 监控最佳实践
135 | 主流开源时序数据库比较
136 | 开源分布式监控平台 ZMon 简介
137 | 微服务监控体系总结
138 | 参考资源和后续课程预览
139 | 课程概述和背景
140 | 架构和设计
141 | 开发环境搭建
142 | 基础代码(code review)
143 | 数据访问模块(code review)
144 | OAuth2服务模块(code review)
145 | Web服务模块(code review)
146 | 启动流程(code review)
147 | 起步准备实验(lab02)
148 | OAuth2授权码模式实验(lab03)
149 | OAuth2简化模式实验(lab04)
150 | OAuth2用户名密码模式实验(lab05)
151 | OAuth2客户端模式实验(lab06)
152 | OAuth2令牌校验实验(lab07)
153 | OAuth2令牌刷新实验(lab08)
154 | 项目复盘和扩展环节
155 | 参考资源和后续课程预览
156 | 课程概述和背景
157 | 需求和架构设计
158 | 开发环境搭建(lab01)(上)
159 | 开发环境搭建(lab01)(下)
160 | 项目业务代码(Code Review)
161 | Apollo配置中心集成(lab02)
162 | Zuul-Eureka-Ribbon-Hystrix集成(Code Review)
163 | Gravitee OAuth2集成(lab03)
164 | Zuul网关集中令牌校验(Code Review)
165 | CAT调用链集成(lab04)(上)
166 | CAT调用链集成(lab04)(下)
167 | Demo展示(lab05)(上)
168 | Demo展示(lab05)(下)
169 | Prometheus监控集成(Code Review)
170 | 生产扩展环节
171 | 课程复盘总结&结课测试
本节摘要
登录 后留言

全部留言(12)

  • 最新
  • 精选
正是那朵玫瑰
老师想问几个问题: 1、老师实践的zuul是原生的zuul么?并没有使用Spring-cloud-zuul? 2、每一个客户端如H5、手机、web都对应不同的zuul网关?这样管理是不是太麻烦? 3、filter文件是怎么管理的,写在zuul项目里面还是直接储存在数据库里面? 4、老师所说的异步servlet可以优化连接数,servlet是运行在容器里面的如tomcat,目前tomcat支持BIO和NIO,如果使用BIO的话,这种阻塞IO模型是一个连接一个线程,就算异步servlet意义也不大吧;如果是NIO,这种多路复用IO技术,本身就已经支持大量连接了,此时在tomcat里面servlet线程应该是IO线程吧,使用异步servlet,对一些处理慢的请求可以得到优化,但是并不是优化了连接数吧?这是我的理解,所以不太明白老师所说的异步servlet可以优化连接数?望老师可以解答下!

作者回复: 你好,你的问题回答如下:1),是原生zuul的简化定制版,不是spring cloud zuul。2),当企业业务和团队到一定规模,zuul网关是要按场景(h5,无线,第三方开放平台等)分集群的,我之前和现在的公司都是这种管理模式,当然管理成本会大一点,一般需要研发一套统一网关治理系统。如果你业务和团队规模小,则没必要分那么细。3)我们做法是存数据库集中管理,zuul网关节点定期到数据库拉取(zuul节点本地有缓存和比对机制)。4),我们在生产实践中发现,不启用AsyncServerlet,当访问量大时候连接数有限制(拒绝额外请求);启用AsyncServerlet后,可以接受的连接数明显增加,当然这个只是前端异步,后端处理和请求还是由容器线程池同步处理的,总体吞吐量没有增加,只是可接受连接数增加了,所以我说优化了连接数。

2018-09-15
6
DDs moving castle
我司使用的是spring cloud封装的zuul,也想增加动态filter功能,故参考了波波老师的s2g-zuul,将使用数据库动态加载激活filter功能拿过来,期间也发现原本的deactivate通用功能只是将数据库的is_active、is_canary都置为false,并未做其它处理,filter并没有真正停用,还是会调用到,故对停用功能做如下调整:1、更新数据库记录状态保持不变;2、删除本地磁盘filter目录中的groovy文件(因为数据库管理filter也是先写到本地磁盘再加载到内存的,本地磁盘不删,怎么都会再加载进内存);3、根据spring cloud的ZuulFilterInitializer中contextDestroyed()方法的逻辑(也通过dump分析过谁引用了动态加载的filter),将动态filter的实例从FilterRegistry和FilterLoader#hashFiltersByType中删除,想看看是否能够达到删除对动态filter的所有引用后,在下次gc时能被销毁;4、由于使用了apollo配置中心,也将filter的disable property置为true,以防止内存中不能被销毁或其它意外情况发生。经过如上步骤,filter真正是停用了,不会被调用到。但不会被调用到首先是因为已经从FilterLoader#hashFiltersByType中删除,想看看内存中是否被gc销毁,但目前的方法只能通过dump内存(但dump时确实是会触发一次full gc的),从dump数据查看filter实例,确实没有了,不知道这能不能算真正的协助成功??请问有必要这样做吗?? (题外:本来想通过alibaba Arthas通过不dump的方式查看filter是否被卸载,结果反而发现使用Arthas后发生了内存泄露,在shutdown Arthas后,filter对象仍然被Arthas的Advice引用,而root在tomcat的TaskThread的threadlocal中,尝试很久始终无法卸载)

作者回复: 你好,看得出你们已经花费很多功夫去禁用某个filter,实际生产中,我们还是需要评估成本和可靠性,首先,生产上禁用某个filter一般不会频繁发生(毕竟我们没有Netflix那么大规模),所以需要评估这个成本是否值得,大部分情况下,能用apollo配置中心动态控制filter启停就足够了(我们之前就是这么干的),没必要完全内存删除;其次,删除filter可能有潜在内存问题,是否会引入不可靠性?所以还是需要评估下是否一定要这样做,anyway,你已经深入研究了这个问题,也完全理解了这种机制的利弊,相信你已经有自己的答案了,也谢谢你提供的方案思路!

2019-02-01
3
wyw
老师,filter从激活变为未激活将filter移除 是不是未实现? groovy是不是不能注入spring容器中的bean?

作者回复: 对的,netflix原生zuul这块还不完善,主要在filter本地加载那块,笨办法只能先删除本地filter临时目录,再重启zuul。或者需自己修复filter加载逻辑,下线的filter本地和内存都要删除。或者也可以用apollo开关控制filter的启用或禁用。groovy应该不在spring容器管理范围内,估计不能用注入。

2018-11-06
1
🔰夏天的味道
老师您好,能不能说下您的精简源码和Netflix原版源码之间的对应关系?自己尝试过,找不出老师的源码是从原来哪里精简过来的。

作者回复: 总体是基于zuul源码,做了少量简化和调整,主要变化:过滤器管理数据访问层从cassandra改为mysql,增加CAT埋点,增加AsyncServlet支持

2018-07-17
1
托尼斯威特
用AsyncServlet并没有省线程, 那和直接增加Tomcat的线程池大小不是一样效果吗? 感觉servlet就解决不了这个问题. Zuul2.0的异步是Netty实现的, 不光前端异步, 向后端发请求也是Netty 异步client. 不知道我的理解有没有问题, 老师能评价一下吗?

作者回复: 建议阅读一下这篇文章<理解AsyncServlet>: https://ijunc2.github.io/2018/02/01/seventh.html AsyncServlet把线程的角色一分为二,分为主要处理连接和I/O的Servlet线程和处理业务逻辑的Worker线程。这个优化对提升服务其处理效率还是有不小的帮助的,Servlet线程处理完IO就可以被回收到线程池,这样就可以处理更多的连接。如果不分的化,Servlet线程要同时处理I/O连接和处理业务逻辑,容易阻塞消耗更多资源。 就像一个由AB两个步骤组成的任务原来只有一个人干,B阻塞的时候这个人只能等着,现在把步骤拆分为二,有两个人分别专注干A和B,B阻塞的时候,第一个人可以继续可以干下一个A。

2020-12-24
Jason
zuul 网管为什么能比 nginx 等网关性能高呢?

作者回复: 如果讲绝对性能,zuul应该比不过nginx,但是网关无状态,可以水平扩,适当优化,zuul组成的网关性能完全是ok的(携程每日百亿API请求通过zuul网关,netflix比携程的量应该还要大),而且zuul基于java,对开发人员扩展比较友好。相比nginx比较偏运维,开发人员能直接扩展nginx的不多。

2020-03-22
张晓永
波波老师 本地maven仓库也给提供一份吧,下载太费劲了

作者回复: 请确保网络良好,可以正常连接并下载官方maven仓库中的依赖jar包。

2020-02-15
张晓永
项目到不进 eclipes TST 里

作者回复: 请确保网络良好,可以正常连接并下载官方maven仓库中的依赖jar包。

2020-02-14
Ckiwis
lab1-lab4的源码没有?

作者回复: 源码就是定制版s2g-zuul和lab05中的项目 https://github.com/spring2go/s2g-zuul

2019-10-10
2
在路上
老师好 感觉Zuul和Nginx可以相互替代,是这样的吗? 在选择时,不考虑公司历史原因,Zuul和Nginx分别适合于哪种场景呢?

作者回复: 理论上讲,Zuul能做的, Nginx都能做到,相反,Nginx能做的,Zuul也能做到(可以扩展)。实际上,Nginx是一种通用高性能的反向代理,常常作为网站的前置反向代理和负载均衡器用;而zuul则一般用在API网关场景。很多公司同时用Nginx + Zuul。

2019-09-19
收起评论