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 17:18] admin |
microservicios_en_java [2020/07/27 19:37] (current) 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 166: | Line 171: | ||
http://dddsample.sourceforge.net/architecture.html | http://dddsample.sourceforge.net/architecture.html | ||
+ | |||
+ | https://medium.com/@jonathanloscalzo/domain-driven-design-principios-beneficios-y-elementos-primera-parte-aad90f30aa35 | ||
+ | |||
+ | https://martinfowler.com/eaaDev/EventSourcing.html | ||
+ | |||
+ | https://martinfowler.com/eaaDev/EventSourcing.html | ||
+ | |||
+ | https://martinfowler.com/bliki/CQRS.html | ||
+ | |||
+ | ===== Spring Boot ===== | ||
+ | Herramienta que nace con la finalidad de simplificar el desarrollo de Spring Core. | ||
+ | |||
+ | Crear proyecto con maven o gradle | ||
+ | **Crear en la aplicación** | ||
+ | Empaquetar y desplegar la aplicación | ||
+ | |||
+ | * Configuración automática | ||
+ | * Resolución de dependencias | ||
+ | * Despliegue standalone y en contenedores integrados | ||
+ | * Métricas. SpringBoot proporciona métricas (actuators) para consultar el estado de la aplicación | ||
+ | * Extensible mediante plugins | ||
+ | |||
+ | @Restcontroller | ||
+ | Una clase se puede utilizar desde SpringMVC y puede recibir peticiones web | ||
+ | |||
+ | |||
+ | @RequestMapping asigna el patrón de la ulr con el método sobre el que se aplica. anotación @Controller y @ResponseBody | ||
+ | |||
+ | |||
+ | @SpringBootApplication es lo mismo que usar | ||
+ | * @Configuration Marca la clase como origen de definiciones de beans | ||
+ | * @EnableAutoConfiguration Indica a SpringBoot que comience a añadir beans basándose en la configuración de claspath | ||
+ | * @ComponentScan Indica a Spring que busque otros componentes en el mismo paquete | ||
+ | |||
+ | No hay ficheros de configuración. Únicamente anotaciones. | ||
+ | |||
+ | ./mvnw package => Crea el paquete | ||
+ | |||
+ | Añadir dependencia spring-boot-starter-test del pom | ||
+ | |||
+ | ./mvnw spring-boot:run => Ejecuta la aplicación | ||
+ | java -jar target/gs-spring-boot-0.1.0.jar => ejecuta la aplicación | ||
+ | |||
+ | ==== Test Driven Development ==== | ||
+ | |||
+ | Añadiendo la dependencia spring-boot-starter-test hace que todas las clases que acaben en Test sean candidatos para examinar los métodos de tests que tiene dentro. Esté en el paquete que esté | ||
+ | |||
+ | La anotación @Test marca que el método se tiene que ejecutar como test | ||
+ | |||
+ | @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 | ||
+ | @AutoConfigureMockMvc configura los mocks | ||
+ | MockMvc proviene de SpringTest. Envia solicitudes HTTP al DispatcherServlet y hacer assert | ||
+ | |||
+ | |||
+ | @SpringBootTest(webEnvironment = SprinbBootTest.webEnvironment.RANDOM_PORT) | ||
+ | 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 | ||