2023年7月17日发(作者:)
SpringCloud微服务架构全链路实践阅读⽬录:1. ⽹关请求流程2. Eureka 服务治理3. Config 配置中⼼4. Hystrix 监控5. 服务调⽤链路6. ELK ⽇志链路7. 统⼀格式返回⽬前公司使⽤的 Spring Cloud 整个技术组件,基本包含了上⾯图中所包含的,不得不说,Spring Cloud 整个⽣态真的很强⼤,使⽤起来也很⽅便有效。后⾯有时间再针对每个组件进⾏使⽤解读,这篇⽂章主要说下 Spring Cloud 架构的链路图,顺便把⾃⼰的思路整理下来,以备查阅。1.
在 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 的授权验证,实现的⽅式有两种:授权的配置在后端服务中(每个服务都需要当作 Resource Server 进⾏配置,需要配置公钥,接⼝的授权具体配置在注解中),Zuul 只做转发,并不进⾏授权的验证。授权的配置在 Zuul 中,也就是把 Zuul 当作 Resource Server,后端服务不需要进⾏任何处理,Zuul 中具体的实现就是AccessTokenFilter,⾥⾯的逻辑是⼿动解析 JWT,然后判断是否正确,以及解析出⽤户信息/Scope/Role,然后根据当前的请求 API,对授权 Map 中的配置进⾏匹配,如果匹配错误,直接抛出 401 授权错误。我们⽬前采⽤的是第⼆种⽅式,这两种⽅式都有利有弊,关键在于⾃⼰的取舍,为什么采⽤第⼆种⽅式?⽬的就是发挥 Zuul 的作⽤,对外⽹关进⾏统⼀授权验证。关于授权 Map,⾥⾯存储了所有服务接⼝的配置,⽰例配置:private static final Map ROUTE_MAPS;static{ ROUTE_MAPS = new HashMap
服务调⽤链路的概念,就是当服务请求发起时,记录整个请求链路的数据,以备查询。⽬前市⾯上,⼏乎所有服务调⽤链路的实现,理论基础都是基于 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 存储。7.
关于统⼀格式返回,图中已经详细的说明了,如果你有更好的⽅案,欢迎探讨。
发布者:admin,转转请注明出处:http://www.yc00.com/web/1689542643a264737.html
评论列表(0条)