对微服务架构设计思考总结(腾讯课堂) - 上篇

AI 摘要: 本文总结了作者的技术架构设计思考和个人职业发展思考,包括架构设计的本质、微服务架构设计概览、研发标准规范和团队文化氛围、复杂业务系统领域驱动设计、对技术债务的思考以及个人职业发展和成长等方面。作者指出了架构设计的重要性,以及应对复杂业务和技术债务的方法。并强调了个人的学习和成长,以及拥抱变化和为认知买单的重要性。

1. 背景

  1. 个人经历:10 年+后台研发经验、电商\在线教育、海购电商平台从 0 到 1 落地、Gearbest 出口电商平台 SOA 重构、腾讯课堂帐号\房间消息\计费结算等系统架构重构和演进、百万 TPS\千万级用户\亿级 PV ,系统性能优化\稳定性保障\扩展性设计…
  2. 技术栈演进:五洲会\GB - 基础设施升级、PHP 转 GO)、单体 →SOA→ 微服务 → 云原生、技术债务治理、持续系统演进等、基于 Go 落地微服务架构最佳实践
  3. 系统的架构设计资源学习:陈皓-左耳听风、王启军-《持续的云原生演进》、李运华 - 《从 0 开始学架构》、陈皓 - 《左耳听风》、周志明老师 - 《凤凰架构》、BytebyteGo、DDD 等系列课程
  4. 业务调整:CSIG 教育线业务变动,当下有时间系统梳理下自己对云原生微服务架构、个人职业发展的理解

2. 思考架构设计的本质

  1. 架构设计本质:解决软件复杂度
    • 分析软件需求,识别软件复杂度,遵循设计原则,结合业务\团队\技术实况,做架构 TradeOff 设计,以及跟进落地
  2. 软件设计开发复杂度十个个来源下篇展开讲解):
    • 十个软件复杂度来源:高性能、高可用、可扩展、一致性、易维护性、安全性、规模、低成本、协同、技术债务
    • 如何避偶然复杂度:系统全面的洞察业务需求、识别软件复杂度来源、简单和清晰设计、分层和模块化设计、不过度设计、代码和注释、最佳实践、UT、及早&持续集成 CICD、自动化
  3. 架构设计原则:简单、合适、演化原则
  4. 架构师到方案一直在做 TradeOff 设计
  5. 以终为始,回归业务驱动技术发展
  6. 个人成长发展依赖于业务,选业务才是王道

3. 腾讯课堂微服务架构设计概览

微服务包含内容比较多,可以按图中各块分治处理,每块算是比较独立;

在微服务跑起来后,蓝色的区域部分应该尽可能的标准化,让研发聚焦于红色的业务域内

  1. 微服务架构优势和问题
    • 优势:性能\扩展-弹力\维护\分治\并行开发
    • 问题:学习成本高(复杂\系统\需要实践理解)、治理和维护成本
  2. 不可变基础实施要求:容器化管理平台(STKE、K8s、docker、镜像仓库)
  3. 基础框架&服务支持:RPC 框架、Rainbow\Apollo 配置中心、Polaris 名字服务注册\发现\路由\容错
  4. 微服务分治微服务 DDD 领域驱动设计
  5. 微服务布局Go-DDD-Layout
  6. CICD 持续集成和部署:Coding\智研平台
    • CI 过程: 分支合并\编译构建\镜像打包推送
    • CD 过程: 可用区\集群负载\Pod 资源\服务镜像版本\容器编排、安全起停\健康检查\服务注册、HPA 弹性扩缩容、监控告警
  7. 分布式中间件:Redis\Kafka\ElasticSearch、分布式任务定时调度器、分布式 UID 发号器
  8. 分布式存储:MySQL\PostgreSQL、MongoDB\HBase\Cassandra、TDSQL\TiDB、Clickhouse、COS 分布式文件存储
  9. 服务网关:负责负载均衡、协议转换、认证鉴权、安全防护、链路 ID 生成等,例如 Nginx、Kong\Gin\Echo 等
  10. 全链路追踪:日志 Log\追踪 Trace\度量 Metric,Grafana\Promethous\ELK

