Ejemplo de Spring Data con Cassandra y Docker

SpringBootCassandra

SpringBootCassandra

En esta entrada de refactorizando sobre Ejemplo de Spring Data con Cassandra y Docker, vamos a ver como integrar Spring Data con Cassandra, para ver una introducción sobre Cassandra pulsa aquí.

Arrancar y Configurar Cassandra con Docker

Arrancar Cassandra

Para empezar nuestra integración de Cassandra con una aplicación Spring Boot, lo primero que necesitamos es arrancar una Base de Datos de Cassandra, para ello vamos a hacer uso del siguiente Docker para su ejecución:

$ docker run -p 9042:9042 cassandra:latest

Con el comando anterior hemos arrancado la última versión de Cassandra.

Configurar Cassandra

Una vez arrancada la imagen de docker vamos a entrar en cassandra, para ello vamos a obtener primero el proceso en el que se ejecuta:

docker ps

Miramos el identificador del proceso de cassandra y lo copiamos para el siguiente punto

docker exect -it <procesoID> bash

Una vez dentro ejecutamos:

cqlsh

Crear keyspace:

CREATE KEYSPACE mykeyspace WITH replication = {'class':'SimpleStrategy', 'replication_factor' : 3};

Acceder al keyspace creado:

use mykeyspace

Crear la tabla:

CREATE TABLE Car( id uuid PRIMARY KEY, model text, description text, color text);

Configuración de Spring Boot con Apache Cassandra

Dependencias Maven en nuestro Ejemplo Spring Data con Cassandra

Lo mejor para crear una aplicación desde 0 con Spring Boot es ir a su página initializr y añadir las dependencias que se requieran. Una vez tenemos se ha generado y descargado el proyecto tenemos que asegurarnos que tenemos la dependencia de Cassandra.

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-cassandra</artifactId>
</dependency>

Configuración de conexión

Para la conexión con Cassandra hay tres propiedades que son obligatorias:

  • Contact-points: el hostname al que conectarnos y en el que se ejecuta Cassandra.
  • Keyspace-name: es el namespace en donde se define la replicación de la información en los nodos.
  • Port: Puerto de conexión, por lo general es 9042.
  • Local-datacenter: Es necesario para evitar el enrutamiento de solicitudes a nodos en centros de datos remotos. A partir de las versión 4.0 es necesario informarlo.

En nuestro archivo de propiedades que se encuentra en src/resources/application.yml, vamos a escribir lo siguiente:

spring:
  data:
    cassandra:
      keyspace-name: mykeyspace
      contact-points: 127.0.0.1
      port: 9042
      local-datacenter: datacenter1

O si quieres también se puede escribir de manera programática de la siguiente manera:

@Configuration
public class CassandraConfig extends AbstractCassandraConfiguration {
 
    @Override
    protected String getKeyspaceName() {
        return "cassandra";
    }
 
    @Bean
    public CassandraClusterFactoryBean cluster() {
        CassandraClusterFactoryBean cluster = 
          new CassandraClusterFactoryBean();
        cluster.setContactPoints("127.0.0.1");
        cluster.setPort(9142);
        return cluster;
    }
 
    @Bean
    public CassandraMappingContext cassandraMapping() 
      throws ClassNotFoundException {
        return new BasicCassandraMappingContext();
    }
}

Configuración de los Repositorios con Cassandra

Al igual que hacemos con cualquier base de datos cuando hacemos uso de JPA con Spring Boot, es necesario crear una clase Repository, que en este caso extenderá de CassandraRepository.

public interface CarRepository extends CassandraRepository<Car, UUID> {
  List<Tutorial> findByModel(String model);
}

Al igual que pasa cuando se usa Spring Data con JpaRepository o CrudRepository, tenemos los métodos save()findOne()findById()findAll()count()delete()deleteById() etc… por defecto, y además, si necesidad de crear la query, tenemos opciones como por ejemplo findBy<Campos de la tabla>. Lo mejor es echar un ojo a la documentación oficial.

