6-Spring cloud之Hystrix容错处理(上)

news2024/11/22 6:05:48

6-Spring cloud之Hystrix容错处理(上)

  • 1. 前言
    • 1.1 关于雪崩
      • 1.1.1 什么是灾难性雪崩
      • 1.1.2 服务雪崩形成的原因
      • 1.1.3 如何防止灾难性雪崩效应
    • 1.2 前文介绍
  • 2. Hystrix容错处理
    • 2.1 项目搭建(Ribbon整合Hystrix)
      • 2.1.1 项目结构
      • 2.1.2 pom文件
      • 2.1.3 yml文件
      • 2.1.4 配置类
      • 2.1.5 启动类
      • 2.1.6 controller
      • 2.1.7 启动,确保服务可用
      • 2.1.8 演示远程服务不可用
        • 2.1.8.1 简单演示
        • 2.1.8.2 远程服务正常和不正常
    • 2.2 服务降级
      • 2.2.1 简单说服务降级
      • 2.2.2 模拟服务降级
      • 2.2.3 看效果
    • 2.3 服务熔断
      • 2.3.1 简单说服务熔断
      • 2.3.2 模拟服务熔断1(停服务)
        • 2.3.2.1 降级代码
        • 2.3.2.2 看效果
      • 2.3.3 模拟服务熔断1(服务端模拟异常)
        • 2.3.3.1 修改服务提供者
        • 2.3.3.2 看效果
          • 2.3.3.2.1 注释掉熔断处理
          • 2.3.3.2.2 加上熔断处理
    • 2.4 模糊使用(熔断?降级?)
      • 2.4.1 代码(服务端代码正常,消费端代码模拟异常)
      • 2.4.2 效果
        • 2.4.2.1 未开启熔断时效果
        • 2.4.2.2 开启熔断后效果
  • 3. Feign整合Hystrix容错处理
    • 3.1 核心代码
      • 3.1.1 实现类和注解
        • 3.1.1.1 方式1
        • 3.1.1.2 方式2
      • 3.1.2 消费者的yml
      • 3.1.3 看效果

1. 前言

1.1 关于雪崩

1.1.1 什么是灾难性雪崩

  • 微服务之间相互调用,因为调用链中的一个服务故障,导致一系列的服务不可能,即引起整个链路都无法访问的情况。

1.1.2 服务雪崩形成的原因

  • 服务提供者不可用。
    如:硬件故障、程序bug、缓存击穿、并发请求量过大(比如双十一时)等。
    其中,缓存击穿一般发生在缓存应用重启,所有缓存被清空时,以及短时间内大量的缓存失效时。大量的缓存不命中,使请求直接访问后端,造成服务提供者超负荷运行,引起服务不可用。
  • 服务调用者不可用。
    如:同步请求阻塞造成的资源耗尽。
  • 重试加大流量。如:
    • 用户重试:
      在服务提供者不可用后,用户由于忍受不了界面上的长时间等待,而不断刷新页面,甚至提交表单。
    • 代码重试逻辑:
      服务的调用端存在大量服务异常后的重试逻辑。

1.1.3 如何防止灾难性雪崩效应

  • 服务降级
  • 服务熔断
  • 请求缓存

1.2 前文介绍

  • 本文是续接前文,所以下面有些集群或服务都不在介绍,比如Eureka集群还是在前面的基础上启动的,关于前面几篇文章的介绍如下:
    • 1-Eureka服务注册与发现以及Eureka集群搭建(实操型).
    • 2-Spring cloud之Eureka快速剔除失效服务
    • 3-Spring cloud之搭建Ribbon负载均衡——服务器上实操(上)
    • 4-Spring cloud之搭建Ribbon负载均衡——服务器上实操(下)
    • 5-Spring cloud之Feign的使用——服务器上实操.

2. Hystrix容错处理

2.1 项目搭建(Ribbon整合Hystrix)

2.1.1 项目结构

  • 为了整体项目看起来有前后顺序,层次更清晰,所以本项目直接新建一个Module,可以理解为此项目是在dog-consumer-80的升级版,就是简单地在Ribbon上加上了Hystrix。
  • 项目结构如下:
    在这里插入图片描述

