admin管理员组

文章数量:1633739

今天来开门见山地讲讲网关是一个怎么样的组件,网关在做什么事情。网关这个词其实到处都在用,它可以工作在硬件层面,也可以工作在网络层,还可以工作在应用层。

网关快速入门

网关在做什么?

我们今天讲的实际上是一个工作在 HTTP 七层协议的网关,它主要做的有几件事情:

第一,公网入口。它作为我们公有云服务的一个入口,可以把公有云过来的请求定向到用户的资源上面去。

第二,对接后端资源。我们云开发有很多内部的资源,像云函数、容器引擎这样的资源,便可以把请求对接到这样的云资源上面去。

第三,身份鉴权。云开发有自己的一套账号身份体系,请求里如果是带有身份信息的,那么网关会对身份进行鉴权。

所以网关这个东西听起来好像是很底层的一个组件,大家可能会觉得很复杂,实际上并没有。我们就花几行代码,就可以实现一个非常简单的 HTTP 网关的逻辑。

import express from 'express'
import { requestUpstream, resolveUpstream } from './upstream'

const app = express()

app.all('*', (req, res) => {
    console.log(req.method, req.path, req.headers)
    const upstream = await resolveUpstream(req.method, req.path, req.headers)
    const response = await requestUpstream(upstream, req.body)
    console.log(response.statusCode, response.headers)
    res.send(response)
})

const port = 3000
app.listen(port, () => {
    console.log(`App listening at ${port}`)
})

这段示例代码在做的事情很简单,即我们收到一个请求之后,会根据请求的方法或者路径进行解析,找出它的上游是什么,然后再去请求上游,这样就完成一个网关的逻辑。

当然这是最简的一个代码了,实际上里面有很多东西是没有考虑到的,比如技术框架以及内部架构模块的治理,比如性能优化、海量的日志系统、高可用保障、DevOps 等等。当然这样展开就非常大了,所以我今天也不会面面俱到,会选其中几个方向来讲的比较深一点,这样我觉得会对大家比较有收获。

云开发 CloudBase(TCB) 是个啥?

说到这个,顺便介绍一下我们云开发 CloudBase 是什么,要介绍我们网关肯定要知道我们业务,像小程序·云开发、Web 应用托管、微搭低代码平台,还有微信云托管这样的服务都是在我们体系内的。

这些服务它的资源都会过我们的网关来进行鉴权,你可以在云开发体系下的控制台上,看到我们 URL 的入口,实际上这些 URL 它的背后就是我们的网关。

整个网关最简版的一个架构如上图所示,我们会给用户免费提供一个公网的默认域名,这个域名它背后实际上是一套 CDN 的分发网络,然后 CDN 回源到核心网关上面来。我们网关本身是无状态的服务,收到请求之后,它需要知道如何把请求分发到后端的云资源上去,所以有一个旁路的后端服务可以读取这样一套数据。

资料领取直通车:大厂面试题锦集+视频教程https://docs.qq/doc/DTlhVekRrZUdDUEpy

Linux服务器学习网站:C/C++Linux服务器开发/后台架构师https://ke.qq/course/417774?flowToken=1028592

网关的后面就是用户自己的云上资源了,你在云开发用到任何资源几乎都可以通过这样的链路来进行访问。

网关内部是基于 Nest.js 来做的,选 Nest.js 是因为它本身自带一套设计模式,很 Spring 那一套,更多的是做 IOC 容器这一套设计模式。

从上图可以看到,我们把它的内部架构分成了两层,一层是 Controller,一层是 Service。Controller 主要是控制各种访问资源的逻辑。比如说你去访问一个云函数(SCF),和你去访问一个静态托管的资源,它所需要的访问信息肯定是不一样的,所以这也就是分成了几种 Controller 来实现。

底层的话 Service 这一层是非常“厚”的,Service 内部又分成逻辑模块和功能性模块。

首先第一大块是我们的逻辑模块,逻辑模块主要是处理我们内部服务模块的很多东西,最上面这一层主要就是处理跟资源访问相关的一些请求的逻辑,跟各种资源使用不同的协议、方法来对接。然后中间这一层,更多的是做我们内部的一些集群的逻辑。比如集群管理,作为一个公有云的服务,我们对于客户也是会分等级的,像 VIP 客户可能就需要最后来发布,我们肯定是先验证一些灰度的流量,像这块逻辑就属于中间这一层来管理。最下面这一层就会有各种负责 I/O 的 Client,我这一次只画了一个 HTTP 的 Client,实际上还会有一些别的 Client。

除此之外还有一些旁路的功能性模块,包括像怎么打日志、配置、本地缓存的管理、错误处理,还有本地配置管理 DNS、调用链追踪等这些旁路的服务。

这一套设计其实就是老生常谈的高内聚低耦合,业务逻辑和真正的 I/O 实现要解耦开。因为只有解耦开,你才能够针对你的业务逻辑进行单元化的测试,可以很方便的把它底层的这种 I/O 读写逻辑给 Mook 起来,保证核心业务逻辑模块的可测试性。

上图是网关整体的链路架构,稍微更全面一点。最上层是分布在边缘的 CDN 节点,然后这些 CDN 节点会回源到我们部署在各地的集群,然后这些集群它又可以访问后面不同区域的资源,因为公有云它的资源其实也是按区域来划分的,所以这就讲到了我们网关的两个核心的要求,“快”和“稳”。

首先作为一个网关肯定是要快的,因为网关作为 CloudBase 云函数、云托管、静态资源的公网出口,性能要求极高,需要承接 C 端流量,应对各种地域、各种设

本文标签: 腾讯网关带你一文入门