Я пишу приложение Spring, которое выполняет очень простую задачу.
Я хочу сравнить время проверки токена с использованием nginx-jwt (Lua) и проверки с использованием чистой Java (jose4j). Выполнение POST-запроса к конечной точке с заголовком аутентификации, конечная точка / — это место, где я использую nginx-jwt для проверки, а /token-java — это конечная точка, использующая Java.
nginx-jwt — это инструмент, использующий скрипт Lua для проверки токенов, а также я пишу программу для проверка времени тестирования с использованием java и nginx-jwt.
public class ComparePerformance {
private static final String NGINX_VALIDATE_URL = "http://localhost/";
private static final String JAVA_VALIDATE_URL = "http://localhost/token-java";
private RestTemplate restTemplate;
public ComparePerformance() {
restTemplate = new RestTemplate();
}
public long getTimeValidateNginx() {
return getTimeValidate(NGINX_VALIDATE_URL);
}
public long getTimeValidateJava() {
return getTimeValidate(JAVA_VALIDATE_URL);
}
private long getTimeValidate(String url) {
HttpHeaders headers = new HttpHeaders();
headers.add("Authorization", getToken());
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
HttpEntity<String> entity = new HttpEntity<>("parameters", headers);
long startTime = System.nanoTime();
for (int i = 0; i < 10; i++) {
restTemplate.exchange(url, HttpMethod.GET, entity, String.class);
}
long endTime = System.nanoTime();
return endTime - startTime;
}
private String getToken() {
return "Bearer xxxx";
}
public static void main(String[] args) {
ComparePerformance cp = new ComparePerformance();
long timeNginx = cp.getTimeValidateNginx() / 1_000_000;
long timeJava = cp.getTimeValidateJava() / 1_000_000;
LogUtil.log(Level.INFO, cp.getClass(),
"%nNginx validate time: %dms%n" +
"Java validate time: %dms", timeNginx, timeJava);
}
}
Вот моя конфигурация в Nginx: (nginx.conf)
location / {
access_by_lua '
local jwt = require("nginx-jwt")
jwt.auth()
';
proxy_pass http://localhost;
}
location /token-java {
proxy_pass http://localhost/token-java
}
Вот моя проверка Java, я использую jose4j для проверки с использованием алгоритма hs256 - так же, как nginx-jwt, ниже приведен метод проверки и анализа токена:
public Map<String, Object> parseToken(String JWTToken) throws InvalidJwtException {
Key verificationKey = new HmacKey(secretKey.getBytes());
JwtConsumer secondPassJwtConsumer = new JwtConsumerBuilder()
.setExpectedIssuer(officialIssuer)
.setSkipDefaultAudienceValidation()
.setVerificationKey(verificationKey)
.setRequireExpirationTime()
.setAllowedClockSkewInSeconds(30)
.setRequireSubject()
.build();
JwtClaims jwtClaims = secondPassJwtConsumer.processToClaims(JWTToken);
return jwtClaims.getClaimsMap();
}
И вот результат:
Nginx validate time: 9037ms
Java validate time: 57ms
Как видите, Nginx намного медленнее, чем Java.
Кто-нибудь может это объяснить? Я очень смущен, потому что вижу некоторые фотографии, на которых Lua работает быстрее, чем Java.