This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
microservicios_en_java [2020/06/16 19:06] admin |
microservicios_en_java [2020/07/27 19:37] admin |
||
---|---|---|---|
Line 108: | Line 108: | ||
====== Modelo SOAP ====== | ====== Modelo SOAP ====== | ||
- | Estan pensados para enviar y recibir xml | + | Estan pensados para enviar y recibir xml. |
- | WSDL Es un formato xml estándar (Lenguaje de descripción del servicio web). Se encuentran los mensajes que se pueden usar, tipos de datos y operaciones | + | WSDL Es un formato xml estándar (Lenguaje de descripción del servicio web). Se encuentran los mensajes que se pueden usar, tipos de datos y operaciones. |
* Mensaje | * Mensaje | ||
* Partes (las estructuras complejas tienen un esquema a parte) | * Partes (las estructuras complejas tienen un esquema a parte) | ||
Line 130: | Line 130: | ||
* POST: Añadir información (No es idempotente) | * POST: Añadir información (No es idempotente) | ||
* PUT: Actualizar información o creación de recursos con un id conocido (es idempotente) | * PUT: Actualizar información o creación de recursos con un id conocido (es idempotente) | ||
+ | * DELETE: Borra un elemento | ||
+ | |||
+ | ===== Exponer ficheros planos en java con spring boot ===== | ||
+ | en el directorio src/main/resources/static están expuestos automáticamente | ||
====== Domain Driven design ====== | ====== Domain Driven design ====== | ||
- | Libro Domain-driven Design: Tackling Coplexity in the Heart of the Sofware(2003) - Eric Evans | + | Libro Domain-driven Design: Tackling Coplexity in the Heart of the Sofware(2003) - Eric Evans. |
Evitar realizar traducciones del lenguaje entre usuario y programadores | Evitar realizar traducciones del lenguaje entre usuario y programadores | ||
Line 176: | Line 181: | ||
===== Spring Boot ===== | ===== Spring Boot ===== | ||
- | Herramienta que nace con la finalidad de simplificar el desarrollo de Spring Core | + | Herramienta que nace con la finalidad de simplificar el desarrollo de Spring Core. |
Crear proyecto con maven o gradle | Crear proyecto con maven o gradle | ||
Line 202: | Line 207: | ||
No hay ficheros de configuración. Únicamente anotaciones. | No hay ficheros de configuración. Únicamente anotaciones. | ||
- | ./mvnw package => Crea el paquete | + | ./mvnw package => Crea el paquete |
Añadir dependencia spring-boot-starter-test del pom | Añadir dependencia spring-boot-starter-test del pom | ||
- | ./mvnw spring-boot:run => Ejecuta la aplicación | + | ./mvnw spring-boot:run => Ejecuta la aplicación |
- | java -jar target/gs-spring-boot-0.1.0.jar => ejecuta la aplicación | + | java -jar target/gs-spring-boot-0.1.0.jar => ejecuta la aplicación |
==== Test Driven Development ==== | ==== Test Driven Development ==== | ||
Line 215: | Line 220: | ||
La anotación @Test marca que el método se tiene que ejecutar como test | La anotación @Test marca que el método se tiene que ejecutar como test | ||
- | @SpringRunner dentro de la anotación de junit se crea un puente entre los tests de SpringBoot y Junit | + | @RunWith(SpringRunner.class) dentro de la anotación de junit se crea un puente entre los tests de SpringBoot y Junit |
@SpringBootTest carga todo el contexto de spring para los tests | @SpringBootTest carga todo el contexto de spring para los tests | ||
@AutoConfigureMockMvc configura los mocks | @AutoConfigureMockMvc configura los mocks | ||
Line 223: | Line 228: | ||
@SpringBootTest(webEnvironment = SprinbBootTest.webEnvironment.RANDOM_PORT) | @SpringBootTest(webEnvironment = SprinbBootTest.webEnvironment.RANDOM_PORT) | ||
unido a @LocalServerPort levanta un servidor de spring en un puerto aleatorio | unido a @LocalServerPort levanta un servidor de spring en un puerto aleatorio | ||
+ | |||
+ | Dependencia spring-boot-starter-actuator lo que hace es habilitar urles para hacer comprobaciones. Escribir localhost:8080/actuator y aparecen checks. Algunos hay que activar de manera manual | ||
+ | |||
+ | |||
+ | ==== En eclipse ==== | ||
+ | |||
+ | Spring Tools 4 (aka Spring Tool Suite 4) | ||
+ | https://start.spring.io/ | ||
+ | |||
+ | Tests utilizados por BDD Behavior-Driven Development | ||
+ | |||
+ | El @Autowired se puede aplicar a un método. Entonces lo que hace es inyectar dependencias en los argumentos | ||
+ | Para lanzar los tests: | ||
+ | |||
+ | mvnw -Dtest=MultiplicationServiceTest test | ||
+ | Se encarga de pasar los tests desde línea de comandos | ||
+ | |||
+ | El contexto de aplicación de tests de Spring se crea una vez por aplicación, no por cada test | ||
+ | |||
+ | @RequiredArgsConstructor genera un constructor con los parámetros finales o con restricciones @NotNull | ||
+ | |||
+ | @Override en un método es una ayuda visual para el programador | ||
+ | |||
+ | @RestController declara la clase para servicios rest | ||
+ | |||
+ | |||
+ | Cada método de esa clase se puede anotar con el tipo. @GetMapping equilave a @RequestMapping(method=RequestMethod.GET) | ||
+ | |||
+ | @WebMvcTest iniciará el contexto de la aplicación wewb. Sólo carga la capa de controladores | ||
+ | @MockBean indica a Spring | ||
+ | @NoArgsConstructor(force=true) inicializa todos los valores a nulo, vacío o 0 | ||
+ | @Entity asocia el nombre de una clase al de una tabla | ||
+ | @GeneratedValue genera automáticamente un valor para el id | ||
+ | @Column(name= "xxx") establece el nombre de un campo en bbdd a un atributo en java | ||
+ | @RequestBody se utiliza para recibir los datos de una petición dentro del cuerpo de la petición | ||
+ | @Param se utiliza para recibir los datos de una petición como argumento | ||
+ | @PathVariable se utiliza para recibir los datos de una petición dentro de la url | ||
+ | |||
+ | Para utilizar estas etiquetas hay que declarar las siguientes dependencias en el fichero pom como alternativa a utilizar las dependencias de spring boot | ||
+ | |||
+ | <dependency> | ||
+ | <groupId>org.springframework</groupId> | ||
+ | <artifactId>spring-webmvc</artifactId> | ||
+ | <version>5.2.1.RELEASE</version> | ||
+ | </dependency> | ||
+ | <dependency> | ||
+ | <groupId>org.springframework</groupId> | ||
+ | <artifactId>spring-web</artifactId> | ||
+ | <version>5.2.1.RELEASE</version> | ||
+ | </dependency> | ||
+ | <dependency> | ||
+ | <groupId>com.fasterxml.jackson.core</groupId> | ||
+ | <artifactId>jackson-databind</artifactId> | ||
+ | <version>2.9.8</version> | ||
+ | </dependency> | ||
+ | |||
+ | === Proyecto web === | ||
+ | |||
+ | Para poder crear una aplicación que escuche conexiones hay que añadir la dependencia | ||
+ | <dependency> | ||
+ | <groupId>org.springframework.boot</groupId> | ||
+ | <artifactId>spring-boot-starter-web</artifactId> | ||
+ | </dependency> | ||
+ | |||
+ | Para poder lanzar un servidor tomcat embebido hay que añadir la siguiente dependencia. Esta dependencia no es necesaria si únicamente se quiere tener un servidor web | ||
+ | <dependency> | ||
+ | <groupId>org.springframework.boot</groupId> | ||
+ | <artifactId>spring-boot-starter-tomcat</artifactId> | ||
+ | </dependency> | ||
+ | |||
+ | |||
+ | === Entity === | ||
+ | |||
+ | Para poder utilizar la anotación @Entity hay que añadir la dependencia | ||
+ | <dependency> | ||
+ | <groupId>org.springframework.boot</groupId> | ||
+ | <artifactId>spring-boot-starter-data-jpa</artifactId> | ||
+ | </dependency> | ||
+ | |||
+ | ====== Arquitectura basada en eventos ====== | ||
+ | Event driven arquitecture. Los microservicios intercambian mensajes entre sí cada vez que ocurre alguna acción relevante. | ||
+ | |||
+ | Se intercambian mediante un bus de eventos (event bus) | ||
+ | |||
+ | Los servicios se suscriben a los eventos y reaccionan con ellos. | ||
+ | |||
+ | Los eventos son acciones que ya han ocurrido, por ello los nombres son de acciones pasadas. | ||
+ | |||
+ | CQRS => operaciones de escrituras en eventos y lecturas síncronas? | ||
+ | |||
+ | Proporciona un acomplamiento débil. | ||
+ | |||
+ | No se utilizan transacciones ACID. En su lugar hay consistencia eventual. | ||
+ | |||
+ | |||
+ | ===== RabbitMQ ===== | ||
+ | Servidor de mensajería que se integra con Spring Boot. Implementa AMQP (Advanced Message Quering Poll) | ||
+ | |||
+ | ==== Exchange ==== | ||
+ | Canal al que enviar mensajes (el topic de mqtt) | ||
+ | Los topic no son persistentes. | ||
+ | Cada microservicio crea su propia cola. No existe topic central (diferencia con JMS) | ||
+ | |||
+ | ==== Spring AMQP ==== | ||
+ | Crea desde Java el topic exchange y la cola. No hay servicios centrales. | ||
+ | |||
+ | Los servicios no pueden asumir que el servicio estará | ||
+ | |||
+ | |||
+ | @Slf4j es una fachada común para usar los logs. | ||
+ | |||
+ | Jetty es un servidor web y de aplicaciones de Eclipse. Al estilo Tomcat | ||
+ | |||
+ | ====== Descubrimiento de servicios ====== | ||
+ | Consul o Eureka (Stack de Netflix OSS) | ||
+ | |||
+ | Service Registry | ||
+ | |||
+ | Register Agent | ||
+ | |||
+ | Service Discovery Client | ||
+ | |||
+ | ====== Balanceo de carga ====== | ||
+ | Eureka y Ribbon | ||
+ | |||
+ | https://tdp.io/lb-opts | ||
+ | |||
+ | ====== Enrutamiento con API Gateway ====== | ||
+ | Zuul | ||
+ | |||
+ | ====== Patrón circuit breaker ====== | ||
+ | |||
+ | Evita que fallos de un componente aislado provoque un fallo total en el sistema | ||
+ | Hystrix | ||