Статьи

Первые шаги к Spring Boot Cassandra

Если вы хотите начать использовать базу данных Cassandra NoSQL с Spring Boot , лучшим ресурсом, вероятно, являются образцы Cassandra, доступные здесь, и документация Spring data Cassandra .

Здесь я возьму немного более окольный путь, фактически установив Cassandra локально и выполнив базовый тест на него, и я намерен развить этот пример в более полный пример со следующим сообщением в блоге.

Настройка локального экземпляра Cassandra

Ваш пробег может отличаться, но самый простой способ запустить локальную установку Cassandra — использовать утилиту Cassandra cluster manager (ccm), доступную здесь .

1
ccm create test -v 2.2.5 -n 3 -s

Или более традиционный подход может просто загрузить его с сайта Apache . Если вы следуете за мной, лучше всего подойдет версия Cassandra 2.2.5.

С помощью любого из вышеперечисленных, запустите Cassandra, используя ccm:

1
ccm start test

или с загрузкой с сайта Apache:

1
bin/cassandra -f

Флаг -f будет держать процесс на переднем плане, так что остановить процесс будет очень легко, как только вы закончите с примерами.

Теперь подключитесь к этому экземпляру Cassandra:

1
bin/cqlsh

и создайте образец пространства ключей Cassandra:

1
CREATE KEYSPACE IF NOT EXISTS sample WITH replication = {'class':'SimpleStrategy', 'replication_factor':1};

Использование Spring Boot Cassandra

Вдоль всего, что связано с Spring Boot , есть стартер, доступный для добавления всех соответствующих зависимостей Cassandra, указанных здесь как зависимости gradle:

1
compile('org.springframework.boot:spring-boot-starter-data-cassandra')

Это будет включать зависимости, которые запускают автоматическую настройку для связанных с Cassandra экземпляров — в основном сеанса Cassandra .

Для примера я определил объект под названием Hotel, который определяется следующим образом:

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package cass.domain;
 
import org.springframework.data.cassandra.mapping.PrimaryKey;
import org.springframework.data.cassandra.mapping.Table;
 
import java.io.Serializable;
import java.util.UUID;
 
@Table("hotels")
public class Hotel implements Serializable {
 
    private static final long serialVersionUID = 1L;
 
    @PrimaryKey
    private UUID id;
 
    private String name;
 
    private String address;
 
    private String zip;
 
    private Integer version;
 
    public Hotel() {
    }
 
    public Hotel(String name) {
        this.name = name;
    }
 
    public UUID getId() {
        return id;
    }
 
    public String getName() {
        return this.name;
    }
 
    public String getAddress() {
        return this.address;
    }
 
    public String getZip() {
        return this.zip;
    }
 
    public void setId(UUID id) {
        this.id = id;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public void setAddress(String address) {
        this.address = address;
    }
 
    public void setZip(String zip) {
        this.zip = zip;
    }
 
    public Integer getVersion() {
        return version;
    }
 
    public void setVersion(Integer version) {
        this.version = version;
    }
 
}

и хранилище данных Spring для управления этим объектом:

1
2
3
4
5
6
import cass.domain.Hotel;
import org.springframework.data.repository.CrudRepository;
 
import java.util.UUID;
 
public interface HotelRepository extends CrudRepository<Hotel, UUID>{}

Для хранения этой сущности требуется соответствующая таблица cql:

1
2
3
4
5
6
7
8
CREATE TABLE IF NOT EXISTS  sample.hotels (
    id UUID,
    name varchar,
    address varchar,
    zip varchar,
    version int,
    primary key((id))
);

По сути, поддержка данных Spring для Cassandra теперь будет управлять всеми операциями CRUD этого объекта, и тест выглядит следующим образом:

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
39
40
41
42
import cass.domain.Hotel;
import cass.repository.HotelRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 
import java.util.UUID;
 
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
 
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = SampleCassandraApplication.class)
public class SampleCassandraApplicationTest {
 
 @Autowired
 private HotelRepository hotelRepository;
 
 @Test
 public void repositoryCrudOperations() {
  Hotel sample = sampleHotel();
  this.hotelRepository.save(sample);
 
  Hotel savedHotel = this.hotelRepository.findOne(sample.getId());
 
  assertThat(savedHotel.getName(), equalTo("Sample Hotel"));
 
  this.hotelRepository.delete(savedHotel);
 }
 
 private Hotel sampleHotel() {
  Hotel hotel = new Hotel();
  hotel.setId(UUID.randomUUID());
  hotel.setName("Sample Hotel");
  hotel.setAddress("Sample Address");
  hotel.setZip("8764");
  return hotel;
 }
 
}

Вот репозиторий Github с этим образцом. В этом примере пока не так много, в следующем посте я улучшу этот пример, чтобы учесть тот факт, что очень важно понимать распределение данных по кластеру в системе NoSQL и то, как сущность, такая как Hotel, может здесь быть смоделирован для эффективных операций CRUD.

Ссылка: Первые шаги к Spring Boot Cassandra от нашего партнера JCG Биджу Кунджуммена в блоге all and sundry.