导图社区 springCloud
这是一篇关于springCloud的思维导图,主要包括服务治理、服务调用、服务降级、网关配置、中心消息、总线消息、驱动请求、链路跟踪等内容。
编辑于2021-09-17 20:17:52springCloud
服务治理
eureka
基本定义
Eureka是一个基于REST的服务
在 Spring Cloud 微服务架构中通常用作注册中心;我们称这个服务为 Eureka Server,还有一个与之交互的客户端称之为 Eureka Client
Eureka Client需要每30秒给Eureka Server发一次心跳,同时更新Server上最新的注册信息到本地,如果Server多次没有收到来自客户端的心跳,那么在90秒内会被Server上剔除
客户端与服务器之间的通信
服务发现有两种模式:一种是客户端发现模式,一种是服务端发现模式。Eureka采用的是客户端发现模式。
注册register
更新/续借renew
抓取注册信息fectch register
保存本地
取消cancel
禁止自我保护机制后,超出90秒即把服务踢出
自我保护
阈值是要大于当前注册数量的15%,心跳持续更新失败,暂时不会把服务踢出
保证AP
集群模式:相互守望
为了保障注册中心的高可用性,容忍了数据的非强一致性,服务节点间的数据可能不一致, Client-Server 间的数据可能不一致。比较适合跨越多机房、对注册中心服务可用性要求较高的使用场景。
zookeeper
consul
Consul是HashiCorp公司推出的开源工具,Consul由Go语言开发,部署起来非常容易,只需要极少的可执行程序和配置文件,具有绿色、轻量级的特点。Consul是分布式的、高可用的、 可横向扩展的用于实现分布式系统的服务发现与配置。
服务发现、服务配置、健康检查、键值存储、安全服务通信、多数据中心
服务发现
Consul提供了通过DNS或者HTTP接口的方式来注册服务和发现服务。一些外部的服务通过Consul很容易的找到它所依赖的服务。
健康检查
Consul的Client可以提供任意数量的健康检查,既可以与给定的服务相关联(“webserver是否返回200 OK”),也可以与本地节点相关联(“内存利用率是否低于90%”)。操作员可以使用这些信息来监视集群的健康状况,服务发现组件可以使用这些信息将流量从不健康的主机路由出去
Key/Value存储
应用程序可以根据自己的需要使用Consul提供的Key/Value存储。 Consul提供了简单易用的HTTP接口,结合其他工具可以实现动态配置、功能标记、领袖选举等等功能
安全服务通信
Consul可以为服务生成和分发TLS证书,以建立相互的TLS连接。意图可用于定义允许哪些服务通信。服务分割可以很容易地进行管理,其目的是可以实时更改的,而不是使用复杂的网络拓扑和静态防火墙规则
多数据中心
Consul支持开箱即用的多数据中心. 这意味着用户不需要担心需要建立额外的抽象层让业务扩展到多个区域。
三者区别
eureka AP JAVA
zookeeper JAVA/consule CP GO
CAP
C 一致性
A 可用性
P 分区容错性
子主题
子主题
服务调用
软负载均衡(客户端) + restTemplate 调用
ribbon
euraka整合了ribbon
Ribbon通过一个@LoadBalanced注解就实现了RestTemplate请求的负载均衡
先找出列表中可用的服务,再根据七种均衡算法得出访问的服务
维护一个下挂可用的服务端清单,通过心跳检测来剔除故障的服务端节点以保证清单中都是可以正常访问的服务端节点。当客户端发送请求到负载均衡设备的时候,该设备按某种算法(比如线性轮询、按权重负载、按流量负载等)从维护的可用服务端清单中取出一台服务端端地址,然后进行转发
流程
找出列表中可用的服务
使用配置文件
使用注册中心
DiscoveryEnabledNIWSServerList
负载均衡调度器
从ServerListFilter获取到一个微服务实例集合后,ILoadBalancer需要使用某个策略从集合中选择一个服务实例, 而策略的抽象接口为IRule
Ribbon提供了七种负载均衡策略,默认的负载均衡策略是轮训策略
WeightedResponseTimeRule 针对响应时间加权轮询AvailabilityFilteringRule 可用过滤策略,先过滤出故障的或并发请求大于阈值的一部分服务实例,然后再以线性轮询的方式从过滤后的实例清单中选出一个;ZoneAvoidanceRule 从最佳区域实例集合中选择一个最优性能的服务实例RetryRule 选择一个Server,如果失败,重新选择一个Server重试
RoundRobinRule 轮训策略RandomRule 随机策略BestAvailableRule 过滤出故障服务器后,选择一个并发量最小的
openFeign
集成ribbon,负载均衡
实现微服务间的相互调用
打印日志
服务降级
hystrix
处理分布式系统的延迟、容错;避免级联故障/雪崩效应
硬件故障:如服务器宕机,机房断电,光纤被挖断
流量激增:如异常流量,重试加大流量
缓存穿透:一般发生在应用重启,所有缓存失效时,以及短时间内大量缓存失效时。大量的缓存不命中,使请求直击后端服务,造成服务提供者超负荷运行,引起服务不可用
程序BUG:如程序逻辑导致内存泄漏,JVM长时间FullGC
同步等待:服务间采用同步调用模式,同步等待造成的资源耗尽
功能
降级
基于open feign 返回友好提示fallback
@EnableHystrix//开启Hystrix
@GetMapping("/consumer/payment/hystrix/timeout/{id}") @HystrixCommand(fallbackMethod = "paymentTimeOutFallbackMethod", commandProperties = { @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1500")//超时1.5秒 }) public String paymentInfo_TimeOut(@PathVariable("id") Integer id) { String result = paymentHystrixService.paymentInfo_TimeOut(id); return result; } public String paymentTimeOutFallbackMethod(@PathVariable("id") Integer id) { return "我是消费者80,对方支付系统繁忙,请10秒后再试或者自己运行出错请检查自己。"; }
@DefaultProperties(defaultFallback = "payment_Global_FallbackMethod")public class OrderHystrixController {
熔断
拉闸,后恢复供电
熔断机制是应对雪崩效应的一种微服务链路保护机制。当扇出链路的某个微服务不可用或者响应时间太长时,会进行服务降级,进而熔断该节点微服务的调用,快速返回“错误”的响应信息。当检测到该节点微服务调用响应正常后恢复调用链路。在SpringCloud框架里熔断机制通过Hystrix实现,Hystrix会监控微服务间调用的状况,当失败的调用到一定阈值,缺省是5秒内调用20次,如果失败,就会启动熔断机制。熔断机制的注解是@HystrixCommand。
熔断有三种状态:1.Closed:关闭状态,所有请求都正常访问。2.Open:打开状态,所有请求都会被降级。Hystix会对请求情况计数,当一定时间内失败请求百分比达到阈值,则触发熔断,断路器会完全打开。默认失败比例的阈值是50%,请求次数最少不低于20次。3.Half Open:半开状态,open状态不是永久的,打开后会进入休眠时间(默认是5S)。随后断路器会自动进入半开状态。此时会释放部分请求通过,若这些请求都是健康的,则会完全关闭断路器,否则继续保持打开,再次进行休眠计时
统计用户在指定的时间范围(默认10s)之内的请求总数达到指定的数量之后,如果不健康的请求(超时、异常)占总请求数量的百分比(50%) 达到了指定的阈值之后,就会触发熔断。触发熔断,断路器就会打开(open),此时所有请求都不能通过。在5s之后,断路器 会恢复到半开状态(half open),会允许少量请求通过,如果这些请求都是健康的,那么断路器会回到关闭状态(close).如果 这些请求还是失败的请求,断路器还是恢复到打开的状态(open).
使用
启动类上开启服务熔断 @EnableCircuitBreaker //开启服务熔断
@HystrixCommand(fallbackMethod = "handleCircuitBreaker",commandProperties = { @HystrixProperty(name="circuitBreaker.enabled", value="true"), // 是否开启断路器 @HystrixProperty(name="circuitBreaker.requestVolumeThreshold", value="10"), //请求次数(请求总数阀值) @HystrixProperty(name="circuitBreaker.sleepWindowInMilliseconds", value="10000"), // 时间窗口期(快照时间窗) @HystrixProperty(name="circuitBreaker.errorThresholdPercentage", value="60"), // 失败率达到多少后跳闸(错误百分比阀值) //整体意思:10秒内 10次请求,有6次失败,就跳闸 })
打开或者关闭的条件
当满足一定阀值,默认10秒超出了20次
当失败率达到一定阀值时,默认10秒内超出了50%的请求
达到以上阀值,断路器会开启
开启时,所有请求都不会转发
一段时间后,默认是5秒,会处于半开状态,会让其中一个请求转发,如果成功,断路器关闭,失败,继续开启
引起降级的条件
访问超时
程序报错
断路器打开
线程池满了
类型
熔断打开
熔断半开
熔断关闭
限流
排队
健康监测dashborad
生产者、消费者都可以配置,一般是消费者
网关
gateway
选择的原因
neflix不太靠谱,zuul2.0,迟迟不发布
springcloud没有整合zuul
SpringCloud Gateway具有如下特性
基于springboot2.0构建
动态路由:能够匹配任何请求属性
可以对路由指定断言、过滤器
继承hystrix断路器功能
继承springcloud服务发现功能
已于编写的断言、过滤器
请求限流功能
支持路径重写
gateway跟zuul的区别
zuul是一个基于阻塞I/O的API gateway
java实现,第一次加载会慢,降低性能
gateway建立在springboot上,使用非阻塞API,支持webSocket
核心
路由
after
before
between
cookies
header
host
method
path
query
断言
过滤
种类
单一 GatewayFilter 全局 GlobalFilter
生命周期
在业务逻辑之前 在业务逻辑之后
自定义过滤器
日志
登陆权限
实现globalFilter ordered接口
配置方法
配置文件
动态配置
代码注入bean routelocator
配置中心
config
集中管理配置文件
各个环境的配置
运行期间动态配置,无需重启
rest接口形式暴露
配置
主启动类@enabledconfigServer
@refreshScope
curl http:localhost:3355/actuator/refresh
客户端
bootstrap.yml>application.yml
消息总线
bus
配合config动态刷新配置
设计思想
触发一个用户端,刷新所有用户端
不合适
打破单一性、对等性
配置增多
触发一个客户端,刷新所有用户端
步骤
curl http:localhost:3355/actuator/bus-refresh/{微服务name+端口号}
定点通知
服务端添加总线支持
客户端增加总线支持
rabbitMq
topic交换机
消息驱动
steam
屏蔽底层消息中间件的差异,降低切换成本,统一消息的编程模型
通过定义的绑定器Binder作为中间层,实现了应用程序和消费中间件的隔离
定义
binder方便链接中间件
channel通道,转发媒介
source和sink 输出、接收
mq
发送消息
@enableBinding(source.class)
yml 配置 input 交换机名称
接收消息
@enableBinding(sink.class)
yml 配置 output 交换机名称
@streamListener(sink.input)
重复消费
分组
消费者yml 配置同一个组group:xxxx
持久化
配置分组也会持久化,消息不丢失
请求链路跟踪
sleuth
微服务现状
随着业务的发展,单体架构变为微服务架构,并且系统规模也变得越来越大,各微服务间的调用关系也变得越来越复杂。
在微服务的应用中,一个由客户端发起的请求在后端系统中会经过多个不同的微服务调用来协同产生最后的请求结果
在复杂的微服务架构系统中,几乎每一个前端请求都会形成一个复杂的分布式服务调用链路,在每条链路中任何一个依赖服务出现延迟超时或者错误都有可能引起整个请求最后的失败
是什么
微服务跟踪(sleuth)其实是一个工具,它在整个分布式系统中能跟踪一个用户请求的过程(包括数据采集,数据传输,数据存储,数据分析,数据可视化),捕获这些跟踪数据,就能构建微服务的整个调用链的视图,这是调试和监控微服务的关键工具。
能干什么
提供链路追踪
通过sleuth可以很清楚的看出一个请求经过了哪些服务,可以方便的理清服务局的调用关系
性能分析
通过sleuth可以很方便的看出每个采集请求的耗时,分析出哪些服务调用比较耗时,当服务调用的耗时随着请求量的增大而增大时,也可以对服务的扩容提供一定的提醒作用
数据分析优化链路
对于频繁地调用一个服务,或者并行地调用等,可以针对业务做一些优化措施
可视化
对于程序未捕获的异常,可以在zipkpin界面上看到
名词
trace
链路,存在唯一标识
span
来源,请求信息
springcloud alibaba
nacos
注册中心+配置中心 /负载均衡
负载均衡、注册中心
主启动类 生产者@enableDisoveryServer
主启动类 消费者@enableDisoveryClient
注册中心
支持AP/CP
配置中心
@refreshScope 动态刷新
建立bootstrap.yml原因:先从配置中心拉取配置,再读取yml本机配置
隔离配置
命名空间namespace
yml增加namespace:xxxx配置
分组group
yml增加group:xxxx配置
dataId
默认空间+默认分组+dev/test+dataId
集群模式、持久化
derby改成mysql
nacos下application.yml
新建数据库表
sentinel
熔断限流
比对hystrix
hystrix
需要程序员手工搭建平台
没有web可配置界面
sentinel
单独组件
web界面配置
实时监控(懒加载,访问了才有)
流量控制
流控规则
直接,快速失败,web界面编辑
QPS
时间内不允许超出阈值,请求进入前
线程数
请求数不能超出阈值,请求进入后
关联
当A关联的B达到阈值时,就限流A自己
流控效果
预热
冷加载因子3----10/3,5秒内预热时长,从3到10
请求慢慢放进来
匀速排队
处理突发性请求
临时,非持久化
降级规则
RT 平均响应时间
1s内持续进入5个请求,对应的平均响应时间超出阈值,方法自动熔断
20秒以内处理完所有请求+1s内进入5个请求,未来1s内开启降级
上限是4900s
时间窗口结束,才关闭降级
异常比例
QPS>5 & 方法异常超出阈值
异常数
1分钟之内超出异常数
先报错后降级
没有半开状态
热点参数限流
限流请求路径中的参数
@histrixCommand ---->@sentinelResource
blockhandle =“方法名”,blockException(降级方法的参数)
没有配置,展示sentinel默认界面
处理的是sentinel控制台上配置的违规情况,java 运行时异常不处理
方法的参数,请求QPS大于阈值
例外项
当参数=1的时候,阈值是1
当参数=5的时候,阈值是200
系统自适应规则
Load
RT
线程数
入口QPS
访问系统的阈值超出
CPU使用率
自定义限流处理customBlockHandle
不支持private方法
核心API
SPHU定义资源
Tracer定义统计
contextUtil定义上下文
熔断
整合ribbon、openfeign、fallback
fallback 处理 java异常
@sentinelResource(value="fallback",fallback="handleMethod")
blockHandle处理sentinel规则
@sentinelResource(value="fallback",blockhandle="handleMethod")
fallback、blockHandle都配置,blockHandle优先级较高
@sentinelResource(value="fallback",fallback="handleMethod",blockhandle="handleMethod")
忽略异常exceptionsToIgnore
@sentinelResource(value="fallback",fallback="handleMethod",blockhandle="handleMethod",exceptionsToIgnore={nullpointException.class})
浮动主题