【Spring Cloud】服务熔断

目录

  • 服务雪崩效应
    • 服务雪崩效应形成的原因及应对策略
    • 小结
  • Hystrix
    • 介绍
    • Hystrix可以做什么
      • 1.资源隔离
      • 2.请求熔断
      • 3.服务降级
    • 小结
  • Hystrix实现服务降级
    • 方式一:@HystrixCommand注解方式
      • 1.服务提供者
        • 1.1业务接口和业务实现中添加方法hystrixTimeout
        • 1.2控制器中处理/provider/hystrix/timeout/{id}请求
      • 2.服务消费者
        • 2.1demo-user-consumer添加依赖
        • 2.2在启动类上添加@EnableHystrix
        • 2.3在UserFeignClient接口创建远程调用的方法hystrixTimeout
        • 2.4在RPC调用方法上加上注解@HystrixCommand
      • 3.添加ribbon配置
      • 4.yml添加配置
      • 5.测试
        • 5.1场景一服务正常调用
        • 5.2场景二当被调服务停止运行时
        • 5.3场景三当调取服务超时时
        • 5.4场景四发生异常
      • 改进服务消费者-定义全局服务降级
    • 方式二:定义统一fallback接口
      • 1.创建降级(兜底)处理类UserFeignClientFallBack
      • 2.为接口指定容错处理
      • 3.测试
    • 方式三:定义fallbackFactory
      • 1.创建接口UserFeignClientWithFactory继承UserFeignClient接口
      • 2.HystrixClientFactory类实现FallbackFactory接口
      • 3.并使用内部匿名方法类,实现UserFeignClient接口中的方法
      • 4.测试:发生异常

服务雪崩效应

  • 在微服务架构中通常会有多个服务调用,基础服务的故障可能会导致级联故障,进而造成整个系统不可用的情况,这种现象被称为服务雪崩效应。
  • 服务雪崩效应是一种因“服务提供者”的不可用导致“服务消费者”的不可用,并将不可用逐渐放大的过程。
    在这里插入图片描述

服务雪崩效应形成的原因及应对策略

原因描述应对策略
硬件故障如服务器宕机,机房断电,光纤被挖断等多机房容灾、异地多活等。
程序Bug如程序逻辑导致内存泄漏,JVM长时间FullGC等修改程序bug、及时释放资源等。
缓存击穿一般发生在应用重启,所有缓存失效时,以及短时间内大量缓存失效时。大量的缓存不命中,使请求直击后端服务,造成服务提供者超负荷运行,引起服务不可用。缓存预加载、缓存异步加载等。
流量激增如异常流量,用户重试,代码逻辑重试加大流量等。服务自动扩容、流量控制(服务限流、关闭重试)等。
同步等待服务间采用同步调用模式,同步等待造成的资源耗尽。资源隔离、MQ解耦、不可用服务调用快速失败等。资源隔离通常指不同服务调用采用不同的线程池;不可用服务调用快速失败一般通过熔断器模式结合超时机制实现。

小结

  • 如果一个应用不能对来自依赖的故障进行隔离,那该应用本身就处在被拖垮的风险中。
  • 因此,为了构建稳定、可靠的分布式系统,我们的服务应当具有自我保护能力,当依赖服务不可用时,当前服务启动自我保护功能,从而避免发生雪崩效应。
  • 在SpringCloud中,将重点介绍使用Hystrix解决同步等待的雪崩问题。

Hystrix

介绍

  • Hystrix 是由Netflix发布,旨在应对复杂分布式系统中的延时和故障容错,基于Apache License 2.0协议的开源的程序库,目前托管在GitHub上。
  • 在分布式系统中,许多依赖不可避免的会调用失败,比如超时、异常等,Hystrix能保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。
  • 官网:https://github.com/Netflix/Hystrix
  • Hystrix的中文含义是豪猪, 因其背上长满了刺,而拥有自我保护能力。

Hystrix可以做什么

