Spring Boot 与 Kubernetes 云原生微服务实践 笔记 (3)

164 阅读5分钟

*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了课程第四章的内容