一遍文章让你看懂的SpringCloud、错过你会后悔

点关注,不迷路;持续更新Java架构相关技术及资讯热文!!!

目前公司使用的 Spring Cloud 整个技术组件,基本包含了上面图中所包含的,不得不说,Spring Cloud 整个生态真的很强大,使用起来也很方便有效。

后面有时间再针对每个组件进行使用解读,这篇文章主要说下 Spring Cloud 架构的链路图,顺便把自己的思路整理下来,以备查阅。

阅读目录

  • 一、 网关请求流程
  • 二、Eureka 服务治理
  • 三、 Config 配置中心
  • 四、 Hystrix 监控
  • 五、服务调用链路
  • 六、ELK 日志链路
  • 七、统一格式返回

一、 网关请求流程

在 Spring Cloud 整个组件库中,Spring Cloud Zuul 是最容易被忽视,但也是最重要的,Spring Cloud Zuul 可以和 Eureka 注册中心集成,我们目前使用 Spring Cloud Zuul 的功能如下:

  • Filter 过滤器
  • Router 路由
  • Ribbon 负载均衡
  • Hystrix 熔断
  • Retry 重试

有些功能是 Spring Cloud Zuul 自带的,比如 Filter 和 Router,有些是结合 Spring Cloud 其他组件,比如 Ribbon 和 Hystrix。

这里重点介绍下 Filter 过滤器,分为四个过滤类型:

  • pre :Zuul 转发请求之前执行,我们目前的实现是 AccessTokenFilter ,用于 oAuth2.0 JWT 的授权验证。
  • route :Zuul 路由时执行,目前项目没用到。
  • post :Zuul 路由转发后执行,也就是已经请求成功了后端服务,我们目前的实现是 CustomResponseFilter ,用于统一请求格式的封装,比如 code/msg/data 等。
  • error :以上过滤器发生错误时执行,我们目前的实现是 CustomErrorFilter ,用于拦截过滤器执行的出现的错误,然后统一格式封装返回,另外,error 过滤器好像并不能捕获后端服务执行出现的错误。

另外,关于 oAuth2.0 JWT 的授权验证,实现的方式有两种:

AccessTokenFilter

我们目前采用的是第二种方式,这两种方式都有利有弊,关键在于自己的取舍,为什么采用第二种方式?目的就是发挥 Zuul 的作用,对外网关进行统一授权验证。

关于授权 Map,里面存储了所有服务接口的配置,示例配置:

这是我们目前的配置,是一个静态的 Map,后面会存储在 Spring Cloud Config 配置中心,Zuul 启动时进行加载,利用 Spring Cloud Bus 动态刷新。

关于 Zuul 网关,其实还有很多需要说的,后面有机会再进行针对说明。

二、 Eureka 服务治理

Eureka 遵循的是 AP 原则(服务可用性和分区容错性),是服务治理最理想的遵循 CAP 分布式原则。

Eureka 集群中的节点是彼此平级,不像 Consul 有 master/worker 之分,集群中的 Eureka 节点彼此两两注册,所以,Eureka 集群最好部署三个节点,这也是我们目前的部署方式。

服务之间的相互调用,负载有两种使用方式:

  • Feign :基于声明式,顾名思义,就是需要定义接口,就像我们平常使用对象调用一样。
  • Ribbon :软负载,通过往 RestTemplate 中注入负载 Handler,然后通过负载算法选取调用(通过 Eureka 获取服务注册信息)。

我们目前打算使用 Ribbon 负载方式,为什么?看下面代码就知道了:

三、 Config 配置中心

我们目前配置中心使用的是 Spring Cloud Config,当然你也可以使用功能更强大的 Polly(携程开源),但 Config 目前也能满足我们的需求,存储仓库我们现在使用的是 Git。

Config 配置中心提供了数据加密功能,你可以使用 RSA 的加密方式,这样存储在 Git 中的配置都是密文形式,Config Client 获取加密配置的时候,Config Server 会自动进行解密返回。

