Heim  >  Artikel  >  Java  >  Wie Springboot automatische idempotente Schnittstellen implementiert

Wie Springboot automatische idempotente Schnittstellen implementiert

WBOY
WBOYnach vorne
2023-05-11 21:52:211672Durchsuche

Impotenz

1. Konzept: Die Auswirkungen mehrerer Hinrichtungen sind die gleichen wie die Auswirkungen einer einzigen Hinrichtung.
Nach dieser Bedeutung besteht die ultimative Bedeutung darin, dass die Auswirkung auf die Datenbank nur einmalig sein kann und nicht wiederholt verarbeitet werden kann. Um die Idempotenz sicherzustellen, werden normalerweise die folgenden Methoden verwendet:

1: Die Datenbank erstellt einen eindeutigen Index, der sicherstellen kann, dass letztendlich nur ein Datenelement in die Datenbank eingefügt wird

# 🎜🎜#2: Token-Mechanismus: Rufen Sie vor jeder Schnittstellenanforderung ein Token ab und fügen Sie dieses Token beim nächsten Mal zum Header der Anforderung hinzu. Wenn die Überprüfung erfolgreich ist, wird das Token gelöscht

#🎜 🎜#3: Pessimistische Sperre oder optimistische Sperre können sicherstellen, dass andere SQL-Dateien nicht jedes Mal aktualisiert werden können (wenn die Datenbank-Engine innodb ist, die Auswahlbedingung). muss ein eindeutiger Index sein, um das Sperren der gesamten Tabelle zu verhindern.)#🎜🎜 #

4: Zuerst die Datenbank abfragen, um zu sehen, ob die Daten vorhanden sind wurde gestellt und die Anfrage wird direkt abgelehnt. Wenn sie nicht existiert, beweist dies, dass sie zum ersten Mal eingeht, und sie wird direkt freigegeben.

redis Schematische Darstellung zur Realisierung der automatischen Idempotenz:

1. Redis-Service-API erstellenWie Springboot automatische idempotente Schnittstellen implementiert#🎜 🎜# 1: Richten Sie zunächst den Redis-Server ein.

2: Führen Sie den Redis-Stater in Springboot oder die von Spring gekapselte Haupt-API ein. Hier verwenden wir die gekapselte Version von Springboot #Der Code lautet wie folgt:

/*
redis工具类
*/
@Component
public class RedisService {

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 写入缓存
     * @param key
     * @param value
     * @return
     */
    public  boolean set(final String key,Object value){
        boolean result = false;
        try {
            ValueOperations<Serializable,Object> operations = redisTemplate.opsForValue();
            operations.set(key,value);
            result = true;
        }catch (Exception e){
            result = false;
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 写入缓存有效期
     * @return
     */
    public boolean setEx(final String key ,Object value,Long expireTime){
        boolean result = false;
        try {
            ValueOperations<Serializable,Object> operations = redisTemplate.opsForValue();
            operations.set(key,value);
            redisTemplate.expire(key,expireTime, TimeUnit.SECONDS);//有效期
            result = true;
        }catch (Exception e){
            result = false;
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 判断缓存中是否有对应的value
     * @param key
     * @return
     */
    public boolean exists(final String key){
       return redisTemplate.hasKey(key);
    }

    /**
     * 读取缓存
     * @param key
     * @return
     */
    public Object get(final String key){
        Object obj = null;
        ValueOperations<Serializable,Object> operations= redisTemplate.opsForValue();
        obj =  operations.get(key);
        return obj;
    }

    /**
     * 删除对应的value
     * @param key
     * @return
     */
    public boolean remvoe(final String key){
        if(exists(key)){
            Boolean delete = redisTemplate.delete(key);
            return delete;
        }
        return false;
    }


}

2. AutoIdempotent anpassen

Der Hauptzweck der Definition dieser Annotation besteht darin, sie hinzuzufügen, wenn Sie Idempotenz erreichen müssen. Wenn eine Methode eine Methode mit Anmerkungen versehen wird, ist sie automatisch idempotent. Wenn diese Annotation mithilfe von Reflektion im Hintergrund gescannt wird, wird die Methode verarbeitet, um eine automatische Idempotenz zu erreichen. Die Metaannotation ElementType.METHOD wird verwendet, um anzugeben, dass sie nur auf der Methode platziert werden kann, und etentionPolicy.RUNTIME gibt an, dass dies der Fall ist Wird während der Laufzeit verwendet

package com.yxkj.springboot_redis_interceptor.annotion;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoIdempotent {
}
#🎜🎜 #3. Token-Erstellung und -Verifizierung

1.Token-Service-Schnittstelle

Wir erstellen eine neue Schnittstelle, um einen Token-Service zu erstellen. Es gibt hauptsächlich zwei Methoden: Eine wird zum Erstellen eines Tokens und eine zum Überprüfen des Tokens verwendet. Beim Erstellen eines Tokens wird hauptsächlich eine Zeichenfolge generiert, die hauptsächlich das Anforderungsobjekt übermittelt. Die Hauptfunktion besteht darin, das Token im Header abzurufen, es dann zu überprüfen und die spezifischen Fehlerinformationen über die ausgelöste Ausnahme abzurufen und an das Frontend zurückzugeben

public interface TokenService {

    /**
     * 创建token
     * @return
     */
    String createToken();

    /**
     * 检验token的合法性
     * @param request
     * @return
     * @throws Exception
     */
    boolean checkToken(HttpServletRequest request) throws Exception;
}

2.Token-Service-Implementierungsklasse#🎜 🎜#

Das Token bezieht sich auf den Redis-Dienst. Um das Token zu erstellen, wird eine zufällige Algorithmus-Toolklasse verwendet, um eine zufällige UUID-Zeichenfolge zu generieren und diese dann in Redis einzufügen (um eine redundante Speicherung von Daten und den Ablauf zu verhindern). Die Zeit wird hier auf 10000 Sekunden eingestellt, was vom Geschäft abhängt. Wenn der Put erfolgreich ist, wird der Token-Wert schließlich zurückgegeben. Die checkToken-Methode dient zum Abrufen des Tokens aus dem Header zum Wert (wenn er nicht aus dem Header abgerufen werden kann, wird er aus dem Parameter abgerufen. Wenn er nicht vorhanden ist, wird direkt eine Ausnahme ausgelöst). Diese Ausnahmeinformationen können vom Interceptor abgefangen und dann an das Frontend zurückgegeben werden.

Das obige ist der detaillierte Inhalt vonWie Springboot automatische idempotente Schnittstellen implementiert. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen