zkcrescent 的木屋

Heroku

Heroku

美国的一家做PaaS的公司,产品很有特色,初次接触的人会容易被它提供服务的特点惊艳到 (:зゝ∠)

特点 + 新颖点

登录

和传统的CLI登录方式有所区别的是,当使用 heroku cli 登录时,会弹出浏览器窗口直接点击即可登录,很有特色

DataClips(挺有用的)

可以通过共享Query方式实现共享你在heroku中的存储数据(各种 stroe add-on)

Dynos (测力计)

heroku 中,app 对应的一个容器集合叫做 dynos, 管理 APP 的runtime,容器资源限制也是从 dynos 中控制的, heroku 提供了6个标准的 dynos 类型,规定了基本的配置, 中间有几个指标比较在意

  1. preboot
  2. Number of process types
  3. Language runtime metric
  4. 没有确切CPU多少的说明,文档中有规格大概是2:5X(1C)免费的是1x-4x
  5. 企业专用 dynos 提供 auto scaling

水平扩展增加数量,垂直伸展换配置

auto scaling: p95 Response Time: 过去一小时内百分之95的请求平均时间,周期触发,最小一分钟,触发如果超过水位线,将会调度或者杀掉一个实例

stack

执行的 os base image,可以指定为标准 stack: heroku-16 heroku-18(ubuntu 16.04 ubuntu 16.08),其他为container

heroku.yaml

定义 Docker image 如何编译,以及启动方式,需要配置你的 stackcontainer,可以在build中配置config的值设置Dockerfile中的ARG字段,可以配置多target,同时配置 release 的类型对应哪个target

setup

通过 heroku.yaml.setup 可以直接布置一个你的初始应用状态,包括 addonsconfig var(这个用来干嘛的没看到)

Build Packs

keroku 提供官方的标准 buildpack,可以配置相关的参数,比如 golang 中的 CGO_LDFALGS 什么的,如果不添加任何 buildpack 配置,将会使用默认的检测工具检查代码属于什么语言类型,找到对应的编译语言后使用官方标准编译相关代码,默认官方提供的 buildpacklatest,如果要使用某个固定版本的,需要直接指定对应的 buildpack full url(仓库地址), 编译使用的base image 为 STACK

一个 app 可以指定多个 buildpack: heroku buildpacks:add --index 1 heroku/go

支持三方 buildpack ,通过官方提供的 buildpack 平台查找或者使用某个符合 heroku buildpack 规则的 git 仓库可以指定需要使用的三方 buildpack,支持仓库的 tag 或者 branch 指定某个 buildpack 的版本

buildpack 指定三个的 script

  • bin/detect: 校验编译准备的合法性,比如是否存在什么东西,什么变量
  • bin/compile: 执行一些前期准备之类的东西
  • bin/release: 提供 meta 信息用于执行期

bin/detect BUILD_DIR

脚本执行必须返回 0 才算作成功,同时从 stdout 应当输出明确的 framwork 名称

bin/compile BUILD_DIR CACHE_DIR ENV_DIR

实际编译过程,BUILD_DIR 是 app 编译目录, CACHE_DIR 是缓存或者长线编译过程中的中间产物,每次编译都会用到这些东西, ENV_DIR 包含了应用的配置变量,可以通过 Profile 将其内容转变为 env 变量,ENV_DIR 中一个文件的文件名是变量名,文件内容是变量的值, 标准 env 仅提供 STACKSOURCE_VERSION 两个基本信息,应当在任何主要步骤执行前明确的使用 -----> 6-char arrow 显示执行的步骤

bin/release BUILD_DIR

两个字段:

  • addons: []string, 需要添加的addon(会在app之前完成)
  • default_process_types: 默认的 Procfile 入口,比如: web: bin/node server.js 当然也可以写Procfile指定而不写这个

Procfile

主目录下的名为 Procfile 的文件,定义应用类型以及对应的执行入口

.profile.d/.profile

开始release之前会通过一个 bash shell soruce .profile.d/*.sh 执行所有的shell 文件, 然后执行 .profile 文件