4. 研发标准规范和团队文化氛围

参考之前写的有关研发标准规范文章: 腾讯课堂后台研发流程与规范

  1. 软件工程流程标准(研发流程标准规范文档)
  2. 团队文化
    1. 公开透明\学习型\扁平\注重效率\量化指标至死
    2. 优秀的领导者(从领导看团队风格)

5. 对复杂业务系统思考

参考之前写的 DDD 文章: 基于 DDD 落地 Go 微服务开发总结

  • 领域建模:需求分析、业务域划分、核心要素提取、领域服务提炼
  • 服务落地:基于 DDD-Layout 进行代码布局,统一微服务代码风格

6. 对技术债务思考

参考之前写的有关技术债务应对文章: How to Deal With Technial Debt - 如何应对技术债务(总结)

  1. 债务现象:系统、团队、个人 系统难维护和扩展,系统内部运转偏黑盒,系统脆弱不稳定,需求研发和问题解决耗时耗时长,研发加班改 Bug,幸福感很低
  2. 债务成因
    • 业务发展过程中,缺乏对技术方案合理性的管控,加上时间排期压力,很多不合理方案凑合上线
    • 研发过程缺乏统一研发标准,研发过程个凭本事,加上人员交替,很容易就导致债务积压架构腐化,形成上述债务现象
    • 针对腐化架构、代码,缺乏系统治理,小修小改需求迭代,最终导致系统脆弱不堪,问题频发
  3. 如何应对: 从管理者(团队)、研发两方面着手
    • 重视技术方案设计评审、老板\时间倒排需求权衡(管控老板预期)
    • 拟定研发标准、方案 Review、代码 CR
    • 搭配需求,小批量重构,及时清理债务
    • 完善基础实施、自动化测试,提升重构信心
    • 定期系统架构检测,识别坏味道,专项治理,提升软件架构和质量
    • 研发吃自己的狗粮,对交付质量负责

7. 对个人职业发展和成长的思考

  1. 工作职业规划
    • 业务现状和未来前景可能(包含业务稳定性
    • 决策时机(智信仁勇严),有勇无谋 vs 有谋无勇,君子不立危墙之下
    • 人脉重要性
    • 当下社会变化太快,高瞻远瞩很难,必须积极拥抱变化 - 徐远观察
  2. 个人生活、学习、成长
    • 人生原则: 你自己想要什么样的人生
    • 终身学习、积极主动、高效学习:
      • 提升信息的获取质量和密度
      • 扩充信息来源渠道
    • 学会淡然和释怀
  3. 为认知买单和觉醒(有人带\没人带、乔总\吴军-人都在为认知买单)
    1. 有人带\没人带区别
    2. 付费是最廉价的知识来源渠道
    3. 多读书、多输出

8. 总结

通过自己 10 年以上后台一线研经验以及在腾讯课堂、环球期间多年对微服务的实践和理解,结合各类云原生\微服务\架构设计和计算机等知识的系统学习,例如(王启军 -《持续的云原生演进》、极客时间李运华 - 《从 0 开始学架构》、陈皓 - 《左耳听风》、周志明老师 - 《凤凰架构》、BytebyteGo、DDD 等系列课程),趁着这段”相对空闲”的时间,希望将自己对云原生架构理解通透的写出来,做个系统的大纲总结,也自己的理解能对做架构设计的同学有一些帮助

  1. 结合自己的经验,谈了对架构设计本质的理解,简要介绍了腾讯课堂的技术架构,以及软件设计和开发过程中十个复杂度来源,并对这些复杂度来源进一步展开讲解;
  2. 接着简述了面对复杂业务系统时候,我们应该如何领域建模和落地,以及如何应对技术债务问题
  3. 接着再讨论了研发流程标准规范,以腾讯课堂为例展开了讲解
  4. 最后讨论了团队文化,以及对个人职业发展和成长的思考

碎碎念了很多内容,有的没有结合具体案例深入展开来讲,后续有机会再完善吧! 另外,下篇主要围绕设计研发过程中的十个复杂度来源进行系统的复盘,希望尽快总结完吧!