借助腾讯云的云函数实现一个极简的API网关

Intro

微信小程序的域名需要备案,但是没有大陆的服务器,而且觉得备案有些繁琐,起初做的小程序都有点想要放弃了,后来了解到腾讯云的云函数,于是利用腾讯云的云函数实现了一个简单的 API 网关,通过云函数来调用真正的 API 地址,借此来绕过域名备案的问题。

云函数简介

腾讯云云函数(Serverless Cloud Function,SCF)是腾讯云为企业和开发者们提供的无服务器执行环境,帮助您在无需购买和管理服务器的情况下运行代码, 是实时文件处理和数据处理等场景下理想的计算平台。 您只需使用 SCF 平台支持的语言编写核心代码并设置代码运行的条件,即可在腾讯云基础设施上弹性、安全地运行代码。

计算资源的变迁

随着云服务的发展,计算资源高度抽象化,腾讯云提供了从物理服务器到云函数和横跨各种抽象程度的计算资源供用户选择。

  • 黑石物理服务器:以物理机为扩展单位。用户完全拥有整台实体计算资源,安全性最好。
  • 云服务器(CVM):以云服务器为扩展单位,虚拟化硬件设备。用户和其他租户共享物理机资源,仍可自行配置 CVM 的各项指标,相对部署和迭代更加简单。
  • 容器:以服务为扩展单位,虚拟化操作系统。测试和生产环境完全一致,测试和部署非常轻松。
  • 云函数:以函数为扩展单位,虚拟化运行时环境(Runtime)。是现有计算资源的最小单位,具有完全自动、一键部署、高度可扩展等特点,是轻量级服务部署非常好的选择。

无服务器的概述

无服务器(Serverless)不是表示没有服务器,而表示当您在使用 Serverless 时,您无需关心底层资源,也无需登录服务器和优化服务器,只需关注最核心的代码片段,即可跳过复杂的、繁琐的基本工作。核心的代码片段完全由事件或者请求触发,平台根据请求自动平行调整服务资源。Serverless 拥有近乎无限的扩容能力,空闲时,不运行任何资源。代码运行无状态,可以轻易实现快速迭代、极速部署。

更多介绍参考官方文档

腾讯云函数目前有免费额度可以用,应用不大,基本可以够用:

我的这个只是一个演示功能,免费的额度应该足够了,选用最低的内存配置,运行一个月妥妥的没问题,还会有剩余时间。

60 * 60 * 24 * 31 = 2,678,400 < 3,200,000

创建云函数

创建云函数:

默认提供了一些模板,可以根据自己需要创建,我这里选择空白函数,选择的运行环境是 nodejs 8.9,然后下一步即可

如果你的方法比较简单可以直接编辑好再完成,如果比较复杂的话可以先完成,在本地编辑好再更新。

使用方式

  1. API网关云函数源码:https://github.com/WeihanLi/ActivityReservation/tree/dev/ActivityReservation.Clients/ReservationApiFunction

  2. 更新云函数

修改 index.ts 文件中的要转发的地址

在该目录下执行 tsc,生成编译后的 js

到 dist 目录下执行 npm install,安装依赖,目前用到的只有一个 got,如果用到了别的请在 package.json 文件里添加,或者执行 npm install <package-name> --save

之后打包 dist 目录下的内容到 zip,然后上传到腾讯云的控制台即可

需要注意,压缩包不能包含 dist 目录,打开压缩包之后就是代码

dist.zip

  • -- node_modules
  • -- httpRequester.js
  • -- index.js
  • -- packages.json
  1. 配置触发方式:

创建 API 网关触发器之后会在 API 网关那边创建一个服务,并且会得到一个访问的地址

我们访问下面的路径就可以访问到我们的 api 了,示例:

https://service-balxf7hr-1251288923.ap-shanghai.apigateway.myqcloud.com/release/reservationWxAppGateway/api/notice

这个请求会实际转发到 https://reservation.weihanli.xyz/api/notice

在小程序的请求接口地址使用这个地址就可以了,这样就暂时绕过了小程序服务器域名备案~~

实现原理

请求转发,实现一个简单的 API 网关

实现过程中遇到的问题

unable to verify the first certificate

这个是 https 请求证书验证的问题,参考 stackoverflow https://stackoverflow.com/questions/31673587/error-unable-to-verify-the-first-certificate-in-nodejs/32440021

通过设置了一个环境变量 NODE_TLS_REJECT_UNAUTHORIZED=0 来解决了

访问 api 404

访问之后,通过看日志,输出请求的地址发现,request 的 path 是带函数名称的,所以将函数名去掉就可以了

if ((<string>event.path).startsWith('/reservationWxAppGateway')) {
event.path = (<string>event.path).replace('/reservationWxAppGateway', '');
}

后来发现在 event 的参数里有个 event.requestContext.path 来表示云函数的 path,把这个 path 去掉就是真正请求的路径

