likes
comments
collection
share

Go Cloud Function搭建自己的云函数服务

作者站长头像
站长
· 阅读数 24

虽然晚了3年,但是我还是想到了解决办法。早在20年的时候,我们遇到一个问题 - 动态业务网关。作为一个前端,我们经常需要对接很多业务接口,而在DDD驱动架构设计的系统下,业务中间层会变得很薄,很纯粹,那就是拼接业务。而对于后端,技术含量很低,无非就是调上游接口拼接业务,对于下游就是转换为适合的数据吐出。当然我们也可以基于Nodejs或者其它技术去解决这个问题。但是我们的初衷是希望这一过程尽可能的简单,高效,动态化同时降低技术门槛。

背景

期初我们就想到了云函数的方式来解决这个问题,公司内部也有对应的Serverless系统,但是由于部门属于一个新的领域新的业务。导致一些上游服务接入困难。而Serverless本身的定位是面向轻量业务。而B端的业务总是很复杂,因此并不适合。

我们有一个Nodejs服务,但是由于历史原因,之前的开发人员挖了很大一个坑,我填了很久依然没有解决,而且团队对于Nodejs的技术储备也非常薄弱。也没办法去支撑这么庞大的业务中间层需求迭代。并且基建设施短期内也建设不起来。远水解不了近渴,只能放弃继续使用Nodejs的想法。

Graphql也是一个非常好的选择,但是面对B端系统的复杂业务逻辑,Graphql的表现并不如文档说的那么好,复杂的Schema是非常让人恼火的。从成本和技术复杂度来讲并没有直接使用Nodejs好哪去。

问题 & 困惑 

寻找一种可以快速接入现有基础设施,并且通过JS语言脚本编写数据拼接逻辑即可生成API接口的需求迎刃而出。为什么是这种方式呢?

如何去实现这一系统呢?这一直困扰了我很久直到有一天,新公司在搞端内动态化,于是开始了解端内动态化的技术方案。恍然大悟,为什么不能将端内动态化方案使用于后端呢?

端内动态化,就是利用JS引擎,执行一些下发的JS脚本来控制逻辑,并且通过Bridge打通端内原生的能力,可选的JS引起包括Quickjs,JSCore等等。典型的例子就是RN

Go Cloud Function搭建自己的云函数服务

而端内集成的引擎也都是C语言开发的,而Golang很容易集成C语言模块。对比几个JS引擎后,为了快速验证想法,选择了Quickjs为JS引起,原因很简单,就是集成难度低。但是带来的问题也比较多,比如启动慢,内部报错排查困难,内存管理复杂等等,不过可以暂时忽略。

GoCF 一个云函数引擎

基于现有客户端动态化的技术方案,快速设计一套可以应用于后端的动态化方案:

Go Cloud Function搭建自己的云函数服务

基于业务聚合层,通过使用底层Koa的插件化扩展能力快速集成现有的基础设施中间件,并通过Quickjs的作为一个JS的虚拟机。由后端实现通过插件化能力将Golang的逻辑暴露给JS层使用,从而快速接入底层Domain服务,解放JS只关注与数据的处理逻辑,降低使用门槛,让前端的接入更加简单。

GoCF的使用

GoCF提供了mapi接口,开发者可以通过mapi/script接口将js代码推送到GoCF内部,并根据path字段自动生成api接口,接口需要前缀加上api。

  # Request
  curl --location 'localhost:8000/mapi/scripts' \
  --header 'Content-Type: application/json' \
  --data '{
      "files":[
          {
              "path": "api/get.a.js", // api标识这是一个api。get标识方法,a是api名字。
              "script": "export default async function exec() {return {error: false, data: '\''Hello World'\''};};" // 脚本内容
          }
      ]
  }'
  # Response
  {
    "error": false,
    "msg": "",
    "data":"Sucess"
  }
  • 目前的GoCF中mapi是没有权限模块的,所以需要自行改造。可以通过ryouaki/koa的中间件去扩展。

推送成功后,会自动生成/api/a接口,返回值就是推送的script的exec函数的返回值。默认需要error字段和data字段:

  # Request
  curl --location 'localhost:8000/api/a'
  
  # Response
  {
    "data": "Hello World",
    "error": false
  }

总结

GoCF只是一个云函数引擎,并不具备直接支持线上业务的能力,所以还有很多东西需要建设,比如权限,比如http请求,比如grpc请求,比如日志,监控。但是GoCF验证了端动态化在后端业务网关落地的可行性。给业务网关动态化带来了一个新思路。

项目地址:Golang Cloud Function

转载自:https://juejin.cn/post/7206237639326089272
评论
请登录