1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/steakliu-u2-lock

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Введение

u2-distributed-operator предоставляет некоторые часто используемые компоненты, решения и объяснения принципов работы в распределенных системах, требуя лишь простого конфигурирования для использования.

Распределенные блокировки на основе zookeeper

Принцип работы распределенных блокировок на основе zookeeper

  1. Аннотация     lockName: имя блокировки, которое можно настроить самостоятельно, если не указано, то будет сгенерировано автоматически     LockType: тип блокировки, предоставляются различные типы блокировок, по умолчанию используется повторяемая блокировка     requireTime: время ожидания блокировки, если блокировка не может быть получена в течение этого времени, выполнение будет завершено, чтобы избежать бесконечного ожидания и блокировки     unit: единица измерения времени
public @interface U2Lock {
    /**
     * Имя блокировки
     */
    String lockName() default "";

    /**
     * Тип блокировки
     * @return
     */
    LockType lockType() default LockType.MUTEX_LOCK;

    /**
     * Время ожидания
     */
    long requireTime() default 30000;

    /**
     * Единица измерения времени
     */
    TimeUnit unit() default TimeUnit.MILLISECONDS;
}
```2. Конфигурация yml
    Настройка некоторых свойств подключения к zookeeper,
```yaml
u2-lock:
  address: 127.0.0.1:2181 # для нескольких узлов, используйте запятую для разделения
  connection-timeout: 1500000000
  session-timeout: 600000
  retry-policy: retry-forever # политика повторной попытки
  retry-forever: # соответствующая конфигурация политики повторной попытки
    retry-interval-ms: 3000
```3. Использование
```java
@GetMapping("get")
@U2Lock(lockName = "order-get", lockType = LockType.MUTEX_LOCK, requireTime = 50000)
public Map<String, Object> lock(@RequestParam int id, @RequestParam String num) {
    Map<String, Object> map = new HashMap<>();
    if (count > 0) {
        count--;
        map.put("order_num", count);
        return map;
    }
    map.put("msg", "Товар закончился");
    return map;
}

Redisson распределенные блокировки

  1. Аннотации   lockType: тип блокировки по умолчанию — это блокировка с повторным захватом, но есть и другие типы блокировок     Честная блокировка (Fair lock)     Множественная блокировка (MultiLock)     Красная блокировка (RedLock)     Чтение/запись блокировка (ReadWriteLock)   waitTime: время ожидания, в течение которого блокировка будет пытаться быть захваченной, если блокировка не может быть захвачена, операция завершается   leaseTime: время истечения блокировки, по истечении этого времени Redis удалит этот ключ
public @interface U2Lock {
    /**
     * Тип блокировки
     * @return
     */
    LockType lockType() default LockType.REENTRANT_LOCK;

    /**
     * Время ожидания
     * @return
     */
    long waitTime() default 25;

    /**
     * Время истечения блокировки
     * @return
     */
    long leaseTime() default 50;

    /**
     * Единица измерения времени
     * @return
     */
    TimeUnit unit() default TimeUnit.SECONDS;

    /**
     * Название блокировки
     * @return
     */
    String lockName() default "";
}
2. yml
```yaml
u2-lock:
  pattern: SINGLE
  password: xiaosi520
  address: redis://101.200.54.149:6379
  idle-connection-timeout: 6000
  idle-size: 10
```&ensp; &ensp; pattern для Redis может быть одиночным (SINGLE), кластерным (CLUSTER), основным-вспомогательным (MASTER_SLAVE) или с использованием Sentinel. Для использования Redlock pattern необходимо выбрать RED_LOCK.Redlock:
&ensp; &ensp; Redlock реализует алгоритм блокировки, описанный в документации Redlock. Этот объект также может быть использован для связывания нескольких объектов RLock в один Redlock, каждый из которых может быть создан из разных экземпляров Redisson. Мартин Клеппман рекомендует использовать не менее пяти узлов Redis для Redlock.
```yaml
u2-lock:
pattern: RED_LOCK
password: xiaosi520
address: redis://116.198.160.10:6379
red-lock:
- "redis://116.198.160.10:6379,123456" # 123456 - это пароль
- "redis://116.198.160.11:6379,123456"  
- "redis://116.198.160.12:6379,123456"  
- "redis://116.198.160.25:6379,123456"  
- "redis://116.198.160.20:6379,123456"  
@GetMapping("test")
@U2Lock(lockType = LockType.REENTRANT_LOCK, lockName = "red-lock")
public void test() throws InterruptedException {
    
}

Предотвращение повторных подач

    В распределенных системах и одиночных системах часто возникает проблема повторной подачи формы. Фронтенд может контролировать это, но и на бэкенде необходимо контролировать. Здесь используется Redis для предотвращения повторных подач.

  1. Аннотация     lockTime(): В течение этого времени этот пользователь не может повторно подать форму.
public @interface U2RepeatSubmit {
    /**
     * Время блокировки
     * @return
     */
    long lockTime() default 1000L;
    /**
     * Единица измерения времени
     * @return
     */
    TimeUnit unit() default TimeUnit.MILLISECONDS;
    /**
     * Сообщение для пользователя
     * @return
     */
    String msg() default "Не повторяйте подачу формы";
}
```}

2.yml     В нашем проекте и запросах могут быть различные, поэтому можно использовать параметры для предотвращения повторных подач, сессию, заголовок запроса. Необходимо только передать уникальный идентификатор пользователя.

spring:
  redis:
    host: 127.0.0.1
    port: 6379
    password: 123456
repeat-submit: #Предотвращение повторных подач
  identity: token  #Уникальный идентификатор
  identity-location: header #Местоположение параметра, может быть заголовок запроса header, сессия session, параметр запроса parameter
```3. Использование
```java
@U2RepeatSubmit(lockTime = 2000)
@GetMapping("submit")
public void submit(@RequestParam("uid") String uid){
    
}

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Распределенные компоненты######################## Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/steakliu-u2-lock.git
git@api.gitlife.ru:oschina-mirror/steakliu-u2-lock.git
oschina-mirror
steakliu-u2-lock
steakliu-u2-lock
master