设计模式最优实践—策略模式 什么策略模式策略模式就是定义一组策略,分别在不同的类中封装,每种策略可以根据当前的场景互相替换,策略的之间的变化是独立的。比如我们要从杭州到上海,可以根据自身的情况,来选择是乘坐火车、汽车、高铁,这些出行方式就是不同的策略。合适使用策略模式当代码中的if else 超过3层情况,是时候考虑使用策略模式的代替了,好的代码是符合单一职责和开闭原则的。怎么使用策略模式第一步,定义策略接口,包括3个方法:1、获取策略方法2、是否执行策略逻辑,这个后面方便管理3、处理策略逻辑的方法.
HTTP压测工具Wrk 介绍和使用 介绍wrk是一款简单的HTTP压测工具,托管在Github上,https://github.com/wg/wrk.wrk 的一个很好的特性就是能用很少的线程压出很大的并发量. 原因是它使用了一些操作系统特定的高性能 io 机制, 比如 select, epoll, kqueue 等. 其实它是复用了 redis 的 ae 异步事件驱动框架. 确切的说 ae 事件驱动框架并不是 redis 发明的, 它来至于 Tcl的解释器 jim, 这个小巧高效的框架, 因为被 redis 采用而更多的被大家所熟知.
线上问题定位处理的工具Arthas 前言在使用Arthas之前,当遇到 Java 线上问题时,如 CPU 飙升、负载突高、内存溢出等问题,你需要查命令,查网络,然后 jps、jstack、jmap、jhat、jstat、hprof 等一通操作。最终焦头烂额,还不一定能查出问题所在。而现在,大多数的常见问题你都可以使用Arthas轻松定位,迅速解决,及时止损,准时下班。1、Arthas 介绍Arthas是Ali...
异步执行一组任务等待所有任务执行完成的2种方式 private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 10, 60, TimeUnit.SECONDS, new ArrayBlockingQueue<>(1000), new ThreadFactoryBuilder().setNameFormat("metrix-pool...
Spring 声明式事务中常见的坑点 背景我们在业务代码中经常使用数据库的事务,及spring 声明式事务@Transcational, 但也经常遇到事务不生效的情况,总结起来主要是踩到下面的几个坑去了。一、配置不正确导致方法上的事务没生效,需要确认@Transctional注解标记的方法必须是public的,并且是通过spring注入的Bean进行调用的,不能在本方法中直接调用。二、异常处理不正确导致事务虽然生效...
springboot 中异步调用 使用@Async 一、背景对于一些的耗时的且与处理结果业务不是紧密关联的,我们采用异步调用的方式处理。一般我们会手动创建一个线程池,来执行这个耗时的异步任务。其实spring 已经提供了一个注解来帮我们干了这件事了二、使用方式使用方式就是很简单了1、在启动类中加入@EnableAsync 是异步调用 @Asyncz注解生效2、在需要异步执行的方法上加上@Async,也可以在类上面加,表示该类中的...
GitHub上最牛逼的10个Java项目 以下文章来源于阿飞的博客,作者阿飞的博客1. CS-Notesstar:92.1k 介绍:技术面试必备基础知识、Leetcode、计算机操作系统、计算机网络、系统设计、Java、Python、C++ ;地址:https://cyc2018.github.io/CS-Notes;其中,算法包括:剑指 Offer 题解、Leetcode 题解、算法、笔试面试题库。数据库包括:数据库系...
去if-else化 (二),利用充血枚举类型 充血枚举类型——Rich Enum Type 模式的优势: 不难发现,这其实就是 enum 枚举类型和 Strategy Pattern 策略模式的巧妙结合运用; 当需要增加新的通知方式时,只需在枚举类 NOTIFY_TYPE 增加一个值,同时在策略接口 NotifyMechanismInterface 中增加一个 by 方法返回对应的策略实现; ...
重试工具库二:AOP 结合 guava retryer 实现接口自动重试 上一篇文章中介绍了Retryer 强大的工具库,以及创建方式。重试工具库一: Guava-Retrying。本篇文章我们通过面向切面结合guava的这个强大的工具类,来实现只需要添加一行注解即可的自动重试机制。注解:@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface R...
重试工具库一: Guava-Retrying 在我们的开发中,api接口调用异常是经常会遇到的,任何接口都会有不同概率的异常情况,对于可以重入的接口,为了避免偶发性异常造成的服务的不可用,重试机制就非常有必要了.Guava-Retryiny 是一个非常灵活的重试组件,包含多种重试策略,扩展很方便。一、maven依赖<dependency> <groupId>com.github.rholder</g...
垃圾回收的优化 回收发生在哪里JVM内存区域中:程序计数器、虚拟机栈、本地方法这个3个区域是线程私有的,堆和方法区则是线程共享的。那么垃圾回收重点关注的是堆和方法区。堆中是对对象的回收,方法区是对常量和类的回收。...
HTTP 连接池的使用 一、HTTP 的长短连接问题HTTP1.0 当时用的还是短连接的方式,就是每次的请求都要建立一次TCP连接,创建TCP连接和关闭TCP的连接都是耗时的过程。HTTP1.1 则对HTTP1.0做了很大的改进,默认使用的是长连接的方式。减少了建立连接和关闭连接的消耗。二、httpClient 的使用后端发送HTTP请求,一般使用的是apache里面的这个jar包 <dep...
线上问题定位—cpu飚高 服务器CPU突然告警,如何定位是哪个服务进程导致CPU过载,哪个线程导致CPU过载,哪段代码导致CPU过载?步骤一、找到最耗CPU的进程工具:top方法: 执行top -d 1-c,每秒刷新一次,显示进程运行信息列表 键入P(大写p),进程按照CPU使用率排序 图示:如上图,最耗CPU的进程PID为1802步骤二:找到最耗CPU的线程工具:top...
多线程-锁优化 一、Synchronized同步锁的优化Synchronized 在JDK1.5 之前是JVM实现一种内置锁,是基于底层的操作系统的Mutex Lock 实现的,所以会带来用户态和内核态的切换问题。JDK1.6 对锁的升级优化:针对java对象头,引入了分级锁的机制。1、当一个线程获取锁时,首先对象锁将成为一个偏向锁,这样的优化了一个线程重复获取锁导致的用户态和系统内核态的切换问题。2、当...