介绍 & 实践
Zhang Yuchen
不仅写代码也运维自己的产品
关心微服务
容器化
喜欢 DevOps 文化
未知的太多,努力学习
Programmer
适合部署在云平台上,方便节省系统管理资源
与操作系统解耦,提供最大的可移植性
标准化且清晰的流程配置,降低新人的学习成本
降低环境差异,并且使用持续交付实施敏捷开发
不发生巨大改变的情况下,实现扩展
更频繁的发布
稳定
易维护、易运营
灵活、简单
学习成本低
消除人员隔阂
知识与沟通
DevOps 是精益准则的实现
DevOps 关心 IT 价值流
价值流驱动我们开发软件、提供服务
统一的价值流,让我们重新团结在一起
忘掉 Title,为产品服务
git: notification-publisher
git: notification-publisher-deploy
prod
staging
...
env
MY_ITEMS_HOST: https://api.host-to-dest.com
API_VERSION: v2
SERVER_USE_FORWARD_HEADERS: true
一个应用,一份代码
一份代码,多份部署
后端服务作为附加资源
通过端口绑定服务,你也是资源
mysql://host/db
smtp://auth@host
s3://host/bucket
http://host.com
本地与远程环境没有明显区别
服务配置写在 Config 中
在开发中方便被替换使用
通过端口暴露服务
服务就是资源
app 1
app 2
...
ADD Rakefile /commsetting/Rakefile
ADD live_version.yml /commsetting/live_version.yml
CMD /commsetting/script/start_server.sh
EXPOSE 80
LOG_USER_SERVICE=http://for/bar
RESPONSYS_IDENTITY_FILE=./file_path
S3_BUCKET_NAME=bucket name here
REDIS_SERVER=redis://iamredis:6379
PREFERENCE_SNS_TOPIC=arn:aws:sns:xxxxxxx
无状态
使用文件系统共享数据
使用 S3 保存文件
将状态保存在数据库
在 Redis 中存储 Session
不恰当在内存中保存
进程相互依赖
无共享
应用程序在处理中应该创建与消费短暂的状态,并且在 response 中返回所有数据
使用后端服务保存状态,没人希望数据库是无状态的。
共享数据的进程是脆弱的,并且危险的。进程创建、消亡,易于回收,方便扩展。
无共享进程是扩展的基础,可以避免串联式的错误
Code
--------
-----------
Unit Test
Code Quality
Style Check
Integration
Package
.....
Product
Config
Release
V1 V2
...
Pick a release
What about rollback?
我们希望 Build 更加复杂,包含很多步骤,因为错误可以立刻展现,方便开发人员妥善处理。
Release 最重要的是配置与 Build 产物的绑定。因为三个月前的代码是不能和现在的配置一起工作的。
Run 却要简单,包含更少的模块,最好自动化,方便部署人员处理。同时,一旦出现问题,可以简单回退。
使用等价的环境,我们可以开发、管理十多个服务……
数周
几小时
不同的人
不同的环境
一群人
类似的环境
redis:
extends:
file: docker-compose-common.yml
service: redis
setting_db:
extends:
file: docker-compose-common.yml
service: postgres
comm_setting_api:
extends:
file: docker-compose-common.yml
service: _base
command: bash -c "script/start_server.sh"
ports:
- "8080:80"
links:
- setting_db
- redis
Cache
DB
API
$(docker_compose_run) bundle exec rake prepush ⁉️
5 Dev, 1 QA, 1 Ops
改动上线?数分钟
在某应用的开发中,超过 190 次部署
Thanks!