*time.geekbang.org/course/intr…
课程和背景介绍
课程重点是:微服务和云原生架构,运用Spring boot 和 kubernetes。
本章重点:可编程网关设计和实践_________________________________________________________________________________________________
网关是什么,为什么需要网关?网关和bff是如何演化出来的?
以MyShop架构演进之路来理解网关。
MyShop作为一个web端服务,V1版本网络架构如下:
浏览器(公网) -> Nginx (反向代理和负载均衡) -> 服务器端Web应用 -> 各个微服务
随着时间推移,MyShop想要支持移动端,V2版本网络架构添加了一条:
手机端app(公网) -> Nginx (反向代理和负载均衡) -> 各个微服务
但是这条架构会有几个问题:会出现app服务和后端微服务强耦合;并且每个对外暴露的服务都需要单独的域名;内部的服务会直接暴露在公网,会有安全问题;app端有聚合,裁剪和适配逻辑,这些代码会放在app端,很不整洁;所以把它修改成了V2.5版本:
手机端app(公网) -> Nginx (反向代理和负载均衡) -> 无线BFF -> 各个微服务
V2.5增加了BFF(Backend for frontend)层,代理适配服务,将后端微服务进行适配,相当于把V2.0的一部分移动端的代码抽到了BFF中去。所以BFF是有前端负责的。BFF的优势:可以把移动端和微服务解偶;可以减少前后端的沟通开销;前端只需要知道BFF的域名,不需要知道微服务的域名;微服务不需要暴露在公网,比较安全;
但是单块BFF会产生把所有微服务功能放在同一个BFF中,根据康威法则,单块的BFF和多团队之间出现了不匹配的问题,增加了跨团队开发合作的沟通成本,降低交付效率;BFF需要有跨横切面(cross cutting concerns)的功能,比如身份认证等,时间长了之后,会造成代码复杂度升高,可读性降低;BFF是个single point of failure,如果BFF宕机,会存在所有服务都不可以用的风险。
V3版本网络架构如下:
BFF按照团队或者业务线的边界进行拆分,每个业务线团队可以并行开发自己负责的BFF。无线网关负责跨横切面(cross cutting concerns),它的作用有:1)路由,将前端来的请求路由到不同的微服务 2)认证,对涉及敏感api的调用,进行集中的认证鉴权 3)监控 4) 限流熔断,当出现流量峰值,或者微服务出现延迟,BFF会主动做熔断,保证微服务不受影响 5) 防爬虫,分析访问日志,阻断恶意行为
V4版本网络架构如下:
这样网关和BFF层就被驱动出来了,在简单的项目中,可以把网关和BFF和在一层。
正向代理和反向代理
上图中,左边和右边的电脑在通讯时,需要经过中间的电脑中转,而中间的那部电脑就是代理服务器。
**当客户端主动使用代理服务器时,此时的代理叫正向代理。**比如一些网络代理工具(加速器/VPN...)正向代理的适用场景:
- 访问被禁止的资源(突破网络审查、绕过客户端IP封禁)
- 隐藏客户端的地址
- 进行客户访问控制(记录用户访问记录 ,控制客户端的访问行为)
- 加速访问资源(使用缓冲特性减少网络使用率:代理服务器设置一个较大的缓冲区,当有外界的信息通过时,同时也将其保存到缓冲区中)
**当服务器端主动使用代理服务器时,此时的代理叫反向代理。**服务器根据客户的请求,从其关系的一组或多组后端服务器(如Web服务器)上获取资源,然后再将这些资源返回给客户端,客服端只会得知代理服务器的IP地址,而不知道在代理服务器后面的服务集群的存在。反向代理的适用场景:
- 负载均衡。如果服务器集群中有负荷较高者,反向代理通过URL重写,根据连线请求从负荷较低者获取与所需相同的资源或备援。可以有效降低服务器压力
- 提升服务器安全。对客户端隐藏服务器的IP地址。
- 加密/SSL加速。将SSL加密工作交由配备了SSL硬件加速器的反向代理完成
最核心的不同在于代理的对象不同。
- 正向代理是代理客户端。
- 反向代理是代理服务器。
网关和反向代理
现在项目一般采用网关和反向代理并存的部署架构,以下图为例:
也存在着统一网关部署架构,所有流量通过一个统一网关,然后分发到微服务,单页应用,web应用。
网关
网关就是从一个网络到另一个网络的大门。市面上有很多网关产品,比如Traefic,Nginx,Zuul,spring cloud gateway,Envoy等。也可以自己开发一个网关。自己开发的好处:1) 可编程性网关,实现开发自由的定制 2) 网关自研成本不高
网关就是一个 ServletFilter,由以下5个模块:
路由映射表
HttpClient映射表
路由解析
请求转发
响应截获器
* httpClient:后端访问一个接口,获取返回的数据。这个时候就要用到httpclient来做,可以用的框架有spring cloud feign,restTemplate...
_________________________________________________________________________________________________
cover了课程第四章的内容