代码记录
拥有服务治理功能,实现微服务之间的动态注册与发现
❌不在使用Eureka:1. 停更进维 2. 注册中心独立且和微服务功能解耦
Consul官网
Spring官方介绍
组件名 | 语言 | CAP | 服务健康检查 | 对外暴露接口 | Spring Cloud集成 |
---|---|---|---|---|---|
Eureka | Java | AP | 可配支持 | HTTP | 已集成 |
Consul | Go | CP | 支持 | HTTP/DNS | 已集成 |
Zookeeper | Java | CP | 支持 | 客户端 | 已集成 |
Nacos | Java | AP | 支持 | 客户端 | 已集成 |
一个分布式系统最多只能同时满足其中的两个属性。
经典CAP:
当网络分区出现后,为了保证一致性,就必须拒接请求,否则无法保证一致性,Consul 遵循CAP原理中的CP原则,保证了强一致性和分区容错性,且使用的是Raft算法,比zookeeper使用的Paxos算法更加简单。虽然保证了强一致性,但是可用性就相应下降了,例如服务注册的时间会稍长一些,因为 Consul 的 raft 协议要求必须过半数的节点都写入成功才认为注册成功 ;在leader挂掉了之后,重新选举出leader之前会导致Consul 服务不可用。结论:违背了可用性A的要求,只满足一致性和分区容错,即CP
./consul --version # 查看版本号
./consul agent -dev # 开发模式启动 http://localhost:8500
负载均衡:平摊请求,减少服务器压力
Spring-cloud-starter-loadbalancer:spring官方提供的客户端负载均衡器,在SpringCloud-commons中,用来替代以前的Ribbon,支持RestTemplate、Web Flux。
客户端与服务器端负载均衡区别:服务器端如Nginx,将客户端发起的请求到通过服务器端部署的Nginx,转发到各个服务器上。LoadBlance本地负载均衡,调用微服务接口时,在注册中心上获取信息服务列表之后缓存到JVM本地,从而在本地实现RPC远程服务调用。
Spring官方介绍
实现ReactiveLoadBalancer接口,默认使用的是RoundRobinLoadBalancer。
官方对负载均衡算法的介绍
Feign是一个声明式web服务客户端,用来替代RestTemplate,只需创建一个Rest接口并在该接口上添加注解@FeignClient。
OpenFeign基本上就是当前微服务之间调用的事实标准。
可以结合LoadBalancer实现负载均衡,结合Sentinel实现熔断降级。
Spring官方介绍 Github
超时控制说明
重试机制说明
默认情况下会创建Retry.NEVER_RETRY类型的Retry的bean,这将禁用重试,这种重试行为与Feign默认行为不同,他会自动重试IOExceptions,将它们视为网络相关的瞬态异常,以及从ErrorDecoder抛出的任何RetryableException。
默认HTTPClient修改说明
如果不做特殊配置,OpenFeign默认使用JDK自带的HttpURLConnection发送HTTP请求,
由于默认HttpURLConnection没有连接池、性能和效率比较低 ,如果采用默认,无法发挥最大性能,故使用Apach的HTTPClient 5替换默认HTTPURLConnection。
⚠️注意:httpclient的版本对齐
请求/响应压缩说明
Spring Cloud OpenFeign支持对请求和响应进行GZIP压缩,以减少通信过程中的性能损耗。
日志打印功能说明
Feign 提供了日志打印功能,我们可以通过配置来调整日志级别,
日志级别:
⚠️较为繁琐,资料少,不适合自学,面试必考
解决服务雪崩问题,对于有问题的节点,快速熔断(快速返回失败处理或者返回默认兜底数据【服务降级】)
“断路器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。
当一个组件或服务出现故障时,CircuitBreaker会迅速切换到开放OPEN状态(保险丝跳闸断电),阻止请求发送到该组件或服务从而避免更多的请求发送到该组件或服务。这可以减少对该组件或服务的负载,防止该组件或服务进一步崩溃,并使整个系统能够继续正常运行。同时,CircuitBreaker还可以提高系统的可用性和健壮性,因为它可以在分布式系统的各个组件之间自动切换,从而避免单点故障的问题。
Spring官方介绍
Spring Cloud提供的两个实现类:Resilience4j、Spring Retry
Resilience4j官网
Resilience4j 是一个轻量级的容错库,专为函数式编程设计。Resilience4j 提供了高阶函数(装饰器),可以增强任何函数式接口、lambda 表达式或方法引用,添加断路器、速率限制器、重试或舱壁。您可以在任何函数式接口、lambda 表达式或方法引用上堆叠多个装饰器。优点是可以自由选择所需的装饰器,而不需要其他任何东西。
failure-rate-threshold | 以百分比配置失败率峰值 |
---|---|
sliding-window-type | 断路器的滑动窗口期类型: 基于“次数”(COUNT_BASED)、“时间”(TIME_BASED)进行熔断,默认是COUNT_BASED。 |
sliding-window-size | 若COUNT_BASED,则N次调用中有failure-rate-threshold%失败(即5次)打开熔断断路器;若为TIME_BASED则,此时还有额外的两个设置属性,含义为:在N秒内(sliding-window-size)100%(slow-call-rate-threshold)的请求超过N秒(slow-call-duration-threshold)打开断路器。 |
slowCallRateThreshold | 以百分比的方式配置,断路器把调用时间大于slowCallDurationThreshold的调用视为慢调用,当慢调用比例大于等于峰值时,断路器开启,并进入服务降级。 |
slowCallDurationThreshold | 配置调用时间的峰值,高于该峰值的视为慢调用。 |
permitted-number-of-calls-in-half-open-state | 运行断路器在HALF_OPEN状态下时进行N次调用,如果故障或慢速调用仍然高于阈值,断路器再次进入打开状态。 |
minimum-number-of-calls | 在每个滑动窗口期样本数,配置断路器计算错误率或者慢调用率的最小调用数。比如设置为5意味着,在计算故障率之前,必须至少调用5次。如果只记录了4次,即使4次都失败了,断路器也不会进入到打开状态。 |
wait-duration-in-open-state | 从OPEN到HALF_OPEN状态需要等待的时间 |
例子:
6次访问中当执行方法的失败率达到50%时CircuitBreaker将进入开启OPEN状态(保险丝跳闸断电)拒绝所有请求。
等待5秒后,CircuitBreaker将自动从开启OPEN状态过渡到半开HALF_OPEN状态,允许一些请求通过以测试服务是否恢复正常。
如还是异常CircuitBreaker将重新进入开启OPEN状态;如正常将进入关闭CLOSE闭合状态恢复正常处理请求。
failure-rate-threshold: 50 # 设置50%的失败率阈值,超过失败请求百分比CircuitBreaker变为open
sliding-window-type: COUNT_BASED # 滑动窗口的类型
sliding-window-size: 6 # 滑动窗口的大小,单位为请求数
minimum-number-of-calls: 6 # 断路器计算失败率或慢调用之前所需的最小样本(每个滑动窗口周期)
automatic-transition-from-open-to-half-open-enabled: true # 是否启用自动从开启到半开启状态,默认值为false
wait-duration-in-open-state: 5s # 从OPEN到HALF_OPEN状态的等待时间
permitted-number-of-calls-in-half-open-state: 2 # 半开状态允许的最大请求数,默认值为10.
failure-rate-threshold: 50 # 设置50%的失败率阈值,超过失败请求百分比CircuitBreaker变为open
slow-call-duration-threshold: 2s # 慢调用时间阈值,高于此时间的调用将被视为慢调用并增加调用比例。
slow-call-rate-threshold: 30 # 慢调用百分比阈值,超过此百分比的慢调用将触发断路器。
sliding-window-type: TIME_BASED
sliding-window-size: 2 # 滑动窗口的大小配置,配置TIME_BASED表示2秒
minimum-number-of-calls: 2 # 断路器计算失败率或慢调用之前所需的最小样本(每个滑动窗口周期)
permitted-number-of-calls-in-half-open-state: 2 # 半开状态允许的最大请求数,默认值为10.
wait-duration-in-open-state: 5s # 从OPEN到HALF_OPEN状态的等待时间
record-exceptions:
- java.lang.Exception
依赖隔离&负载保护:用来限制对于下游服务的最大并发的限制
舱壁隔离说明
速率限制说明
分布式链路追踪(Distributed Tracing),就是将一次分布式请求还原成调用链路,进行日志记录,性能监控并将一次分布式请求的调用情况集中展示。比如各个服务节点上的耗时、请求具体到达哪台机器上、每个服务节点的请求状态等等。
⚠️ Sleuth停更进维, Sleuth替代方案Micrometer
Micrometer官方文档
两个关键id:Track Id(链路id)、Span Id(节点id)、Parent Id(父级节点id,Span Id)
主要通过Span Id记录整条链路
由于Micrometer Tracing是一个门面工具自身并没有实现完整的链路追踪系统,具体的链路追踪另外需要引入的是第三方链路追踪系统的依赖:
以前都是用Zuul,但是Zuul更新太水了,Spring Cloud 自己研发了Gateway替代Zuul
Spring Cloud Gateway组件的核心是一系列的过滤器,通过这些过滤器可以将客户端发送的请求转发(路由)到对应的微服务。 Spring Cloud Gateway是加在整个微服务最前沿的防火墙和代理器,隐藏微服务结点IP端口信息,从而加强安全保护。Spring Cloud Gateway本身也是一个微服务,需要注册进服务注册中心。
Spring官方介绍
工作流程说明
客户端向 Spring Cloud Gateway 发出请求。然后在 Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到 Gateway Web Handler。Handler 再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。
过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(Pre)或之后(Post)执行业务逻辑。
在“pre”类型的过滤器可以做参数校验、权限校验、流量监控、日志输出、协议转换等;
在“post”类型的过滤器中可以做响应内容、响应头的修改,日志的输出,流量监控等有着非常重要的作用。
核心:路由转发 + 断言判断 + 执行过滤器链
在配置route的uri时使用 lb://服务名 即可
Predicate断言说明
Spring Cloud中Gateway有一个RoutePredictFactory,通过RoutePredicate工厂类可以创建Predict对象,Predict对象用于Route的匹配。Spring Cloud Gateway中包含多个内置的Route Predicate Factories:After、Before、Between、Cookie、Header、Host、Method、Path、Query、ReadBody、RemoteAddr、XForwardedRemoteAddr、Weight、CloudFoundryRouteService,当然也可以自定义。
Filter过滤说明
功能上类似SpringMVC里的拦截器Interceptor,Servlet里的过滤器
"pre"和"post"分别会在请求被执行前调用和被执行后调用,用来修改请求和响应信息
作用:请求鉴权、异常处理、记录接口调用时长统计
过滤器分类