1.资源隔离

  • 货船为了进行防止漏水和火灾的扩散,会将货仓分隔为多个, 这种资源隔离减少风险的方式被称为:Bulkheads(舱壁隔离模式)。
  • Hystrix将同样的模式运用到了服务调用者上.如下图所示:
    在这里插入图片描述- 资源隔离:在Hystrix中, 主要通过线程池来实现资源隔离. 通常在使用的时候我们会根据调用的远程服务划分出多个线程池。
  • 在一个高度服务化的系统中,我们实现的一个业务逻辑通常会依赖多个服务,比如: 商品详情展示服务会依赖商品服务, 价格服务和商品评论服务 如图所示:
    在这里插入图片描述
  • 调用三个依赖服务会共享商品详情服务的线程池。如果其中的商品评论服务不可用, 就会出现线程池里所有线程都因等待响应而被阻塞, 从而造成服务雪崩。如图所示:
    在这里插入图片描述
  • Hystrix通过将每个依赖服务分配独立的线程池进行资源隔离, 从而避免服务雪崩。如下图所示, 当商品评论服务不可用时, 即使商品服务独立分配的20个线程全部处于同步等待状态,也不会影响其他依赖服务的调用。
    在这里插入图片描述

2.请求熔断

  • “断路器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。
  • 当Hystrix Command请求后端服务失败数量超过一定比例(默认50%), 断路器会切换到开路状态(Open)。这时所有请求会直接失败而不会发送到后端服务。
  • 断路器保持在开路状态一段时间后(默认5秒), 自动切换到半开路状态(HALF-OPEN)。这时会判断下一次请求的返回情况, 如果请求成功, 断路器切回闭路状态(CLOSED), 否则重新切换到开路状态(OPEN)。
  • Hystrix的断路器就像我们家庭电路中的保险丝, 一旦后端服务不可用, 断路器会直接切断请求链, 避免发送大量无效请求影响系统吞吐量, 并且断路器有自我检测并恢复的能力.
    在这里插入图片描述

3.服务降级

  • 服务降级是当我们的某个微服务响应时间过长,或者不可用了,讲白了也就是那个微服务调用不了了,我们不能把错误信息返回出来,或者让他一直卡在那里,所以要在准备一个对应的策略(一个方法),当发生这种问题的时候我们直接调用这个方法来快速返回这个请求,不让他一直卡在那 。
  • Fallback相当于是降级操作. 对于查询操作, 我们可以实现一个fallback方法, 当请求后端服务出现异常的时候, 可以使用fallback方法返回的值. fallback方法的返回值一般是设置的默认值或者来自缓存,告知后面的请求服务不可用了,不要再来了。
    在这里插入图片描述

小结

  • 服务降级:服务器忙,请稍后再试,不让客户端等待并立刻返回一个友好提示。会出现服务降级的情况:程序运行异常、超时、服务熔断触发服务降级、线程池/信号量打满也会导致服务降级。
  • 服务熔断:类比保险丝达到最大服务访问后,直接拒绝访问,拉闸限电,然后调用服务降级的方法并返回友好提示。
  • 接近实时的监控:服务的降级->进而熔断->恢复调用链路
  • 服务限流:秒杀高并发等操作,严禁一窝蜂的过来拥挤,大家排队,一秒钟N个,有序进行。

Hystrix实现服务降级

方式一:@HystrixCommand注解方式

1.服务提供者

1.1业务接口和业务实现中添加方法hystrixTimeout
public interface UserService {
    boolean checkUser() throws Exception;
    String findFeignTimeOut() throws Exception;
    String hystrixTimeout(Integer id) throws Exception;
}
@Service
public class UserServiceImpl implements UserService {
    @Override
    public boolean checkUser() throws Exception {
        return true;
    }
    @Override
    public String findFeignTimeOut() throws Exception {
        //模拟当前业务,当前业务的执行需要3秒钟
        TimeUnit.SECONDS.sleep(3);
        return "模拟当前业务,当前业务的执行需要3秒钟";
    }

    @Override
    public String hystrixTimeout(Integer id) throws Exception {
        //TimeUnit.SECONDS.sleep(6);
        //return "当前线程的名称:"+Thread.currentThread().getName()+"===,id:"+id;
        throw new Exception("发生了异常:" + id);
    }
}
1.2控制器中处理/provider/hystrix/timeout/{id}请求
@RestController
@Slf4j
public class UserController {
    @Resource
    private UserService userService;
    @PostMapping("/provider/checkUser")
    public boolean checkUser() throws Exception{
        return userService.checkUser();
    }

