hystrix的局部降级逻辑的处理方式
**(1)将服务提供方关于所有服务降级的设置全部去掉
(2)在服务消费方引入hsytrix依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
(3)在启动类上开启服务熔断
@EnableCircuitBreaker//开启熔断器
(4)在controller编写降级逻辑
@HystrixCommand(fallbackMethod = "handeException", commandProperties = {
//设置峰值,超过 1.5 秒,就会调用兜底方法
@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds", value = "1500")
})
(5)启动测试**
全局降级处理方式
(1)在消费方的controller里面编写全局降级逻辑的方法
// 全局降级处理方法
public String globalHandler(){
return "这是全局处理降级逻辑的方法.......";
}
(2)使用注解开启全局服务降级逻辑处理
//开启全局服务降级
@DefaultProperties(defaultFallback=“globalHandler”)
//不写自己的fallbackMethod属性,就使用全局默认的
@HysrixCommand
(3)在yml配置文件开启Feign基于对Hystrix的支持
feign:
hystrix:
enabled: true # 在feign中开启 hystrix
(4)定义一个类实现Feign客户端接口
(5)修改Feign客户端接口
@FeignClient(value = “cloud-payment-service”,fallback = FallBackService.class)
(6)测试
什么是熔断? 熔断有哪几种状态 断路器的工作原理
什么是熔断
熔断器,也叫断路器,其英文单词为:Circuit Breaker
熔断机制的原理很简单,像家里的电路熔断器,如果电路发生短路能立刻熔断电路,避免发生灾难。在分布式系统中应用这一模式之后,服务调用方可以自己进行判断某些服务反应慢或者存在大量超时的情况时,能够主动熔断,防止整个系统被拖垮。
熔断状态机3个状态:
- Closed:关闭状态,所有请求都正常访问。
- Open:打开状态,所有请求都会被降级。Hystix会对请求情况计数,当一定时间内失败请求百分比达到阈值,则触发熔断,断路器会完全打开。默认失败比例的阈值是50%,请求次数最少不低于20次。
- HalfOpen:半开状态,open状态不是永久的,打开后会进入休眠时间(默认是5S)。随后断路器会自动进入半开状态。此时会释放部分请求通过,若这些请求都是健康的,则会完全关闭断路器,否则继续保持打开,再次进行休眠计时
实际上服务熔断 和 服务降级 没有任何关系,就像 java 和 javaScript 服务熔断,有点自我恢复的味道
断路器的工作原理
熔断机制是对雪崩效应的一种微服务链路保护机制。当扇出链路的某个微服务出错不可用或响应时间太长时,会进行读物的降级,进而熔断该节点微服务的调用,快速返回错误信息。
当检测到该节点微服务调用响应正常之后,恢复调用链路
如何开启熔断?
(1)service层的方法设置服务熔断:
首先在启动类上开启服务熔断 @EnableCircuitBreaker //开启服务熔断
//服务熔断
@HystrixCommand(fallbackMethod = "timeoutHandler", 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次失败,就跳闸
})
public String paymentCircuitBreaker(Integer id){
//模拟发生异常
if(id < 0){
throw new RuntimeException("*****id,不能为负数");
}
String serialNumber = IdUtil.simpleUUID();
return Thread.currentThread().getName() + "\t" + "调用成功,流水号:" + serialNumber;
}
public String timeoutHandler(Integer id){
return "id不能为负数,请重试......";
}
(2)定义controller
//服务熔断
@GetMapping("/payment/circuit/{id}")
public String paymentCircuitBreaker(@PathVariable("id")Integer id){
return paymentService.paymentCircuitBreaker(id);
}
(3)测试
测试狂点id<0的测试请求。点完之后,再测试id>0的情况,发现还是调用异常的结果。只有过一段时间之后才会显示调用正常。这正好符合断路器的原理
什么是网关? gateway 的核心概念
SpringCloud Gateway是SpringCloud的一个全新项目,基于Spring5.0+SpringBoot2.0和ProjectReactor等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的API路由管理方式
Spring Cloud gateway作为 Spring Cloud 官方推出的第二代网关框架,取代了 Zuul网关。
Route(路由):路由是构建网关的基本模块,它有ID,目标URI,一系列的断言和过滤器组成,如果断言为true则匹配该路由
Predicate(断言):参考的是java8的java.util.function.Predicate
开发人员可以匹配HTTP请求中的所有内容(列入请求头或请求参数),如果请求与断言相匹配则进行路由
Filter(过滤):指的是Spring框架中GatewayFiler的实例,使用过滤器,可以再请求被路由前或者之后进行修改
Spring Cloud Gateway 可以看做是一个 Zuul 1.x 的升级版和代替品,比 Zuul 2 更早的使用 Netty 实现异步 IO,
从而实现了一个简单、比 Zuul 1.x 更高效的、与 Spring Cloud 紧密配合的 API 网关。
Spring Cloud Gateway 里明确的区分了 Router 和 Filter,并且一个很大的特点是内置了非常多的开箱即用功能,
并且都可以通过 SpringBoot 配置或者手工编码链式调用来使用。
比如内置了 10 种 Router,使得我们可以直接配置一下就可以随心所欲的根据 Header、或者 Path、
或者 Host、或者 Query 来做路由。
比如区分了一般的 Filter 和全局 Filter,内置了 20 种 Filter 和 9 种全局 Filter,
也都可以直接用。当然自定义 Filter 也非常方便。
如何简单使用gateway
(1)创建项目,导入pom
<!--gateway-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--eureka-client gateWay作为网关,也要注册进服务中心-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- gateway和web不能同时存在,即web相关jar包不能导入 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>``
(3)编写application.yml配置文件
cloud:
gateway:
routes:
- id: payment_routh # 路由ID , 没有固定的规则但要求唯一,建议配合服务名
uri: http://localhost:8001 # 匹配后提供服务的路由地址
predicates:
- Path=/payment/** # 断言,路径相匹配的进行路由
- id: payment_routh2 # 路由ID , 没有固定的规则但要求唯一,建议配合服务名
uri: http://localhost:8001 # 匹配后提供服务的路由地址
predicates:
- Path=/payment/lb/** # 断言,路径相匹配的进行路
**(4)编写启动类**
```clike
@SpringBootApplication
@EnableEurekaClient
public class GatewayMain9527 {
public static void main(String[] args) {
SpringApplication.run(GatewayMain9527.class,args);
}
}
(5)最后测试