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

OSCHINA-MIRROR/small_brick_team-formula-distribution

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

Распределённая стратегия

  1. Распределённое кэширование
    1. Поскольку Spring Cache не позволяет устанавливать гибкие значения времени истечения срока действия для кэша, необходимо добавить аннотацию @cacheExpireTime для каждого кэша, чтобы установить индивидуальное время истечения срока действия (в настоящее время это применимо только к использованию кэша Redis).
    2. Аннотация @CacheExpireTime:

    2.1 Область действия:

    2.1.1 На уровне класса: применяется ко всем методам с аннотацией @Cacheable в текущем классе, но не влияет на методы без аннотации @CacheExpireTime. 2.1.2 На уровне метода: устанавливает время истечения срока действия для текущего метода.

    1. Использование:
    @Bean
     CacheManager cacheManager(RedisConnectionFactory connectionFactory) {
         // Инициализация RedisCacheWriter
         RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(connectionFactory);
         RedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig();
         // Установка времени истечения по умолчанию
         RedisCacheConfiguration configuration = defaultCacheConfig.entryTtl(Duration.ofSeconds(100000));
         FormulaCacheManager cacheManager = new FormulaCacheManager(redisCacheWriter, configuration);
         return cacheManager;
     }
    

2. **Распределённые блокировки**

@Override @Lock(keys = {"#params"}, waitTime = 10, leaseTime = 10) public String getValue(String params) { try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } return "success"; }

@Override
@Lock(keys = {"#id"})
public String getValue(Integer id, @LockParam String username) {
    try {
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return "success";
}

@Override
@Lock(keys = {"#user.name", "#user.id"})
public String getValue(User user) {
    try {
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return "success";
}

3. **Распределённый ограничитель скорости**
> 3.1 Включение ограничителя скорости с помощью @EnableRateLimit. Ограничение скорости применяется к методам, отмеченным аннотацией @RateLimit.
> 3.2 По умолчанию используется алгоритм подсчёта, для переключения на использование алгоритма токена необходимо добавить в конфигурацию следующее:
  rateLimit.algorithm= token
  Также следует обратить внимание на два свойства в @RateLimit:
/**
       * Время интервала добавления данных в токен-ведро, в секундах. По умолчанию 10 секунд
           */
          public long tokenBucketTimeInterval() default 10;
          /**
           * Количество токенов, добавляемых в ведро токенов за один раз. По умолчанию 5
           */
          public long tokenBucketStepNum() default 5;
Пример:
      @GetMapping("find/id2")
        @RateLimit(limit = 20)
        public User findById2(@RequestParam("id") Integer id) {

            return userService.findById2(id);
        }

4. **Предотвращение повторной отправки**
Обеспечение уникальности запросов (один и тот же запрос от пользователя всегда приводит к одному и тому же результату):

token механизм — получение токена при запросе:
@PostMapping("get/token")
public String getToken() {
    log.info("Получение TOKEN");
    String token = KEY_NAME + System.currentTimeMillis();
    stringRedisTemplate.opsForValue().set(token, token, TIME_OUT, TimeUnit.SECONDS);
    return null;
}
Затем запрос направляется к бизнес-интерфейсу:
@PostMapping("idempotent")
@ExtApiIdempotent(Constants.HEAD)
public String idempotent() {
    log.info("Тестирование интерфейса на уникальность");
    return null;
}

5. **Генерация коротких ссылок**

6. **Шифрование ответа**

>6.1 Включить:

     ```

@SpringBootApplication
@EnableEncrypt
public class FormulaDistributionExampleApplication {

    public static void main(String[] args) {
        SpringApplication.run(FormulaDistributionExampleApplication.class, args);
    }
}

     ```

>6.2 Добавить ключ шифрования:

spring.formula.encrypt.key=abcdef0123456789 spring.formula.encrypt.debug=false

>spring.formula.encrypt.key: ключ шифрования, должен быть 16-битным.
>spring.formula.encrypt.debug: включить режим отладки, по умолчанию false, если true, то шифрование и дешифрование не будут выполняться.

>6.3 Шифрование результата ответа:
@PostMapping("Encrypt")
 @Encrypt
 public String Encrypt(@RequestBody User user) {
     return JSON.toJSONString(user);
 }
>6.4 Дешифрование содержимого запроса:
@PostMapping("Decrypt")
 @Decrypt
 public String Decrypt(@RequestBody User user) {
     return JSON.toJSONString(user);
 }
>6.5 Реализация с использованием axios:

В тексте запроса есть код на языке программирования Java, который я не могу перевести. Я перевёл всё, что смог понять. Если у вас есть дополнительные вопросы или уточнения, пожалуйста, дайте мне знать. ```
var key  = CryptoJS.enc.Latin1.parse('abcdef0123456789');
var iv   = CryptoJS.enc.Latin1.parse('abcdef0123456789');

// 加密
function EncryptData(data) {
   var srcs = CryptoJS.enc.Utf8.parse(data);
   var encrypted = CryptoJS.AES.encrypt(srcs, key, {
       mode : CryptoJS.mode.ECB,
       padding : CryptoJS.pad.Pkcs7
   });
   return encrypted.toString();
}

// 解密
function DecryptData(data) {
   var stime = new Date().getTime();
   var decrypt = CryptoJS.AES.decrypt(data, key, {
       mode : CryptoJS.mode.ECB,
       padding : CryptoJS.pad.Pkcs7
   });
   var result = JSON.parse(CryptoJS.enc.Utf8.stringify(decrypt).toString());
   var etime = new Date().getTime();
   console.log("DecryptData Time:" + (etime - stime));
   return result;
}

Код axios-перехватчика:

// 添加请求拦截器
axios.interceptors.request.use(function (config) {
    // 对所有POST请加密,必须是json数据提交,不支持表单
    if (config.method == "post") {
        config.data = EncryptData(JSON.stringify(config.data));
    }
    return config;
}, function (error) {
    return Promise.reject(error);
});

// 添加响应拦搓器
axios.interceptors.response.use(function (response) {
    // 后端返回字符串表示需要解密操作
    if(typeof(response.data) == "string"){
        response.data = DecryptData(response.data);
    }
    return response;
}, function (error) {
    return Promise.reject(error);
});

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

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

Введение

Отмена

Обновления

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

Участники

все

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

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