Статьи

Spring-Boot и Cache Abstraction с помощью HazelCast

Ранее мы начинали с абстракции Spring Cache, используя Cache Manager по умолчанию, который предоставляет Spring .

Хотя этот подход может удовлетворить наши потребности в простых приложениях, в случае сложных проблем нам необходимо использовать различные инструменты с более широкими возможностями. Hazelcast является одним из них. Hazelcast — отличный инструмент для кэширования, когда речь идет о приложении на основе JVM. Используя hazelcast в качестве кэша, данные равномерно распределяются между узлами компьютерного кластера, что позволяет горизонтальное масштабирование доступного хранилища.

Мы будем запускать нашу кодовую базу, используя пружинные профили, таким образом, ‘hazelcast-cache’ будет названием нашего профиля.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
group 'com.gkatzioura'
version '1.0-SNAPSHOT'
 
 
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.4.2.RELEASE")
    }
}
 
apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'
 
repositories {
    mavenCentral()
}
 
 
sourceCompatibility = 1.8
targetCompatibility = 1.8
 
dependencies {
    compile("org.springframework.boot:spring-boot-starter-web")
    compile("org.springframework.boot:spring-boot-starter-cache")
    compile("org.springframework.boot:spring-boot-starter")
    compile("com.hazelcast:hazelcast:3.7.4")
    compile("com.hazelcast:hazelcast-spring:3.7.4")
 
    testCompile("junit:junit")
}
 
bootRun {
    systemProperty "spring.profiles.active", "hazelcast-cache"
}

Как вы можете видеть, мы обновили файл gradle из предыдущего примера и добавили две дополнительные зависимости hazelcast и hazelcast-spring. Также мы изменили профиль, по которому наше приложение будет работать по умолчанию.

Наш следующий шаг — настроить менеджер кэша hazelcast.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package com.gkatzioura.caching.config;
 
import com.hazelcast.config.Config;
import com.hazelcast.config.EvictionPolicy;
import com.hazelcast.config.MapConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
 
/**
 * Created by gkatzioura on 1/10/17.
 */
@Configuration
@Profile("hazelcast-cache")
public class HazelcastCacheConfig {
 
    @Bean
    public Config hazelCastConfig() {
 
        Config config = new Config();
        config.setInstanceName("hazelcast-cache");
 
        MapConfig allUsersCache = new MapConfig();
        allUsersCache.setTimeToLiveSeconds(20);
        allUsersCache.setEvictionPolicy(EvictionPolicy.LFU);
        config.getMapConfigs().put("alluserscache",allUsersCache);
 
        MapConfig usercache = new MapConfig();
        usercache.setTimeToLiveSeconds(20);
        usercache.setEvictionPolicy(EvictionPolicy.LFU);
        config.getMapConfigs().put("usercache",usercache);
 
        return config;
    }
 
}

Мы только что создали две карты с политикой ttl 20 секунд. Поэтому через 20 секунд после заполнения карты произойдет выселение из кеша. Для получения дополнительной конфигурации Hazelcast, пожалуйста, обратитесь к официальной документации Hazelcast.

Еще одно изменение, которое мы должны реализовать, — это изменить UserPayload в сериализуемый Java-объект, поскольку объекты, хранящиеся в hazelcast, должны быть Serializable.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package com.gkatzioura.caching.model;
 
import java.io.Serializable;
 
/**
 * Created by gkatzioura on 1/5/17.
 */
public class UserPayload implements Serializable {
 
    private String userName;
    private String firstName;
    private String lastName;
 
    public String getUserName() {
        return userName;
    }
 
    public void setUserName(String userName) {
        this.userName = userName;
    }
 
    public String getFirstName() {
        return firstName;
    }
 
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
 
    public String getLastName() {
        return lastName;
    }
 
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

И последнее, но не менее важное: мы добавляем еще один репозиторий, связанный с профилем hazelcast-cache.

Результатом является наше предыдущее приложение весенней загрузки, интегрированное с hazelcast вместо кэша по умолчанию, настроенное с помощью политики ttl.

Вы можете найти исходный код на github .

Ссылка: Spring-Boot и Cache Abstraction с HazelCast от нашего партнера JCG Эммануила Гкациоураса в блоге gkatzioura .