配置中心的使用场景,我们目前主要是两个地方:

  • 项目启动的配置信息,比如数据库的连接字符串等。
  • 业务服务的配置信息,也就是业务相关的配置。

另外,需要说明的是,默认情况下,如果 Git 中的配置更新了,Config Client 不会进行更新配置,我们目前的解决方式是,使用 Spring Cloud Bus 进行动态刷新配置(Config Server 中配置),具体的流程:

curl -X POST http://manager1:8180/bus/refresh

四、Hystrix 监控

Hystrix 主要是用于服务熔断/降级/隔离处理,Hystrix 配置在调用方,当被调用方服务不可用时,触发 Hystrix 熔断,会执行指定的 Fallback 方法,进行特殊处理。

我之前以为,Hystrix 熔断的触发条件是服务不可用,也就是服务请求超时(比如服务挂掉了),但我自己测试了下,服务出现 500 错误,也会触发 Hystrix 熔断,而且会自动忽略 Hystrix 的超时时间设置。

我们目前使用 Hystrix,主要有两个地方:

  • 内部服务调用 :可以对某个 API 接口进行熔断处理。
  • Zuul 网关使用 :就是当 Zuul 路由转发调用时,但有个局限性,就是只能对服务进行熔断,并不能针对某个 API 接口熔断。

上面图中,主要画的是 Hystrix 的监控流程,我们目前主要使用 RabbitMQ 进行采集传输,turbine-server 进行数据流的聚合,hystrix-dashboard 进行图形化的展示

五、 服务调用链路

服务调用链路的概念,就是当服务请求发起时,记录整个请求链路的数据,以备查询。

目前市面上,几乎所有服务调用链路的实现,理论基础都是基于 Google Dapper 的那篇论文,其中最重要的概念就是 traceId 和 spanId。

  • traceId 记录整个服务链路的 ID,由首次请求方创建,服务链路中唯一。
  • spanId 记录当前服务块的 ID,由当前服务方创建。
  • parentId 记录上一个请求服务的 spanId。

下面我描述下,我们目前的服务调用链路过程:

  • H5 发起请求,到 Zuul 网关,Zuul 创建全局的 traceId 和自己的 spanId,然后携带这些数据到业务服务 A,并利用 Spring Cloud Sluth 传输到 RabbitMQ。
  • 业务服务 A,接收到 Zuul 传输的 traceId 和 spanId,然后把 Zuul 的 spanId 设置成 parentId,并生成自己的 spanId,然后携带这些数据到业务服务 B,并利用 Spring Cloud Sluth 传输到 RabbitMQ。
  • ....

上面图中,详细说明了整个服务调用链路的过程,这边再说下使用的技术栈:

  • Spring Cloud Sluth:和 SkyWalking 的探针概念比较类似,每个服务都进行配置,收集当然服务的请求数据(traceId 和 spanId),然后利用 stream-sluth 和 binder-rabbit 组件,将请求数据传输到 RabbitMQ。
  • Spring Cloud Zipkin:主要用于请求链路的 UI 展示,Zipkin 会从 RabbitMQ 读取请求数据,然后存储到 ElasticSearch 中,然后下次显示直接从 ElasticSearch 中读取。
  • Kibana:Kibana 也可以显示 ElasticSearch 中的请求数据,只不过不是图形化的,需要索引配置创建。

六、ELK 日志链路

上面图中已经很详细介绍了下 ELK 的流程,ELK 默认技术栈里是没有 Filebeat 的,Logstash 用作日志收集的时候,CPU 和内存会占用资源比较大,所以我们使用轻量化的 Filebeat 进行日志的收集,Filebeat 部署在每个业务服务所在的服务器,然后将收集到的日志数据传输到 Logstash,Logstash 可以部署两到三台服务器上,用作日志的过滤和分析工作,然后再将处理后的日志数据,传输到 ElasticSearch 存储。

七、统一格式返回

点关注,不迷路;持续更新Java架构相关技术及资讯热文!!!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352

推荐阅读更多精彩内容