本文最后更新于218 天前,其中的信息可能已经过时,如有错误请发送邮件到[email protected]
K8S中部署了几个项目实例
我们每个微服务都部署了两个pod,不过,由于K8s支持自动伸缩(Horizontal Pod Autoscaler, HPA),实例数量可能会根据CPU或内存使用率自动增加或减少。我们的HPA配置是,当CPU使用率超过70%时,K8s会自动增加实例数量;当CPU使用率低于30%时,K8s会减少实例数量。
jdk自带的线程池和Spring的线程池区别
ThreadPoolTaskExecutor其实是对ThreadPoolExecutor做了一层封装,并提供了一些额外的Spring特性。
使用方面
ThreadPoolExecutor: 它是一个独立的线程池实现,不依赖于Spring框架,可以在任何Java应用中使用。ThreadPoolTaskExecutor: 它是Spring框架的一部分,与Spring的依赖注入(DI)和AOP等功能紧密集成。例如,你可以通过Spring的@Async注解来异步执行任务,而无需手动提交任务到线程池。
生命周期
ThreadPoolExecutor: 需要手动管理线程池的生命周期,例如调用shutdown()或shutdownNow()方法来关闭线程池。ThreadPoolTaskExecutor: 由于它是Spring管理的Bean,Spring会在应用上下文关闭时自动关闭线程池,无需手动管理。
你的项目中写了使用Spring的动态线程池,那么jdk自带的线程池是否可以支持动态配置
JDK自带的ThreadPoolExecutor本身并不直接支持动态配置线程池参数(如核心线程数、最大线程数、任务队列大小等),只能修改这些属性,所以还不能完全作为动态线程池的组成。

线程池的原理
- 当有新的任务提交到线程池时,线程池会首先判断当前线程池中的线程数量是否达到了核心线程数,如果没有达到,则创建新的线程来执行任务。
- 如果线程池中的线程数量已经达到了核心线程数,则将新任务放入工作队列中等待执行。
- 当工作队列已满时,线程池会创建新的线程来执行任务,直到线程数量达到了最大线程数。
- 当线程池中的线程数量已经达到了最大线程数,再有新的任务提交到线程池时,线程池会根据设定的策略(例如抛出异常、丢弃任务、阻塞等待)来处理新的任务。
- 当线程池中的线程数量超过了核心线程数且空闲线程的存活时间超过了设定的时间时,空闲线程会被回收,直到线程池中的线程数量重新回到了核心线程数为止。
如果线程池中出现了异常,如何立刻获取
使用CompletableFuture,在其中的supplyAsync方法中去执行任务,如果出现了异常可以通过链式调用exceptionally方法,这个方法接收一个throwable参数,这个就是我们发生异常的信息。
如果程序出现了异常,如果立刻获取
外层
使用监控工具
你可以使用监控工具(如Prometheus、Grafana、ELK Stack等)来实时监控系统的运行状态,并在发现异常时立即通知相关人员。
使用分布式追踪系统
你可以使用分布式追踪系统(如Zipkin、Jaeger等)来追踪请求的执行路径,并在发现异常时立即通知相关人员。
内层
- 首先我们需要在网关层面去做一个日志的统计,请求和响应的都能拿到。
- 在全局异常信息中新增一个自定义的异常类型,一旦程序发生了对应的异常(可能是我们手动抛出的),就代表这些异常是要紧密关注的。
- 对于这些异常通过HTTP的方式返回给企业微信(或者第三方的一些平台)。
服务的降级和熔断
- 服务降级 :当某个服务不可用或响应时间过长时,系统可以暂时返回一个预定义的降级响应,而不是让用户等待或抛出异常。这样可以保证系统的可用性,避免级联故障。
- 熔断 :当某个服务的错误率达到一定阈值时,系统会自动断开对该服务的调用,直接返回降级响应。熔断机制可以防止故障扩散,保护系统的稳定性。
Hystrix和Resilience4j都是使用的滑动窗口算法,滑动窗口的大小即最近多少次调用将被统计,超过百分之多少的请求失败的时候会打开断路器,这个时候服务就进入了熔断效果,等服务恢复后也是需要进行一定阈值的访问成功才能进入半开状态,直至全开。