2.1.2 pom文件

  • 如下:
    在这里插入图片描述

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>com.liu.susu</groupId>
            <artifactId>dog-cloud-parent</artifactId>
            <version>1.0-SNAPSHOT</version>
        </parent>
    
        <artifactId>dog-consumer-ribbon-hystrix-80</artifactId>
        <packaging>jar</packaging>
    
        <name>dog-consumer-ribbon-hystrix-80</name>
        <url>http://maven.apache.org</url>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>com.liu.susu</groupId>
                <artifactId>dog-po</artifactId>
                <version>${project.version}</version>
            </dependency>
    
            <!--版本同${spring-boot.version}-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <!--引入ribbon相关依赖,ribbon是客户端的负载均衡,ribbon需要和eureka整合-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-ribbon</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-config</artifactId>
            </dependency>
    
            <!--引入Hystrix相关依赖-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-hystrix</artifactId>
            </dependency>
    
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <scope>test</scope>
            </dependency>
    
        </dependencies>
    </project>
    
    

2.1.3 yml文件

  • 如下:
    在这里插入图片描述

    server:
      port: 80
    
    spring:
      application:
        name: dog-consumer-ribbon-hystrix
    
    eureka:
      client:  # 客户端注册进eureka服务列表内
        register-with-eureka: false  # false表示不向注册中心注册自己
        service-url:
          defaultZone: http://IP1:2886/eureka/,http://IP2:2886/eureka,http://IP3:2886/eureka/
    

2.1.4 配置类

  • 如下:
    在这里插入图片描述

2.1.5 启动类

  • 如下:
    在这里插入图片描述

2.1.6 controller

  • 如下:
    在这里插入图片描述

    package com.liu.susu.controller;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.client.RestTemplate;
    
    /**
     * @Description
     * @Author susu
     */
    
    @RestController
    public class DogConsumerController {
    
        private static final String REST_URL_PREFIX = "http://DOG-PROVIDER";
        @Autowired
        private RestTemplate restTemplate;
    
        @RequestMapping(value = "/consumer/dog/hello")
        public String hello(){
            System.out.println("==============================");
            String url = REST_URL_PREFIX + "/dog/hello";
            return restTemplate.getForObject(url, String.class);
        }
        
        /**
         * http://localhost:80/consumer/dog/getDogByNum/1
         * http://localhost/consumer/dog/getDogByNum/1
         */
        @RequestMapping("/consumer/dog/getDogByNum/{dogNum}")
        public Object getDogByNum(@PathVariable("dogNum") Long dogNum){
            String url = REST_URL_PREFIX + "/dog/getDogByNum/" + dogNum;
            return restTemplate.getForObject(url, Object.class);
        }
    }
    
    

2.1.7 启动,确保服务可用

  • 因为Eureka集群和几台服务提供者一直没有停过,所以查看一下,如下:
    在这里插入图片描述
  • 启动新创建的服务消费者,然后访问如下:
    在这里插入图片描述
  • 确保都没问题之后,就可以继续模拟处理服务降级和熔断了,继续……

2.1.8 演示远程服务不可用

2.1.8.1 简单演示

  • 现在把那几台服务提供者都停掉(刚停掉的时候,还是在注册中心的,看设置的心跳时间)
    在这里插入图片描述

    在这里插入图片描述

  • 然后再访问看一下效果(过程变化):

    • 先是 Connection refused (Connection refused)这种就是服务不可用
      在这里插入图片描述
    • 然后,再 No instances available
      但是这种情况是正常的,因为你把服务已经停了
      在这里插入图片描述

2.1.8.2 远程服务正常和不正常

  • 远程服务正常
    • 有返回结果
    • 有异常传递
  • 远程服务错误
    • 远程服务不可用(拒绝访问)
    • 远程服务响应超时

2.2 服务降级

2.2.1 简单说服务降级

  • 服务降级是指在服务出现故障或异常时,为了保证核心服务的稳定性,暂时关闭一些不太重要的服务,或者返回一些简单的缓存数据等,以保证核心服务的正常运行。服务降级能够有效地减少服务的响应时间和错误率,提高系统的可用性。

    即:服务降级是针对系统整体资源的合理分配。区分核心服务和非核心服务。对某个服务的访问延迟时间、异常等情况做出预估并给出兜底方法。这是一种全局性的考量,从整体负荷考虑。

