无需修改代码,用 fcapp.run 运行你的 REST 应用
作者 | 阿里云 Serverless 技术研发 落语
背景
阿里云函数计算产品在较早的时候支持了HTTP触发器能力,支持用户使用 HTTP 协议进行函数调用。函数计算后端通过一个共享的 APIServer 组件对所有客户提供响应 HTTP 触发器调用的服务,需要依赖 URL 中的 Path 将客户流量路由到客户的函数容器内部。容器内收到的 HTTP 请求 Path 会带有函数计算的路由标识,如果客户在函数计算部署 REST 风格的应用,那么就会遇见 404 问题。

在一开始,函数计算并不是为客户运行中小型规模应用而设计的。函数计算提供了原生的 REST 架构,将每个函数视为一个独立的资源,通常一个函数只负责一小块功能,也就是一个 API。如果一个函数只对应一个 API,那么在函数代码中也不必去实现一套路由逻辑去响应不同 URL Path 路径的请求了。

函数计算在近两年引入了Custom Runtime/Custom Container Runtime类型的函数,客户可以直接在函数计算上运行自己存量的应用,而不必按照函数计算推荐的架构去拆分自己的应用。客户以及社区内比较成熟的项目的开发习惯是采用MVC等架构,在一个程序中开发大量的REST API,在进程内按照报文中的HTTP Path进行路由,将不同路径的请求“转发”至不同的方法或函数进行处理。

在这样的背景下,客户可以在函数计算运行存量的 REST 应用,但应用无法正常对外提供服务。客户花费大量的精力对存量的应用进行改造,而且这个改造仅仅在函数计算是必须的,是一种典型的平台携裹用户的产品设计。
使用 fcapp.run调用函数
为了解决上述的问题,并兼容存量的函数以及客户习惯,函数计算为每个新创建的 HTTP 触发器分配了一个独立的域名,例如{random-string}.cn-shanghai.fcapp.run。使用该域名访问函数计算,函数计算会按照域名进行路由,将流量转发至函数容器内,避免对客户代码造成侵入性。

使用 fcapp-test.run 进行本地网页测试
由于中国大陆政策的影响,函数计算主域名无法在互联网为客户提供网站类型的业务,所有的函数请求结果将被转为下载行为。对于纯 API 类型的函数,我们认为将请求结果转为下载是没有影响的。但对于网站属性的函数,返回的 HTML 文本以及 JavaScript 代码强依赖浏览器的解释器才能正常展示。我们判断让开发者能够实时看到函数返回的页面是一个强诉求。
在生产场景,我们推荐客户为函数绑定已备案的域名来解决这个问题,而在测试环境有更加简洁的方案。在测试阶段可以临时通过测试域名fcapp-test.run以及添加本地的host解析绕过这个问题,请求结果将不会被转为下载行为,可以正常进行网页调试。
# 1. 从页面获取fcapp.run的域名
FC_DOMAIN='wordpress-xxxxx-serverlordpress-ydziwvakfn.cn-shenzhen.fcapp.run'
FC_TEST_DOMAIN=`echo ${FC_DOMAIN} | sed 's/fcapp.run/fcapp-test.run/g'`
echo "FC域名: ${FC_DOMAIN}"
echo "FC测试域名: ${FC_TEST_DOMAIN}"
# 2. 查询域名解析的IP
FC_IP=`ping ${FC_DOMAIN} -c 1 | HEAD -1 | awk '{print $3}' | sed 's/[():]//g'`
echo "FC IP: ${FC_IP}"
# 3. 修改host文件,将测试域名的本地解析指向fcapp.run的解析
# 如果没有权限需要手动加
sudo -- sh -c "printf '\n${FC_IP} ${FC_TEST_DOMAIN}\n' >> /etc/hosts"
cat /etc/hosts
# 4. 使用测试域名在浏览器访问函数
curl -v "${FC_TEST_DOMAIN}"
了解 TCP 协议以及HTTP协议的同学可以很容易地理解背后的技术细节。客户端在发起HTTP请求时,首先会通过域名解析查询到域名对应的IP地址,并发起TCP连接。接下来会通过建立的TCP连接,将HTTP Request报文发送至Server端。如果客户端直接向函数计算的Server发起TCP连接,并将可以与函数关联的域名发送至函数计算,那么函数计算就可以返回客户期望的内容。
函数计算在后端进行了处理,兼容了fcapp-test.run域名的访问,但并不提供权威DNS解析。客户只需要在本地进行Host配置或者使用自建的DNS服务器,将fcapp-test.run的域名解析至函数计算Server,就能够正常测试函数。该方案既满足了中国大陆法律法规的要求,又以极低的成本满足了客户调试页面的需求,极大地优化了客户在函数计算的研发体验。
使用函数计算运行 wordpress 官方镜像
通过以上的方案,函数计算支持客户在不修改任何业务代码的前提下迁移自己的REST应用。下面使用wordpress官方镜像进行说明。
前置条件
- 开通函数计算账号。
- 将 wordpress 镜像转存到阿里云容器镜像服务中。
- 创建或使用已有的 mysql 实例,并为wordpress服务初始化相应的账号以及数据库。如果使用阿里云RDS实例,请确保函数服务的VPC配置与RDS实例的VPC配置一致,且白名单配置正确。
创建相应的函数以及服务
使用wordpress官方镜像创建函数,并设置容器内监听端口为80。

