狠狠撸

狠狠撸Share a Scribd company logo
从CI到CD,使用Docker技术实现每日
十次发布
王天青
首席架构师@麻袋理财
Agenda
? About Me
? About 麻袋理财
? 独角兽成功秘诀
? 思考及解决方法
? 敏捷基础架构
? 微服务,What, How, Why?
? 颁滨/颁顿
? 麻袋理财的实践
? 总结
About Me
? 南京大学计算机科学与技术系硕士。
? 资深Java程序员,2003年开始从事J2EE开发,从软件开发做到架构设计。
? 08年加入EMC中国研究院,最高担任云平台主任研究员,长期从事云计算
创新技术解决方案设计和实现。
? 2015年9月加入麻袋理财,任首席架构师
? 在工作期间,分别在中国和美国提交了20+专利申请,其中”Data
provenance in computing infrastructure [United States
8,700,678]”, “Lightweight appliance for content storage [United
States 9,165,009]”和”Analytics platform for automated diagnosis,
remediation, and proactive supportability [United States
9,313,091]”分别在在2014/4,2015/10和2016/4被美国专利局正式授
权。
www.madailicai.com
独角兽成功秘诀
独角兽们
成功秘诀
? Speed of innovation (天下武功,唯快不破)
? Always-available services (随时、随地可用)
? Web scale(从0到1,快速扩展)
? Mobile-centric user experiences (移动为王)
读物
Ten Deploys Per Day. Why Not?
一天十发,有何不可?
思考及解决方法
乱花渐欲迷人眼 & 冰山一角
软件
流程
工具
技术
组织
正本清源
ROI
速度
架构 模块化 服务化 微服务
Dev 领域模型 系统设计 接口设计
DevTest 接口测试 集成测试 系统测试
DevOps CI CD 自动化
质量
架构 高可用 高性能 高安全
Dev 编码规范 单元测试 代码评审
DevTest 自动化测试 分支覆盖率 测试覆盖率
DevOps 系统监控 应用监控 业务监控
业务驱动技术 技术推动业务
解决方案
? Cloud Native Application
? Cloud Native describes the patterns of high
performing organizations delivering software
faster, consistently and reliably at scale.
? Continuous delivery, DevOps, and
Microservices label the why, how and what of
the cloud natives.
Cloud Native的五个层面
微服务
(技术)
敏捷基础设施
(技术)
持续集成/
持续交付
(管理)
DevOps
(管理)
康威定律
(管理)
其他最佳实践
好处
更快的上线速度
细致的故障探测和
发现
故障时自动隔离
故障时自动恢复 方便的水平扩展
敏捷基础架构
支撑微服务的平台
VMware	ESX
Public Cloud
IDC
VPN
Private Cloud
Developer
Tester
DevOps
微服务
What, How, Why?
符合微服务规范 (12 Factor
App)
? 基准代码(Codebase):代码必须纳入配置库统一管理。
? 依赖(Dependencies):显式的声明对其他服务的依赖,比如通过Maven、Bundler、NPM等。
? 配置(Config):对于不同环境(开发/staging/生产等)的参数配置,是通过环境变量的方式进行注入。
? 后台服务(Backing services):对于DB、缓存等后台服务,是作为附加资源,可以独立的Bind/Unbind。
? 编译/发布/运行(Build、Release、Run):Build、Release、Run这三个阶段要清晰的定义和分开。
? 无状态进程(Processes):App的进程是无状态的,任何状态信息都存储到Backing services(DB,缓
存等)。
? 端口绑定(Port binding):App是自包含的,所有对外服务通过Port Binding暴露,比如通过Http。
? 并发(Concurrency):App可以水平的Scaling。
? 快速启动终止(Disposability):App进程可以被安全的、快速的关闭和重启。
? 环境一致性(Dev/prod parity):尽可能的保持开发、staging、线上环境的一致性。
? 日志(Logs):把日志作为事件流,不管理日志文件,通过一个集中的服务,由执行环境去收集、聚合、
索引、分析日志事件。
微服务核心关注点
? Distributed/versioned configuration – 配置中
心
? Service registration and discovery – 服务注册
/发现
? Routing – 路由
? Service-to-service calls – API调用
? Load balancing – 负载均衡
? Circuit Breaker – 容错
? Asynchronous – 异步
? Distributed messaging – 分布式消息
微服务好处
技术异构性 弹性 扩展
简化部署
与组织架构
匹配
可组合性
Spring Boot/Cloud
? All in one
? 全套!!!
Spring Boot
? Stand-alone Spring-based applications
? Tomcat embedded container (supports
Jetty & JBoss Undertow too)
? Starter POMs
? Annotation driven
? Java Configuration Beans
? http://start.spring.io/
Spring Cloud
? Microservice friendly
components:	
? Distributed	&	
versioned	
configuration	
? Service	discovery
? Load	Balancing
? Circuit	breakers
? Distributed	messaging
从颁滨到颁顿摆麻袋理财王天青闭惫1
颁滨/颁顿
CI/CD
Continuous Integration Continuous Delivery
自动化
自动化代码管理
自动化测试
自动化发布
自动化资源分配自动化安全检测
自动化监控
自动化故障处理
DevOps 八荣八耻
?以可配置为荣,以硬编码为耻 。
?以系统互备为荣,以系统单点为耻 。
?以随时可重启为荣,以不能迁移为耻 。
?以整体交付为荣,以部分交付为耻 。
?以无状态为荣,以有状态为耻 。
?以标准化为荣,以特殊化为耻 。
?以自动化工具为荣,以人肉操作为耻 。
?以无人值守为荣,以人工介入为耻 。
麻袋理财的实践
方法与工具(麻袋理财实践版)
开发 测试 运维
CI/CD
Jenkins + Docker
Git-flow
Gitlab
Code Analysis
Sonar
Issues/Milestones/Wiki
Gitlab
Team Collaboration
Teambition
Status/Perf Monitoring
Nagios/Zabbix
Log Monitoring
ELK
Running Env
Cloud+Docker
Deploy/Config Automation
Ansible/Bash Scripts
APM
ELK
UI测试
Selenium/Appium
接口测试
Robot/Sniper
性能测试
Jmeter/LoadRunner
功能测试
Manual*
业务架构
基础架构
基础服务层 DisConf Dubbo
基础业务服务 支付 帐务 合同 短信 客户征信
业务服务 审批 电销 网销 催收
拆分原则
? 单一职责:每一个模块(服务)只做一件事情
? 项目粒度:每一个可以单独进程跑的项目拆分为
一个单独的项目
? 代码与配置分离:Build	->	Release	->	Run
代码管理
? 使用Git
? 使用Git flow
接口管理: Swagger
代码质量管理: SonarQube
CI: Jenkins + Docker
? Commit code to Gitlab
? Gitlab触发Jenkins任务
? Jenkins任务启动Maven基础镜像进行:
? Build
? Unit Test (集成Sonar)
? Deploy: 发布snapshot版本到本地Maven仓库
? Jenkins回调Gitlab, 将结果反馈
CD: Jenkins + Docker
? Merge request (Dev to UAT) at Gitlab
? Gitlab触发Jenkins任务
? Jenkins任务启动Maven基础镜像进行:
? Build
? Deploy: 发布RC版本到本地Maven仓库
? Jenkins触发下一个构建镜像的任务
? 基于Dockerfile构建Docker镜像
? 推送镜像到Harbor仓库
? 在UAT服务器上启动镜像
? 进行端到端的自动化测试(如果有)
? Jenkins回调Gitlab, 将结果反馈
编排-Docker Compose
? 配置
? 支持环境变量的方式配置应用参数。利用docker-compose将所有的配置单独
的保存在一个git仓库中。
? 配置复用
? 由于各个项目启动参数,配置项存在相同的部分和不同的部分,因此可以利用
docker-compose的override的特性实现配置的复用。例如 docker-compose
-f docker-compose.yml -f docker-compose.sit.yml -f docker-
compose.sit.project.yml up –d
? 容器启动的参数,如log driver/Volume/Network等的配置可以放在docker-
compose.yml中,部署环境相关的内容放在docker-compose.sit.yml,特定
项目的配置放在docker-compose.sit.project.yml中,多个yml中配置项相同
的,越往后的优先级越高。
集群管理(厂飞补谤尘+厂丑颈辫测补谤诲)
Docker Registry: Harbor
? An	open	source	enterprise-class	registry	server.	
? Apache	2	license.
? https://github.com/vmware/harbor/
灰度发布
应用停止处理新请
求(管理接口)
更新Nginx配置
(切流量)
等待应用处理完当
前请求
停止当前容器(管
理接口+Docker命
令)
启动新版本容器
灰度验证(基于IP
或者Header)
更新Nginx配置
(切流量)
更新其余容器
更新Nginx配置
(恢复配置)
总结
? 微服务化:
? 模块化->服务化->Docker化
? 充分的单元测试,接口测试,集成测试
? 一切都要自动化
? CI
? CD
感谢

More Related Content

从颁滨到颁顿摆麻袋理财王天青闭惫1