Изменено кэширование

This commit is contained in:
serega6531
2019-11-24 01:50:15 +03:00
parent 389567b469
commit 56e84f6566
9 changed files with 39 additions and 48 deletions

View File

@@ -24,7 +24,6 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-web'
implementation "org.springframework.boot:spring-boot-starter-security" implementation "org.springframework.boot:spring-boot-starter-security"
implementation "org.springframework.boot:spring-boot-starter-websocket" implementation "org.springframework.boot:spring-boot-starter-websocket"
implementation 'org.springframework.boot:spring-boot-starter-cache'
implementation 'org.springframework.session:spring-session-core' implementation 'org.springframework.session:spring-session-core'
compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.7' compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.7'
compile group: 'commons-io', name: 'commons-io', version: '2.6' compile group: 'commons-io', name: 'commons-io', version: '2.6'

View File

@@ -5,7 +5,7 @@ import org.springframework.web.bind.annotation.*;
import ru.serega6531.packmate.model.Pattern; import ru.serega6531.packmate.model.Pattern;
import ru.serega6531.packmate.service.PatternService; import ru.serega6531.packmate.service.PatternService;
import java.util.List; import java.util.Collection;
@RestController @RestController
@RequestMapping("/api/pattern/") @RequestMapping("/api/pattern/")
@@ -19,7 +19,7 @@ public class PatternController {
} }
@GetMapping @GetMapping
public List<Pattern> getPatterns() { public Collection<Pattern> getPatterns() {
return service.findAll(); return service.findAll();
} }

View File

@@ -5,7 +5,7 @@ import org.springframework.web.bind.annotation.*;
import ru.serega6531.packmate.model.CtfService; import ru.serega6531.packmate.model.CtfService;
import ru.serega6531.packmate.service.ServicesService; import ru.serega6531.packmate.service.ServicesService;
import java.util.List; import java.util.Collection;
@RestController @RestController
@RequestMapping("/api/service/") @RequestMapping("/api/service/")
@@ -19,7 +19,7 @@ public class ServiceController {
} }
@GetMapping @GetMapping
public List<CtfService> getServices() { public Collection<CtfService> getServices() {
return service.findAll(); return service.findAll();
} }

View File

@@ -1,6 +1,5 @@
package ru.serega6531.packmate.repository; package ru.serega6531.packmate.repository;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import ru.serega6531.packmate.model.Packet; import ru.serega6531.packmate.model.Packet;
import ru.serega6531.packmate.model.Stream; import ru.serega6531.packmate.model.Stream;

View File

@@ -1,7 +1,6 @@
package ru.serega6531.packmate.service; package ru.serega6531.packmate.service;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import ru.serega6531.packmate.model.Packet; import ru.serega6531.packmate.model.Packet;
import ru.serega6531.packmate.model.Stream; import ru.serega6531.packmate.model.Stream;
@@ -19,13 +18,12 @@ public class PacketService {
this.repository = repository; this.repository = repository;
} }
@Cacheable(value = "packets", key = "#stream.id")
public List<Packet> getPacketsForStream(Stream stream) { public List<Packet> getPacketsForStream(Stream stream) {
return repository.findAllByStream(stream); return repository.findAllByStream(stream);
} }
public Packet save(Packet packet) { public List<Packet> saveAll(List<Packet> packets) {
return repository.save(packet); return repository.saveAll(packets);
} }
} }

View File

