1. Fundamentos del Registro y Descubrimiento de ServiciosEn arquitecturas de microservicios, existen dos componentes principales: los consumidores de servicios y los proveedores de servicios.
Proveedores de servicios: Exponen interfaces que otros microservicios pueden consumir
Consumidores de servicios: Invocan interfaces expuestas por otros microservicios
En proyectos de microservicios a gran escala, el número de proveedores puede ser significativo. Para gestionar estos servicios de manera eficiente, se requiere un centro de registro que los administre de forma centralizada. La relación entre consumidores, proveedores y el centro de registro es la siguiente:
- Los proveedores registran sus servicios en el centro de registro
- Los consumidores consultan el centro de registro cuando necesitan consumir un servicio
- Los seleccionan y consumen servicios según estrategias de balanceo de carga
2. Herramientas Principales para Gestión de Registros de Servicios
- Eureka: Desarrollado por Netflix, integrado en SpringCloud, comúnmente utilizado en aplicaciones Java
- Nacos: Desarrollado por Alibaba, integrado en SpringCloudAlibaba, diseñado para aplicaciones Java
- Consul: Desarrollado por HashiCorp, integrado en SpringCloud, sin restricciones de lenguaje para microservicios
3. Centro de Registro NacosDebido a su origen chino, Nacos cuenta con documentación extensa en idioma chino y además ofrece funcionalidades de gestión de configuración, su adopción es particularmente alta en China. Por ello, nos centraremos en su implementación como centro de registro.
4. Implementación del Registro con Nacos
- Añadir dependencias
Ver código``` <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
2. Configuración del archivo YAML
Ver código```
spring:
application:
name: inventario-service # Nombre del servicio para registro en Nacos
cloud:
nacos:
discovery: # Configuración de registro
server-addr: 127.0.0.1:8848
- Verificación
El servicio se muestra correctamente registrado
5. Consumo de Servicios RemotosPara la invocación de servicios remotos, utilizaremos OpenFeign:
- Añadir dependencias
Ver código``` <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId>
2. Crear módulo para manejar llamadas remotas En este caso, se desarrolló un módulo llamado api-cliente
3. Definir interfaz de cliente
Ver código```
package com.tienda.api.cliente;
import com.tienda.api.configuracion.ConfiguracionFeignPorDefecto;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
@FeignClient(value = "servicio-carrito",configuration = ConfiguracionFeignPorDefecto.class)
public interface ClienteCarrito {
@DeleteMapping("/carrito/elementos")
void eliminarElementosPorIds(@RequestParam("ids") List<Long> identificadores);
}
Configuración de logging Ver código``` package com.tienda.api.configuracion;
import com.tienda.comun.utilidades.ContextoUsuario; import feign.Logger; import feign.RequestInterceptor; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;
@Configuraton @Slf4j public class ConfiguracionFeignPorDefecto {
@Bean
public Logger.Level nivelLogFeign(){
return Logger.Level.FULL;
}
}
4. Importar dependencias Una vez creado el módulo api, se empaqueta en un jar y se importa como dependencia en el proyecto consumidor
5. Añadir anotación en clase principal
6. Realizar llamadas
Se puede inyectar directamente el clienteCarrito
La invocación se realiza correctamente, implementando la funcionalidad requerida