1. 背景
- 个人经历:10 年+后台研发经验、电商\在线教育、海购电商平台从 0 到 1 落地、Gearbest 出口电商平台 SOA 重构、腾讯课堂帐号\房间消息\计费结算等系统架构重构和演进、百万 TPS\千万级用户\亿级 PV ,系统性能优化\稳定性保障\扩展性设计…
- 技术栈演进:五洲会\GB - 基础设施升级、PHP 转 GO)、单体 →SOA→ 微服务 → 云原生、技术债务治理、持续系统演进等、基于 Go 落地微服务架构最佳实践
- 系统的架构设计资源学习:陈皓-左耳听风、王启军-《持续的云原生演进》、李运华 - 《从 0 开始学架构》、陈皓 - 《左耳听风》、周志明老师 - 《凤凰架构》、BytebyteGo、DDD 等系列课程
- 业务调整:CSIG 教育线业务变动,当下有时间系统梳理下自己对云原生微服务架构、个人职业发展的理解
2. 思考架构设计的本质
- 架构设计本质:解决软件复杂度
- 分析软件需求,识别软件复杂度,遵循设计原则,结合业务\团队\技术实况,做架构 TradeOff 设计,以及跟进落地
- 软件设计开发复杂度十个个来源(下篇展开讲解):
- 十个软件复杂度来源:高性能、高可用、可扩展、一致性、易维护性、安全性、规模、低成本、协同、技术债务
- 如何避偶然复杂度:系统全面的洞察业务需求、识别软件复杂度来源、简单和清晰设计、分层和模块化设计、不过度设计、代码和注释、最佳实践、UT、及早&持续集成 CICD、自动化
- 架构设计原则:简单、合适、演化原则
- 架构师到方案一直在做 TradeOff 设计
- 以终为始,回归业务驱动技术发展
- 个人成长发展依赖于业务,选业务才是王道
3. 腾讯课堂微服务架构设计概览
微服务包含内容比较多,可以按图中各块分治处理,每块算是比较独立;
在微服务跑起来后,蓝色的区域部分应该尽可能的标准化,让研发聚焦于红色的业务域内
- 微服务架构优势和问题
- 优势:性能\扩展-弹力\维护\分治\并行开发
- 问题:学习成本高(复杂\系统\需要实践理解)、治理和维护成本
- 不可变基础实施要求:容器化管理平台(STKE、K8s、docker、镜像仓库)
- 基础框架&服务支持:RPC 框架、Rainbow\Apollo 配置中心、Polaris 名字服务注册\发现\路由\容错
- 微服务分治:微服务 DDD 领域驱动设计
- 微服务布局:Go-DDD-Layout
- CICD 持续集成和部署:Coding\智研平台
- CI 过程: 分支合并\编译构建\镜像打包推送
- CD 过程: 可用区\集群负载\Pod 资源\服务镜像版本\容器编排、安全起停\健康检查\服务注册、HPA 弹性扩缩容、监控告警
- 分布式中间件:Redis\Kafka\ElasticSearch、分布式任务定时调度器、分布式 UID 发号器
- 分布式存储:MySQL\PostgreSQL、MongoDB\HBase\Cassandra、TDSQL\TiDB、Clickhouse、COS 分布式文件存储
- 服务网关:负责负载均衡、协议转换、认证鉴权、安全防护、链路 ID 生成等,例如 Nginx、Kong\Gin\Echo 等
- 全链路追踪:日志 Log\追踪 Trace\度量 Metric,Grafana\Promethous\ELK
4. 研发标准规范和团队文化氛围
参考之前写的有关研发标准规范文章: 腾讯课堂后台研发流程与规范
- 软件工程流程标准(研发流程标准规范文档)
- 团队文化
- 公开透明\学习型\扁平\注重效率\量化指标至死
- 优秀的领导者(从领导看团队风格)
5. 对复杂业务系统思考
参考之前写的 DDD 文章: 基于 DDD 落地 Go 微服务开发总结
- 领域建模:需求分析、业务域划分、核心要素提取、领域服务提炼
- 服务落地:基于 DDD-Layout 进行代码布局,统一微服务代码风格
6. 对技术债务思考
参考之前写的有关技术债务应对文章: How to Deal With Technial Debt - 如何应对技术债务(总结)
- 债务现象:系统、团队、个人 系统难维护和扩展,系统内部运转偏黑盒,系统脆弱不稳定,需求研发和问题解决耗时耗时长,研发加班改 Bug,幸福感很低
- 债务成因:
- 业务发展过程中,缺乏对技术方案合理性的管控,加上时间排期压力,很多不合理方案凑合上线
- 研发过程缺乏统一研发标准,研发过程个凭本事,加上人员交替,很容易就导致债务积压架构腐化,形成上述债务现象
- 针对腐化架构、代码,缺乏系统治理,小修小改需求迭代,最终导致系统脆弱不堪,问题频发
- 如何应对: 从管理者(团队)、研发两方面着手
- 重视技术方案设计评审、老板\时间倒排需求权衡(管控老板预期)
- 拟定研发标准、方案 Review、代码 CR
- 搭配需求,小批量重构,及时清理债务
- 完善基础实施、自动化测试,提升重构信心
- 定期系统架构检测,识别坏味道,专项治理,提升软件架构和质量
- 研发吃自己的狗粮,对交付质量负责
7. 对个人职业发展和成长的思考
- 工作职业规划
- 业务现状和未来前景可能(包含业务稳定性)
- 决策时机(智信仁勇严),有勇无谋 vs 有谋无勇,君子不立危墙之下
- 人脉重要性
- 当下社会变化太快,高瞻远瞩很难,必须积极拥抱变化 - 徐远观察
- 个人生活、学习、成长
- 人生原则: 你自己想要什么样的人生
- 终身学习、积极主动、高效学习:
- 提升信息的获取质量和密度
- 扩充信息来源渠道
- 学会淡然和释怀
- 为认知买单和觉醒(有人带\没人带、乔总\吴军-人都在为认知买单)
- 有人带\没人带区别
- 付费是最廉价的知识来源渠道
- 多读书、多输出
8. 总结
通过自己 10 年以上后台一线研经验以及在腾讯课堂、环球期间多年对微服务的实践和理解,结合各类云原生\微服务\架构设计和计算机等知识的系统学习,例如(王启军 -《持续的云原生演进》、极客时间李运华 - 《从 0 开始学架构》、陈皓 - 《左耳听风》、周志明老师 - 《凤凰架构》、BytebyteGo、DDD 等系列课程),趁着这段”相对空闲”的时间,希望将自己对云原生架构理解通透的写出来,做个系统的大纲总结,也自己的理解能对做架构设计的同学有一些帮助
- 结合自己的经验,谈了对架构设计本质的理解,简要介绍了腾讯课堂的技术架构,以及软件设计和开发过程中十个复杂度来源,并对这些复杂度来源进一步展开讲解;
- 接着简述了面对复杂业务系统时候,我们应该如何领域建模和落地,以及如何应对技术债务问题
- 接着再讨论了研发流程标准规范,以腾讯课堂为例展开了讲解
- 最后讨论了团队文化,以及对个人职业发展和成长的思考
碎碎念了很多内容,有的没有结合具体案例深入展开来讲,后续有机会再完善吧! 另外,下篇主要围绕设计研发过程中的十个复杂度来源进行系统的复盘,希望尽快总结完吧!