@@ -11,10 +11,7 @@ import ru.serega6531.packmate.model.PatternType;
import ru.serega6531.packmate.model.Stream; import ru.serega6531.packmate.model.Stream;
import ru.serega6531.packmate.repository.PatternRepository; import ru.serega6531.packmate.repository.PatternRepository;
import java.util.HashMap; import java.util.*;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@Service @Service
@@ -24,22 +21,27 @@ public class PatternService {
private final PatternRepository repository; private final PatternRepository repository;
private final StreamService streamService; private final StreamService streamService;
private Map<String, java.util.regex.Pattern> compiledPatterns = new HashMap<>(); private final Map<Integer, Pattern> patterns = new HashMap<>();
private final Map<String, java.util.regex.Pattern> compiledPatterns = new HashMap<>();
@Autowired @Autowired
public PatternService(PatternRepository repository, @Lazy StreamService streamService) { public PatternService(PatternRepository repository, @Lazy StreamService streamService) {
this.repository = repository; this.repository = repository;
this.streamService = streamService; this.streamService = streamService;
repository.findAll().forEach(p -> patterns.put(p.getId(), p));
log.info("Loaded {} patterns", patterns.size());
} }
public List<Pattern> findAll() { public Collection<Pattern> findAll() {
return repository.findAll(); return patterns.values();
} }
public List<Pattern> findMatching(byte[] bytes, boolean incoming) { public List<Pattern> findMatching(byte[] bytes, boolean incoming) {
String content = new String(bytes); String content = new String(bytes);
return repository.findAllByTypeEqualsOrTypeEquals(incoming ? PatternType.INPUT : PatternType.OUTPUT, PatternType.BOTH).stream() return patterns.values().stream()
.filter(p -> p.getType() == (incoming ? PatternType.INPUT : PatternType.OUTPUT)
|| p.getType() == PatternType.BOTH)
.filter(pattern -> matches(pattern, content)) .filter(pattern -> matches(pattern, content))
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
@@ -66,12 +68,15 @@ public class PatternService {
} }
pattern.getMatchedStreams().clear(); pattern.getMatchedStreams().clear();
patterns.remove(pattern.getId());
compiledPatterns.remove(pattern.getValue());
repository.delete(pattern); repository.delete(pattern);
} }
} }
public Pattern save(Pattern pattern) { public Pattern save(Pattern pattern) {
log.info("Добавлен новый паттерн {} со значением {}", pattern.getName(), pattern.getValue()); log.info("Добавлен новый паттерн {} со значением {}", pattern.getName(), pattern.getValue());
patterns.put(pattern.getId(), pattern);
return repository.save(pattern); return repository.save(pattern);
} }

View File