2.2.2 模拟服务降级

  • 接下来,我们模拟一个超时
    • 未做服务降级处理的时候,如果我们故意设计超时的话,这时候不管超时多久,SpringCloud远程调用时都会等待。自己可以试试,这里就不演示了。
  • 看模拟服务超时并做降级处理的核心代码如下:
    • 启动类

      @EnableHystrix    //开启Hystrix容错处理能力
      

      在这里插入图片描述

    • controller里方法

      @HystrixCommand(fallbackMethod = "errorHello")
      

      在这里插入图片描述

          /**
           * @EnableHystrix 启动类上注解,开启Hystrix容错处理能力
           * @HystrixCommand 代表当前方法是一个需要做容错处理的方法
           * @EnableHystrix 结合 @HystrixCommand,默认地配置了一个远程服务超时配置,默认设置超时是1秒
           */
          @RequestMapping(value = "/consumer/dog/hello")
          @HystrixCommand(fallbackMethod = "errorHello")
          public String hello(){
              System.out.println("==============================");
      
              //默认情况下,SpringCloud远程调用时,不管多久都会等
              try {
                  Thread.sleep(3000);
              } catch (InterruptedException e) {
                  throw new RuntimeException(e);
              }
      
              String url = REST_URL_PREFIX + "/dog/hello";
              return restTemplate.getForObject(url, String.class);
          }
      
      	/**
           * 降级方法
           *   1、返回类型要和对应的服务方法的返回类型一致
           *   2、参数和对应的服务方法要一致
           *   3、返回的内容:远程服务访问错误时(比如超时),返回的拖底数据
           */
          public String errorHello(){
              return "服务器忙,请稍后再试!";
          }
      

2.2.3 看效果

  • 如下:
    在这里插入图片描述

    在这里插入图片描述

2.3 服务熔断

2.3.1 简单说服务熔断

  • 服务熔断是指在服务出现故障时或异常时,通过断开与该服务的连接,避免该服务继续接受请求,从而阻止故障的扩散,并快速恢复服务的可用性。服务熔断通常根据一定的策略来检测服务的可用性,如果服务的响应时间或错误率超过了一定的阈值,就会触发熔断机制,断开与该服务的连接,之后定期重试连接,直至服务正常。
  • 即:服务熔断一般是某个服务(下游服务)故障引起,而服务降级一般是从整体负荷考虑

2.3.2 模拟服务熔断1(停服务)

2.3.2.1 降级代码

  • 如下:

        @RequestMapping("/consumer/dog/getDogByNum/{dogNum}")
        @HystrixCommand(fallbackMethod = "errorGetDogByNum",commandProperties = {
           //是否开启熔断机制
           @HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_ENABLED,value = "true"),
            //一个时间窗内,发生远程访问错误的次数阈值,达到开启熔断
           @HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_REQUEST_VOLUME_THRESHOLD,value = "3"),
            //一个时间窗内,发生远程访问错误的百分比,达到则开启熔断
           @HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_ERROR_THRESHOLD_PERCENTAGE,value = "20"),
            //开启熔断后,多少毫秒内,不发起远程服务访问
           @HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_SLEEP_WINDOW_IN_MILLISECONDS,value = "3000")
    
        })
        public Object getDogByNum(@PathVariable("dogNum") Long dogNum){
            System.out.println("本地测试熔断....");
    
            String url = REST_URL_PREFIX + "/dog/getDogByNum/" + dogNum;
            return restTemplate.getForObject(url, Object.class);
        }
    
        public Object errorGetDogByNum(Long dogNum){
            System.out.println("进入熔断,dogNum是:===>"+dogNum);
            return "熔断——服务器忙,请稍后再试!";
        }
    

2.3.2.2 看效果

  • 将服务提供者停掉,如下:
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

2.3.3 模拟服务熔断1(服务端模拟异常)

2.3.3.1 修改服务提供者

  • 修改代码如下

       System.out.println("进入服务提供者,模拟异常....");
       System.out.println(2 / dogNum);
    

    在这里插入图片描述

  • 启动服务,为了方便直接启动本地了
    在这里插入图片描述

