首先让我们来了解一下Spring Cloud 是什么:
从字面理解,Spring Cloud 就是致力于分布式系统、云服务的框架。
Spring Cloud 是整个 Spring 家族中新的成员,是最近云服务火爆的必然产物。
Spring Cloud 为开发人员提供了快速构建分布式系统中一些常见模式的工具,例如:
使用 Spring Cloud 开发人员可以开箱即用的实现这些模式的服务和应用程序。这些服务可以任何环境下运行,包括分布式环境,也包括开发人员自己的笔记本电脑以及各种托管平台。
我这边也准备了一份教材送给同学们去学习spring
关注+收藏+转发后私信我【架构资料】即可免费获取!
这一份PDF已经是很多高校的教材了
Spring Cloud
Spring Cloud
阅读目录:
目前公司使用的 Spring Cloud 整个技术组件,基本包含了上面图中所包含的,不得不说,Spring Cloud 整个生态真的很强大,使用起来也很方便有效。
后面有时间再针对每个组件进行使用解读,这篇文章主要说下 Spring Cloud 架构的链路图,顺便把自己的思路整理下来,以备查阅。
1. 网关请求流程
在 Spring Cloud 整个组件库中,Spring Cloud Zuul 是最容易被忽视,但也是最重要的,Spring Cloud Zuul 可以和 Eureka 注册中心集成,我们目前使用 Spring Cloud Zuul 的功能如下:
有些功能是 Spring Cloud Zuul 自带的,比如 Filter 和 Router,有些是结合 Spring Cloud 其他组件,比如 Ribbon 和 Hystrix。
这里重点介绍下 Filter 过滤器,分为四个过滤类型:
另外,关于 oAuth2.0 JWT 的授权验证,实现的方式有两种:
我们目前采用的是第二种方式,这两种方式都有利有弊,关键在于自己的取舍,为什么采用第二种方式?目的就是发挥 Zuul 的作用,对外网关进行统一授权验证。
关于授权 Map,里面存储了所有服务接口的配置,示例配置:
private static final Map ROUTE_MAPS;
static
{
ROUTE_MAPS = new HashMap<String, String>();
ROUTE_MAPS.put("eureka-client/home", "read:ROLE_ADMIN");
ROUTE_MAPS.put("eureka-client/user", "read:ROLE_ADMIN");
ROUTE_MAPS.put("eureka-client/error", "read:ROLE_ADMIN");
}
这是我们目前的配置,是一个静态的 Map,后面会存储在 Spring Cloud Config 配置中心,Zuul 启动时进行加载,利用 Spring Cloud Bus 动态刷新。
关于 Zuul 网关,其实还有很多需要说的,后面有机会再进行针对说明。
2. Eureka 服务治理
Eureka 遵循的是 AP 原则(服务可用性和分区容错性),是服务治理最理想的遵循 CAP 分布式原则。
Eureka 集群中的节点是彼此平级,不像 Consul 有 master/worker 之分,集群中的 Eureka 节点彼此两两注册,所以,Eureka 集群最好部署三个节点,这也是我们目前的部署方式。
另外,Eureka 的自我保护机制,可以参考这篇文章。
服务之间的相互调用,负载有两种使用方式:
我们目前打算使用 Ribbon 负载方式,为什么?看下面代码就知道了:
restTemplate.getForObject("http://eureka-client/hello", String.class);
3. Config 配置中心
我们目前配置中心使用的是 Spring Cloud Config,当然你也可以使用功能更强大的 Polly(携程开源),但 Config 目前也能满足我们的需求,存储仓库我们现在使用的是 Git。
Config 配置中心提供了数据加密功能,你可以使用 RSA 的加密方式,这样存储在 Git 中的配置都是密文形式,Config Client 获取加密配置的时候,Config Server 会自动进行解密返回。
配置中心的使用场景,我们目前主要是两个地方:
另外,需要说明的是,默认情况下,如果 Git 中的配置更新了,Config Client 不会进行更新配置,我们目前的解决方式是,使用 Spring Cloud Bus 进行动态刷新配置(Config Server 中配置),具体的流程:
4. Hystrix 监控
Hystrix 主要是用于服务熔断/降级/隔离处理,Hystrix 配置在调用方,当被调用方服务不可用时,触发 Hystrix 熔断,会执行指定的 Fallback 方法,进行特殊处理。
我之前以为,Hystrix 熔断的触发条件是服务不可用,也就是服务请求超时(比如服务挂掉了),但我自己测试了下,服务出现 500 错误,也会触发 Hystrix 熔断,而且会自动忽略 Hystrix 的超时时间设置。
我们目前使用 Hystrix,主要有两个地方:
上面图中,主要画的是 Hystrix 的监控流程,我们目前主要使用 RabbitMQ 进行采集传输,turbine-server 进行数据流的聚合,hystrix-dashboard 进行图形化的展示。
5. 服务调用链路
服务调用链路的概念,就是当服务请求发起时,记录整个请求链路的数据,以备查询。
目前市面上,几乎所有服务调用链路的实现,理论基础都是基于 Google Dapper 的那篇论文,其中最重要的概念就是 traceId 和 spanId。
下面我描述下,我们目前的服务调用链路过程:
上面图中,详细说明了整个服务调用链路的过程,这边再说下使用的技术栈:
6. ELK 日志链路
ELK 可以参考下之前的几篇文章:
上面图中已经很详细介绍了下 ELK 的流程,ELK 默认技术栈里是没有 Filebeat 的,Logstash 用作日志收集的时候,CPU 和内存会占用资源比较大,所以我们使用轻量化的 Filebeat 进行日志的收集,Filebeat 部署在每个业务服务所在的服务器,然后将收集到的日志数据传输到 Logstash,Logstash 可以部署两到三台服务器上,用作日志的过滤和分析工作,然后再将处理后的日志数据,传输到 ElasticSearch 存储。
7. 统一格式返回
关于统一格式返回,图中已经详细的说明了,如果你有更好的方案,欢迎探讨。
看到最后大家还有不明白的地方,我这边也给你们准备了一下Spring Cloud的资料让大家学习
这一份PDF已经是很多高校的教材了
Spring Cloud
Spring Cloud
Spring Cloud
Spring Cloud实战PDF是可以免费送给想要学习的小伙伴!
关注+转发+收藏后私信【架构资料】即可免费获取!
留言与评论(共有 0 条评论) |