Creando el objeto entidad

@Table
@Getter
@Setter
public class Car {
  @PrimaryKey
  private UUID id;

  private String model;

  private String description;

  private String color;
}

Creando API Controller

A continuación vamos a crear un Controlador en el que tengamos cuatro operaciones, GET, POST, UPDATE, DELETE.

@RestController
@RequestMapping("/api/cars")
@RequiredArgsConstructor
public class CarController {

    private final CarService carservice;

    @GetMapping()
    public ResponseEntity<List<Car>> getAllcars() {

        return new ResponseEntity<>(carservice.findAll(), HttpStatus.OK);
    }

    @GetMapping("/{id}")
    public ResponseEntity<Car> getCarById(@PathVariable("id") String id) {

        return new ResponseEntity<>(carservice.findById(UUID.fromString(id)), HttpStatus.OK);
    }

    @PostMapping()
    public ResponseEntity<Car> createCar(@RequestBody Car car) {

        return new ResponseEntity<>(carservice.saveCar(car), HttpStatus.CREATED);
    }

    @PutMapping("/{id}")
    public ResponseEntity<Car> updateCar(@PathVariable("id") String id, @RequestBody Car car) {

        if (carservice.existById(UUID.fromString(id))) {
            return new ResponseEntity<>(carservice.saveCar(car), HttpStatus.ACCEPTED);
        }

        throw new IllegalArgumentException("Car with id " + id + "not found");
    }

    @DeleteMapping("/{id}")
    public ResponseEntity<HttpStatus> deleteCar(@PathVariable("id") String id) {

        carservice.deleteCar(UUID.fromString(id));

        return new ResponseEntity<>(HttpStatus.NO_CONTENT);
    }

}

Probando el Ejemplo de Spring Data con Apache Cassandra

Te puedes descargar el ejemplo completo desde nuestro github pulsando aquí.

Creando un objeto coche:

Lanzamos una petición contra http://localhost:8080/api/cars:

{
    "id": "f8fa0e2e-326f-11eb-adc1-0242ac120002",
    "model": "focus",
    "description": "small car",
    "color": "rojo"
}

El resultado es:

{ "id": "f8fa0e2e-326f-11eb-adc1-0242ac120002", "model": "focus", "description": "small car", "color": "rojo"}

Podemos mirar en base de datos:

select * from car;

Consulta en Cassandra | Ejemplo de Spring Data con Cassandra y Docker
Consulta en Cassandra

Obteniendo un objeto coche:

Ejecutamos http://localhost:8080/api/cars/f8fa0e2e-326f-11eb-adc1-0242ac120002

y obtenemos:

{
    "id": "f8fa0e2e-326f-11eb-adc1-0242ac120002",
    "model": "focus",
    "description": "small car",
    "color": "rojo"
}

Borrando un Objeto Coche

Ejecutamos con el verbo delete el comando http://localhost:8080/api/cars/f8fa0e2e-326f-11eb-adc1-0242ac120002

Y compramobamos en base de datos el resultado:

Verificando la tabla de Car en Cassandra
Verificando la tabla de Car en Cassandra

El resultado es vacío.

Conclusión

En este Ejemplo de Spring Data con Cassandra y Docker, hemos visto la integración básica para poder conectar nuestra aplicación Spring Boot con Cassandra. Si ya se esta familiarizado con Spring Data la integración es bastante sencilla, tan solo hará falta conocer algunos parámetros para configurar la conexión con Cassandra.

Te puedes descargar el ejemplo completo desde nuestro github pulsando aquí.

Si te ha gustado no dudes en poner un comentario así como si tienes alguna duda.

Síguenos en nuestras redes sociales a través de Facebook o Twitter para estar al día de nuestros artículos.

1 pensamiento sobre “Ejemplo de Spring Data con Cassandra y Docker

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *