技术分享 -- 185




概述上一篇日志中,我们介绍了 Retryer 类,及可以用来方便的创建 Retryer 的强大工具类 RetryerBuilderguava 重试工具库 -- RetryerRetryer 创建工具 -- RetryerBuilder 本篇日志中,我们通过面向切面结合 guava 的这个强大的工具类,来实现只需要添加一行注解即可的自动重试机制 注解我们的注解旨在通过简单的参数配置常用的重试策略:@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface TechlogRetryer { long waitMsec() default 0; Class[] retryThrowable() default {}; long maxDelayMsec() default 0; int maxAttempt() default 0; }  切面我们以上面的注解为切点构造一个切面,实现对方法的自动处理@Aspect @Service public class TechlogRetryerAspect { private static final Logger LO
#技术帖    #技术分享    #spring    #aop   
概述在我们的开发中,api 接口调用异常是经常会遇到的,任何接口都会有不同概率的异常情况,对于可以重入的接口,为了避免偶发性异常造成的服务的不可用,重试机制就非常有必要了通常我们的接口超时都是符合正态分布的,即 99.9% 的请求超时时间都不会大于某个值,将这个值设置为请求的超时时间是比较合理的,因为即使将超时时间设置为该值的两倍或更高,按照正态分布的概率来看,请求成功率并不会有明显提高,而使用该值作为超时时间可以保证在 99.9% 的情况下请求正常返回,对于异常情况我们添加重试机制就可以大概率减少失败但是需要注意的是,我们的调用链通常是非常长的,如果在多个层级上都添加重试,那么最终将会造成雪崩效应,最底层将受到指数扩大的请求次数,这对于底层服务的压力是非常大的,因此重试的设置需要非常谨慎,这在底层服务出现问题时尤为明显,过度的重试将会成倍加剧问题的严重性,因此,在重试机制的同时增加递增的重试间隔时间或者熔断机制也是非常有必要的,有时间的话博主将会在博客中介绍用于业务熔断组件 Hystrix,敬请期待 guava 提供了非常优雅、方便的重试工具类 -- retryer maven 依赖<dependency> <groupId>com.g
#读书笔记    #技术帖    #龙潭书斋    #技术分享   
概述上一篇日志中,我们介绍了 Retryer 类guava 重试工具库 -- Retryer由于 Retryer 类构造方法参数较多,较为复杂,而使用 RetryerBuilder 要更加简洁明了,也是更加常用的方式 RetryerBuilder 的创建 -- newBuilderRetryerBuilder 的构造方法是 private 的,这也意味着我们不能通过 new 的方式直接创建 RetryerBuilder 对象RetryerBuilder 提供了一个 static 方法:public static <V> RetryerBuilder<V> newBuilder()  通过:RetryerBuilder retryer = RetryerBuilder.newBuilder(); 就可以创建一个 RetryerBuilder 了 Retryer 对象的创建通过 RetryerBuilder 提供的 build 方法就可以创建出一个 
#读书笔记    #技术帖    #龙潭书斋    #技术分享   

200x200


概述刚刚接触 java 的同学通常会被 java 百花齐放的日志体系搞晕,错综复杂的日志框架包之间总是发生冲突,令人抓狂本篇日志就从历史上各个版本的 

#技术帖    #技术分享    #log    #java   

200x200


概述在此前的博客中,我们介绍了代理模式代理模式 -- Proxyjava 提供了动态代理机制以巧妙的方式实现了代理模式的设计理念,最为常用的 AOP 就是基于动态代理实现

#技术帖    #技术分享    #java    #jdk   
概述作为 java 开发者,创建对象是一件最常见的事,那么,除了使用 new 来创建对象,你知道还有哪些创建对象的方式吗?怎样通过一个 Class 对象获得他的实例呢?本节我们就来介绍一下 java 对象创建的五种方式 使用 new 关键字MyObject myObj = new MyObject();  这是最简单也是最常见的对象创建方式,他是通过调用调用指定构造方法进行对象的创建的,可以调用任何构造方法 使用 Class 类的 newInstance 方法很多情况下,我们需要通过已有的 Class 对象创建对应的实例,这在代理、反射等情况下非常常见Class 对象拥有 newInstance 方法,他等同于调用对应类的无参构造方法创建对象,因此这种方式最大的局限也在于被实例化的类必须具有无参构造方法,当然这样做的一个好处是,我们可以调用类的无参 private 构造方法创建对象,这是用 new 关键字无法做到的 使用 java.lang.reflect.Constructor 类的&
#技术帖    #技术分享    #class    #java   
概述上一篇日志中,我们介绍了单例模式的概念和基础的应用单例模式 -- Singleton本节中,我们就来介绍一下 java 语言中如何编写单例模式类 只适合单线程环境的单例模式public class Singleton { private static Singleton instance = null; private Singleton() { } public static Singleton getInstance(){ if (instance == null) { instance = new Singleton(); } return instance; } }  这是单例模式的最简单实现,private 的构造方法保证了类不会被通过 new 的方式创建,同时,判断 instance 是否为 null 保证了单线程环境下单例模式运行的正确性但是,正如我们反复强调的,这种方式是非线程安全的,原因在于,当多个线程并发执行,同时进行判断 instance 为 null 的操作,而此时 instance&
#技术帖    #技术分享    #java    #singleton   
概述guava 是一套由 google 开发的十分成熟、易用 java 核心库,包含了集合、缓存、并发库、原生类型支持、通用注解、字符串处理、IO 操作等基础库由于 Guava 的强大与易用,被 java 开发人员广泛接受,jdk 的每次升级都会融入 Guava 中一些已经被广泛验证并且运用的特性,足见 Guava 的先进本篇日志就来介绍一下常见的几个 Guava 基本工具 Optional有过 java 编程经验的很多人都有过和 null 开战的悲惨经历,模棱两可的 null 常常会导致很多令人意想不到的问题java8 中也加入了 Optional 类:java8 新特性Guava 用 Optional 类解决了这个问题,Optional<T> 对 T 类型进行了一层封装,可以看做是 T 类型的一个容器,他 提供了下列方法: Optional 提供的 static 方法Opt
#技术帖    #技术分享    #java    #object   
概述此前我们介绍了通过 xml 配置生成 bean 的方法:依赖构造器注入、注入属性装配 bean你是否想过 xml 是如何解析的呢?我们是否可以自己定义一个 xml 标签,然后自己去处理用户对该标签的配置呢?事实上,spring2.0 开始就提供了 schema 风格的 xml 扩展机制,允许我们添加额外的扩展标签,下面我们就来尝试一下 引入标签配置 -- xsd 文件首先,我们需要对我们即将提供的标签进行声明和格式定义,spring 是通过解析我们提供的 xsd 文件来确定我们的自定义标签的格式的xsd 文件是一种特殊的 xml 文件,spring 官方包中的提供了很多 xsd 文件的配置,我们可以去参考这些文件的定义方法来实现我们自己的定义这里,我们来实现一个简单的标签 <techlogBean time="" name=""/>,来创建一个 bean <?xml version="1.0" e
#技术帖    #xml    #技术分享    #java   

200x200


概述在 Web 应用中,请求的拦截是最常见的一个需求,例如常常需要进行用户权限的验证等等,这样的通用逻辑不应该陷入业务逻辑来处理,Spring 提供了 org.

#技术帖    #mvc    #技术分享    #http   



京ICP备15018585号