TL;DR
「五」更乏味一点
一、概念梳理
- 前情提要,
@midway/faas
是原生serverless
模式的开发,然而目前还在演变中,集体的应用体验是离成熟还挺远 - 我想要的是
@midway
的语法糖,和原生serverless
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
# 局部不影响本文但确是外围的依赖并没有列出来
三、提供接口
- 规范
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};
}
}
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"},
package.json
要害配置:ts
要手动构建,这里把钩子设在了生命周期的公布前阶段
"midway-integration": {
"lifecycle": {"before:package:cleanup": "npm run build"}
},
f.yml
要害配置:deployType: egg
f.yml
要害配置:能够按前缀将一类申请都指向这个服务
functions:
myservicename:
runtime: nodejs12
handler: index.handler
events:
- http:
path: /api/*
environment:
FORCE_COLOR: 0
四、提供动态资源
- 和三实际上是一样的,这就是
deployType: egg
美好之处,能够了解为后端真的起了一个egg
利用,而不是像faas
模式那样封装了一个长得很像egg
的货色
# f.yml 概念代码,理论配置参考三
functions:
events:
- http:
/api/*
/public/*
五、那这不就是一般的 egg
吗,套娃了?
- 最近反微服务反中台的论调又多了起来,我司执行微服务(伪)中台(伪)也挺久了,最直观的感觉就是,对微服务种种的不称心,解决方案都是还不够微,粒度还是太粗了
- 老板说前端要千人千面,千是个虚指,翻译过去实际上是 2 亿人 2 亿面,仿佛很有情理无奈反驳,然而后端就区区 300 个利用就开始闹合并了,什么
SOLID / DRY
都来了,为啥呀 - 很多探讨
serverless
的文章都说是为了节俭估算,而后反驳的文章都说实际上没有节俭估算,300 个利用换成 300 个serverless
当然不省估算,然而 2 亿个呢 - Serverless 是一种思维状态,它能让你更专一于解决眼前的问题,而不被原有代码影响,因为这里只有以后的代码,没有其它代码
- 解决需要变更的最好的形式,就是按需要免费,来一个需要做一套「零碎」,而后等那些没有流量的「零碎」天然淘汰
- 抉择
traefik
的起因是它自带的docker
模式很好用 - 抉择
envoy
而不是nginx
的起因是看上去前者应该就是将来了 - 终端客户认为本人购买了一个产品的四种性能,但实际上这四个性能是由四个独立团队别离开发的
六、为什么 serverless
这个事件是前端的同学比拟上心
- 因为前端长年以来就是以「需要」为粒度开发的,「npm」的体量和品质就是很好的阐明,正是因为有很多低质量的包,才阐明这是一个沉闷的市场;而且那些低质量的包,很有可能在某个场景粒度是性价比最好的
serverless
岂但能够让前端疾速地响应客户的需要,也能够让中台更疾速地响应前端的需要- 甲方爸爸永远是对的,服务数量指数式激增管不了是乙方本人的问题
七、一些小技巧
- 同时开 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
- 阿里云函数计算的日志是以
service
为单位的,所以上述多个package
子利用的日志局部配置必须统一,否则会相互笼罩
# f.yaml
service:
name: myappname
provider:
name: aliyun
logConfig:
project: myprojectname
logstore: myappname
参考文献:
- Egg/Midway 利用迁徙
- Serverless 是一种思维状态
系列文章:
阿里云函数计算(Midway FaaS)一探
阿里云函数计算(@Midway/Egg-Layer)二探