u2-distributed-operator предоставляет некоторые часто используемые компоненты, решения и объяснения принципов работы в распределенных системах, требуя лишь простого конфигурирования для использования.
Принцип работы распределенных блокировок на основе zookeeper
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;
}
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
```    pattern для Redis может быть одиночным (SINGLE), кластерным (CLUSTER), основным-вспомогательным (MASTER_SLAVE) или с использованием Sentinel. Для использования Redlock pattern необходимо выбрать RED_LOCK.Redlock:
    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 для предотвращения повторных подач.
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 )