if((<string>event.path).startsWith(`${event.requestContext.path}`)){
event.path = (<string>event.path).replace(`${event.requestContext.path}`, '');
}

请求头的转发

请求头转发的时候, host 请求头不能传,我在传递 headers 的时候将 host 请求头设置为 undefined

headers["host"]= undefined;

Reference

借助腾讯云的云函数实现一个极简的API网关的更多相关文章

  1. 阿里云API网关(6)用户指南(开放 API )

    网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...

  2. 阿里云学习之API网关

    注:此处仅供api的创建做一个补充参考,API网关的优缺点及创建过程中的参数详情,请参考阿里云开放文档:https://helpcdn.aliyun.com/document_detail/29478 ...

  3. 阿里云API网关(2)开放 API 并接入 API 网关

    网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...

  4. 极简Vue的异步组件函数

    export default new Router({ routes: [ { path: '/live', name: 'live', component: () => import('@/v ...

  5. dio框架访问云函数参数传递问题(以腾讯云中的云函数为例子)第一部

    dd云函数其实比较普及,这里以腾讯云的云函数为例,传递参数完成简单的账号注册. 一.第一步先注册腾讯云账号,这里不过多阐述,接着点击 控制台 进入开发者界面.(注意提前进行实名认证) 二.开发者界面如 ...

  6. Android讯飞语音云语音听写学习

    讯飞语音云语音听写学习         这几天两个舍友都买了iPhone 6S,玩起了"Hey, Siri",我依旧对我的Nexus 5喊着"OK,Google" ...

  7. 腾讯云的云数据库MYSQL配置

    腾讯云的云数据库MYSQL配置

  8. GDC快讯,腾讯CMatrix布局云游戏B端领域

    2019年3月20日-22日, GDC游戏开发者大会(Game Developers Conference,以下简称GDC)于旧金山召开.每年的GDC大会上,来自世界各地,数以万计的游戏开发者们都会分 ...

  9. 在腾讯CentOS7.4云服务器上安装Docker,在Docker上安装配置MySQL、Tomcat和Nginx

    提示:以下是在腾讯CentOS7.4云服务器上操作. Docker的基本操作:https://www.cnblogs.com/opsprobe/p/10963098.html 一.安装Docker # ...

随机推荐

  1. c语言进阶10-算法

    一.  数据结构和算法关系 为什么要学数据结构和算法? 通常,计算机解决问题的步骤如下: 在数学模型中,计算机处理的对象之间通常存在着一种最简单的线性关系,这类数学模型就是线性的数据结构.著名计算机科 ...

  2. python执行unittest界面设置

    执行单元测试时,系统会自动添加unittest in...的执行服务器. 执行时unittest in...的执行服务器在界面右上方可以看到,且执行结果为左侧框和右侧统计结果. 如果没有,会导致测试结 ...

  3. 解密Kafka吞吐量高的原因

    众所周知kafka的吞吐量比一般的消息队列要高,号称the fastest,那他是如何做到的,让我们从以下几个方面分析一下原因. 生产者(写入数据) 生产者(producer)是负责向Kafka提交数 ...

  4. Linux系统安装jdk——.tar.gz版(old)

    这里简单地阐述一下rpm.deb.tar.gz的区别. rpm格式的软件包适用于基于Red Hat发行版的系统,如Red Hat Linux.SUSE.Fedora. deb格式的软件包则是适用于基于 ...

  5. 在父页面用Iframe加载子页面时,将父页面的title替换成子页面title

    报告管理

  6. HTML--CSS样式表的基本概念

    CSS(Cascading Style Sheet  叠层样式表) 作用:美化HTML网页 (一)样式表分类 一.内联样式表 和HTML联合显示,控制精准,但是可重用性差,冗余多. 例如:<p ...

  7. 第一个C# Winform实例

    前面我们准备好了相关的库,现在开始搭建环境,本人自动化行业,就用Windorm开发吧,例子仅仅做引导,希望大家能深入.VS版本VS2017 1:打开VS建立一个WInform 项目.拉入两个控件,gr ...

  8. Java集合Collention

    集合:又被称为容器,用来存储数据,他是一个对象,能够将具有相同性质的多个元素汇聚成一个整体,集合被用于存储,获取,操纵和传输聚合的数据. 这种数据结构称为集合 Collenction:他是集合的根接口 ...

  9. codeforces 322 A Ciel and Dancing

    题目链接 题意: 有n个男孩和m个女孩,他们要结对跳舞,每对要有一个女孩和一个男孩,而且其中一个要求之前没有和其他人结对,求出最大可以结多少对. 如图,一条线代表一对,只有这样三种情况. #inclu ...

  10. H3C模拟器实验之网络地址转换

    网络拓扑图 NOTE:各个设备的基本配置在拓扑图上已经标明(需要注意的是RTB的出接口也需要配置IP,但是使用ping -a 10.1.1.1 202.117.144.1 ping不通,这点不是很理解 ...