    @PostMapping("/provider/findFeignTimeOut")
    public String findFeignTimeOut() throws Exception{
        return userService.findFeignTimeOut();
    }
    @GetMapping("/provider/hystrixTimeout/{id}")
    public String hystrixTimeout(@PathVariable("id") Integer id) throws Exception{
        return userService.hystrixTimeout(id);
    }
}

2.服务消费者

2.1demo-user-consumer添加依赖
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
2.2在启动类上添加@EnableHystrix
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
@EnableHystrix
public class DemoUserConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoUserConsumerApplication.class, args);
    }
}
2.3在UserFeignClient接口创建远程调用的方法hystrixTimeout
@FeignClient(name = "DEMO-USER-PROVIDER")
public interface UserFeignClient {
    /**
     * 远程调用DEMO-USER-PROVIDER中的/provider/checkUser服务
     * 调用的路径名称必须和服务提供者保证高度一致
     * @return
     * @throws Exception
     */
    @PostMapping("/provider/checkUser")
    boolean checkUser(@RequestParam String id) throws Exception;
    @PostMapping("/provider/findFeignTimeOut")
    String findFeignTimeOut() throws Exception;
    @GetMapping("/provider/hystrixTimeout/{id}")
    String hystrixTimeout(@RequestParam @PathVariable("id") Integer id) throws Exception;
}
2.4在RPC调用方法上加上注解@HystrixCommand

注解:@HystrixCommand(fallbackMethod = “hystrixTimeoutFallback”),这就指定了该方法的降级方法是哪个。

@Service
public class LocalUserServiceImpl implements LocalUserService {
    @Resource
    private UserFeignClient userFeignClient;
    @Override
    public boolean doLogin(String id) throws Exception {
        //通过http协议调用的服务
        return userFeignClient.checkUser(id);
    }

    @Override
    public String queryFeignTimeOut() throws Exception {
        return userFeignClient.findFeignTimeOut();
    }

    /**
     * 当远程调用provider的服务时,如果服务提供者正确响应,获取provider的返回值即可
     * 当远程调用provider的服务时,如果服务提供者响应失败或出现异常,则返回fallbackMethod中的降级方法
     * fallbackMethod属性指定的就是降级的方法
     * @param id
     * @return
     * @throws Exception
     */
    @HystrixCommand
    @Override
    public String hystrixTimeout(Integer id) throws Exception {
        return userFeignClient.hystrixTimeout(id);
    }

    public String fallbackHystrixTimeout(Integer id){
        return "服务降级,服务器繁忙,请耐心等待";
    }
}

3.添加ribbon配置

@Configuration
public class RibbonConfiguration {
    @Bean
    public IClientConfig ribbonClientConfig() {
        DefaultClientConfigImpl config = new DefaultClientConfigImpl();
        return config;
    }

    @Bean
    public IRule myRule(IClientConfig config) {
        config.setProperty(IClientConfigKey.Keys.ConnectTimeout,5000);// 设置连接超时为5000毫秒
        config.setProperty(IClientConfigKey.Keys.ReadTimeout,5000);// 设置读取超时为5000毫秒
        return new RoundRobinRule();
    }
}

4.yml添加配置

在application. yml中添加配置开启容错

server:
  port: 8085
spring:
  application:
    name: demo-user-consumer
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7776/eureka/
logging:
  level:
    cn.kgc.feignclient: debug
feign:
  hystrix:
    enabled: true
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 5000

5.测试

5.1场景一服务正常调用

在这里插入图片描述

5.2场景二当被调服务停止运行时

在这里插入图片描述

5.3场景三当调取服务超时时

在这里插入图片描述

在这里插入图片描述

5.4场景四发生异常

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

改进服务消费者-定义全局服务降级

  • 每一个业务方法都有一个对应的兜底方法,代码会膨胀
  • 和业务代码混在了一起,容易混乱在业务实现类添加注解@DefaultProperties(defaultFallback = “hystrixTimeOutFallback”)
  • 在方法上加注解@HystrixCommand
@Service
@DefaultProperties(defaultFallback = "fallbackHystrixTimeout")
public class LocalUserServiceImpl implements LocalUserService {
    @Resource
    private UserFeignClient userFeignClient;
    @Override
    public boolean doLogin(String phone,String password) throws Exception {
        return userFeignClient.checkUser(phone, password);
    }

