主编推荐语
一个贯穿全书的实战项目,一次从单体应用到微服务架构的升级体验。
内容简介
本书源码以Spring Boot 2.2.x、Spring Cloud Hoxton和Kubernetes 1.19.2为基础,从Spring Boot单体应用的搭建,到Spring Cloud微服务架构升级,再到使用Docker和Kubernetes容器编排技术做容器化改造,由浅入深、逐步讲解,使读者全面掌握主流微服务架构和容器编排方案。
本书共22章,分为三个部分。第一部分,讲解Spring Boot的核心功能和底层原理,手把手带读者搭建一个基于Spring Boot的优惠券平台单体应用系统。第二部分,讲解Spring Cloud微服务技术的应用,涵盖了Spring Cloud Netflix和Spring Cloud Alibaba两大组件库的核心组件,在项目实战环节,将Spring Cloud微服务技术应用到优惠券项目中,让读者亲身体验从单体应用升级为微服务架构的过程。第三部分,深入讲解Docker容器技术和Kubernetes容器编排技术的核心功能,并对优惠券项目做容器化改造。
本书紧扣实战、学练结合,适合具备一定Java基础的开发人员、对微服务架构和Spring Cloud技术及容器编排技术感兴趣的读者。对处在微服务架构转型期的团队来说,本书具有很大的实践指导价值。
目录
- 版权信息
- 内容简介
- 推荐序
- 专家力荐
- 前言
- 第1章 热身运动
- 1.1 准备工作
- 1.1.1 安装JDK
- 1.1.2 安装IDE
- 1.1.3 安装Maven
- 1.1.4 安装Postman
- 1.2 Java Web开发的进化史
- 1.2.1 应用服务器
- 1.2.2 青铜Servlet
- 1.2.3 铂金Spring MVC
- 1.2.4 王者Spring Boot
- 第2章 Spring Boot介绍
- 2.1 Spring Boot的前尘往事
- 2.1.1 Spring Framework
- 2.1.2 Spring Boot
- 2.2 Spring Boot的设计理念
- 2.3 Spring Boot的核心功能
- 2.3.1 易于使用的依赖管理Starter
- 2.3.2 约定大于配置的Auto Configuration
- 2.3.3 优雅灵活的配置管理Properties
- 2.3.4 简单明了的管理工具Actuator
- 2.3.5 方便快捷的内置容器Embedded Container
- 第3章 Spring Boot实战
- 3.1 创建Spring Boot项目
- 3.1.1 利用Spring Initializr创建项目
- 3.1.2 项目结构
- 3.1.3 在项目中添加Starter
- 3.1.4 偷懒神器lombok
- 3.2 项目运行打包
- 3.2.1 Spring Boot项目编译打包
- 3.2.2 运行Spring Boot项目
- 3.3 Spring Boot管理日志
- 3.3.1 日志框架
- 3.3.2 Log4J2
- 3.3.3 Logback
- 3.3.4 Slf4j
- 3.4 数据访问
- 3.4.1 访问关系型数据库
- 3.4.2 实现优惠券模板模块DAO层
- 3.4.3 实现用户领券模块DAO层
- 3.4.4 使用key-value store实现缓存
- 3.5 消息系统
- 3.5.1 消息系统的作用
- 3.5.2 消息系统的两种模式
- 3.5.3 集成RabbitMQ
- 3.5.4 集成Kafka
- 3.6 应用安全管理
- 3.6.1 Authentication用户身份鉴定
- 3.6.2 Authorization用户鉴权
- 3.6.3 OAuth 2.0
- 3.6.4 Spring Security
- 3.7 定时任务
- 3.7.1 Quartz
- 3.7.2 Spring Batch
- 3.8 Spring Boot项目测试
- 第4章 微服务与Spring Cloud
- 4.1 什么是微服务架构
- 4.1.1 微服务架构的特点
- 4.1.2 一线大厂为什么采用微服务架构
- 4.1.3 微服务架构对系统运维的挑战
- 4.2 微服务的拆分规范
- 4.2.1 领域模型
- 4.2.2 计算密集型业务和I/O密集型业务
- 4.2.3 区分高频、低频业务场景和突发流量
- 4.2.4 规划业务主链路
- 4.3 大厂微服务架构的服务治理方案
- 4.3.1 业界主流服务治理框架一览
- 4.3.2 微服务框架的选型建议
- 4.4 了解Spring Cloud
- 4.4.1 Spring Cloud简介
- 4.4.2 Spring Cloud和Spring Boot的关系
- 4.5 了解Spring Cloud组件库
- 4.5.1 Spring Cloud的整体架构
- 4.5.2 Spring Cloud的子项目
- 4.5.3 Netflix组件库
- 4.5.4 Alibaba组件库
- 4.6 实战项目技术选型
- 4.6.1 技术架构选型
- 4.6.2 Spring Cloud组件选型与版本
- 第5章 使用Eureka实现服务治理
- 5.1 什么是服务治理
- 5.2 Spring Cloud中常用的注册中心
- 5.3 分布式系统理论
- 5.3.1 了解CAP定理
- 5.3.2 高并发应用在CAP中的偏向性
- 5.4 Eureka核心概念
- 5.4.1 服务注册
- 5.4.2 服务发现
- 5.4.3 服务续约和服务下线
- 5.4.4 服务剔除
- 5.4.5 服务自保
- 5.5 优惠券项目改造——高可用注册中心
- 5.5.1 创建项目结构
- 5.5.2 修改host文件
- 5.5.3 引入Maven依赖项
- 5.5.4 创建项目启动类
- 5.5.5 为注册中心添加配置
- 5.6 coupon-template-service微服务架构升级
- 5.6.1 添加依赖项
- 5.6.2 创建启动类
- 5.6.3 添加配置项
- 5.6.4 运行项目
- 5.7 改造coupon-calculator
- 5.8 改造coupon-user-service服务
- 5.8.1 添加依赖项和配置项
- 5.8.2 声明RestTemplate
- 5.8.3 改造findCoupon()方法——RestTemplate.exchange函数的用法
- 5.8.4 改造requestCoupon()方法——getForObject函数的用法
- 5.8.5 改造placeOrder()方法
- 5.8.6 启动项目并验证服务注册
- 5.9 Eureka中的其他配置参数
- 第6章 使用Nacos实现服务治理
- 6.1 什么是Nacos
- 6.2 Nacos的核心功能
- 6.2.1 服务注册、服务发现与健康检测
- 6.2.2 配置管理
- 6.3 Nacos下载与安装
- 6.4 Nacos实战
- 6.4.1 Nacos与Spring Cloud的集成
- 6.4.2 Nacos控制台
- 6.4.3 Nacos实现配置管理
- 6.4.4 Nacos实现服务注册与服务发现
- 第7章 使用Ribbon实现负载均衡
- 7.1 什么是负载均衡
- 7.2 了解Ribbon
- 7.3 了解Ribbon的负载均衡器
- 7.3.1 Ribbon内置的负载均衡策略
- 7.3.2 各个负载均衡器适用的业务场景
- 7.3.3 Ribbon的IRule扩展接口
- 7.4 IPing机制
- 7.4.1 了解IPing机制
- 7.4.2 Ribbon内置的IPing策略类
- 7.5 微服务项目架构升级
- 7.5.1 添加Ribbon依赖项
- 7.5.2 添加@LoadBalancer注解
- 7.5.3 修改getUrl()方法
- 7.5.4 配置Ribbon负载均衡策略
- 第8章 使用OpenFeign实现服务间调用
- 8.1 Feign
- 8.1.1 什么是Feign
- 8.1.2 Feign的工作流程
- 8.1.3 Feign对请求和响应的压缩
- 8.2 微服务架构升级——使用Feign代理接口调用
- 8.2.1 添加依赖项
- 8.2.2 开启Feign注解支持
- 8.2.3 定义Feign接口
- 8.2.4 替换RestTemplate
- 8.2.5 Feign与Ribbon的超时与重试配置
- 8.2.6 Feign的日志配置
- 8.2.7 配置请求和响应的压缩参数
- 第9章 使用Hystrix实现服务间容错
- 9.1 Hystrix
- 9.1.1 什么是Hystrix
- 9.1.2 服务雪崩
- 9.1.3 服务雪崩的解决方案
- 9.2 Hystrix的核心概念
- 9.2.1 服务降级
- 9.2.2 服务熔断
- 9.2.3 Hystrix如何切换断路器的开关
- 9.3 微服务架构升级——配置熔断和降级
- 9.3.1 添加依赖项和配置项
- 9.3.2 在Feign接口上指定降级类
- 9.3.3 为特定方法指定降级逻辑
- 9.3.4 设置全局熔断参数
- 9.3.5 为指定方法设置超时时间
- 9.3.6 隔离机制的配置项
- 9.3.7 使用@CacheResult缓存注解
- 9.3.8 开放Actuator端点
- 9.4 微服务架构升级——利用Turbine收集Hystrix信息
- 9.4.1 什么是Turbine
- 9.4.2 添加Turbine子项目
- 9.4.3 创建启动类
- 9.4.4 指定需要监控的服务名称
- 9.5 微服务架构升级——利用Hystrix Dashboard观察服务健康度
- 9.5.1 什么是Hystrix Dashboard
- 9.5.2 添加Hystrix Dashboard项目
- 9.5.3 创建配置项和启动类
- 9.6 启用Hystrix Dashboard观察服务状态
- 第10章 使用Sentinel实现限流控制
- 10.1 服务容错
- 10.2 Sentinel简介
- 10.2.1 什么是Sentinel
- 10.2.2 Sentinel的核心功能
- 10.3 Sentinel控制台
- 10.4 Sentinel与Spring Cloud的集成
- 10.5 使用Sentinel实现降级控制
- 10.6 使用Sentinel实现限流控制
- 10.7 Sentinel的日志
- 第11章 使用Spring Cloud Config和Bus搭建配置中心
- 11.1 配置中心在微服务中的应用
- 11.1.1 环境隔离
- 11.1.2 业务配置项动态推送
- 11.1.3 中心化的配置管理
- 11.2 了解Spring Cloud Config和Bus
- 11.2.1 Spring Cloud Config+Bus架构图
- 11.2.2 保存配置的几种方式
- 11.3 准备工作——创建GitHub文件
- 11.3.1 创建GitHub Repo
- 11.3.2 添加YML配置文件
- 11.4 微服务架构升级——搭建高可用的配置中心
- 11.4.1 创建高可用的config-schmerver项目
- 11.4.2 添加依赖项和启动类
- 11.4.3 添加配置——设置GitHub地址,借助Eureka实现高可用
- 11.4.4 从多个GitHub Repo中读取配置
- 11.5 GitHub配置文件命名规则
- 11.5.1 Application、Profile和Label
- 11.5.2 路径匹配规则
- 11.6 对GitHub中的配置项进行加解密
- 11.6.1 更新JDK中的JCE组件
- 11.6.2 使用对称密钥对配置项加解密
- 11.6.3 使用非对称密钥对配置项加解密
- 11.7 微服务架构升级——从配置中心读取配置项
- 11.7.1 添加Spring Cloud Config和Bus的依赖项
- 11.7.2 为配置中心添加service-id
- 11.7.3 对数据库访问密码进行加密存储
- 11.7.4 配置@RefreshScope注解
- 11.7.5 从客户端触发配置刷新
- 11.7.6 使用Bus批量刷新配置项
- 第12章 使用Spring Cloud Gateway搭建服务网关
- 12.1 了解微服务网关
- 12.1.1 服务网关的用途
- 12.1.2 Spring Cloud中的网关组件
- 12.2 Spring Cloud Gateway的核心概念——路由、谓词和过滤器
- 12.3 路由功能
- 12.3.1 通过配置文件设置简单路由
- 12.3.2 通过Java代码配置路由
- 12.3.3 谓词工厂
- 12.3.4 Gateway常用谓词
- 12.3.5 过滤器
- 12.4 微服务架构改造——搭建网关模块
- 12.4.1 添加Gateway的依赖项和启动类
- 12.4.2 将Gateway连接到注册中心
- 12.4.3 在Java文件中设置路由规则
- 12.4.4 添加网关层跨域过滤器
- 12.5 微服务架构升级——使用Redis+Lua做流控
- 12.5.1 Redis和Lua的限流算法
- 12.5.2 设置限流规则
- 12.5.3 通过Actuator端点查看路由
- 第13章 使用Sleuth进行调用链路追踪
- 13.1 为什么微服务架构需要链路追踪
- 13.2 链路追踪技术介绍
- 13.2.1 Sleuth
- 13.2.2 Zipkin
- 13.2.3 ELK
- 13.3 Sleuth基本数据结构
- 13.4 微服务架构升级——集成Sleuth实现链路追踪
- 13.4.1 添加依赖项
- 13.4.2 配置Sleuth采样率
- 13.5 微服务架构升级——搭建Zipkin服务器
- 13.5.1 添加Zipkin依赖
- 13.5.2 创建Zipkin启动类
- 13.5.3 通过RabbitMQ接收日志文件
- 13.5.4 应用程序集成Zipkin
- 13.6 微服务架构升级——搭建ELK环境
- 13.6.1 下载ELK的Docker镜像
- 13.6.2 在镜像内配置ELK属性
- 13.6.3 将应用日志输送到Logstash
- 13.6.4 在Kibana中搜索日志
- 第14章 使用Stream集成消息队列
- 14.1 了解Stream
- 14.2 消息队列在微服务架构中的应用
- 14.3 消息队列的概念
- 14.3.1 发布订阅
- 14.3.2 消费组
- 14.3.3 消息分区
- 14.4 微服务架构升级——异步分发优惠券
- 14.4.1 添加Stream依赖项和消息信道
- 14.4.2 创建消息生产者
- 14.4.3 创建消息消费者并添加启动注解
- 14.4.4 添加Stream配置
- 14.5 微服务架构升级——Stream异常处理
- 14.5.1 本机重试
- 14.5.2 消息重新入队
- 14.5.3 自定义异常处理——添加降级逻辑
- 14.5.4 死信队列
- 14.6 Stream实现延迟消息
- 14.6.1 延迟消息的使用场景
- 14.6.2 安装延迟消息插件
- 14.6.3 实现延迟消息
- 第15章 使用Seata实现分布式事务
- 15.1 为什么需要分布式事务
- 15.2 分布式事务的替代方案
- 15.3 传统的XA分布式事务解决方案
- 15.4 Seata框架介绍
- 15.5 Seata的AT模式
- 15.5.1 AT模式原理
- 15.5.2 AT模式下的写隔离
- 15.5.3 AT模式下的读隔离
- 15.5.4 TCC模式
- 15.5.5 Saga模式
- 15.5.6 XA模式
- 15.6 微服务架构升级——搭建Seata服务器
- 15.6.1 下载Seata服务器
- 15.6.2 修改file.conf文件
- 15.6.3 修改registry.conf文件
- 15.6.4 添加服务器JDBC驱动
- 15.6.5 创建数据库表
- 15.7 微服务架构升级——应用改造
- 15.7.1 添加Seata依赖项和配置项
- 15.7.2 实现业务逻辑
- 15.7.3 添加数据源代理
- 第16章 走进容器化的世界
- 16.1 微服务落地的难点
- 16.1.1 微服务的兴起与容器的顺势而为
- 16.1.2 业务的高内聚和低耦合
- 16.1.3 摆脱软硬件异构的困境
- 16.1.4 遵循云原生12因素
- 16.1.5 满足康威定律
- 16.1.6 一线大厂为什么采用容器技术
- 16.2 容器技术的演进
- 16.2.1 容器技术的前世今生
- 16.2.2 主流容器技术介绍
- 16.2.3 容器技术生态圈对比
- 16.2.4 未来展望
- 16.3 容器编排技术先睹为快
- 16.3.1 资源统一管理和容器编排协作
- 16.3.2 Swarm
- 16.3.3 Mesos
- 16.3.4 Kubernetes
- 16.3.5 Rancher
- 16.3.6 各大容器编排框架对比
- 第17章 Docker容器技术
- 17.1 从HelloWorld起步
- 17.1.1 容器实战基本思路
- 17.1.2 5分钟Docker安装
- 17.1.3 1分钟HelloWorld
- 17.1.4 Docker感受分享
- 17.2 Docker架构
- 17.2.1 整体架构
- 17.2.2 客户端
- 17.2.3 Docker宿主机
- 17.2.4 仓库
- 17.2.5 镜像
- 17.2.6 容器
- 17.2.7 各个组件用途归纳
- 17.3 Docker镜像
- 17.3.1 镜像结构
- 17.3.2 镜像制作
- 17.3.3 Dockerfile常用指令
- 17.3.4 Dockerfile排疑解惑
- 17.3.5 镜像管理思路
- 17.4 Docker容器
- 17.4.1 容器的运行原理
- 17.4.2 隔离特性
- 17.4.3 限制特性
- 17.4.4 容器的起承转合
- 17.4.5 容器的管理思路
- 17.5 Docker存储
- 17.5.1 存储管理的目标
- 17.5.2 系统卷
- 17.5.3 数据卷
- 17.5.4 数据卷容器
- 17.5.5 存储模式总结
- 17.6 Docker网络
- 17.6.1 网络技术分类
- 17.6.2 none网络
- 17.6.3 host网络
- 17.6.4 bridge网络
- 17.6.5 自定义网络
- 17.6.6 第三方网络
- 17.6.7 网络技术选型
- 17.7 进一步感受Docker的魅力
- 17.7.1 Nginx反向代理部署
- 17.7.2 Redis缓存部署
- 17.7.3 MySQL数据库部署
- 17.7.4 MongoDB文档数据库部署
- 17.7.5 RabbitMQ消息队列部署
- 17.7.6 Kafka集群部署
- 17.7.7 ELK监控部署
- 17.7.8 Docker感受新体验
- 17.8 镜像仓库
- 17.8.1 搭建私有仓库
- 17.8.2 上传镜像
- 17.8.3 下载镜像
- 17.8.4 仓库的扩展
- 17.9 【优惠券项目落地】——Docker容器化
- 17.9.1 容器化总体思路
- 17.9.2 无状态应用模块容器化
- 17.9.3 无状态中间件容器化
- 17.9.4 有状态中间件容器化
- 17.9.5 容器间网络互通
- 17.9.6 后续改造规划
- 第18章 Kubernetes基础
- 18.1 了解容器编排
- 18.1.1 容器编排的意义和使命
- 18.1.2 容器编排的难点
- 18.2 了解Kubernetes
- 18.2.1 Kubernetes整体架构
- 18.2.2 Kubernetes Master节点
- 18.2.3 Kubernetes Node节点
- 18.3 Kubernetes基本概念
- 18.3.1 Pod概念
- 18.3.2 Controller概念
- 18.3.3 Label资源锁定
- 18.3.4 Namespace逻辑隔离
- 18.3.5 Kubernetes的功能理解导图
- 18.4 Kubernetes集群搭建
- 18.4.1 基础软件安装
- 18.4.2 在Master节点创建集群
- 18.4.3 网络选择和初始化
- 18.4.4 Node节点加入集群
- 18.5 Pod管理
- 18.5.1 Pod原理和实现
- 18.5.2 Pod生命周期管理
- 18.5.3 资源限制和调度选择
- 18.5.4 健康检查
- 18.6 Controller管理
- 18.6.1 Controller原理
- 18.6.2 Deployment
- 18.6.3 滚动升级
- 18.6.4 后台应用DaemonSet
- 18.6.5 任务Job
- 18.6.6 控制器选择思路
- 18.7 【优惠券项目落地】——Kubernetes容器化管理
- 18.7.1 应用Pod划分总体思路
- 18.7.2 应用Controller选择
- 18.7.3 Node资源分配
- 18.7.4 Liveness健康检查
- 第19章 Kubernetes网络互联
- 19.1 跨节点网络
- 19.1.1 网络互联总体思路
- 19.1.2 Flannel网络的Kubernetes实现
- 19.1.3 Canal网络的Kubernetes实现
- 19.1.4 网络选型
- 19.2 服务发现与负载均衡
- 19.2.1 Pod访问方式
- 19.2.2 ClusterIP方式
- 19.2.3 NodePort方式
- 19.2.4 LoadBalancer方式
- 19.2.5 Ingress方式
- 19.2.6 服务发现总体思路
- 19.3 【优惠券项目落地】——服务发现和互联
- 19.3.1 有状态服务搭建
- 19.3.2 无状态服务搭建
- 19.3.3 微服务网络互联和服务发现
- 第20章 Kubernetes数据存储
- 20.1 Volume卷
- 20.1.1 磁盘管理整体思路
- 20.1.2 emptyDir方式
- 20.1.3 hostPath方式
- 20.1.4 云存储方式
- 20.1.5 PV-PVC方式
- 20.1.6 StorageClass方式
- 20.2 ConfigMap和Secret
- 20.2.1 ConfigMap和Secret的定位
- 20.2.2 创建方式
- 20.2.3 数据传递方式
- 20.3 【优惠券项目落地】——配置和磁盘管理
- 20.3.1 应用环境变量加载
- 20.3.2 有状态应用磁盘挂载
- 第21章 Kubernetes高级功能
- 21.1 容器化的非功能性需求
- 21.1.1 架构设计的非功能性考量
- 21.1.2 Kubernetes容器方案的架构特性
- 21.2 安全性
- 21.2.1 安全性整体思路
- 21.2.2 认证和授权
- 21.2.3 Pod安全策略
- 21.2.4 网络访问策略
- 21.3 可用性
- 21.3.1 高可用架构整体思路
- 21.3.2 Node节点高可用
- 21.3.3 etcd高可用
- 21.3.4 Master节点高可用
- 21.4 扩展性
- 21.4.1 水平还是垂直扩展
- 21.4.2 手动扩缩容
- 21.4.3 HPA自动扩缩容
- 21.4.4 Serverless扩缩容
- 21.5 易用性
- 21.5.1 易用性的考量要素
- 21.5.2 Helm应用包管理
- 21.5.3 CI/CD流水线
- 21.6 可观察性
- 21.6.1 集群观察要点
- 21.6.2 Dashboard
- 21.6.3 Prometheus Grafana
- 21.6.4 Elasticsearch Fluentd Kibana
- 21.7 【优惠券项目落地】——Kubernetes容器架构终态
- 21.7.1 实现服务高可用
- 21.7.2 容器水平扩展
- 21.7.3 设置性能监控告警
- 21.7.4 设置日志监控搜索
- 21.7.5 微服务容器化落地的思考
- 第22章 Service Mesh
- 22.1 Service Mesh在微服务中的应用
- 22.1.1 Service Mesh引领微服务新时代
- 22.1.2 Istio的诞生和兴起
- 22.1.3 Service Mesh在大厂中的应用
- 22.2 从BoofInfo样例起步
- 22.2.1 异构应用的网络互通
- 22.2.2 应用拓扑监控
- 22.2.3 应用蓝绿发布
- 22.2.4 Service Mesh感受分享
- 22.3 了解Istio架构
- 22.3.1 Istio工作原理和整体架构
- 22.3.2 Proxy模块
- 22.3.3 Istiod模块
- 22.4 服务治理
- 22.4.1 服务治理的整体思路
- 22.4.2 灰度发布
- 22.4.3 故障注入
- 22.4.4 数据流镜像
- 22.4.5 服务熔断
- 22.4.6 服务网关
- 22.5 服务安全
- 22.5.1 服务安全整体思路
- 22.5.2 mTLS双向认证加密
- 22.5.3 基于mTLS的用户授权
- 22.5.4 JWT用户认证授权
- 22.6 服务监控
- 22.6.1 服务监控整体思路
- 22.6.2 Prometheus+Grafana性能监控
- 22.6.3 Jaeger服务追踪
- 22.7 【优惠券项目落地】——非侵入式容器进阶态
- 22.7.1 激活Service Mesh
- 22.7.2 透明授权验证
- 22.7.3 无埋点应用拓扑管理
- 22.7.4 优惠券项目容器化落地思考
出版方
电子工业出版社
电子工业出版社成立于1982年10月,是国务院独资、工信部直属的中央级科技与教育出版社,是专业的信息技术知识集成和服务提供商。经过三十多年的建设与发展,已成为一家以科技和教育出版、期刊、网络、行业支撑服务、数字出版、软件研发、软科学研究、职业培训和教育为核心业务的现代知识服务集团。出版物内容涵盖了电子信息技术的各个分支及工业技术、经济管理、科普与少儿、社科人文等领域,综合出版能力位居全国出版行业前列。