Ejemplo de Spring Data con Cassandra y Docker
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;
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:
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.
Si necesitas más información puedes escribirnos un comentario o un correo electrónico a refactorizando.web@gmail.com o también nos puedes contactar por nuestras redes sociales Facebook o twitter y te ayudaremos encantados!
1 pensamiento sobre “Ejemplo de Spring Data con Cassandra y Docker”