2.3.3.2 看效果

2.3.3.2.1 注释掉熔断处理
  • 头疼的500,还不知道啥原因导致的,还得去服务提供端开日志,如下:
    在这里插入图片描述
    在这里插入图片描述
2.3.3.2.2 加上熔断处理
  • 服务提供者日志,如下:
    在这里插入图片描述
  • 服务消费者
    在这里插入图片描述
  • 页面,如果你是客户,看起来舒服多了
    在这里插入图片描述

2.4 模糊使用(熔断?降级?)

  • 模糊概念:服务熔断是服务降级的强化版。所以如果错误发生在消费端本端也可以使用服务熔断,效果跟上面差不多。
  • 下面是错误在消费端的服务熔断,如下:

2.4.1 代码(服务端代码正常,消费端代码模拟异常)

  • 如下:
    在这里插入图片描述

        @RequestMapping("/consumer/dog/getDogByNum/{dogNum}")
        @HystrixCommand(fallbackMethod = "errorGetDogByNum",commandProperties = {
           //是否开启熔断机制
           @HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_ENABLED,value = "true"),
            //一个时间窗内,发生远程访问错误的次数阈值,达到开启熔断
           @HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_REQUEST_VOLUME_THRESHOLD,value = "3"),
            //一个时间窗内,发生远程访问错误的百分比,达到则开启熔断
           @HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_ERROR_THRESHOLD_PERCENTAGE,value = "20"),
            //开启熔断后,多少毫秒内,不发起远程服务访问
           @HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_SLEEP_WINDOW_IN_MILLISECONDS,value = "3000")
    
        })
        public Object getDogByNum(@PathVariable("dogNum") Long dogNum){
            System.out.println("本地测试熔断....");
    
            System.out.println(2 / dogNum);
    
            String url = REST_URL_PREFIX + "/dog/getDogByNum/" + dogNum;
            return restTemplate.getForObject(url, Object.class);
        }
    
        public Object errorGetDogByNum(Long dogNum){
            System.out.println("进入熔断,dogNum是:===>"+dogNum);
            return "熔断——服务器忙,请稍后再试!";
        }
    

2.4.2 效果

2.4.2.1 未开启熔断时效果

  • 如下:
    在这里插入图片描述

2.4.2.2 开启熔断后效果

  • 先测试不会发生错误的dog_num,如下:
    在这里插入图片描述

  • 再测试会发生错误的,如下:
    在这里插入图片描述

  • 再点本应该不会发生错误的,如下:
    在这里插入图片描述

3. Feign整合Hystrix容错处理

  • 为了方便直接在dog-api项目里修改代码,如下两种方式
    • 先看原代码
      在这里插入图片描述

3.1 核心代码

3.1.1 实现类和注解

3.1.1.1 方式1

  • 添加实现类,如下
    在这里插入图片描述
  • 修改注解,如下
    @FeignClient(value = "DOG-PROVIDER",fallback = DogClientApiImpl.class) //方式1
    
    在这里插入图片描述

3.1.1.2 方式2

  • 添加实现类,如下:
    在这里插入图片描述

    package com.liu.susu.api;
    
    import com.liu.susu.pojo.Dog;
    import feign.hystrix.FallbackFactory;
    import org.springframework.stereotype.Component;
    
    import java.util.List;
    
    /**
     * @Description
     * @Author susu
     */
    @Component
    public class DogClientApiFallbackFactory implements FallbackFactory<DogClientApi> {
    
        @Override
        public DogClientApi create(Throwable throwable) {
            return new DogClientApi() {
                @Override
                public String hello() {
                    System.out.println("进入 DogClientApiFallbackFactory 服务降级--->hello");
                    return "DogClientApiFallbackFactory 服务降级处理,请稍后再试";
                }
    
                @Override
                public Object getDogByNum(Long dogNum) {
                    return null;
                }
    
                @Override
                public List<Dog> getAllDog() {
                    return null;
                }
            };
        }
    }
    
    
  • 修改注解,如下:

    @FeignClient(value = "DOG-PROVIDER",fallbackFactory = DogClientApiFallbackFactory.class) //方式2
    

    在这里插入图片描述