    @Override
    public List<String> searchUser(Map<String, Object> map) throws Exception {
        return userFeignClient.findUserList(map);
    }
    @HystrixCommand
    @Override
    public String queryFeignTimeOut() throws Exception {
        return userFeignClient.findFeignTimeOut();
    }

    /**
     * 当远程调用provider的服务时,如果服务提供者正确响应,获取provider的返回值即可
     * 当远程调用provider的服务时,如果服务提供者响应失败或出现异常,则返回fallbackMethod中的降级方法
     * fallbackMethod属性指定的就是降级的方法
     * @param id
     * @return
     * @throws Exception
     */
    @HystrixCommand
    @Override
    public String hystrixTimeout(Integer id) throws Exception {
        return userFeignClient.hystrixTimeout(id);
    }

    public String fallbackHystrixTimeout(){
        return "服务降级,服务器繁忙,请耐心等待";
    }
}

方式二:定义统一fallback接口

1.创建降级(兜底)处理类UserFeignClientFallBack

  • 实现UserFeignClient接口,返回预先处理好的默认值。
@Component
public class UserFeignClientFallback implements UserFeignClient {
    /**
     * 当调用checkUser方式时,会调用DEMO-USER-PROVIDER的/provider/checkUser API接口
     * 调用的路径要求DEMO-USER-PROVIDER中路径保持一致
     * 如果调用的方法包含参数,需要和DEMO-USER-PROVIDER中的参数保持一致
     *
     * @param phone
     * @param password
     * @return
     * @throws Exception
     */
    @Override
    public boolean checkUser(String phone, String password) throws Exception {
        return false;
    }

    @Override
    public String findFeignTimeOut() throws Exception {
        return "服务调用失败,服务降级测试";
    }

    @Override
    public String hystrixTimeout(Integer id) throws Exception {
        return "服务调用失败,服务降级测试";
    }
}

2.为接口指定容错处理

在这里插入图片描述

  • demo-user-consumer-hystrix项目的UserFeignClient接口中,通过@FeignClient注解的fallback属性指定容错处理类。
/**
 * 通过name或value属性指定远程调用的服务的名字(存在于注册中心)
 */
@FeignClient(value = "DEMO-USER-PROVIDER",fallback = UserFeignClientFallback.class)
public interface UserFeignClient {
    /**
     * 当调用checkUser方式时,会调用DEMO-USER-PROVIDER的/provider/checkUser API接口
     * 调用的路径要求DEMO-USER-PROVIDER中路径保持一致
     * 如果调用的方法包含参数,需要和DEMO-USER-PROVIDER中的参数保持一致
     * @return
     * @throws Exception
     */
    @PostMapping("/provider/checkUser")
    boolean checkUser(@RequestParam String phone, @RequestParam String password) throws Exception;
    @PostMapping("/provider/findFeignTimeOut")
    String findFeignTimeOut() throws Exception;
    @GetMapping("/provider/hystrixTimeout/{id}")
    String hystrixTimeout(@PathVariable("id") Integer id) throws Exception;
}

3.测试

方式三:定义fallbackFactory

  1. fallback 的方式的缺陷:不能捕获异常打印堆栈信息,不利于问题排查
  2. fallbackFactory 推荐:可以捕获异常信息并返回默认降级结果。可以打印堆栈信息。

1.创建接口UserFeignClientWithFactory继承UserFeignClient接口

public interface UserFeignClientWithFactory extends UserFeignClient {
}

2.HystrixClientFactory类实现FallbackFactory接口

3.并使用内部匿名方法类,实现UserFeignClient接口中的方法

@Component
@Slf4j
public class HystrixClientFactory implements FallbackFactory<UserFeignClient> {
    @Override
    public UserFeignClient create(Throwable cause) {
        log.info("发生了异常:{},异常消息:{}",cause,cause.getMessage());
        return new UserFeignClientWithFactory() {
            @Override
            public boolean checkUser(String phone, String password) throws Exception {
                return false;
            }

            @Override
            public List<String> findUserList(Map<String, Object> params) throws Exception {
                return new ArrayList<>();
            }

            @Override
            public String findFeignTimeOut() throws Exception {
                return "fallbackFactory方式实现服务降级";
            }

            @Override
            public String hystrixTimeout(Integer id) throws Exception {
                return "fallbackFactory方式实现服务降级";
            }
        };
    }
}

