安福网站建设上海微信网站公司哪家好

当前位置: 首页 > news >正文

安福网站建设,上海微信网站公司哪家好,wordpress 固定链接 中文,内容管理系统cms文章目录 一、负载均衡概论1、服务器负载均衡2、客户端负载均衡3、客户端负载均衡策略(SpringCloudRibbon)4、客户端负载均衡策略(SpringCloudLoadBalancer) 二、SpringCloudOpenFeign服务调用1、OpenFeign服务调用的使用2、OpenFeign服务调用的日志增强3、OpenFeign服务调用超… 文章目录 一、负载均衡概论1、服务器负载均衡2、客户端负载均衡3、客户端负载均衡策略(SpringCloudRibbon)4、客户端负载均衡策略(SpringCloudLoadBalancer) 二、SpringCloudOpenFeign服务调用1、OpenFeign服务调用的使用2、OpenFeign服务调用的日志增强3、OpenFeign服务调用超时机制 三、SpringCloudResilience4J服务断路器11、服务雪崩的解决方案2、SpringCloudResilience4J服务断路器3、Resilience4J的超时降级 (timelimiter)4、Resilience4J的重试机制(retry)5、Resilience4J的熔断降级(circuitbreaker)6、Resilience4J的慢调用熔断降级(slowcircuitbreaker) 四、SpringCloudResilience4J服务断路器21、Resilience4J信号量服务隔离(bulkhead)2、Resilience4J线程池服务隔离(bulkhead)3、Resilience4J的服务限流(ratelimiter) 总结SpringCloud 2022.0.2和SpringBoot 3.0.5 一、负载均衡概论 1、服务器负载均衡 在服务集群内设置一个中心化负载均衡器例如Nginx。发起服务间调用的时候服务请求并不直接发向目标服务器而是发给这个全局负载均衡器它再根据配置的负载均衡策略将请求转发到目标服务。优点服务端负载均衡应用范围很广它不依赖于服务发现技术客户端并不需要拉取完整的服务列表同时发起服务调用的客户端也不用操心该使用什么负载均衡策略。劣势网络消耗以及复杂度和故障率提升。 2、客户端负载均衡 SpringCloudLoadbalancer采用了客户端负载均衡技术每个发起服务调用的客户端都存有完整的目标服务地址列表根据配置的负载均衡策略由客户端自己决定向哪台服务器发起调用。优势网络开销小并且配置灵活劣势需要满足一个前置条件发起服务调用的客户端需要获取所有目标服务的地址这样它才能使用负载均衡规则选取要调用的服务。即客户端负载均衡技术需要依赖服务发现技术来获取服务列表。客户端负载均衡可以使用Eureka来获取微服务实例清单缓存到本地然后通过Loadbalancer根据负载均衡策略从服务实例清单列表中选择具体实例。SpringCloudRibbon是NetFlix发布的负载均衡器它有助于http和tcp的客户端行为。可以根据负载均衡算法轮询、随机或自定义自动帮助服务消费者请求默认就是轮询。SpringCloudLoadBalancer由于Ribbon已经进入停更维护状态并且Ribbon 2并不与Ribbon 1相互兼容所以Spring Cloud全家桶在Spring Cloud Commons项目中添加了Spring cloud Loadbalancer作为新的负载均衡器并且做了向前兼容就算你的项目中继续用 Spring Cloud Netflix 套装包括RibbonEurekaZuulHystrix等等让你的项目中有这些依赖你也可以通过简单的配置把Ribbon替换成Spring Cloud LoadBalancer。 3、客户端负载均衡策略(SpringCloudRibbon) RandomRule(随机)RoundRobinRule(轮询)RetryRule(重试) 即失败后在指定时间内重试。WeightedResponseTimeRule 即根据响应时间的长短给权重。响应时间越短权重越大也就是被选中的概率越大。BestAvailableRule 在过滤掉故障服务后它会基于过去30分钟的统计结果选取当前并发量最小的服务节点作为目标地址。如果统计结果尚未生成则采用轮询的方式选定节点。AvailabilityFilteringRule 每次AvailabilityFilteringRule简称AFR都会请求RobinRule挑选一个节点然后对这个节点做以下两步检查是否处于不可用节点当前的active请求连接数超过阈值超过了则表示节点目前太忙不适合接客就会让RobinRule重新选择一个服务节点。 如果被选中的server不幸挂掉了那么AFR会自动重试次数最多10次还是没连上的话就会让RobinRule重新选择一个服务节点。ZoneAvoidanceRule 复合判断server所在区域的性能和server的可用性选择服务器 4、客户端负载均衡策略(SpringCloudLoadBalancer) RandomLoadBalancer随机RoundRobinLoadBalancer(默认轮询) 二、SpringCloudOpenFeign服务调用 1、OpenFeign服务调用的使用 之前使用RestTemplate比较麻烦改用OpenFeign进行服务的调用会更得心应手。 在cloud父工程下创建一个子模块cloud-consumer-openfeign-order80 即用openfeign服务调用的order模块去替换原先的RestTemplate服务调用的order模块。 在POM文件中添加依赖 ?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdparentartifactIdcloud/artifactIdgroupIdcom.zzx/groupIdversion1.0-SNAPSHOT/version/parentmodelVersion4.0.0/modelVersionartifactIdcloud-consumer-openfeign-order80/artifactIdpropertiesmaven.compiler.source17/maven.compiler.sourcemaven.compiler.target17/maven.compiler.target/propertiesdependencies!– 引入OpenFeign依赖 –dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-openfeign/artifactId/dependency!– 引入Eureka client依赖 –dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-eureka-client/artifactId/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!– actuator监控信息完善 –dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId/dependency/dependencies/project即比原先多了一个OpenFeign依赖。 在resources目录下创建application.yml文件 server:port: 80 eureka:instance:# 注册的实例名instance-id: cloud-consumer-openfeign-order80client:service-url:# Eureka server的地址#单机#defaultZone: http://localhost:7001/eureka/#集群defaultZone: http://localhost:7001/eureka,http://localhost:7002/eureka spring:application:#设置应用名name: cloud-order-consumer 即修改了该消费者在Eureka的注册的实例名。 创建主启动类OrderFeignMain80 package com.zzx;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.openfeign.EnableFeignClients;Slf4j SpringBootApplication //开启openfeign服务调用 EnableFeignClients public class OrderFeignMain80 {public static void main(String[] args) {SpringApplication.run(OrderFeignMain80.class,args);log.info(***** OrderFeignMain80 启动成功 ***);} } 此时多了一个开启Openfeign服务调用的注解 在com.zzx包中创建一个service包在该包下创建OpenFeign服务调用的接口PaymentFeignService package com.zzx.service;import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping;/ 支付远程调用OpenFeign接口/ //根据服务生产者的名字调用 FeignClient(CLOUD-PAYMENT-PROVIDER) public interface PaymentFeignService {GetMapping(/payment/index)String index(); } 即将服务的应用名给到OpenFeign再由它去获取Eureka中对应的实例的uri通过该uri再拼接上GetMapping中的url即可调用服务对应的方法。 在com.zzx包中创建一个controller包在该包下创建OpenFeign服务调用的控制类OrderController package com.zzx.controller;import com.zzx.service.PaymentFeignService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;RestController RequestMapping(order) public class OrderController {Autowiredprivate PaymentFeignService paymentFeignService;/** openfeign远程服务调用/RequestMapping(index)public String index(){return paymentFeignService.index();} } 即可以通过浏览器访问并映射到该Controller对应地址的方法上该Controller对应的方法就会调用该OpenFeign接口的对应方法该接口方法就会通过OpenFeign调用Eureka对应实例的方法最后返回结果到浏览器。 测试 1在浏览器中打开localhost:80/order/index
2、OpenFeign服务调用的日志增强 OpenFeign的日志级别 1NONE默认的不显示任何日志 2BASIC仅记录请求方法、URL、响应状态码及执行时间 3HEADERS除了BASIC中定义的信息之外还有请求和响应的头信息 4FULL除了HEADERS中定义的信息之外还有请求和响应的正文及元数据。 在子模块openfeign的com.zzx包下创建config包在该包下创建类OpenFeignConfig package com.zzx.config;import feign.Logger; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;Configuration public class OpenFeignConfig {/**
日志级别定义/BeanLogger.Level feignLoggerLevel(){return Logger.Level.FULL;} } 即将该类指定为配置类创建一个方法返回Feign的日志级别对象指定为Bean对象交给SpringIOC容器。 在application.yml文件中添加如下 logging:level:com.zzx.service: debugcom.zzx.service是openfeign接口所在的包名。 测试 1在浏览器中访问localhost:80/order/index
3、OpenFeign服务调用超时机制 服务消费者在调用服务提供者的时候发生了阻塞、等待的情形这个时候服务消费者会一直等待下去。 在某个峰值时刻大量的请求都在同时请求服务消费者会造成线程的大量堆积势必会造成雪崩。 利用超时机制来解决这个问题设置一个超时时间在这个时间段内无法完成服务访问则自动断开连接。 在子模块openfeign中的yml文件中添加如下超时时间的配置 spring:application:#设置应用名name: cloud-order-consumercloud:#默认超时时间openfeign:client:config:default:#连接超时时间connectTimeout: 2000#读取超时时间readTimeout: 2000在子模块payment中的com.zzx.controller包下的PaymentController类中添加如下代码 GetMapping(timeout)public String timeout() throws InterruptedException {TimeUnit.SECONDS.sleep(5);return payment timeout;}即用来模拟超时的方法让openfeign调用。 在子模块openfeign中的com.zzx.service包下的PaymentFeignService类中添加如下代码 GetMapping(/payment/timeout) String timeout();在子模块openfeign中的com.zzx.controller包下的OrderController类中添加如下代码 GetMapping(/timeout)public String timeout() {return paymentFeignService.timeout();}即调用提供者Payment的超时方法。 测试 1重启服务提供者和消费者 2浏览器访问http://localhost:80/order/timeout 3控制台报读取数据超时错误
三、SpringCloudResilience4J服务断路器1 1、服务雪崩的解决方案 服务雪崩服务与服务之间的依赖性故障会传播造成连锁反应会对整个微服务系统造成灾难性的严重后果这就是服务故障的“雪崩”效应。 造成雪崩的原因 1服务提供者不可用硬件故障、程序bug、缓存击穿、用户大量请求 2重试加大流量用户重试代码逻辑重试 3服务调用者不可用同步等待造成的资源耗尽服务熔断 熔断就跟保险丝一样当一个服务请求并发特别大服务器已经招架不住了调用错误率飙升当错误率达到一定阈值后就将这个服务熔断了。熔断之后后续的请求就不会再请求服务器了以减缓服务器的压力。服务降级 1服务降级 fallback 概念服务器繁忙请稍后重试不让客户端等待并立即返回一个友好的提示。 2使用场景当下游的服务因为某种原因响应过慢下游服务主动停掉一些不太重要的业务释放出服务器资源增加响应速度 当下游的服务因为某种原因不可用上游主动调用本地的一些降级逻辑避免卡顿迅速返回给用户 3出现服务降级的情况 程序运行异常 超时 服务熔断触发服务降级 线程池/信号量打满也会导致服务降级服务隔离 1线程池隔离 将用户请求线程和服务执行线程分割开来同时约定了每个服务最多可用线程数。 支持超时可直接返回 支持熔断当线程池到达maxSize后再请求会触发fallback接口进行熔断 隔离原理每个服务单独使用线程池 可以是异步也可以是同步。看调用的方法 资源消耗大大量线程的上下文切换容易造成机器负载高 2信号量隔离 它和线程池技术一样控制了服务可以被同时访问的并发数量。 不支持超时如果阻塞只能通过调用协议如socket超时才能返回 支持熔断当信号量达到maxConcurrentRequests后。再请求会触发fallback 隔离原理通过信号量的计数器 支持同步调用不支持异步 资源消耗小只是个计数器服务限流 1限流模式主要是提前对各个类型的请求设置最高的QPS阈值若高于设置的阈值则对该请求直接返回不再调用后续资源。 2限流的目的是通过对并发访问/请求进行限速或者对一个时间窗口内的请求进行限速来保护系统一旦达到限制速率则可以拒绝服务、排队或等待、降级等处理。 3流量控制 网关限流防止大量请求进入系统消息队列Mq实现流量消峰 用户交流限流提交按钮限制、点击频率限制等 2、SpringCloudResilience4J服务断路器 Resilience4J服务断路器 1Hystrix,这个断路器是SpringCloud中最早支持的一种容错方案现在这个断路器已经处于维护状态已经不再更新了Hystrix依赖了Archaius Archaius本身又依赖很多第三方包例如 Guava、Apache Commons Configuration 等。 2Resilience4J是一个轻量级的容错组件其灵感来自于Hystrix但主要为Java 8和函数式编程所设计,也就是我们的lambda表达式。轻量级体现在其只用 Vavr 库前身是 Javaslang没有任何外部依赖。Resilience4J的可用性功能 1resilience4j-circuitbreaker熔断 2resilience4j-ratelimiter限流 3resilience4j-bulkhead隔离 4resilience4j-retry自动重试 5resilience4j-cache结果缓存 6resilience4j-timelimiter超时处理 在使用Resilience4j的过程中不需要引入所有的依赖只引入需要的依赖即可。断路器CircuitBreaker通常存在三种状态CLOSE、OPEN、HALF_OPEN并通过一个时间或数量窗口来记录当前的请求成功率或慢速率从而根据这些指标来作出正确的容错响应。 6种状态 1CLOSED: 关闭状态代表正常情况下的状态允许所有请求通过,能通过状态转换为OPEN 2HALF_OPEN: 半开状态即允许一部分请求通过,能通过状态转换为CLOSED和OPEN 3OPEN: 熔断状态即不允许请求通过能通过状态转为为HALF_OPEN 4DISABLED: 禁用状态即允许所有请求通过出现失败率达到给定的阈值也不会熔断不会发生状态转换。 5METRICS_ONLY: 和DISABLED状态一样也允许所有请求通过不会发生熔断但是会记录失败率等信息不会发生状态转换。 6FORCED_OPEN: 与DISABLED状态正好相反启用CircuitBreaker但是不允许任何请求通过不会发生状态转换。主要的3种状态 1closed - open : 关闭状态到熔断状态 当失败的调用率比如超时、异常等默认50%达到一定的阈值服务转为open状态在open状态下所有的请求都被拦截。 2open- half_open: 当经过一定的时间后CircubitBreaker中默认为60s服务调用者允许一定的请求到达服务提供者。 3half_open - open: 当half_open状态的调用失败率超过给定的阈值转为open状态 half_open - closed: 失败率低于给定的阈值则默认转换为closed状态 3、Resilience4J的超时降级 (timelimiter) 在cloud父工程下创建一个子模块cloud-consumer-resilience4j-order80 在该子模块的POM文件中添加如下依赖 ?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdparentartifactIdcloud/artifactIdgroupIdcom.zzx/groupIdversion1.0-SNAPSHOT/version/parentmodelVersion4.0.0/modelVersionartifactIdcloud-consumer-resilience4j-order80/artifactIdpropertiesmaven.compiler.source17/maven.compiler.sourcemaven.compiler.target17/maven.compiler.target/propertiesdependencies!– 引入Eureka 客户端依赖 –dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-eureka-client/artifactId/dependency!– 引入服务调用依赖 OpenFigen –dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-openfeign/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdversion1.18.22/version/dependency!– actuator监控信息完善 –dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId/dependency!– 引入断路器依赖resilience4j –dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-circuitbreaker-resilience4j/artifactId/dependency/dependencies/projectspringcloud新版本不需要引入io.github.resilience4j的包。 在该子模块中的java目录中创建包com.zzx并在该包下创建主启动类OrderResilience4JMain80 package com.zzx;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.openfeign.EnableFeignClients;/**
主启动类/ EnableFeignClients SpringBootApplication Slf4j public class OrderResilience4JMain80 {public static void main(String[] args) {SpringApplication.run(OrderResilience4JMain80.class,args);log.info(**** OrderResilience4JMain80服务 启动成功 **);} } 在该子模块中的包com.zzx下创建包service并在该包下创建OpenFeign服务调用的接口PaymentOpenFeignService package com.zzx.service;import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping;/ 支付远程调用OpenFeign接口/ //根据服务生产者的名字调用 FeignClient(CLOUD-PAYMENT-PROVIDER) public interface PaymentOpenFeignService {GetMapping(/payment/timeout)String timeout(); } 调用支付服务提供者的测试超时方法。 在resources目录中创建application.yml文件代码如下 server:port: 80 eureka:instance:# 注册的实例名instance-id: cloud-consumer-resilience4j-order80client:service-url:# Eureka server的地址#单机#defaultZone: http://localhost:7001/eureka/#集群defaultZone: http://localhost:7001/eureka,http://localhost:7002/eureka spring:application:#设置应用名name: cloud-order-consumer #超时机制 resilience4j:timelimiter:instances:delay:# 设置超时时间2stimeout-duration: 2 即配置resilience4j的超时机制。 在该子模块中的包com.zzx下创建包controller并在该包下创建控制层类OrderController package com.zzx.controller;import com.zzx.service.PaymentOpenFeignService; import io.github.resilience4j.timelimiter.annotation.TimeLimiter; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;import java.util.concurrent.CompletableFuture; import java.util.function.Supplier;/** 订单控制层/ Slf4j RestController RequestMapping(order) public class OrderController {Autowiredprivate PaymentOpenFeignService paymentOpenFeignService;/** 测试超时降级** return*/GetMapping(timeout)TimeLimiter(name delay, fallbackMethod timeoutfallback)public CompletableFutureString timeout() {log.info(******进入方法***);//异步操作CompletableFutureString timeout CompletableFuture.supplyAsync((SupplierString)()-paymentOpenFeignService.timeout());log.info(***离开方法***);return timeout;}/ 超时服务降级方法* param e* return/public CompletableFutureResponseEntity timeoutfallback(Exception e){e.printStackTrace();return CompletableFuture.completedFuture(ResponseEntity.ok(读取超时));} } 即使用OpenFeign调用支付服务提供者的测试超时方法。此时异步操作返回类型为CompletableFutureString使用注解TimeLimiter来实现超时注解中的name属性的值跟yml文件的resilience4j.timelimiter.instances的下一个属性名相同然后在yml文件中该属性名的下一个属性也就是在设置超时时间的属性中设置超时时间的值。 fallbackMethod属性即设置超时的时候回调的方法名该方法可以使服务降级等即直接返回一个友好提示信息。 supplyAsync需要使用函数作为参数此时应用lambda箭头函数()-的方式。 访问浏览器进行测试http://localhost/order/timeout
4、Resilience4J的重试机制(retry) 在该子模块中的包com.zzx.controller下的控制层类OrderController中添加重试机制的方法retry /**
重试* return*/ GetMapping(retry) Retry(name backendA) public CompletableFutureString retry() {log.info(******进入方法***);//异步操作CompletableFutureString timeout CompletableFuture.supplyAsync((SupplierString)()-paymentOpenFeignService.timeout());log.info(***离开方法***);return timeout; }此时使用resilience4j的retry注解name的属性值与yml文件中对应。 在yml文件中添加重试机制的配置 resilience4j:#超时机制timelimiter:instances:delay:# 设置超时时间2stimeout-duration: 2#重试机制retry:instances:backendA:#最大重试次数max-attempts: 3#固定的重试间隔wait-duration: 10senable-exponential-backoff: trueexponential-backoff-multiplier: 2每隔10s重试一次最多重试3次。 测试重试机制 1此时重启子模块cloud-consumer-resilience4j-order80并且关闭子模块支付提供者payment8001服务。因为当连接不上服务提供者时会进行重试。 2浏览器访问http://localhost/order/retry
5、Resilience4J的熔断降级(circuitbreaker) JMETER的安装使用https://blog.csdn.net/weixin_49076273/article/details/126022329 在yml文件中配置熔断机制 #熔断机制 resilience4j.circuitbreaker:configs:default:# 熔断器打开的失败阈值30%failureRateThreshold: 30# 默认滑动窗口大小circuitbreaker使用基于计数和时间范围欢动窗口聚合统计失败率slidingWindowSize: 10# 计算比率的最小值和滑动窗口大小去最小值即当请求发生5次才会计算失败率minimumNumberOfCalls: 5# 滑动窗口类型默认为基于计数的滑动窗口slidingWindowType: TIME_BASED# 半开状态允许的请求数permittedNumberOfCallsInHalfOpenState: 3# 是否自动从打开到半开automaticTransitionFromOpenToHalfOpenEnabled: true# 熔断器从打开到半开需要的时间waitDurationInOpenState: 2srecordExceptions:- java.lang.Exceptioninstances:backendA:baseConfig: default在该子模块中的包com.zzx.controller下的控制层类OrderController中添加熔断机制的方法circuitbreaker /
熔断降级* return*/GetMapping(circuitbreaker)CircuitBreaker(name backendA,fallbackMethod circuitbreakerfallback)public String circuitbreaker() {log.info(******进入方法***);String index paymentOpenFeignService.index();log.info(***离开方法***);return index;}public String circuitbreakerfallback(Exception e){e.printStackTrace();return 服务器繁忙请稍后重试;}用Jmeter进行测试 在配置完参数后点击运行即可。 此时有10个http请求该地址先把payment8001服务关闭使错误率提高让cirvuitbreaker熔断器的状态切换为打开即不再接收http请求。过了2秒又切换为半开状态此时半开最多只能接收3个请求如果此时3个请求错误率还是很高则又会切换到打开状态。等2秒又切换回半开直到3个请求的成功率达到阈值才会将状态切换为关闭。 然后这里使用了熔断降级所以每次当状态为打开时后面2秒的http请求都会返回一个友好提示信息。直接半开或关闭状态才继续接收http请求去访问服务提供者。
6、Resilience4J的慢调用熔断降级(slowcircuitbreaker) 在yml文件中配置慢调用熔断降级 #慢调用熔断降级backendB:# 熔断器打开的失败阈值failureRateThreshold: 50# 慢调用时间阈值 高于这个阈值的slowCallDurationThreshold: 2s# 慢调用百分比阈值断路器调用时间大于slowslowCallRateThreshold: 30slidingWindowSize: 10slidingWindowType: TIME_BASEDminimumNumberOfCalls: 2permittedNumberOfCallsInHalfOpenState: 2waitDurationInOpenState: 2seventConsumerBufferSize: 10与熔断降级有一些不同慢调用熔断降级顾名思义有慢调用的配置也就是熔断器在http请求超时的配置。 该配置中即http请求超过2s的比例高于等于30%或者失败的阈值高于50%就开启熔断器。 在该子模块中的包com.zzx.controller下的控制层类OrderController中添加慢调用熔断降级的方法slowcircuitbreaker /
慢调用熔断降级* return*/ GetMapping(slowcircuitbreaker) CircuitBreaker(name backendB,fallbackMethod slowcircuitbreakerfallback) public String slowcircuitbreaker() {log.info(******进入方法***);String index paymentOpenFeignService.timeout();log.info(***离开方法***);return index; } public String slowcircuitbreakerfallback(Exception e){e.printStackTrace();return 正在处理请稍等; }测试 1使用Jmeter测试该url映射接口 2JMeter在第一次发送http请求时慢调用使熔断器处于关闭状态2s后打开半开状态。在第二次发送http请求时熔断器处于半开状态这时候在访问两次http请求后不会访问服务提供者payment8001而是直接返回友好提示信息。
四、SpringCloudResilience4J服务断路器2 1、Resilience4J信号量服务隔离(bulkhead) 在消费者服务的yml文件中配置信号量隔离 resilience4j:#信号量隔离bulkhead:instances:backendA:# 隔离允许并发线程执行的最大数量maxConcurrentCalls: 5# 当达到并发调用数量时新的线程的阻塞时间maxWaitDuration: 20ms 在该子模块中的包com.zzx.controller下的控制层类OrderController中添加信号量隔离的方法bulkhead /
信号量隔离* return*/ GetMapping(bulkhead) Bulkhead(name backendA,type Bulkhead.Type.SEMAPHORE) public String bulkhead() {log.info(******进入方法***);String index paymentOpenFeignService.timeout();log.info(***离开方法***);return index; }测试 1重启消费者服务后配置访问的url接口进行测试
2、Resilience4J线程池服务隔离(bulkhead) 在消费者服务的yml文件中配置线程池隔离 #线程池隔离 esilience4j:thread-pool-bulkhead:instances:backendA:# 最大线程池大小maxThreadPoolSize: 4# 核心线程池大小coreThreadPoolSize: 2# 队列容量#queueCapacity: 2在该子模块中的包com.zzx.controller下的控制层类OrderController中添加线程池隔离的方法future /
线程池隔离* return*/ GetMapping(thread) Bulkhead(name backendA,type Bulkhead.Type.THREADPOOL) public CompletableFuture future() throws InterruptedException {log.info(******进入方法***);TimeUnit.SECONDS.sleep(5);String index paymentOpenFeignService.timeout();log.info(***离开方法***);return CompletableFuture.supplyAsync(()-信号量); }3、Resilience4J的服务限流(ratelimiter) 在消费者服务的yml文件中配置服务限流 resilience4j:ratelimiter:instances:backendA:# 限流周期时长。 默认500纳秒limitRefreshPeriod: 5s# 周期内允许通过的请求数量。 默认50limitForPeriod: 2 在该子模块中的包com.zzx.controller下的控制层类OrderController中添加服务限流的方法rateLimiter / 限流* return*/ GetMapping(rate) RateLimiter(name backendA) public String rateLimiter() throws InterruptedException {log.info(******进入方法***);TimeUnit.SECONDS.sleep(5);//异步操作String index paymentOpenFeignService.index();log.info(***离开方法******);return index; }测试服务限流 1使用JMeter测试 此时刚好5秒通过2次。
总结SpringCloud 2022.0.2和SpringBoot 3.0.5 1客户端负载均衡可以使用Eureka来获取微服务实例清单缓存到本地然后通过Loadbalancer根据负载均衡策略从服务实例清单列表中选择具体实例。 2服务端负载均衡发起服务间调用的时候服务请求并不直接发向目标服务器而是发给这个全局负载均衡器它再根据配置的负载均衡策略将请求转发到目标服务。 3客户端负载均衡SpringCloudRibbon在Ribbon2已经停更并且1和2不兼容后面SpringCloud将SpringCloudLoadBalancer作为新的客户端负载均衡器。1SpringCloudOpenFeign的作用是服务调用并且支持SpringMVC的标准注解。 OpenFeign服务调用的流程即先创建一个OpenFeign的接口并为其指定应用名以及拼接上方法上对应的url在Controller中自动装配后再调用对应的接口方法即可。 2OpenFeign服务调用的日志级别有4个分别是NONE、BASIC、HEADERS、FULL。 设置OpenFeign的日志级别需要定义一个配置类在类中定义一个方法返回OpenFeign的日志级别将该方法上方添加Bean注解交给SpringIOC容器管理并在yml文件中配置即可。 3设置超时时间首先需要在服务消费者的yml文件中配置OpenFeign的超时时间然后通过消费者调用提供者提供者超时则会报错。避免造成雪崩的方案 1服务熔断调用错误率飙升当错误率达到一定阈值后就将这个服务熔断了。熔断之后后续的请求就不会再请求服务器了以减缓服务器的压力。 2服务降级 fallback不让客户端等待并立即返回一个友好的提示。触发服务降级的情况有程序运行异常、超时、服务熔断触发服务降级、线程池/信号量打满也会导致服务降级。 3服务隔离主要目的是为了解决服务与服务之间的影响。有信号量隔离和线程池隔离两种方式。线程池隔离支持的功能更多但是资源消耗也更大。信号量隔离支持的功能比线程池隔离少但是资源消耗也小。 4服务限流主要是提前对各个类型的请求设置最高的QPS阈值若高于设置的阈值则对该请求直接返回不再调用后续资源。 服务熔断和服务隔离都属于出错后的容错处理机制而限流模式则可以称为预防模式。1服务断路器Resilience4J提供了6个避免服务雪崩的功能熔断、限流、隔离、自动重试、结果缓存、超时处理。 Resilience4J只使用Vavr库没有外部依赖。使用过程中只需要按需引入即可。 2CircubitBreaker断路器有6种状态分别是CLOSED、HALF_OPEN、OPEN、DISABLED、METRICS_ONLY、FORCED_OPEN 主要的状态有3种分别是CLOSED、HALF_OPEN、OPENclosed可以转换为openopen转换为half_openhalf_open转换为open或closed状态。 CircubitBreaker断路器最开始的状态为关闭状态。 3Resilience4J的超时降级Resilience4J需要使用注解TimeLimiter此时name需要跟yml文件的resilience4j.timelimiter.instances的下一个属性名相同并在下一个属性中设置超时时间它的fallbackMethod属性是超时的时候回调的方法名可以处理服务降级等操作即直接返回一个友好提示信息。 异步操作时返回类型为CompletableFutureStringsupplyAsync需要使用函数作为参数此时应用lambda箭头函数()-的方式去调用OpenFeign对应的方法即可。 并且还需要引入spring-cloud整合resilience4j的包即可。新版本的SpringCloud不需要引入io.github.resilience4j中的包但是老版本的则需要引入该包。 4Resilience4J的重试机制即使用resilience4j中的retry注解name属性值与yml文件对应的值绑定并且配置retry重试机制的yml文件即可。 5熔断机制降级即需要在yml文件中配置熔断机制在URL映射方法上使用CircuitBreaker注解以及降级的方法名。当http请求达到一定数量并且错误率达到阈值时则将熔断器的状态切换打开过了设置的时间后切换为半开此时接收设置的http数量如果错误率还是达到阈值则再次切换为打开状态直到成功率达到阈值再切换为关闭状态。当处于打开状态时http请求会得到一个友好提示而不是访问payment8001服务。当处于半开或关闭的状态才会访问payment8001服务。 6慢调用熔断降级在调用服务提供者payment8001时如果调用时间超时并且超时率达到阈值则打开熔断器过了指定的时间后打开半开状态。半开状态设置只接收2次http请求如果成功率达到阈值则关闭熔断器或者达到失败率则开启熔断器否则一直处于半开状态。在打开状态时,所有http请求不访问服务提供者payment8001而是直接返回友好提示信息关闭状态时所有http请求都直接访问服务提供者payment8001。Resilience4J在这里不知道是不是版本bug的原因服务隔离bulkhead目前配置是不生效的也就是说信号量和服务隔离配置不生效。 1信号量服务隔离的基本原理就是一个计数器它控制线程的并发数不超过一个指定数额超过的话就进行隔离。使用Bulkhead注解。 2线程池服务隔离的基本原理就是通过指定核心线程池数和最大线程池数以及队列容量等来控制线程的并发数从而实现服务的隔离。使用Bulkhead注解。 3服务限流即指定服务的周期时间以及在周期时间内通过的请求数量。使用RateLimiter注解。