借助腾讯云的云函数实现一个极简的API网关
借助腾讯云的云函数实现一个极简的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,然后下一步即可
如果你的方法比较简单可以直接编辑好再完成,如果比较复杂的话可以先完成,在本地编辑好再更新。
使用方式
更新云函数
修改 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
- 配置触发方式:
创建 API 网关触发器之后会在 API 网关那边创建一个服务,并且会得到一个访问的地址
我们访问下面的路径就可以访问到我们的 api 了,示例:
这个请求会实际转发到 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网关的更多相关文章
- 阿里云API网关(6)用户指南(开放 API )
网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...
- 阿里云学习之API网关
注:此处仅供api的创建做一个补充参考,API网关的优缺点及创建过程中的参数详情,请参考阿里云开放文档:https://helpcdn.aliyun.com/document_detail/29478 ...
- 阿里云API网关(2)开放 API 并接入 API 网关
网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...
- 极简Vue的异步组件函数
export default new Router({ routes: [ { path: '/live', name: 'live', component: () => import('@/v ...
- dio框架访问云函数参数传递问题(以腾讯云中的云函数为例子)第一部
dd云函数其实比较普及,这里以腾讯云的云函数为例,传递参数完成简单的账号注册. 一.第一步先注册腾讯云账号,这里不过多阐述,接着点击 控制台 进入开发者界面.(注意提前进行实名认证) 二.开发者界面如 ...
- Android讯飞语音云语音听写学习
讯飞语音云语音听写学习 这几天两个舍友都买了iPhone 6S,玩起了"Hey, Siri",我依旧对我的Nexus 5喊着"OK,Google" ...
- 腾讯云的云数据库MYSQL配置
腾讯云的云数据库MYSQL配置
- GDC快讯,腾讯CMatrix布局云游戏B端领域
2019年3月20日-22日, GDC游戏开发者大会(Game Developers Conference,以下简称GDC)于旧金山召开.每年的GDC大会上,来自世界各地,数以万计的游戏开发者们都会分 ...
- 在腾讯CentOS7.4云服务器上安装Docker,在Docker上安装配置MySQL、Tomcat和Nginx
提示:以下是在腾讯CentOS7.4云服务器上操作. Docker的基本操作:https://www.cnblogs.com/opsprobe/p/10963098.html 一.安装Docker # ...
随机推荐
- C#3.0新增功能10 表达式树 06 生成表达式
连载目录 [已更新最新开发文章,点击查看详细] 到目前为止,你所看到的所有表达式树都是由 C# 编译器创建的. 你所要做的是创建一个 lambda 表达式,将其分配给一个类型为 Expressi ...
- [剑指offer] 3. 从头到尾打印链表
题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 思路: 利用容器,遍历一遍加入到一个新容器里,然后反置输出. vector 用 reverse stack 则直接一个个出栈 ...
- 【Gym - 101002F】Mountain Scenes(dp)
Mountain Scenes Descriptions 给你一个长度为n的丝带,一个宽w一个高h 的 格子,用丝带去填充格子,这填充后只需要满足至少有一列的丝带长度与其他格子不同即可.丝带可以不全部 ...
- python 之 并发编程(线程理论,开启线程的两种方式,进程与线程的区别,线程对象的其他方法)
9.9 线程理论 1.什么是线程 线程指的是一条流水线的工作过程 进程根本就不是一个执行单位,进程其实是一个资源单位,一个进程内自带一个线程,线程才是执行单位 2.进程VS线程 同一进程内的线程们共享 ...
- 自动化部署方案CICD
自动化部署方案 由于来来也的时间不久,可能对现有的部署情况不是很了解,以下是个人对POC自动化部署的设计方案. 自动化部署优点 降低成本,提高生产力,高可用,更可靠,性能优化 与gitlab持 ...
- ThreadPoolExecutor带来的性能问题
使用线程池,一般情况下会带来性能提升,并且使用线程池管理线程,减少了每个任务调用的开销,通常可以在执行大量异步任务时提供增强的性能. 但是在高并发的情况下,会因为使用不当导致性能下降,并且下降得比较严 ...
- Flink实战(八) - Streaming Connectors 编程
1 概览 1.1 预定义的源和接收器 Flink内置了一些基本数据源和接收器,并且始终可用.该预定义的数据源包括文件,目录和插socket,并从集合和迭代器摄取数据.该预定义的数据接收器支持写入文件和 ...
- 恢复在iterm2中当滚动光标时候触发滚动历史记录的问题
在Iterm2中,如果你上下滚动光标(上下滑动触摸板.或者滚动鼠标滚轮),通常情况下是触发了屏幕内容上下滚动. 但是在某些异常情况下,却触发了命令行历史记录的上下滚动,效果和你连续按了多次键盘的上下键 ...
- Java编程思想,初学者推荐看看
这是一本介绍Java编程思想,如何从面向过程的编程思想转换为面向对象的编程思想.我个人是比较建议新手看一下的,思想掌握了,学起来自然也就会方便很多的,我还有一些Java基础的数,有需要的可以找我要,都 ...
- Golang版本的rocksdb-对gorocksdb的封装
rocksdb的优秀特性不用多说,但是它是用c++语言写的,就是这一个特点就把很多人拦住了.虽然rocksdb官方也有Java版本,但是Golang的发展速度让人不容小觑,而且由于golang原生对高 ...