1.20

1.hystrix的局部降级逻辑的处理方式

局部降级逻辑:
fallback 可以在服务的提供方进行处理,也可以在服务的消费方进行处理(经常用到的)。
在服务提供方进行处理:
1.在服务提供方的service里面 给指定的方法编写降级的方法,降级方法(逻辑)编写的原则是方法的形参和返回值必须要和被降级的方法
保持一致。
2.在启动类上开启服务熔断的功能 @EnableCircuitBreaker
@SpringCloudApplication = @SpringBootApplication + @EnableDiscoveryClient + @EnableCircuitBreaker
3.将降级的逻辑应用在某个服务上
@HystrixCommand(fallbackMethod=“降级逻辑的方法名”,commandProperties={
@HystrixProperties(name = “execution.isolation.thread.timeoutInMilliseconds”,value = “1500”)
})
public String timeout(){}
在消费方进行处理:
1.在消费方的启动类上面开启熔断 @EnableCircuitBreaker
2.在消费方的controller里面定义降级逻辑的方法。将降级逻辑应用在被降级的方法上面(实现的思路和上面一样)

2.全局降级处理方式

全局降级逻辑:
1.在消费方的启动类上面要加上一个@EnableCircuitBreaker
2.在消费方的controller里面,定义一个全局降级的方法。
3.在controller上面 添加一个注解@DefaultProperties(defaultFallback = “handleAll”)
4.在指定的被降级的方法上添加一个@HystrixCommand
注意:降级逻辑的优先级 局部的降级逻辑>全局的降级逻辑

3.什么是熔断? 熔断有哪几种状态 断路器的工作原理

1.什么是熔断

服务熔断
当用户访问某个服务,达到了最大的访问量之后,直接拒绝用户访问。
服务熔断原理(断路器的原理):
统计用户在指定的时间范围(默认10s)之内的请求总数达到指定的数量之后,如果不健康的请求(超时、异常)占总请求数量的百分比(50%)
达到了指定的阈值之后,就会触发熔断。触发熔断,断路器就会打开(open),此时所有请求都不能通过。在5s之后,断路器
会恢复到半开状态(half open),会允许少量请求通过,如果这些请求都是健康的,那么断路器会回到关闭状态(close).如果
这些请求还是失败的请求,断路器还是恢复到打开的状态(open).

2. 熔断有哪几种状态

熔断状态机3个状态:
1.Closed:关闭状态,所有请求都正常访问。
2.Open:打开状态,所有请求都会被降级。Hystix会对请求情况计数,当一定时间内失败请求百分比达到阈值,则触发熔断,断路器会完全打开。默认失败比例的阈值是50%,请求次数最少不低于20次。
3.Half Open:半开状态,open状态不是永久的,打开后会进入休眠时间(默认是5S)。随后断路器会自动进入半开状态。此时会释放部分请求通过,若这些请求都是健康的,则会完全关闭断路器,否则继续保持打开,再次进行休眠计时
实际上服务熔断 和 服务降级 没有任何关系,就像 java 和 javaScript
服务熔断,有点自我恢复的味道

3.断路器的工作原理

在这里插入图片描述
在这里插入图片描述

4.如何开启熔断?

以上次8001提供者模块为例
1.service层的方法设置服务熔断:
首先在启动类上开启服务熔断 @EnableCircuitBreaker //开启服务熔断

@Service
public class PaymentService {

    /**
     * 可以正常访问的方法
     * @param id
     * @return
     */
    public String paymentInfo_Ok(Integer id){
        return "线程池:" + Thread.currentThread().getName() + "  ,paymentInfo_OK,id:" + id;
    }

    /**
     超时访问的方法
     */
    /*@HystrixCommand(fallbackMethod = "timeoutHandler",commandProperties = {
            //设置峰值,超过 3 秒,就会调用兜底方法,这个时间也可以由feign控制
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000")
    })*/
    public String paymentInfo_Timeout(Integer id){
        // int interTime = 5;
        int i = 10/0;
        /*try{
            TimeUnit.SECONDS.sleep(interTime);
        }catch (Exception e){
            e.printStackTrace();
        }
        return "线程池:" + Thread.currentThread().getName() + "  ,paymentInfo_Timeout,id:" + id + "耗时" + interTime + "秒钟";*/
        return "hello";
    }

    //服务熔断
    @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的时候
在这里插入图片描述
测试狂点id<0的测试请求。点完之后,再测试id>0的情况,发现还是调用异常的结果。只有过一段时间之后才会显示调用正常。这正好符合断路器的原理

5.什么是网关? gateway 的核心概念

1.什么是网关?

网关(Gateway)又称网间连接器、协议转换器。网关在传输层上以实现网络互连,是最复杂的网络互连设备,仅用于两个高层协议不同的网络互连。网关的结构也和路由器类似,不同的是互连层。网关既可以用于广域互连,也可以用于局域网互连。网关是一种充当转换重任的计算机系统或设备。在使用不同的通信协议、数据格式或语言,甚至体系结构完全不同的两种系统之间,网关是一个翻译器。与网桥只是简单地传达信息不同,网关对收到的信息要重新打包,以适应目的系统的需求。同时,网关也可以提供过滤和安全功能。大多数网关运行在OSI 7层协议的顶层–应用层。

2.gateway 的核心概念

Route(路由):路由是构建网关的基本模块,它由ID、目标URI,一系列的断言和过滤器组成,如果断言为true则匹配该路由

Predicate(断言):参考的是Java8的java.util.function.Predicate
开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由

Filter(过滤):指的是Spring框架中GatewayFilyter的实例,使用过滤器,可以在请求被路由前或者之后进行修改

匹配方式就叫断言,实现这个匹配方式就叫filter,对外表现出来就是路由的功能。

在这里插入图片描述
web 请求,通过一些匹配条件,定位到真正的服务节点。并在这个转发过程的前后,进行一些精细化控制。
predicate 就是我们的匹配条件,而filter,就可以理解为一个无所不能的拦截器。有了这两个元素再加上目标uri,就可以实现一个具体的路由。

6.如何简单使用gateway

1.创建 cloud-gateway-gateway9527模块
2.引入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>

3.编写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/**  # 断言,路径相匹配的进行路由

# 注册进 eureka Server
eureka:
  client:
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
    register-with-eureka: true
    fetch-registry: true

4.编写启动类

@SpringBootApplication
@EnableEurekaClient
public class GatewayMain9527 {
    public static void main(String[] args) {
        SpringApplication.run(GatewayMain9527.class,args);
    }
}

5.测试
在这里插入图片描述
试用网关后
在这里插入图片描述
这样子就隐藏了业务微服务端口8001,使用网关服务对微服务进行保护

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值