關於如何在專案介面保證冪等性的一點思考

ZShUn發表於2019-02-25

什麼是介面冪等?

介面冪等就是無論客戶端呼叫服務端介面發起多少次請求,有且只有一次有效。

如何解決冪等問題呢?

1.暴露獲取冪等token介面,且在此時儲存redis、mysql、本地記憶體等(可根據具體業務場景選擇token儲存方式)

@Autowired
private RedissonClient redissonClient;

private String createToken(){
    return UUID.randomUUID().toString().replace("-","");
}

    @GetMapping("/getLdempotentToken")
    public Response<String> getLdempotentToken(){
        RMapCache<String,String> rMapCache = redissonClient.getMapCache(LdempotentAspect.LDEMPOTENT_TONE);
        String token = createToken();
        rMapCache.put(token,token);
        return Response.ok(token);
    }
複製程式碼

2.客戶端在請求介面前先獲取冪等介面,然後在請求介面前寫入請求頭中.

key value
ldempotent_token ba4b441e75f2449792fce5eb0ccfa2ab

3.利用spring aop技術程式碼需要處理冪等介面。在執行介面之前驗證客戶端請求頭中的冪等token,驗證成功則刪除token,驗證失敗則直接返回錯誤資訊.

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Ldempotent {

}
複製程式碼
@Slf4j
@Component
@Aspect
public class LdempotentAspect {

    public static final String LDEMPOTENT_TONE = "ldempotent_token";

    @Autowired
    private RedissonClient redissonClient;

    @Pointcut("@annotation(com.fast.family.framework.core.redis.ldempotent.Ldempotent)")
    public void pointcut(){}



    @Around("pointcut()")
    public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        String token = Optional.ofNullable(WebUtils.getRequestHeader(LDEMPOTENT_TONE))
                .orElseThrow(() -> new LdempotentException(ResponseCode.LDEMPOTENT_ERROR.getCode()
                        ,ResponseCode.LDEMPOTENT_ERROR.getMsg()));
        RMapCache<String,String> rMapCache = redissonClient.getMapCache(LDEMPOTENT_TONE);
        Optional.ofNullable(rMapCache.get(token))
                .orElseThrow(() -> new LdempotentException(ResponseCode.LDEMPOTENT_ERROR.getCode()
                        ,ResponseCode.LDEMPOTENT_ERROR.getMsg()));
        rMapCache.remove(rMapCache.get(token));//token一次有效,所以在驗證完後需刪除
        return proceedingJoinPoint.proceed();
    }


}
複製程式碼

那麼按照上述步驟則可以保證介面冪等性(這種方式除了可以處理介面冪等,還能處理其他問題嗎?哈哈哈哈哈哈)

相關文章