乐趣区

关于serverless:阿里云函数计算MidwayEggLayer二探

TL;DR

「五」更乏味一点

一、概念梳理

  1. 前情提要,@midway/faas 是原生 serverless 模式的开发,然而目前还在演变中,集体的应用体验是离成熟还挺远
  2. 我想要的是 @midway 的语法糖,和原生 serverless
  3. deployType: egg 从外观上看满足了这个要求

二、锁版本

# dep
@midwayjs/cli@1.2.32
@midwayjs/decorator@2.4.7
@midwayjs/web@2.5.4
egg@2.29.1
egg-scripts@2.13.0
egg-view-nunjucks@2.2.0

# devDep
@midwayjs/egg-ts-helper@1.0.4

# 局部不影响本文但确是外围的依赖并没有列出来

三、提供接口

  1. 规范 egg 利用目录构造,没有特地的,把你的旧代码复制过去就能用
src/
  app/
    controller/
      api.ts
  config/
    config.default.ts

# app/controller/api.ts
@Provide()
@Controller('/')
export class ApiController {@Inject()
  ctx: Context;

  @Inject()
  dataService: DataService;
  
  @Get('/api/fetch-data')
  async fetchData(@Query('pn') pageNo: number=1, @Query('ps') pageSize: number=10) {const { page, data} = await this.dataService.fetchData(pageNo, pageSize);
    return {code: 0, message: 'ok', page, data};
  }
}
  1. package.json 要害配置:要指定 framework@midway/web
"scripts": {
  "start": "egg-scripts start --title=bilibili --framework=@midwayjs/web --env=prod",
  "dev": "cross-env ets && cross-env NODE_ENV=local midway-bin dev --ts"
},
"egg": {"framework": "@midwayjs/web"},
  1. package.json 要害配置:ts 要手动构建,这里把钩子设在了生命周期的公布前阶段
"midway-integration": {
  "lifecycle": {"before:package:cleanup": "npm run build"}
},
  1. f.yml 要害配置:deployType: egg
  2. f.yml 要害配置:能够按前缀将一类申请都指向这个服务
functions:
  myservicename:
    runtime: nodejs12
    handler: index.handler
    events:
      - http:
          path: /api/*
    environment:
      FORCE_COLOR: 0

四、提供动态资源

  1. 和三实际上是一样的,这就是 deployType: egg 美好之处,能够了解为后端真的起了一个 egg 利用,而不是像 faas 模式那样封装了一个长得很像 egg 的货色
# f.yml 概念代码,理论配置参考三
functions:
events:
- http:
  /api/*
  /public/*

五、那这不就是一般的 egg 吗,套娃了?

  1. 最近反微服务反中台的论调又多了起来,我司执行微服务(伪)中台(伪)也挺久了,最直观的感觉就是,对微服务种种的不称心,解决方案都是还不够微,粒度还是太粗了
  2. 老板说前端要千人千面,千是个虚指,翻译过去实际上是 2 亿人 2 亿面,仿佛很有情理无奈反驳,然而后端就区区 300 个利用就开始闹合并了,什么 SOLID / DRY 都来了,为啥呀
  3. 很多探讨 serverless 的文章都说是为了节俭估算,而后反驳的文章都说实际上没有节俭估算,300 个利用换成 300 个 serverless 当然不省估算,然而 2 亿个呢
  4. Serverless 是一种思维状态,它能让你更专一于解决眼前的问题,而不被原有代码影响,因为这里只有以后的代码,没有其它代码
  5. 解决需要变更的最好的形式,就是按需要免费,来一个需要做一套「零碎」,而后等那些没有流量的「零碎」天然淘汰

  1. 抉择 traefik 的起因是它自带的 docker 模式很好用
  2. 抉择 envoy 而不是 nginx 的起因是看上去前者应该就是将来了
  3. 终端客户认为本人购买了一个产品的四种性能,但实际上这四个性能是由四个独立团队别离开发的

六、为什么 serverless 这个事件是前端的同学比拟上心

  1. 因为前端长年以来就是以「需要」为粒度开发的,「npm」的体量和品质就是很好的阐明,正是因为有很多低质量的包,才阐明这是一个沉闷的市场;而且那些低质量的包,很有可能在某个场景粒度是性价比最好的
  2. serverless 岂但能够让前端疾速地响应客户的需要,也能够让中台更疾速地响应前端的需要
  3. 甲方爸爸永远是对的,服务数量指数式激增管不了是乙方本人的问题

七、一些小技巧

  1. 同时开 n 个我的项目,node_modules 真的很占空间,所以必须要上 lerna
# 目录构造
packages/
  appa/
    package.json
    f.yml -> service: myappname, function: appa, path: /a/*
  appb/
    package.json
    f.yml -> service: myappname, function: appb, path: /b/*
lerna.json

# 在根目录执行
$ lerna run dev --scope appa --stream
$ lerna run deploy --scope appa --stream
  1. 阿里云函数计算的日志是以 service 为单位的,所以上述多个 package 子利用的日志局部配置必须统一,否则会相互笼罩
# f.yaml
service:
  name: myappname

provider:
  name: aliyun
  logConfig:
    project: myprojectname
    logstore: myappname

参考文献:

  1. Egg/Midway 利用迁徙
  2. Serverless 是一种思维状态

系列文章:
阿里云函数计算(Midway FaaS)一探
阿里云函数计算(@Midway/Egg-Layer)二探

退出移动版