Spring Cloud微服务架构进阶
内容总结
1.1 第一代服务框架
代表:Dubbo(Java)、Orleans(.Net)等
特点:和语言绑定紧密
1.2 第二代服务框架
代表:Spring Cloud等
现状:适合混合式开发(例如借助Steeltoe OSS可以让ASP.Net Core与Spring Cloud集成),正值当年
1.3 第三代服务框架
代表:Service Mesh(服务网格) => 例如Service Fabric、lstio、Linkerd、Conduit等
现状:在快速发展中,更新迭代比较快
1.4 未来(目测不久)主流的服务架构和技术栈
基础的云平台为微服务提供了资源能力(计算、存储和网络等),容器作为最小工作单元被Kubernetes调度和编排,Service Mesh(服务网格)管理微服务的服务通信,最后通过API Gateway向外暴露微服务的业务接口。
目前,我所在的项目组已经在采用这种技术架构了,服务网格采用的是Linkerd,容器编排采用的是K8S,Spring Cloud已经没用了。But,不代表Spring Cloud没有学习的意义,对于中小型项目团队,Spring Cloud仍然是快速首选。
内容介绍
本书全面系统地介绍Spring Cloud及其在微服务架构中的应用。全书共13章,第1章介绍微服务架构相关的基本概念;第2章介绍Spring Cloud中包含的组件以Spring Cloud约定的上下文;第3章介绍Spring Cloud的基础:Spring Boot,包括如何构建一个Spring Boot服务、Spring Boot的配置文件和Actuator提供的监控管理端点;第4至第13章详细讲解Spring Cloud组件,包括:Eureka(服务注册与发现)、OpenFeign(声明式Restful客户端)、Hystrix(断路器)、Ribbon(客户端负载均衡器)、Gateway(API网关)、Config(配置中心)、Stream(消息驱动)、Bus(消息总线)、Security(认证与授权)、Sleuth(服务链路追踪)。本书为读者揭开了Spring Cloud组件实现的技术内幕,并提供了进阶应用的思路,可以作为使用Spring Cloud进行微服务架构实践的参考书。
目录
- 前言
- 第1章 微服务架构介绍1
- 1.1 微服务架构的出现1
- 1.1.1 单体应用架构1
- 1.1.2 SOA架构2
- 1.1.3 微服务架构3
- 1.2 微服务架构的流派5
- 1.3 云原生与微服务9
- 1.4 本章小结12
- 第2章 Spring Cloud总览13
- 2.1 Spring Cloud架构13
- 2.2 Spring Cloud特性16
- 2.2.1 Spring Cloud Context:应用上下文16
- 2.2.2 Spring Cloud Commons:公共抽象19
- 2.3 本章小结21
- 第3章 Spring Cloud的基础:Spring Boot22
- 3.1 Spring Boot简介22
- 3.2 构建一个微服务24
- 3.3 Spring Boot配置文件29
- 3.3.1 默认配置文件29
- 3.3.2 外部化配置29
- 3.3.3 YAML30
- 3.3.4 自动载入外部属性到Bean30
- 3.3.5 多Profile31
- 3.3.6 Starter32
- 3.3.7 自制一个Starter32
- 3.3.8 Actuator36
- 3.4 本章小结38
- 第4章 服务注册与发现:Eureka39
- 4.1 基础应用40
- 4.1.1 Eureka简介40
- 4.1.2 搭建Eureka服务注册中心40
- 4.1.3 搭建Eureka服务提供者42
- 4.1.4 搭建Eureka服务调用者43
- 4.1.5 Eureka服务注册和发现44
- 4.1.6 Consul的简单应用46
- 4.2 服务发现原理48
- 4.3 Eureka Client源码解析49
- 4.3.1 读取应用自身配置信息50
- 4.3.2 服务发现客户端52
- 4.3.3 拉取注册表信息56
- 4.3.4 服务注册61
- 4.3.5 初始化定时任务62
- 4.3.6 服务下线68
- 4.4 Eureka Server源码解析70
- 4.4.1 服务实例注册表70
- 4.4.2 服务注册72
- 4.4.3 接受服务心跳74
- 4.4.4 服务剔除75
- 4.4.5 服务下线77
- 4.4.6 集群同步78
- 4.4.7 获取注册表中服务实例信息82
- 4.5 进阶应用84
- 4.5.1 Eureka Instance和Client的元数据84
- 4.5.2 状态页和健康检查页端口设置85
- 4.5.3 区域与可用区85
- 4.5.4 高可用性服务注册中心86
- 4.6 本章小结87
- 第5章 声明式RESTful客户端:Spring Cloud OpenFeign88
- 5.1 基础应用88
- 5.1.1 微服务之间的交互88
- 5.1.2 OpenFeign简介89
- 5.1.3 代码示例89
- 5.2 源码分析91
- 5.2.1 核心组件与概念91
- 5.2.2 动态注册BeanDefinition92
- 5.2.3 实例初始化98
- 5.2.4 函数调用和网络请求107
- 5.3 进阶应用111
- 5.3.1 Decoder与Encoder的定制化111
- 5.3.2 请求/响应压缩112
- 5.4 本章小结113
- 第6章 断路器:Hystrix114
- 6.1 基础应用114
- 6.1.1 RestTemplate与Hystrix115
- 6.1.2 OpenFeign与Hystrix117
- 6.2 Hystrix原理118
- 6.2.1 服务雪崩118
- 6.2.2 断路器119
- 6.2.3 服务降级操作120
- 6.2.4 资源隔离121
- 6.2.5 Hystrix实现思路122
- 6.3 源码解析123
- 6.3.1 封装HystrixCommand123
- 6.3.2 HystrixCommand类结构129
- 6.3.3 异步回调执行命令129
- 6.3.4 异步执行命令和同步执行命令137
- 6.3.5 断路器逻辑137
- 6.3.6 资源隔离143
- 6.3.7 请求超时监控148
- 6.3.8 失败回滚逻辑150
- 6.4 进阶应用152
- 6.4.1 异步与异步回调执行命令152
- 6.4.2 继承HystrixCommand153
- 6.4.3 请求合并157
- 6.5 本章小结161
- 第7章 客户端负载均衡器:Spring Cloud Netflix Ribbon162
- 7.1 负载均衡162
- 7.2 基础应用163
- 7.3 源码分析165
- 7.3.1 配置和实例初始化165
- 7.3.2 与OpenFeign的集成167
- 7.3.3 负载均衡器LoadBalancerClient171
- 7.3.4 ILoadBalancer173
- 7.3.5 负载均衡策略实现177
- 7.4 进阶应用184
- 7.4.1 Ribbon API184
- 7.4.2 使用Netty发送网络请求185
- 7.4.3 只读数据库的负载均衡实现186
- 7.5 本章小结187
- 第8章 API网关:Spring Cloud Gateway189
- 8.1 Spring Cloud Gateway介绍189
- 8.2 基础应用190
- 8.2.1 用户服务191
- 8.2.2 网关服务192
- 8.2.3 客户端的访问195
- 8.3 源码解析195
- 8.3.1 初始化配置196
- 8.3.2 网关处理器197
- 8.3.3 路由定义定位器202
- 8.3.4 路由定位器205
- 8.3.5 路由断言208
- 8.3.6 网关过滤器216
- 8.3.7 全局过滤器227
- 8.3.8 API端点234
- 8.4 应用进阶235
- 8.4.1 限流机制235
- 8.4.2 熔断降级238
- 8.4.3 网关重试过滤器240
- 8.5 本章小结241
- 第9章 配置中心:Spring Cloud Config243
- 9.1 基础应用244
- 9.1.1 配置客户端244
- 9.1.2 配置仓库245
- 9.1.3 服务端246
- 9.1.4 配置验证248
- 9.1.5 配置动态更新249
- 9.2 源码解析250
- 9.2.1 配置服务器251
- 9.2.2 配置客户端261
- 9.3 应用进阶267
- 9.3.1 为Config Server配置多个repo268
- 9.3.2 客户端覆写远端的配置属性268
- 9.3.3 属性覆盖269
- 9.3.4 安全保护269
- 9.3.5 加密解密270
- 9.3.6 快速响应失败与重试机制272
- 9.4 本章小结272
- 第10章 消息驱动:Spring Cloud Stream274
- 10.1 消息队列274
- 10.2 基础应用276
- 10.2.1 声明和绑定通道276
- 10.2.2 自定义通道276
- 10.2.3 接收消息276
- 10.2.4 配置278
- 10.3 源码分析278
- 10.3.1 动态注册BeanDefinition279
- 10.3.2 绑定服务282
- 10.3.3 获取绑定器284
- 10.3.4 绑定生产者289
- 10.3.5 消息发送的流程291
- 10.3.6 StreamListener注解的处理293
- 10.3.7 绑定消费者298
- 10.3.8 消息的接收304
- 10.4 进阶应用306
- 10.4.1 Binder For RocketMQ306
- 10.4.2 多实例311
- 10.4.3 分区311
- 10.5 本章小结313
- 第11章 消息总线:Spring Cloud Bus314
- 11.1 基础应用314
- 11.1.1 配置服务器315
- 11.1.2 配置客户端316
- 11.1.3 结果验证316
- 11.2 源码解析318
- 11.2.1 事件的定义与事件监听器319
- 11.2.2 消息的订阅与发布326
- 11.2.3 控制端点328
- 11.3 应用进阶329
- 11.3.1 在自定义的包中注册事件329
- 11.3.2 自定义监听器330
- 11.3.3 事件的发起者331
- 11.4 本章小结332
- 第12章 认证与授权:Spring Cloud Security333
- 12.1 基础应用333
- 12.1.1 OAuth2简介334
- 12.1.2 JWT336
- 12.1.3 搭建授权服务器338
- 12.1.4 配置资源服务器341
- 12.1.5 访问受限资源344
- 12.2 整体架构346
- 12.3 源码解析348
- 12.3.1 安全上下文349
- 12.3.2 认证350
- 12.3.3 授权357
- 12.3.4 Spring Security中的过滤器与拦截器361
- 12.3.5 授权服务器372
- 12.3.6 资源服务器387
- 12.3.7 令牌中继机制394
- 12.4 进阶应用395
- 12.4.1 Spring Security定制395
- 12.4.2 OAuth2定制399
- 12.4.3 SSO单点登录403
- 12.5 本章小结406
- 第13章 服务链路追踪:Spring Cloud Sleuth407
- 13.1 链路监控组件简介407
- 13.2 基础应用410
- 13.2.1 特性411
- 13.2.2 项目准备411
- 13.2.3 Spring Cloud Sleuth独立实现414
- 13.2.4 集成Zipkin414
- 13.3 本章小结420
微服务的概念源于 2014 年 3 月 Martin Fowler 所写的一篇文章“Microservices”。文中内容提到:微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。 每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相沟通(通常是基于 HTTP 的 RESTful API)。每个服务都围绕着具体业务进行构建,并且能够被独立地部署到生产环境、类生产环境等。 另外,应尽量避免统一的、集中式的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言、工具对其进行构建。 微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被独立部署,各个微服务之间是松耦合的。每个微服务仅关注于完成一件任务并很好地完成该任务。在所有情况下,每个任务代表着一个小的业务能力。
Spring Cloud核心子项目 Spring Cloud Netflix:核心组件,可以对多个Netflix OSS开源套件进行整合,包括以下几个组件: Eureka:服务治理组件,包含服务注册与发现 Hystrix:容错管理组件,实现了熔断器 Ribbon:客户端负载均衡的服务调用组件 Feign:基于Ribbon和Hystrix的声明式服务调用组件 Zuul:网关组件,提供智能路由、访问过滤等功能 Archaius:外部化配置组件 Spring Cloud Config:配置管理工具,实现应用配置的外部化存储,支持客户端配置信息刷新、加密/解密配置内容等。 Spring Cloud Bus:事件、消息总线,用于传播集群中的状态变化或事件,以及触发后续的处理 Spring Cloud Security:基于spring security的安全工具包,为我们的应用程序添加安全控制 Spring Cloud Consul : 封装了Consul操作,Consul是一个服务发现与配置工具(与Eureka作用类似),与Docker容器可以无缝集成
接触Spring Cloud还是挺早的了,算是早期关注者吧,之后一直在项目中有实践和应用。相比于刚出来之前,Spring Cloud已经完善了太多,通过整合现有的开源框架和Spring社区自己开发的一部分组件,使得Spring Cloud功能越来越强大。Spring Cloud使用和整合单个组件还比较简单,但是在微服务的实践中,要求我们对这些基础的组件有更深的了解才行。在平时的应用中,我会去了解和学习各个组件的实现原理,虽然没有特别细致,但是也对其中的主要部分比较熟悉。 关于这方面的书籍,其实已经有DIDI(翟永超)的Spring Cloud微服务实战和周立Spring Cloud与Docker微服务架构实战等书籍,写得时间比较早,内容质量也挺高了。笔者实在不敢谈超越,然而技术的发展和迭代很快,Spring Cloud版本迭到了Finchley,基于的Spring Boot版本已经是2.x了(2.x已经基于Spring 5),相对来说,好多组件的实现和用法方面变化还是很大。这本《Spring Cloud 微服务架构进阶》基于最新的Finchley,详细介绍了微服务架构中涉及到的主要Spring Cloud组件,配合基础应用的案例介绍实现原理。本书适合所有的Java开发者,特别希望能为从事微服务开发和架构的读者提供一些帮助。