4.测试:发生异常

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

信息安全基础(补充)

&#xff09;的内容主要有数据备份、数据修复、系统恢复等。响应&#xff08;Respons&#xff09;的内容主要有应急策略、应急机制、应急手段、入侵过程分析及安全状态评估等。 面向数据挖掘的隐私保护技术主要解决高层应用中的隐私保护问题&#xff0c;致力于研究如何根据不同…

html5各行各业官网模板源码下载(2)

文章目录 1.来源2.源码模板2.1 HTML5好看的旅行网站模板源码2.2 HTML5自适应医院叫号大屏模板源码2.3 HTML5好看的高科技登录页面模板源码2.4 HTML5宠物美容服务公司网站模板源码2.5 HTML5创意品牌广告设计公司网站模板源码2.6 HTML5实现室内设计模板源码2.7 HTML5黄金首饰网站…

PL5358A 单芯锂离子/聚合物电池保护IC芯片

一般说明 PL5358A系列产品是锂离子/聚合物电池保护的高集成解决方案。PL5358A包含先进 的功率MOSFET&#xff0c;高精度电压检测电路和延迟电路。5358A被放入一个超小的SOT23-5封装&#xff0c;只有一个外部元件&#xff0c;使其成为理想的解决方案&#xff0c;在有限的…

美业SaaS收银系统源码-已过期卡项需要延期怎么操作?美业系统实操

美业SaaS系统 连锁多门店美业收银系统源码 多门店管理 / 会员管理 / 预约管理 / 排班管理 / 商品管理 / 促销活动 PC管理后台、手机APP、iPad APP、微信小程序 1.询问会员手机号和需要延期的卡项 2.PC运营后端-数据导入-修改已售卡项&#xff0c;搜索手机号 3.把需要卡项选…

D - Permutation Subsequence(AtCoder Beginner Contest 352)

题目链接: D - Permutation Subsequence (atcoder.jp) 题目大意&#xff1a; 分析&#xff1a; 相对于是记录一下每个数的位置 然后再长度为k的区间进行移动 然后看最大的pos和最小的pos的最小值是多少 有点类似于滑动窗口 用到了java里面的 TreeSet和Map TreeSet存的是数…

Vue3中如何自定义消息总线

前言 在 Vue 开发中&#xff0c;组件之间的通信是一个常见的需求&#xff0c;无论是父组件向子组件传递数据&#xff0c;还是子组件向父组件传递数据&#xff0c;甚至是兄弟组件之间的数据交换。这些通信需求在构建复杂的 Vue 应用时尤为关键。 Vue 提供了多种组件通信的方式…

Linux系统安装AMH服务器管理面板并实现远程访问管理维护

目录 前言 1. Linux 安装AMH 面板 2. 本地访问AMH 面板 3. Linux安装Cpolar 4. 配置AMH面板公网地址 5. 远程访问AMH面板 6. 固定AMH面板公网地址 1. 部署Docker Registry 2. 本地测试推送镜像 3. Linux 安装cpolar 4. 配置Docker Registry公网访问地址 5. 公网远程…

如何被谷歌收录?

最简单的方法就是提交网站给谷歌&#xff0c;但这种方法可操作空间不大&#xff0c;一天一般也就只有十条左右的链接可以提交&#xff0c;对于一些大网站来说&#xff0c;这种方法显然不适用&#xff0c;这时候GPC爬虫池的好处就体现了&#xff0c;GPC爬虫池对希望提升Google搜…

re:记录下正则的使用方法

1、match pattern r(\d{4})[-\/](\d{1,2})[-\/](\d{1,2}) match re.search(pattern, text) if match:year, month, day match.groups()

SolidWorks教育版 学生使用的优势

在工程技术领域的学习中&#xff0c;计算机辅助设计软件&#xff08;CAD&#xff09;如SolidWorks已经成为学生掌握专业知识和技能的必要工具。SolidWorks教育版作为专为教育机构和学生设计的版本&#xff0c;不仅提供了与商业版相同的强大功能&#xff0c;还为学生带来了诸多独…