3.1.2 消费者的yml

  • 配置消费者的yml文件(不能忘!!!)
    在这里插入图片描述
    feign:
      hystrix:
        enabled: true
    

3.1.3 看效果

  • 启动服务,看效果
    在这里插入图片描述
  • 然后把服务提供者断开,再看效果
    在这里插入图片描述
    在这里插入图片描述
    好了,就这么多吧,另外一种方式同样的效果,感兴趣的话自己下去试试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/744958.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IOI车机系统刷机和改包笔记

前言 我自己21年买的雪佛兰探界者SUV&#xff0c;没想到到了23年&#xff0c;车机系统上的高德导航还是3.2版本&#xff0c;而官方的已经7.1. 中间出去玩&#xff0c;在高速上被车机上的高德坑了好多次&#xff0c;简直无力吐槽。单纯使用手机Carplay虽然也能完成导航任务&am…

2023年上半年鲁大师电动车综合分数榜解读:九号M95C荣登榜首

2023年上半年电动车综合分数榜单显示了电动车市场的最新发展趋势和品牌表现。 九号M95C获得了第一名&#xff0c;得分798分。九号M95C以其卓越的性能和创新设计脱颖而出。它的高得分主要来自于其强大的续航能力、高速性能和可靠性。九号M95C在电动单车市场中取得了非常好的口碑…

23款奔驰C260L加装原厂香氛负离子系统,清香宜人,久闻不腻

奔驰原厂香氛合理性可通过车内空气调节组件营造芳香四溢的怡人氛围。通过更换手套箱内香氛喷雾发生器所用的香水瓶&#xff0c;可轻松选择其他香氛。香氛的浓度和持续时间可调。淡雅的香氛缓缓喷出&#xff0c;并且在关闭后能够立刻散去。车内气味不会永久改变&#xff0c;香氛…

IPv6 地址简介

IP 地址是指互联网协议地址&#xff0c;它是允许设备连接到互联网的标识符。互联网协议版本 6 &#xff08;IPv6&#xff09; 地址是一个 128 位字母数字标签&#xff0c;用于标识和定位计算机网络中的网络接口卡 &#xff08;NIC&#xff09; 或网络节点。 IPv6由互联网工程任…

C# 圆盘(hsv)颜色选择器

【首先贴上github链接&#xff1a;适用于 Windows 窗体的 Cyotek 拾色器控件】 一、简单使用教程 此处是我使用Cyotek.Windows.Forms.ColorPickers库部分功能的一些经验和思路总结&#xff0c;没有太多深入地去学习&#xff0c;如果有哪位大佬有深入学习使用的话&#xff0c;可…

阿里云限时福利:WoSign品牌SSL证书首购4折优惠

阿里云限时福利&#xff1a;WoSign品牌SSL证书首购4折优惠 阿里云SSL证书限时首购福利&#xff1a;2023年07月04日至08月31日&#xff0c;阿里云平台WoSign品牌系列SSL证书首购4折优惠&#xff0c;惊喜折扣、限时促销、限量抢购&#xff0c;机会不容错过&#xff01; 阿里云平…

PCB防静电设计的必要性

平时通过走路穿衣等日常活动带来的摩擦&#xff0c;会产生不同幅值的静电电压&#xff0c;但其能量很小不会对人体产生伤害&#xff0c;不过对于电子元器件来说&#xff0c;这种静电能量却是不能忽视的。 在干燥的环境下&#xff0c;人体静电(ESD)的电压很容易超过6~35Kv&#…

Ubuntu 22安装使用Codon高性能Python编译器记录

Ubuntu 22安装使用Codon高性能Python编译器记录 Codon 在官方 Ubuntu 存储库中没有直接的教程&#xff0c;但可以尝试如下方法进行安装。 一、更新系统 终端输入&#xff1a; sudo apt update以及 sudo apt upgrade二、安装curl 输入指令&#xff1a; sudo apt install …

DHCP静态分配IP地址、IP-MAC绑定、静态ARP有哪些区别?

