Go项目架构设计 说明
# 前言
# Go项目架构设计 说明
Go语言是由罗伯特·格里泽默(Robert Griesemer)、罗布·派克(Rob Pike)和肯·汤普森(Ken Thompson)于2007年左右在谷歌构思并开发的。其目标是打造一种实用的编程语言,以处理庞大的代码库、复杂的多线程场景以及多核处理器。2012年3月,Go 1.0版本发布,从那以后,这门语言在受欢迎程度上突飞猛进。像我这样的开发者喜欢它的简洁性、表现力、明确性以及出色的社区。
在过去几年里,我用Go构建了一些生产级应用程序,在本书中,我尝试从一个具有实践经验的架构师的角度,提炼我所学到的知识。本书主要是对Go生态系统的一个全面概述,但在一些关键部分,我们会深入探讨并编写代码来演示相关理论。最后,我们将使用所学的知识构建一个较为复杂的电子商务应用程序!
本文为《Hands-On Software Architecture with Golang》的译本,首发于 cppguide.cn (opens new window)。
限于水平有限,如果您在阅读过程中有任何问题,可以联系小方(微信cppxiaofang),也欢迎加入小方的 技术交流群,群里面有很多开发高手,不定期发布招聘信息,加群请备注“加微信群”。
小方微信公众号【CppGuide】:
# 开发环境说明
你需要在计算机上安装运行Go程序所需的所有工具,包括:
- Go(最好是v0.9版本)。
- 一个编辑器。不需要太高级的,Sublime Text就很不错。
- 此外,本书有几章涉及Cassandra、Kafka、Redis和NSQ。所有这些都可以安装在普通笔记本电脑上。在Mac系统上,通过Homebrew可以安装所有这些软件。使用它们的最新稳定版本即可。
# 目录
前言
第1章:用Go构建大型项目
- 从全局角度解决问题
- 架构师的角色
- 需求澄清
- 北极星指标(True North)
- 技术选型
- 掌控全局的领导力
- 指导与辅导
- 目标状态与当前状态
- 架构师的角色
- 软件架构
- 架构与设计
- 架构是什么样的?
- 微服务
- 微服务面临的挑战——效率
- 微服务面临的挑战——编程复杂性
- Go语言
- Hello World!
- 数据类型和结构
- 函数和方法
- 流程控制
- 打包
- 并发
- 垃圾回收
- 面向对象
- 总结
- 从全局角度解决问题
第2章:代码打包
- 契约
- 面向对象
- Go语言中的面向对象——结构体
- Go语言中的面向对象——可见性
- Go语言中的面向对象——接口
- Go语言中的面向对象——嵌入
- 模块
- 代码布局
- 第三方依赖
- 框架
- 测试
- 构建测试
- 总结
第3章:设计模式
- 设计原则
- 单一职责原则(Single Responsibility Principle,S)
- 开闭原则(Open/Closed Principle,O)
- 里氏替换原则(Liskov Substitution Principle,L)
- 接口隔离原则(Interface Segregation Principle,I)
- 依赖倒置原则(Dependency Inversion Principle,D)
- 创建型设计模式
- 工厂方法
- 生成器模式(Builder)
- 抽象工厂模式(Abstract factory)
- 单例模式(Singleton)
- 结构型设计模式
- 适配器模式(Adaptor)
- 桥接模式(Bridge)
- 组合模式(Composite)
- 装饰器模式(Decorator)
- 外观模式(Facade)
- 代理模式(Proxy)
- 行为型设计模式
- 命令模式(Command)
- 责任链模式(Chain of Responsibility)
- 中介者模式(Mediator)
- 备忘录模式(Memento)
- 观察者模式(Observer)
- 访问者模式(Visitor)
- 策略模式(Strategy)
- 状态模式(State)
- 总结
- 设计原则
第4章:应用程序扩展
- 扩展算法
- 算法复杂度
- 分布式算法
- 扩展数据结构
- 剖析数据结构
- 概率数据结构
- 扩展数据
- 可扩展性瓶颈
- C10K问题
- 惊群问题(Thundering Herd problem)
- 根源
- 编程
- 操作系统
- 内存使用
- 状态丢失
- 扩展系统
- X轴扩展
- Y轴扩展
- Z轴扩展
- 扩展部署
- 总结
- 扩展算法
第5章:走向分布式
- 拓扑结构
- 分布式系统的常见误解
- 网络是可靠的
- 延迟为零
- 带宽无限
- 网络是安全的
- 拓扑结构不会改变
- 只有一个管理员
- 传输成本为零
- 网络是同构的
- 一致性
- 原子性、一致性、隔离性、持久性(ACID)
- 以客户端为中心的一致性模型
- 强一致性
- 弱一致性
- 最终一致性
- 顺序一致性
- 因果一致性
- 会话一致性
- 单调读一致性
- 单调写一致性
- 以存储系统为中心的一致性模型
- CAP定理
- 共识算法
- 两军问题
- 基于时间因果关系的共识算法
- 多阶段提交
- 两阶段提交
- 三阶段提交
- Paxos算法
- Raft算法
- 领导者选举
- 分布式架构
- 基于对象的系统
- 分层架构
- 对等(Peer-2-Peer,P2P)架构
- 分布式计算
- 事件驱动架构(Event-driven architecture,EDA)
- 参与者模型(Actor model)
- 流处理
- 总结
第6章:消息传递
- 性能特征
- 基于代理的消息传递
- 队列模型
- 发布/订阅模型(Pub/Sub model)
- 交付语义
- 投递机制
- 至少一次交付
- 至多一次交付
- 恰好一次交付
- 投递机制
- 弹性
- 高级消息队列协议(AMQP)
- 深入剖析Apache Kafka
- 概念
- 发布消息
- AsyncProducer接口
- 同步生产者
- 消费消息
- 流处理
- 无代理消息传递
- 深入剖析NSQ
- 概念
- 发布消息
- 消费消息
- 集成模式
- 请求-回复模式
- 关联标识符模式
- 管道和过滤器模式
- 基于内容的路由器模式
- 扇入模式
- 扇出模式
- 后台工作者模式
- 总结
第7章:构建API
- 端点
- 网络基础
- 服务发现
- 服务器端服务发现
- 客户端服务发现
- 数据序列化
- XML
- JSON
- Protobuf
- 性能
- 表述性状态转移(Representational State Transfer,REST)
- 概念
- 约束条件
- 客户端-服务器模型
- 无状态性
- 可缓存性
- 统一接口
- 理查森成熟度模型(Richardson Maturity Model)
- 0级——XML沼泽(swamp of POX)
- 1级——资源
- 2级——HTTP动词
- 3级——超媒体控制
- 使用Gin构建REST服务
- Gin简介
- 示例应用程序
- 路由
- 创建
- 读取
- 更新
- 删除
- GraphQL
- 模式
- 端点
- 查询
- 变更
- 订阅
- 更高级的模式
- 模型-视图-控制器(Model-View-Controller,MVC)
- 负载均衡健康检查
- API网关
- Go kit
- 总结
- 端点
第8章:数据建模
- 实体和关系
- 一致性保证
- 原子性、一致性、隔离性、持久性(Atomicity, Consistency, Isolation, Durability,ACID)
- 原子性
- 一致性
- 隔离性
- 持久性
- 基本可用、软状态、最终一致性(Basically Available, Soft state, Eventual consistency,BASE)
- 原子性、一致性、隔离性、持久性(Atomicity, Consistency, Isolation, Durability,ACID)
- 关系模型
- 第一范式
- 第二范式
- 第三范式
- 巴斯范式(Boyce-Codd normal form)
- 第四范式
- SQL
- 索引
- 视图
- 内连接
- 左外连接
- 右外连接
- 全外连接
- 深入探究MySQL
- 连接管理
- 查询执行
- 存储引擎
- InnoDB
- MyISAM
- 其他插件
- 高可用性/可扩展性
- 对象关系映射(Object Relational Mappers,ORMs)
- 键值存储
- 概念
- Redis深度解析
- 架构
- 数据结构
- 持久化
- 集群
- 用例
- 在Golang中的使用
- 宽列存储
- 列族存储
- Cassandra深度解析
- 数据分布
- 写入路径
- 读取路径
- 在Golang中的使用
- Cassandra深度解析
- 提升数据性能的模式
- 分片
- 反规范化
- 物化视图
- 总结
第9章:反脆弱系统
- 可靠性指标
- 动态指标
- 静态指标
- 可靠性工程
- 健壮服务
- 高可用性
- 消息传递
- 异步计算模式
- 编排器模式
- 补偿事务模式
- 管道和过滤器模式
- 热点问题
- 边车模式(sidecar pattern)
- 限流
- 版本控制
- 可靠性验证
- 单元测试
- 集成测试
- 用户界面测试(UI tests)
- 性能测试
- 混沌工程
- 依赖关系
- 故障扩散
- 级联故障
- 依赖弹性
- Hystrix简介
- Hystrix——回退机制
- Hystrix——断路器
- 在Golang中使用Hystrix
- Hystrix监控
- 数据库级可靠性
- 数据中心级可靠性
- 一致性
- 路由和切换
- 总结
- 可靠性指标
第10章:案例研究——旅游网站
- 产品介绍
- 参与者
- 需求分析
- 数据建模
- 高层架构
- 搜索
- 航班业务
- 酒店业务
- 预订功能
- 支付功能
- 预约功能
- 总结
- 产品介绍
第11章:部署规划
部署架构
- 组件
- 计算资源
- 物理服务器
- 虚拟机
- 容器
- 计算属性
- 存储
- 网络
- 负载均衡器
- API网关
- 反向代理
- 消息代理
- 计算资源
- 环境
- 容量规划与规模确定
- 灾难恢复
- 组件
持续集成与持续交付(CICD)
- 概述
- Jenkins
- 示例代码
- 安装Jenkins
- 安装Docker
- 设置插件
- 创建项目
- 运行构建
- 目标配置
- 工具
- go fmt
- golint
- go build
- 脚注
监控
日志
指标
应用性能监控/仪表盘
警报
团队
云服务
- 基础设施即服务(Infrastructure as a Service,IaaS)
- 平台即服务(Platform as a Service,PaaS)
- 软件即服务(Software as a service,SaaS)
安全性
总结
第12章:应用程序迁移
- 迁移原因
- Python
- Java
- 迁移策略
- 阶段1——学习Go语言
- 阶段2——试点服务
- 阶段3——定义包
- 阶段4——移植主程序
- 阶段5——移植包
- 阶段6——优化计算
- 组建团队
- 总结
- 迁移原因
上次更新: 2025/04/08, 19:40:35