private HealthCheck buildFailedHealthCheck(List<ServiceEndpoint> trippedBreakers) { StringBuilder sb = new StringBuilder(); trippedBreakers.forEach(serviceEndpoint -> { sb.append(serviceEndpoint.getServiceName()).append('/') .append(serviceEndpoint.getAvailZone()).append('/') .append(serviceEndpoint.getHostAndPort()).append(' '); }); return new HealthCheck("RPC dependencies", HealthCheck.Status.WARN, sb.toString()); }
public void updateEndpointHealth(ServiceEndpoint ep, CircuitBreakerState.State state) { mutex.readLock().lock(); try { ServiceEndpointNode current = returnNext; int count = size; for (int i = 0; i < count; i++) { if (current.value.getHostAndPort().equals(ep.getHostAndPort())) { current.value.setCircuitBreakerState(state); return; } current = current.next; } logger.error("updateEndpointHealth: endpoint not found: {}", ep.toString()); } finally { mutex.readLock().unlock(); } }
/** * Try to find an endpoint in our primary AZ. If none found, try further AZs. * Modifies state */ @Override public ServiceEndpoint getHealthyInstance() { if (! haveEndpoints.get()) { //wait for the first one to come in try { notificationSemaphore.tryAcquire(1, TimeUnit.SECONDS); } catch (InterruptedException e) { } } mutex.readLock().lock(); try { for (AvailabilityZone az : availabilityZones) { ServiceEndpoint next = az.nextEndpoint(); if (next != null) { logger.debug("Returning instance {} for {}", next.getHostAndPort(), serviceName); return next; } } return null; } finally { mutex.readLock().unlock(); } }
public HttpRequestWrapper(String method, ServiceEndpoint instance) { this.method = method; this.instance = instance; setUri(URI.create("http://" + instance.getHostAndPort() + "/")); setHeader("X-Correlation-Id", MDC.get(OrangeContext.CORRELATION_ID)); }
@Override public void updateServiceEndpoints(LoadBalancerUpdate updates) { mutex.writeLock().lock(); try { Marker logMarker = append("serviceName", this.serviceName); for (ServiceEndpoint ep : updates.getNewServices()) { logger.debug(logMarker, "Endpoint for {} became available: {}", this.serviceName, ep.getHostAndPort()); addServiceEndpoint(ep); } for (ServiceEndpoint ep : updates.getDeletedServices()) { logger.debug(logMarker, "Endpoint for {} became unavailable: {}", this.serviceName, ep.getHostAndPort()); updateEndpointHealth(ep, CircuitBreakerState.State.UNHEALTHY); } for (ServiceEndpoint ep : updates.getUpdatedServices()) { logger.debug(logMarker, "Health of endpoint {} of {} changed to {}", ep.getHostAndPort(), this.serviceName, ep.getCircuitBreakerState()); updateEndpointHealth(ep, ep.getCircuitBreakerState()); } } finally { mutex.writeLock().unlock(); } }
private synchronized String getServiceBaseUrl() { if (serviceBaseUrl == null) { LoadBalancer lb = lbFactory.getLoadBalancer(serviceName); lb.waitForServiceInstance(); com.sixt.service.framework.rpc.ServiceEndpoint endpoint = lb.getHealthyInstance(); serviceBaseUrl = "http://" + endpoint.getHostAndPort(); } return serviceBaseUrl; }