DHCP静态分配IP地址、IP-MAC绑定、静态ARP这三个功能都涉及到IP地址和MAC地址的对应关系&#xff0c;但其应用场景及实现的功能有所不同&#xff0c;如表所示&#xff1a; 原文地址https://support.huawei.com/enterprise/zh/knowledge/EKB1000052241

Linux下如何部署Nuxt项目(通过ip直接访问)

一、基础环境准备 1.确定服务器的Linux的系统版本 cat /etc/issue 不要问为什么&#xff0c;问就是吃过大亏 2.确定 node mysql是否安装&#xff0c;版本尽量与本地开发环境一致 如果没有安装建议自己百度一下&#xff0c;要根据Linux系统及版本来进行安装&#xff1b; 二、…

企业信息化-亿发软件,中小企业数字化转型解决方案供应商

因自身规模和企业性质&#xff0c;中小型企业需要有效管理企业资源&#xff0c;因此企业信息化管理至关重要。在此背景下&#xff0c;为中小企业量身定制的信息化管理系统可以为中小型企业带来显著的效益。能够实现数据的迅速整合&#xff0c;便于跨部门的协调和管理&#xff0…

计算机网络|思维导图|自顶向下方法|MindMaps资料分享

前言 那么这里博主先安利一下一些干货满满的专栏啦&#xff01; 手撕数据结构https://blog.csdn.net/yu_cblog/category_11490888.html?spm1001.2014.3001.5482这里包含了博主很多的数据结构学习上的总结&#xff0c;每一篇都是超级用心编写的&#xff0c;有兴趣的伙伴们都支…

【JMeter】同步定时器Synchronizing Timer集合点功能

LoadRunner 中有一个可以设置集合点的功能&#xff0c;顾名思义是设置多个虚拟用户等待到一个时间点&#xff0c;都到齐集合后一起发请求达到并发的目的 集合点是什么意思呢&#xff1f; 阻塞线程&#xff0c;直到指定的线程数量到达后&#xff0c;再一起释放&#xff0c;可以…

【Leetcode】206. 反转链表

题意&#xff1a;反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 一开始需要 cur head pre None 第二步反转指针 cur.next pre 接着再继续移动指针 tmp cur.next // 放在反转之前 pre cur cur tmp 完整…

Java使用JNA调用C文件

1.构建项目 准备最简单的maven项目&#xff0c;结构如下&#xff1a; 引入依赖&#xff1a; <dependency><groupId>net.java.dev.jna</groupId><artifactId>jna</artifactId><version>5.3.1</version></dependency>2.构建c…

2023-7-12-第十七式状态模式

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f4a5;&#x1f4a5;&#x1f4a5;欢迎来到&#x1f91e;汤姆&#x1f91e;的csdn博文&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f49f;&#x1f49f;喜欢的朋友可以关注一下&#xf…

IMPALA 查询优化之元数据

目录 说明 背景 问题复现 环境 sql 排查 分析过程 结果分析 总结 说明 sql优化中重要的一环是查询改写&#xff0c;一个表的元数据有利于sql优化器准确的评估sql代价&#xff0c;获取最佳的sql执行计划&#xff0c;如下图所示&#xff0c;本文验证通过加载刷新impala …

Maya文件加载缓慢,这样处理就可以

将场景加载到Maya中时&#xff0c;需要较长时间才能打开场景。 有时&#xff0c;CPU使用率可能会达到100%。 原因&#xff1a; 在文件上工作一段时间后&#xff0c;场景通常会与未使用的显示层、集和节点混淆。这些未使用的图元可能会导致打开文件时出现滞后。 解决方案&…

CMU 15-445 -- Query Processing - 07

CMU 15-445 -- Query Processing - 07 引言Query ProcessingProcessing ModelIterator ModelMaterialization ModelVectorization Model小结 Access MethodsSequential ScanZone MapsLate MaterializationHeap Clustering Index ScanMulti-index ScanIndex Scan Page Sorting E…

文件操作--按格式读写文件

C语言允许按指定格式读写文件。函数fscanf&#xff08;&#xff09;用于按指定格式从文件读数据。其函数原型为&#xff1a; int fscanf (FILE *fp, const char *format ,...)&#xff1b; 其中&#xff0c;第一个参数为文件指针&#xff0c;第2个参数为格式控制参数&#x…