No se registra el servicio "Service1" en Eureka, es innecesario. Se usa EurekaClient para acceder a las instancias del servicio para luego usarlas en el Balanceador de carga.
Configuración básica de EurekaClient
eureka:
client:
register-with-eureka: false # No registra el servicio en Eureka
serviceUrl:
defaultZone: http://localhost:8761/eurekaConfiguración personalizada del Balanceador de carga [Service1.yml]. Es necesario especificar el tipo de protocolo "http" o "https" con la propiedad EnabledSSL
vaetech:
load-balancer:
instance1:
enabledSSL: false # Especificar True cuando las instancias tienen un enlace seguro.
instance2:
enabledSSL: false # Especificar True cuando las instancias tienen un enlace seguro.Configuration personalizada de Balanceador de carga para microservicio1, microservicio2, ....
Se considera el despliegue de los microservicios en multiples servidores.
Configuración personalizada del Balanceador de carga.
class ServiceInstanceListSupplier{
@Autowired
LoadBalancerInstanceConfig config;
@Autowired
@Lazy
EurekaClient eurekaClient;
@Bean
@Primary
ServiceInstanceListSupplier serviceInstanceListSupplier() throws Exception {
List<InstanceInfo> instanceInfoList = eurekaClient.getApplications()
.getRegisteredApplications(WebClientInstanceConfig.InstanceName)
.getInstances();
if(instanceInfoList == null || instanceInfoList.size() == 0)
throw new Exception("instances not found.");
Boolean isSecure = config.getEnabledSSL();
List<Triplet<String, Integer, Boolean>> instances = eurekaClient.getApplications()
.getRegisteredApplications(WebClientInstanceConfig.InstanceName)
.getInstances().stream()
.filter(e -> e.getStatus().equals(InstanceStatus.UP))
.map(e -> new Triplet<String, Integer, Boolean>(e.getIPAddr(), e.getPort(), isSecure)).toList();
if(instances.size() == 0)
throw new Exception("no available instances found.");
return new MicroServiceInstanceListSupplier(WebClientInstanceConfig.InstanceName, instances);
}
}Controlador de instancias para EurekaClient. La idea es mostrar las instancias de Service-Discovery en el Admin-Server ProyectoBancoS1-AdminServer
Con está vista se tendría una visión más completa del Service-Discovery.
Configuración básica de Circuit Breaker
@Bean
Customizer<ReactiveResilience4JCircuitBreakerFactory> defaultCustomizer() {
return factory -> factory.configureDefault(id -> new Resilience4JConfigBuilder(id)
.circuitBreakerConfig(CircuitBreakerConfig
.custom()
// slidingWindowSize: Configura el tamaño de la ventana deslizante que se utiliza para registrar el resultado de las llamadas cuando se cierra el disyuntor.
.slidingWindowType(CircuitBreakerConfig.SlidingWindowType.TIME_BASED)
.slidingWindowSize(10)
// minimumNumberOfCalls: Configura el número máximo de llamadas después de la primera exception (disyuntor medio abierto).
.minimumNumberOfCalls(5)
// waitDurationInOpenState: Configura la duración del tiempo de espera antes de pasar de abierto a medio abierto.
.waitDurationInOpenState(Duration.ofSeconds(15))
// failureRateThreshold: Configura el umbral de tasa de errores en porcentaje.
.failureRateThreshold(25)
.build())
.timeLimiterConfig(TimeLimiterConfig.custom()
// timeoutDuration: Configura la duración del tiempo de espera de respuesta del microservicio.
.timeoutDuration(Duration.ofSeconds(1))
.build())
.build());
}Configuración básica de Circuit Breaker - timeoutDuration
Configuración básica de Circuit Breaker - minimumNumberOfCalls