1.hystrix的局部降级逻辑的处理方式
(1)在服务引入Hystrix依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
2配置容易超时的方法
@HystrixCommand(fallbackMethod = "timeoutHandler",commandProperties = {
//设置峰值,超过 3 秒,就会调用兜底方法,这个时间也可以由feign控制
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000")
})
3启动类要加服务熔断
通过兜底的方法来进行降级提升了耦合度
@EnableCircuitBreaker //开启服务熔断
@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker //开启服务熔断
public class HystrixPaymentApplication {
public static void main(String[] args) {
SpringApplication.run(HystrixPaymentApplication.class,args);
}
2.全局降级处理方式
全局服务降级处理在服务消费方上面实现
首先定义个一全局的降级方法
public String jiangji(){
return "这是全局处理降级逻辑的方法.......";
}
使用一个全局降级的注解
@DefaultProperties(defaultFallback=“全局降级的方法”)
服务降级:修改Feign客户端接口
@FeignClient(value = "cloud-payment-service",fallback = FallBackService.class)
public interface OrderService {
@GetMapping("/payment/hystrix/{id}")
public String paymentInfo_OK(@PathVariable("id")Integer id);
@GetMapping("/payment/hystrix/timeout/{id}")
public String paymentInfo_Timeout(@PathVariable("id")Integer id);
}
3.什么是熔断? 熔断有哪几种状态 断路器的工作原理
熔断 当用户访问某个服务的话 达到了他这个最大的访问量之后 ,直接拒绝了用户访问
熔断器的话有三种状态
关闭状态 关闭的话就是 不会对服务器进行熔断
打开状态 请求不再进行调用当前服务,内部设置时钟一般为MTTR(平均故障处理时间)
半开状态 部分请求根据规则调用当前的服务 如果请求成功且符合规则认为当前服务恢复正常 就关闭熔段
服务熔断的话 核心代码如下
在这里插入图片描述
//服务熔断
@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不能为负数,请重试......";
}
如果请求数达到了设置的请求阈值或者请求失败的比例超过了设置的比例,则断路器将从close状态转到open状态,这时所有的请求都会被阻止。
2、sleep一段时间后,下一个请求将被放过,这时断路器处于半开半闭状态,目的是为了验证一下后边的路是否通畅,如果请求失败,则断路器回到open状态;如果成功了则断路器切换到closed状态并且返回响应的结果。
图中下方描述了计数器维护的数据存储结构及工作原理:大概意思是它维护10个桶(bucket),每个桶中记录第i秒请求状态 的数量,当新的一秒请求记录来的时候,计数器会丢掉时间最靠前的桶。
4.如何开启熔断?
- 熔断机制的注解是@HystrixCommand;
- 熔断机制是应对雪崩效应的一种【链路保护机制】,一般存在于服务端;
- 当扇出链路的某个服务出现故障或响应超时,会进行【服务降级】,进而【熔断该节点的服务调用】,快速返回“错误”的相应信息;
- Hystrix的熔断存在阈值,缺省是5秒内20次调用失败就会触发;
5.什么是网关? gateway 的核心概念
网关作为流量的入口,常用功能包括路由转发、权限校验、限流控制等。Spring Cloud gateway作为 Spring Cloud 官方推出的第二代网关框架,取代了 Zuul网关。
三大核心概念
- Route(路由):路由是构建网关的基本模块,它由ID、目标URI,一系列的断言和过滤器组成,如果断言为true则匹配该路由
- Predicate(断言):参考的是Java8的java.util.function.Predicate
开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由 - Filter(过滤):指的是Spring框架中GatewayFilyter的实例,使用过滤器,可以在请求被路由前或者之后进行修改
匹配方式就叫断言,实现这个匹配方式就叫filter,对外表现出来就是路由的功能。
6.如何简单使用gateway
搭建一个网管微服务 代号 9527
引入pom依赖
<dependencies>
<!--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>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency><!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
<groupId>com.krisswen.cloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
编写application.yml配置文件
server:
port: 9527
spring:
application:
name: cloud-gateway
## GateWay配置
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/** # 断言,路径相匹配的进行路由
测试
试用网关后