网站建设经费方案,百度关键词搜索查询,厦门人才网唯一官网登录,建筑企业信用分查询系统#x1f4dd; 代码记录
Consul#xff08;服务注册与发现 分布式配置管理#xff09; 拥有服务治理功能#xff0c;实现微服务之间的动态注册与发现 ❌不在使用Eureka#xff1a;1. 停更进维 2. 注册中心独立且和微服务功能解耦 Consul官网
Spring官方介绍
三个注册中… 代码记录
Consul服务注册与发现 分布式配置管理 拥有服务治理功能实现微服务之间的动态注册与发现 ❌不在使用Eureka1. 停更进维 2. 注册中心独立且和微服务功能解耦 Consul官网
Spring官方介绍
三个注册中心区别
组件名语言CAP服务健康检查对外暴露接口Spring Cloud集成EurekaJavaAP可配支持HTTP已集成ConsulGoCP支持HTTP/DNS已集成ZookeeperJavaCP支持客户端已集成NacosJavaAP支持客户端已集成
CAP 一个分布式系统最多只能同时满足其中的两个属性。 Consistency: 强一致性每次读取都能获取到最近一次成功写入的数据。Availablity: 可用性每次请求都会在有限时间内返回结果无论结果是否为最新。Partition tolerance: 分区容错性系统在遇到网络分区节点之间无法通信时仍能继续运作。必须有
经典CAP
APEurake当网络分区出现后为了保证可用性系统B可以返回旧值保证系统的可用性。 CP当网络分区出现后为了保证一致性系统返回错误信息。 当数据出现不一致时虽然A, B上的注册信息不完全相同但每个Eureka节点依然能够正常对外提供服务这会出现查询服务信息时如果请求A查不到但请求B就能查到。如此保证了可用性但牺牲了一致性结论违背了一致性C的要求只满足可用性和分区容错即AP
当网络分区出现后为了保证一致性就必须拒接请求否则无法保证一致性Consul 遵循CAP原理中的CP原则保证了强一致性和分区容错性且使用的是Raft算法比zookeeper使用的Paxos算法更加简单。虽然保证了强一致性但是可用性就相应下降了例如服务注册的时间会稍长一些因为 Consul 的 raft 协议要求必须过半数的节点都写入成功才认为注册成功 在leader挂掉了之后重新选举出leader之前会导致Consul 服务不可用。结论违背了可用性A的要求只满足一致性和分区容错即CP
使用
./consul --version # 查看版本号
./consul agent -dev # 开发模式启动 http://localhost:8500
LoadBalance服务调用复杂均衡 负载均衡平摊请求减少服务器压力 Spring-cloud-starter-loadbalancerspring官方提供的客户端负载均衡器在SpringCloud-commons中用来替代以前的Ribbon支持RestTemplate、Web Flux。 客户端与服务器端负载均衡区别服务器端如Nginx将客户端发起的请求到通过服务器端部署的Nginx转发到各个服务器上。LoadBlance本地负载均衡调用微服务接口时在注册中心上获取信息服务列表之后缓存到JVM本地从而在本地实现RPC远程服务调用。 Spring官方介绍
负载均衡算法
实现ReactiveLoadBalancer接口默认使用的是RoundRobinLoadBalancer。
官方对负载均衡算法的介绍
RoundRobinLoadBalancer: 轮询RandomLoadBalancer: 随机
OpenFeign服务调用复杂均衡 Feign是一个声明式web服务客户端用来替代RestTemplate只需创建一个Rest接口并在该接口上添加注解FeignClient。 OpenFeign基本上就是当前微服务之间调用的事实标准。 可以结合LoadBalancer实现负载均衡结合Sentinel实现熔断降级。 Spring官方介绍 Github
超时控制
超时控制说明
connectTimeout: 连接超时时间readTimeout: 请求处理超时时间默认超时时间是60s
重试机制
重试机制说明
默认情况下会创建Retry.NEVER_RETRY类型的Retry的bean这将禁用重试这种重试行为与Feign默认行为不同他会自动重试IOExceptions将它们视为网络相关的瞬态异常以及从ErrorDecoder抛出的任何RetryableException。
默认HTTPClient修改
默认HTTPClient修改说明
如果不做特殊配置OpenFeign默认使用JDK自带的HttpURLConnection发送HTTP请求
由于默认HttpURLConnection没有连接池、性能和效率比较低 如果采用默认无法发挥最大性能故使用Apach的HTTPClient 5替换默认HTTPURLConnection。
⚠️注意httpclient的版本对齐
请求/响应压缩
请求/响应压缩说明
Spring Cloud OpenFeign支持对请求和响应进行GZIP压缩以减少通信过程中的性能损耗。
日志打印功能
日志打印功能说明
Feign 提供了日志打印功能我们可以通过配置来调整日志级别
日志级别
NONE默认的不显示任何日志BASIC仅记录请求方法、URL、响应状态码及执行时间HEADERS除了 BASIC 中定义的信息之外还有请求和响应的头信息FULL除了 HEADERS 中定义的信息之外还有请求和响应的正文及元数据
CircuitBreaker断路器
⚠️较为繁琐资料少不适合自学面试必考 解决服务雪崩问题对于有问题的节点快速熔断快速返回失败处理或者返回默认兜底数据【服务降级】 “断路器”本身是一种开关装置当某个服务单元发生故障之后通过断路器的故障监控类似熔断保险丝向调用方返回一个符合预期的、可处理的备选响应(FallBack)而不是长时间的等待或者抛出调用方无法处理的异常这样就保证了服务调用方的线程不会被长时间、不必要地占用从而避免了故障在分布式系统中的蔓延乃至雪崩。 当一个组件或服务出现故障时CircuitBreaker会迅速切换到开放OPEN状态(保险丝跳闸断电)阻止请求发送到该组件或服务从而避免更多的请求发送到该组件或服务。这可以减少对该组件或服务的负载防止该组件或服务进一步崩溃并使整个系统能够继续正常运行。同时CircuitBreaker还可以提高系统的可用性和健壮性因为它可以在分布式系统的各个组件之间自动切换从而避免单点故障的问题。 Spring官方介绍
Spring Cloud提供的两个实现类Resilience4j、Spring Retry
Resilience4j
Resilience4j官网 Resilience4j 是一个轻量级的容错库专为函数式编程设计。Resilience4j 提供了高阶函数装饰器可以增强任何函数式接口、lambda 表达式或方法引用添加断路器、速率限制器、重试或舱壁。您可以在任何函数式接口、lambda 表达式或方法引用上堆叠多个装饰器。优点是可以自由选择所需的装饰器而不需要其他任何东西。 断路Circuit Breaker
断路器状态
OPENCLOSEDHALF_OPENDISABLED(特殊状态)FORCED_OPEN(特殊状态)
3大状态之间的转换 当熔断器关闭时所有请求都会通过熔断器 失败率超过设定的阈值熔断器就会从CLOSED转到OPEN这时所有的请求都会被拒绝当经过一段时间后熔断器会从OPEN变为HALF_OPEN这时有一定数量的请求会被放入并重新计算失败率如果失败率超过阈值则变为OPEN状态如果失败率低于阈值则变为CLOSED状态 断路器使用滑动窗口来存储和统计调用的结果 基于访问数量的滑动窗口统计了最近N次调用的返回结果基于时间的滑动窗口统计了最近N秒的调用返回结果 特殊状态 这两个状态不会生成熔断时间并且不回记录事件的成功或失败退出这两个状态的唯一方法是触发状态转换或者熔断器
配置
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-size100%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舱壁隔离Bulkhead 依赖隔离负载保护用来限制对于下游服务的最大并发的限制 舱壁隔离说明
两种隔离方式
信号量舱壁SemaphoreBulkhead 当信号量有空闲时进入系统的请求会直接获取信号量并开始业务处理。当信号量全备占用时接下来的请求将会进入阻塞状态SemaphoreBulkhead提供了一个阻塞计时器 如果阻塞状态的请求在阻塞计时内无法获取到信号量则系统会拒绝这些请求。若请求在阻塞计时内获取到了信号量那将直接获取信号量并执行相应的业务处理 FixedThreadPoolBulkhead使用了有界队列和固定大小线程池 当线程池中存在空闲时则此时进入系统的请求将直接进入线程池开启新线程或使用空闲线程来处理请求当线程中无空闲时接下来的请求进入等待队列 若等待队列仍然无剩余空间时接下来的请求将直接被拒绝在队列中的请求等待线程池出现空闲时将进入线程池进行业务处理 另ThreadPoolBulkhead只对CompletableFuture方法有效所以必须创建返回CompletableFuture类型的方法
速率限制Rate Limiter
速率限制说明
限流算法
漏斗算法Leaky Bucket 一个固定容量的漏桶按照设定常量固定速率流出水滴类似医院打吊针不管你源头流量多大我设定匀速流出。如果流入水滴超出了桶的容量则流入的水滴将会溢出了(被丢弃)而漏桶容量是不变的。缺点对于存在突发特性的流量来说缺乏效率。 令牌桶算法Token Bucket Spring Cloud 默认使用的算法当用户发起请求先判断桶空不空 令牌桶算法会匀速的添加令牌至令牌桶中桶可容纳令牌的数量是有限的。用户每次发起请求先检查桶是否为空。若桶空则丢弃请求若桶不空则申请获得令牌获得令牌则可排队让处理器处理当前请求 滚动时间窗口算法Tumbling time window 允许固定数量的请求进入(比如1秒取4个数据相加超过25值就over)超过数量就拒绝或者排队等下一个时间段进入。由于是在一个时间间隔内进行限制如果用户在上个时间间隔结束前请求但没有超过限制同时在当前时间间隔刚开始请求同样没超过限制在各自的时间间隔内这些请求都是正常的。缺点间隔临界的一段时间内的请求就会超过系统限制可能导致系统被压垮。 滑动时间窗口算法Sliding time window 滑动窗口算法是把固定时间片进行划分并且随着时间移动移动方式为开始时间点变为时间列表中的第2个时间点结束时间点增加一个时间点。不断重复通过这种方式可以巧妙的避开计数器的临界点的问题。
Sleuth(Micrometer) Zipkin分布式链路追踪 分布式链路追踪Distributed Tracing就是将一次分布式请求还原成调用链路进行日志记录性能监控并将一次分布式请求的调用情况集中展示。比如各个服务节点上的耗时、请求具体到达哪台机器上、每个服务节点的请求状态等等。 ⚠️ Sleuth停更进维 Sleuth替代方案Micrometer Micrometer官方文档
分布式链路追踪原理
两个关键idTrack Id链路id、Span Id节点id、Parent Id父级节点idSpan Id
主要通过Span Id记录整条链路
Dashboard
ZipKin由Twitter公司开源开放源代码分布式的跟踪系統用于收集服务的定时数据以解决微服务架构中的延迟问 题包括数据的收集、存储、查找和展现。结合spring-cloud-sleuth使用较为简单集成方便但是功能较 简单。Cat由大众点评开源基于Java开发的实时应用监控千台包括实时应用监控业务监控。集成方案是通过代码埋 点的方式来实现监控比如拦截器过滤器等。对代码的侵入性很大集成成本较高。风险较大。PinpointPinpoint是一款开源的基于字节码注入的调用链分析以及应用监控分析工具。特点是支持多种插件UI功能 强大接入端无代码侵入。Skywalking SkyWalking是国人开源的基于字节码注入的调用链分析以及应用监控分析工具。特点是支持多 种插件UI功能较强接入端无代码侵入。
整合Micrometer Tracing
由于Micrometer Tracing是一个门面工具自身并没有实现完整的链路追踪系统具体的链路追踪另外需要引入的是第三方链路追踪系统的依赖
micrometer-tracing-bom 导入链路追踪版本中心体系化说明micrometer-tracing 指标追踪micrometer-tracing-bridge-brave 一个Micrometer模块用于与分布式跟踪工具 Brave 集成以收集应用程序的分布式跟踪数据。Brave是一个开源的分布式跟踪工具它可以帮助用户在分布式系统中跟踪请求的流转它使用一种称为跟踪上下文的机制将请求的跟踪信息存储在请求的头部然后将请求传递给下一个服务。在整个请求链中Brave会将每个服务处理请求的时间和其他信息存储到跟踪数据中以便用户可以了解整个请求的路径和性能。micrometer-observation 一个基于度量库 Micrometer的观测模块用于收集应用程序的度量数据。feign-micrometer 一个Feign HTTP客户端的Micrometer模块用于收集客户端请求的度量数据。zipkin-reporter-brave 一个用于将 Brave 跟踪数据报告到Zipkin 跟踪系统的库。补充包spring-boot-starter-actuator SpringBoot框架的一个模块用于监视和管理应用程序
Gateway服务网关 以前都是用Zuul但是Zuul更新太水了Spring Cloud 自己研发了Gateway替代Zuul Spring Cloud Gateway组件的核心是一系列的过滤器通过这些过滤器可以将客户端发送的请求转发(路由)到对应的微服务。 Spring Cloud Gateway是加在整个微服务最前沿的防火墙和代理器隐藏微服务结点IP端口信息从而加强安全保护。Spring Cloud Gateway本身也是一个微服务需要注册进服务注册中心。 Spring官方介绍
三大核心
路由Route网关的基本构建块。它由一个ID、一个目标URI、一组断言和一组过滤器定义。如果断言为True则匹配路由。断言Predicate参考的是Java8中的java.util.function.Predicate, 允许匹配HTTP请求中的任何内容例如头或参数。如果请求与断言相匹配则进行路由。过滤器Filter指的是Spring框架中GatewayFilter的实例使用过滤器可以在请求被路由前或者之后对请求进行修改。
Gateway工作流程
工作流程说明
客户端向 Spring Cloud Gateway 发出请求。然后在 Gateway Handler Mapping 中找到与请求相匹配的路由将其发送到 Gateway Web Handler。Handler 再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑然后返回。
过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(Pre)或之后(Post)执行业务逻辑。
在“pre”类型的过滤器可以做参数校验、权限校验、流量监控、日志输出、协议转换等;
在“post”类型的过滤器中可以做响应内容、响应头的修改日志的输出流量监控等有着非常重要的作用。
核心路由转发 断言判断 执行过滤器链
Route以微服务名 - 动态获取服务URI
在配置route的uri时使用 lb://服务名 即可
Predicate断言
Predicate断言说明
Spring Cloud中Gateway有一个RoutePredictFactory通过RoutePredicate工厂类可以创建Predict对象Predict对象用于Route的匹配。Spring Cloud Gateway中包含多个内置的Route Predicate FactoriesAfter、Before、Between、Cookie、Header、Host、Method、Path、Query、ReadBody、RemoteAddr、XForwardedRemoteAddr、Weight、CloudFoundryRouteService当然也可以自定义。
Filter过滤
Filter过滤说明
功能上类似SpringMVC里的拦截器InterceptorServlet里的过滤器
pre和post分别会在请求被执行前调用和被执行后调用用来修改请求和响应信息
作用请求鉴权、异常处理、记录接口调用时长统计
过滤器分类
单一内置过滤器自定义过滤器