前言
第1章 迎接云原生的浪潮1
1.1 扑面而来的云原生1
1.1.1 单体应用面临的挑战2
1.1.2 从微服务到云原生3
1.1.3 云原生应用的特性4
1.1.4 云原生计算基金会 CNCF5
1.2 云原生设计的十二原则6
1.2.1 Codebase(单一代码)7
1.2.2 Dependencies(依赖管理)7
1.2.3 Configuration(配置)7
1.2.4 Backing services(支撑服务)7
1.2.5 Build, Release, Run(构建、发布、运行)8
1.2.6 Processes(无状态服务进程)8
1.2.7 Port Binding(端口绑定)8
1.2.8 Concurrency(并发能力)8
1.2.9 Disposability(易回收)9
1.2.10 Dev/Prod Parity(环境对等)9
1.2.11 Logs(日志流)9
1.2.12 Admin Processes(管理进程)9
1.3 云原生四大核心要素10
1.3.1 容器化10
1.3.2 微服务技术11
1.3.3 DevOps12
1.3.4 持续交付13
1.4 使用 .NET 技术开发云原生应用的优势14
1.4.1 高性能15
1.4.2 跨平台15
1.4.3 完全容器化支持15
1.4.4 开源15
1.5 小结16
第2章 配置 .NET云原生开发与运行环境17
2.1 系统要求17
2.2 安装与配置Git环境18
2.2.1 安装 Git18
2.2.2 配置Git18
2.2.3 下载eShopOnContainers源代码20
2.3 安装 .NET20
2.3.1 .NET 版本选择21
2.3.2 安装 .NET22
2.4 安装 Visual Studio 2022 或 Visual Studio Code23
2.4.1 安装Visual Studio 202223
2.4.2 安装 Visual Studio Code25
2.5 安装Docker27
2.5.1 安装 WSL 227
2.5.2 安装 Docker Desktop31
2.5.3 配置 Docker Desktop32
2.5.4 配置国内 Docker 环境35
2.6 启用 Kubernetes36
2.7 小结36
第3章 云原生应用开发—电子商务应用eShopOnContainers37
3.1 云原生应用 eShopOnContainers功能概述37
3.1.1 功能需求38
3.1.2 eShopOnContainers开发架构38
3.2 运行eShopOnContainers应用40
3.2.1 了解docker-compose文件40
3.2.2 构建eShop44
3.2.3 运行eShopOnContainers 应用45
3.2.4 注意事项46
3.3 访问eShopOnContainers应用程序47
3.3.1 访问MVC Web应用47
3.3.2 访问SPA Web应用48
3.3.3 访问Android、iOS和Windows上的移动应用49
3.3.4 访问 Swagger UI49
3.3.5 访问日志控制台50
3.3.6 应用程序与微服务列表53
3.4 eShopOnContainers代码组织53
3.4.1 项目架构53
3.4.2 源代码介绍54
3.4.3 领域驱动设计56
3.4.4 单元测试和集成测试60
3.5 小结62
第4章 实现云原生应用的扩展性63
4.1 容器化应用63
4.1.1 单体部署面临的挑战63
4.1.2 什么是Docker65
4.1.3 Docker常用命令68
4.1.4 开发中用到的Docker知识73
4.2 镜像仓库74
4.2.1 Docker Hub74
4.2.2 创建自定义的容器镜像仓库75
4.2.3 创建私有镜像仓库77
4.3 Docker定义文件Dockerfile80
4.3.1 Dockerfile 语法概要80
4.3.2 构建ASP.NET Core应用81
4.3.3 构建 ASP.NET Core Docker 应用83
4.4 扩展容器应用84
4.4.1 使用Docker compose管理云原生应用84
4.4.2 使用Kubernetes管理云原生应用86
4.4.3 使用环境变量89
4.5 容器与编排器实践94
4.5.1 购物车服务94
4.5.2 构建 Dockerfile95
4.5.3 构建docker-compose.yaml96
4.5.4 构建Kubernetes部署文件97
4.6 小结101
第5章 实现云原生应用的通信102
5.1 云原生应用通信的复杂性102
5.2 服务注册与服务发现103
5.2.1 微服务下的服务注册和服务发现104
5.2.2 Docker Compose环境下的服务注册与发现105
5.2.3 Kubernetes 环境下的服务注册与发现106
5.3 前端应用的通信模式107
5.3.1 实现网关的选择109
5.3.2 实时通信110
5.4 服务与服务之间的通信111
5.4.1 查询 Query112
5.4.2 命令Command115
5.4.3 事件Event116
5.4.4 领域总线和集成总线118
5.5 新一代通信协议gRPC118
5.5.1 gRPC的优势118
5.5.2 gRPC核心概念119
5.5.3 在 .NET中应用gRPC119
5.5.4 gRPC的使用场景120
5.5.5 在eShopOnContainers中实现gRPC支持120
5.6 服务网格(Service Mesh)122
5.7 实战演练:实现 eShopOnContainers中的组件间通信123
5.7.1 实现基于 Envoy 的 API 网关123
5.7.2 实现BFF网关125
5.7.3 实现基于MediatR的领域总线128
5.7.4 基于RabbitMQ实现跨微服务的事件总线133
5.7.5 基于事件总线实现集成总线135
5.8 小结140
第6章 数据访问模式141
6.1 云原生应用中的数据访问模式141
6.1.1 微服务中对数据库使用方式的变化142
6.1.2 跨微服务的查询143
6.1.3 数据完整性和分布式事务145
6.1.4 大规模数据访问147
6.2 关系型与非关系型数据库150
6.2.1 CAP定理151
6.2.2 关系型数据库与NoSQL数据库152
6.2.3 NewSQL数据库153
6.3 在云原生应用中应用缓存154
6.3.1 应用缓存的原因154
6.3.2 云原生应用的缓存架构154
6.4 实战演练:实现eShopOnContainers中产品价格变更的最终一致性155
6.4.1 实现简化事件溯源模式的集成事件日志156
6.4.2 发布基于事件日