注入数据库配置
修改函数配置,将mysql的数据库配置以环境变量的方式注入函数容器内。

无需备案,测试wordpress函数功能
查看创建的触发器分配的域名,按照上述文档配置,使用fcapp-test.run域名进行测试。


上线你的函数
对外提供网站类型服务只能通过已备案域名来实现。函数计算用户可以通过配置自定义域名的功能,将域名与函数进行绑定,使用自己的域名对外提供服务。同时也可以使用任意标准的网关类型的云产品或者开源产品,使用fcapp.run的内网域名上线你的函数。
小结
作为 Serverless 技术的标志性产品之一,函数计算长久以来专注于提升产品适用的场景。fcapp.run域名以及相关产品特性的引入,标志着函数计算在 REST 场景以及 Web 场景的很大一步。客户从此可以将 REST 应用零改造地部署在函数计算上,研发测试的体验以及正式上线的方案都做到了优秀。非常欢迎同学们使用函数计算,并提出宝贵的意见。
更多内容关注 Serverless 微信公众号(ID:serverlessdevs),汇集 Serverless 技术最全内容,定期举办 Serverless 活动、直播,用户最佳实践。
无需修改代码,用 fcapp.run 运行你的 REST 应用的更多相关文章
- vue webpack打包之后 重新修改配置文件接口API路径,无需修改代码后再打包
用vue-cli构建的项目通常是采用前后端分离的开发模式,也就是前端与后台完全分离,此时就需要将后台接口地址打包进项目中,但是有的时候需要修改接口地址,为了避免为了修改接口地址而进行修改代码后再重新打 ...
- webstorm编写react native,代码修改后,重新编译运行没有变化的问题
w我是拷贝一份react native代码到另一台电脑,发现修改代码运行之后不显示修改后的效果,即仍然与原来的效果一样,暂时不知道什么原因, 后来我运行了npm install 就可以了,不知道是不是 ...
- pycharm修改代码后第一次运行不生效解决
问题: 用pycharm每次修改代码后第一次运行还是原来的结果,运行第二次的时候才是修改后代码的结果 解决: 每次修改代码后保存一下即可解决
- 【C#】Visual Studio 2017 一边Debug,一边修改代码
好久没写C#了,最近在学习著名***工具 shadowsocks-windows 的源代码,想着可以边断点调试,边加上一些注释以方便理解,stackoverflow 和 msdn 随便翻了一下,竟发现 ...
- Java Agent初探——动态修改代码
用了一下午总算把java agent给跑通了,本篇文章记录一下具体的操作步骤,以免遗忘... 通过java agent可以动态修改代码(替换.修改类的定义),进行AOP. 目标: ? 1 为所有添加@ ...
- 自修改代码 on the fly 动态编译 即时编译 字节码
https://zh.wikipedia.org/wiki/自修改代码 自修改代码(Self-modifying code)是指程序在运行期间(Run time)修改自身指令.可能的用途有:病毒利用此 ...
- 《修改代码的艺术》【PDF】下载
<修改代码的艺术>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382309 内容简介 <修改代码的艺术>针对大型的. ...
- 51ak带你看MYSQL5.7源码3:修改代码实现你的第一个Mysql版本
从事DBA工作多年 MYSQL源码也是头一次接触 尝试记录下自己看MYSQL5.7源码的历程 目录: 51ak带你看MYSQL5.7源码1:main入口函数 51ak带你看MYSQL5.7源码2:编译 ...
- Python NLTK——代码重用,F5运行py文件cmd闪退,invalid syntax
打开IDLE,对代码进行保存(Ctrl+S)后,代码都是可以运行的. 但是打开文件就会弹出cmd并闪退,截了好几次图发现报的是Invalid syntax的错. 后来发现应该在IDLE中新建一个fil ...
- Entity Framework 6 Code First 系列:无需修改实体和配置-在MySql中使用和SqlServer一致的并发控制
无需修改实体和配置,在MySql中使用和SqlServer一致的并发控制.修改RowVersion类型不可取,修改为Timestamp更不可行.Sql Server的RowVersion生成一串唯一的 ...
随机推荐
- 开发工具使用:CubeMX、KEIL MDK-ARM
来源:成电<微机原理与嵌入式系统>漆强 第四章 STM32CubeMX软件的使用 来源:成电<微机原理与嵌入式系统>漆强 第五章 MDK-ARM软件的使用 一.STM32的Cu ...
- JPA动态注册多数据源
背景 目前已经是微服务的天下,但是随着业务需求的日益增长,部分应用还是出现了需要同时连接多个数据源操作数据的技术诉求. 需要对现有的技术架构进行优化升级,查阅了下网上的文章,基本都是照搬的同一篇文章, ...
- [ABC268G] Random Student ID
Problem Statement Takahashi Elementary School has $N$ new students. For $i = 1, 2, \ldots, N$, the n ...
- [ABC248G] GCD cost on the tree
Problem Statement You are given an undirected tree with $N$ vertices. Let us call the vertices Verte ...
- 34. 干货系列从零用Rust编写负载均衡及代理,异步测试在Rust中的实现
wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,四层TCP/UDP转发,七层负载均衡,内网穿透,后续将实现websocket代 ...
- ceph集群搭建详细教程(ceph-deploy)
ceph-deploy比较适合生产环境,不是用cephadm搭建.相对麻烦一些,但是并不难,细节把握好就行,只是命令多一些而已. 实验环境 服务器主机 public网段IP(对外服务) cluster ...
- pytest框架学习-前置和后置setup和teardown
前置和后置 (1)setup和teardown,方法级 写在类中 方法级,每个用例都会执行setup和teardown. 相当于setup_method和teardown_method (2)setu ...
- 查看电脑、手机中已保存的wifi密码
电脑: 以管理员身份运行CMD,执行 netsh wlan show profile netsh wlan export profile folder=C:\ key=clear 此时,用记事本打开对 ...
- Windows Server 2019/2016 配置自动更新和更换大陆更新服务器
文章原地址: 运行 > gpedit.msc -> 计算机配置 -> 管理模板 -> Windows 组件 -> Windows 更新 下面中右侧三个选项是本篇教程中会介 ...
- Android对接华为AI - 文本识别
准备工作 在开发应用前: 1.需要在AppGallery Connect中配置相关信息,包括:注册成为开发者和创建应用. 2.使用ML Kit云侧服务(端侧服务可不开通)需要开发者在AppGaller ...