@@ -2,14 +2,13 @@ package ru.serega6531.packmate.service;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import ru.serega6531.packmate.model.CtfService; import ru.serega6531.packmate.model.CtfService;
import ru.serega6531.packmate.repository.ServiceRepository; import ru.serega6531.packmate.repository.ServiceRepository;
import java.util.List; import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional; import java.util.Optional;
@Service @Service
@@ -17,10 +16,13 @@ import java.util.Optional;
public class ServicesService { public class ServicesService {
private final ServiceRepository repository; private final ServiceRepository repository;
private final Map<Integer, CtfService> services = new HashMap<>();
@Autowired @Autowired
public ServicesService(ServiceRepository repository) { public ServicesService(ServiceRepository repository) {
this.repository = repository; this.repository = repository;
repository.findAll().forEach(s -> services.put(s.getPort(), s));
log.info("Loaded {} services", services.size());
} }
public Optional<CtfService> findService(String localIp, String firstIp, int firstPort, String secondIp, int secondPort) { public Optional<CtfService> findService(String localIp, String firstIp, int firstPort, String secondIp, int secondPort) {
@@ -33,24 +35,23 @@ public class ServicesService {
return Optional.empty(); return Optional.empty();
} }
@Cacheable("services")
public Optional<CtfService> findByPort(int port) { public Optional<CtfService> findByPort(int port) {
return repository.findById(port); return Optional.ofNullable(services.get(port));
} }
public List<CtfService> findAll() { public Collection<CtfService> findAll() {
return repository.findAll(); return services.values();
} }
@CacheEvict("services")
public void deleteByPort(int port) { public void deleteByPort(int port) {
log.info("Удален сервис на порту {}", port); log.info("Удален сервис на порту {}", port);
services.remove(port);
repository.deleteById(port); repository.deleteById(port);
} }
@CachePut("services")
public CtfService save(CtfService service) { public CtfService save(CtfService service) {
log.info("Добавлен новый сервис {} на порту {}", service.getName(), service.getPort()); log.info("Добавлен новый сервис {} на порту {}", service.getName(), service.getPort());
services.put(service.getPort(), service);
return repository.save(service); return repository.save(service);
} }

View File

@@ -6,8 +6,6 @@ import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.ArrayUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -176,17 +174,15 @@ public class StreamService {
Stream savedStream = save(stream); Stream savedStream = save(stream);
List<ru.serega6531.packmate.model.Packet> savedPackets = new ArrayList<>();
Set<Pattern> matches = new HashSet<>(); Set<Pattern> matches = new HashSet<>();
for (ru.serega6531.packmate.model.Packet packet : packets) { for (ru.serega6531.packmate.model.Packet packet : packets) {
packet.setStream(savedStream); packet.setStream(savedStream);
savedPackets.add(packetService.save(packet));
matches.addAll(patternService.findMatching(packet.getContent(), packet.isIncoming())); matches.addAll(patternService.findMatching(packet.getContent(), packet.isIncoming()));
} }
savedStream.setFoundPatterns(new ArrayList<>(matches)); savedStream.setFoundPatterns(new ArrayList<>(matches));
savedStream.setPackets(savedPackets); savedStream.setPackets(packetService.saveAll(packets));
savedStream = save(savedStream); savedStream = save(savedStream);
subscriptionService.broadcastNewStream(savedStream); subscriptionService.broadcastNewStream(savedStream);
@@ -227,12 +223,10 @@ public class StreamService {
return null; return null;
} }
@CachePut(value = "streams", key = "#stream.id")
public Stream save(Stream stream) { public Stream save(Stream stream) {
Stream saved; Stream saved;
if (stream.getId() == null) { if (stream.getId() == null) {
saved = repository.save(stream); saved = repository.save(stream);
cachePackets(saved);
log.debug("Создан стрим с id {}", saved.getId()); log.debug("Создан стрим с id {}", saved.getId());
} else { } else {
saved = repository.save(stream); saved = repository.save(stream);
@@ -241,13 +235,6 @@ public class StreamService {
return saved; return saved;
} }
@SuppressWarnings("UnusedReturnValue")
@CachePut(value = "packets", key = "#stream.id")
public List<Packet> cachePackets(Stream stream) {
return stream.getPackets();
}
@Cacheable("streams")
public Optional<Stream> find(long id) { public Optional<Stream> find(long id) {
return repository.findById(id); return repository.findById(id);
} }
@@ -261,7 +248,6 @@ public class StreamService {
@SuppressWarnings("UnusedReturnValue") @SuppressWarnings("UnusedReturnValue")
@Transactional @Transactional
@CachePut(value = "streams", key = "#id")
public Stream setFavorite(long id, boolean favorite) { public Stream setFavorite(long id, boolean favorite) {
final Optional<Stream> streamOptional = repository.findById(id); final Optional<Stream> streamOptional = repository.findById(id);
if (streamOptional.isPresent()) { if (streamOptional.isPresent()) {

View File

@@ -9,8 +9,11 @@ spring:
ddl-auto: update ddl-auto: update
properties: properties:
hibernate: hibernate:
format_sql: true
temp: temp:
use_jdbc_metadata_defaults: false use_jdbc_metadata_defaults: false
show-sql: true
enable-capture: true enable-capture: true
interface-name: enp0s31f6 interface-name: enp0s31f6
@@ -18,7 +21,7 @@ local-ip: "192.168.0.125"
account-login: BinaryBears account-login: BinaryBears
account-password: 123456 account-password: 123456
udp-stream-timeout: 20 # секунд udp-stream-timeout: 20 # секунд
tcp-stream-timeout: 120 # секунд tcp-stream-timeout: 40 # секунд
timeout-stream-check-interval: 10 # секунд timeout-stream-check-interval: 10 # секунд
ignore-empty-packets: true ignore-empty-packets: true
unpack-gzipped-http: true unpack-gzipped-http: true