无需修改代码,用 fcapp.run 运行你的 REST 应用

Posted Serverless

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无需修改代码,用 fcapp.run 运行你的 REST 应用相关的知识,希望对你有一定的参考价值。

作者 | 阿里云 Serverless 技术研发 落语


背景

阿里云​​函数计算产品​​能力,支持用户使用 HTTP 协议进行函数调用。函数计算后端通过一个共享的 APIServer 组件对所有客户提供响应 HTTP 触发器调用的服务,需要依赖 URL 中的 Path 将客户流量路由到客户的函数容器内部。容器内收到的 HTTP 请求 Path 会带有函数计算的路由标识,如果客户在函数计算部署 REST 风格的应用,那么就会遇见 404 问题。

无需修改代码,用

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

无需修改代码,用

函数计算在近两年引入了​​Custom 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官方镜像进行说明。

前置条件

  1. 开通函数计算账号。
  2. 将 wordpress 镜像转存到阿里云容器镜像服务中。
  3. 创建或使用已有的 mysql 实例,并为wordpress服务初始化相应的账号以及数据库。如果使用阿里云RDS实例,请确保函数服务的VPC配置与RDS实例的VPC配置一致,且白名单配置正确。

创建相应的函数以及服务

使用wordpress官方镜像创建函数,并设置容器内监听端口为80。

无需修改代码,用

注入数据库配置

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

无需修改代码,用

无需备案,测试wordpress函数功能

查看创建的触发器​​分配的域名​​,按照上述文档配置,使用fcapp-test.run域名进行测试。

无需修改代码,用无需修改代码,用

上线你的函数

对外提供网站类型服务只能通过已备案域名来实现。函数计算用户可以通过​​配置自定义域名​​的功能,将域名与函数进行绑定,使用自己的域名对外提供服务。同时也可以使用任意标准的网关类型的云产品或者开源产品,使用fcapp.run的内网域名上线你的函数。

小结

作为 Serverless 技术的标志性产品之一,函数计算长久以来专注于提升产品适用的场景。fcapp.run域名以及相关产品特性的引入,标志着函数计算在 REST 场景以及 Web 场景的很大一步。客户从此可以将 REST 应用零改造地部署在函数计算上,研发测试的体验以及正式上线的方案都做到了优秀。非常欢迎同学们使用函数计算,并提出宝贵的意见。

以上是关于无需修改代码,用 fcapp.run 运行你的 REST 应用的主要内容,如果未能解决你的问题,请参考以下文章

windows下怎么安装pygraphviz?请各位帮帮忙

R-无需打开文本编辑器即可连接到文本文件

什么是好代码?怎么写好代码?

R语言运行太慢怎么办?这几招大幅提升你的运行速度!

R语言中如何更改R包安装路径

vue webpack打包之后 重新修改配置文件接口API路径,无需修改代码后再打包