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

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. 最后讨论了团队文化,以及对个人职业发展和成长的思考

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