TypeScript 语言在不改变算法复杂度前提下,细节上性能优化,运行时性能提升效果明显吗?

有经验的专家写的代码&#xff0c;和无经验的新手写的代码&#xff0c;在运行时性能上大概会有多少差异&#xff1f; 个人感觉&#xff0c;常规业务逻辑代码通常可以差 1 倍&#xff1b;如果算上框架的影响&#xff0c;可以差 2~4 倍。 仅考虑业务代码的话&#xff0c;新手容易…

科普:水冷负载的工作原理

水冷负载是一种利用水作为冷却介质&#xff0c;将电子设备产生的热量传递到外部环境的散热方式。它广泛应用于各种电子设备&#xff0c;如服务器、数据中心、电力设备等&#xff0c;以提高设备的运行效率和稳定性。本文将对水冷负载的工作原理进行简要科普。 水冷负载的工作原理…

我被恐吓了,对方扬言要压测我的网站

大家好我是聪&#xff0c;昨天真是水逆&#xff0c;在技术群里交流问题&#xff0c;竟然被人身攻击了&#xff01;骂的话太难听具体就不加讨论了&#xff0c;人身攻击我可以接受&#xff0c;我接受不了他竟然说要刷我接口&#xff01;&#xff01;&#xff01;&#xff01;这下…

C#多维数组不同读取方式的性能差异

背景 近来在优化一个图像显示程序&#xff0c;图像数据存储于一个3维数组data[x,y,z]中&#xff0c;三维数组为一张张图片数据的叠加而来&#xff0c;其中x为图片的张数&#xff0c;y为图片行&#xff0c;Z为图片的列&#xff0c;也就是说这个三维数组存储的为一系列图片的数据…

记录下所遇到远程桌面连接方法winSCP跟mstsc

之前公司使用过连接远程桌面&#xff0c;今天又遇到要使用远程桌面问题&#xff0c;来记录下。 之前公司使用的是winR 然后回车弹出 后面按照用户名密码就能登陆了 今天后台给了我一张图片准备接着用这个方法&#xff0c;后台就说这个东西要下载winSCP 后台发给我图片 然后去…

mfc140u.dll丢失的解决方法有哪些?怎么全面修复mfc140u.dll文件

mfc140u.dll丢失其实相对来说不太常见到&#xff0c;因为这个文件一般是不丢失的&#xff0c;不过既然有人遇到这种问题&#xff0c;那么小编一定满足各位&#xff0c;给大家详细的唠叨一下mfc140u.dll丢失的各种解决方法&#xff0c;教大家以最快最有效率的方法去解决mfc140u.…

python文件IO基础知识

目录 1.open函数打开文件 2.文件对象读写数据和关闭 3.文本文件和二进制文件的区别 4.编码和解码 读写文本文件时 读写二进制文件时 5.文件指针位置 6.文件缓存区与flush()方法 1.open函数打开文件 使用 open 函数创建一个文件对象&#xff0c;read 方法来读取数据&…

CentOS7 部署单机版 ElasticSearch + Logstash

一、部署ElasticSearch Elasticsearch部署参考下面文章&#xff1a; CentOS7 部署单机版 elasticsearch-CSDN博客文章浏览阅读285次&#xff0c;点赞6次&#xff0c;收藏3次。ElasticSearch&#xff0c;用于检索、聚合分析和大数据存储https://blog.csdn.net/weixin_44295677…

定个小目标之每天刷LeetCode热题(1)

有两种解决方法&#xff1a; 第一种&#xff1a;利用哈希集合不重复的特性&#xff0c;代码展示如下 public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {Set<ListNode> listNode new HashSet<ListNode>();ListNode…

一招搞定!家里灰尘多?教你如何轻松清理,推荐必备神器

在现代生活中&#xff0c;灰尘无处不在&#xff0c;特别是在大城市&#xff0c;空气中的污染物更多&#xff0c;导致家里的灰尘积聚速度加快。保持家居环境的干净和整洁不仅能提升生活质量&#xff0c;还能保护我们的健康。作为一名家电博主将为你提供详细的家里灰尘清理方法&a…