Rumah  >  Artikel  >  Java  >  Cara springboot melaksanakan antara muka idempoten automatik

Cara springboot melaksanakan antara muka idempoten automatik

WBOY
WBOYke hadapan
2023-05-11 21:52:211577semak imbas

Mati pucuk

1. Konsep: Impak mana-mana berbilang pelaksanaan adalah sama dengan kesan satu pelaksanaan.
Mengikut maksud ini, makna terakhir ialah kesan ke atas pangkalan data hanya boleh sekali sahaja dan tidak boleh diproses berulang kali. Bagaimana untuk memastikan hilang pucuknya, biasanya kaedah berikut digunakan:

1: Pangkalan data mewujudkan indeks unik, yang boleh memastikan bahawa hanya satu keping data akhirnya dimasukkan ke dalam pangkalan data

2 : Mekanisme token, setiap permintaan antara muka Mula-mula dapatkan token, dan kemudian tambahkan token ini pada isi tajuk permintaan pada kali seterusnya, dan sahkannya di latar belakang Jika pengesahan lulus, padamkan token dan nilaikan token itu sekali lagi permintaan seterusnya

3: Kunci pesimis Atau penguncian optimistik, penguncian pesimis boleh memastikan SQL lain tidak dapat mengemas kini data setiap kali untuk kemas kini (apabila enjin pangkalan data innodb, keadaan pilih mestilah indeks unik untuk mengelakkan keseluruhan jadual daripada dikunci)

4: Pertama Untuk menilai selepas membuat pertanyaan, semak dahulu sama ada data wujud dalam pangkalan data Jika ia wujud, ia membuktikan bahawa permintaan telah dibuat, dan permintaan itu ditolak secara langsung. Jika ia tidak wujud, ia membuktikan bahawa ia adalah kali pertama masuk, dan ia terus dikeluarkan.

Redis merealisasikan gambarajah skema mati pucuk automatik:

Cara springboot melaksanakan antara muka idempoten automatik

1 Bina API perkhidmatan redis

1: Pertama, bina redis pelayan .

2: Perkenalkan redis stater dalam springboot, atau jedis yang dikapsulkan oleh Spring Api utama yang digunakan kemudian ialah kaedah set dan kaedah wujud Di sini kami menggunakan redisTemplate terkapsul springboot
Kodnya adalah seperti berikut:

/*
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. Sesuaikan AutoIdempoten

Peribadikan anotasi ini adalah untuk menambahkannya pada kaedah yang perlu diidentifikasikan akan menjadi idempoten secara automatik. Jika anotasi ini diimbas menggunakan pantulan di latar belakang, kaedah tersebut akan diproses untuk merealisasikan idempotensi automatik ElementType.METHOD meta-anotasi digunakan untuk menunjukkan bahawa ia hanya boleh diletakkan pada kaedah, dan etentionPolicy.RUNTIME menunjukkan bahawa ia adalah. digunakan pada masa jalan

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 {
}

tiga penciptaan dan pengesahan Token

1 Antara muka perkhidmatan Token

Kami mencipta antara muka baharu untuk mencipta perkhidmatan token ia, satu digunakan untuk mencipta token dan satu lagi digunakan untuk mengesahkan token. Mencipta token terutamanya menjana rentetan Apabila menyemak token, ia terutamanya menyampaikan objek permintaan Mengapa kita perlu lulus objek permintaan. Fungsi utama adalah untuk mendapatkan token dalam pengepala, dan kemudian menyemaknya, dan mendapatkan maklumat ralat khusus melalui Exception yang dilemparkan dan mengembalikannya ke hujung hadapan

public interface TokenService {

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

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

2 Kelas pelaksanaan perkhidmatan token

rujukan token Perkhidmatan redis, buat token, gunakan kelas alat algoritma rawak untuk menjana rentetan uuid rawak, dan kemudian masukkannya ke dalam redis (untuk mengelakkan pengekalan data yang berlebihan, masa tamat tempoh ditetapkan di sini kepada 10000 saat, bergantung pada perniagaan), jika put berjaya , dan akhirnya mengembalikan nilai token ini. Kaedah checkToken adalah untuk mendapatkan token daripada pengepala kepada nilai (jika ia tidak boleh diperolehi daripada pengepala, dapatkannya daripada paramter Jika ia tidak wujud, ia akan membuang pengecualian secara langsung). Maklumat pengecualian ini boleh ditangkap oleh pemintas dan kemudian dikembalikan ke bahagian hadapan.

Atas ialah kandungan terperinci Cara springboot melaksanakan antara muka idempoten automatik. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam