use of com.tencent.polaris.api.plugin.circuitbreaker.CircuitBreakResult in project polaris-java by polarismesh.
the class ChangeStateUtils method buildCircuitBreakResult.
/**
* 构建熔断结果
*
* @param stateMachine 熔断状态机
* @param instances 实例集
* @param parameter 熔断参数
* @param <T> 配置类型
* @return 结果
*/
public static <T extends Verifier> CircuitBreakResult buildCircuitBreakResult(StateMachine<T> stateMachine, Collection<Instance> instances, StateMachine.Parameter parameter) {
long curTimeMs = System.currentTimeMillis();
CircuitBreakResult result = new CircuitBreakResult(curTimeMs, parameter.getHalfOpenMaxReqCount());
String cbName = parameter.getCircuitBreakerName();
for (Instance instance : instances) {
Set<StatusDimension> statusDimensions = stateMachine.getStatusDimensions(instance, parameter);
if (CollectionUtils.isEmpty(statusDimensions)) {
continue;
}
String instanceId = instance.getId();
for (StatusDimension statusDimension : statusDimensions) {
if (stateMachine.closeToOpen(instance, statusDimension, parameter)) {
result.getInstancesToOpen().put(new ResultKey(instanceId, statusDimension), instance);
LOG.info("circuitBreaker: instance {} and dimension {} changed from close to open by {}", instanceId, statusDimension, cbName);
continue;
}
if (stateMachine.openToHalfOpen(instance, statusDimension, parameter)) {
result.getInstancesToHalfOpen().put(new ResultKey(instanceId, statusDimension), instance);
LOG.info("circuitBreaker: instance {} and dimension {} changed from open to halfOpen by {}", instanceId, statusDimension, cbName);
continue;
}
if (stateMachine.halfOpenToOpen(instance, statusDimension, parameter)) {
result.getInstancesToOpen().put(new ResultKey(instanceId, statusDimension), instance);
LOG.info("circuitBreaker: instance {} and dimension {} changed from halfOpen to open by {}", instanceId, statusDimension, cbName);
continue;
}
if (stateMachine.halfOpenToClose(instance, statusDimension, parameter)) {
result.getInstancesToClose().put(new ResultKey(instanceId, statusDimension), instance);
LOG.info("circuitBreaker: instance {} and dimension {} changed from halfOpen to close by {}", instanceId, statusDimension, cbName);
}
}
}
return result;
}
use of com.tencent.polaris.api.plugin.circuitbreaker.CircuitBreakResult in project polaris-java by polarismesh.
the class InstancesCircuitBreakTask method run.
@Override
public void run() {
Map<String, CircuitBreakResult> allResults = new HashMap<>();
Set<ResultKey> statusChangedInstances = new HashSet<>();
Collection<Instance> targetInstances = instances;
if (StringUtils.isNotEmpty(instId)) {
Instance instance = getInstance();
if (null != instance) {
targetInstances = new ArrayList<>();
targetInstances.add(instance);
}
}
if (CollectionUtils.isEmpty(targetInstances)) {
return;
}
for (CircuitBreaker circuitBreaker : extensions.getCircuitBreakers()) {
if (StringUtils.isNotBlank(cbName) && !cbName.equals(circuitBreaker.getName())) {
continue;
}
CircuitBreakResult circuitBreakResult = circuitBreaker.checkInstance(targetInstances);
if (null == circuitBreakResult || circuitBreakResult.isEmptyResult()) {
continue;
}
cleanInstanceSet(circuitBreakResult.getInstancesToOpen(), statusChangedInstances);
cleanInstanceSet(circuitBreakResult.getInstancesToHalfOpen(), statusChangedInstances);
cleanInstanceSet(circuitBreakResult.getInstancesToClose(), statusChangedInstances);
allResults.put(circuitBreaker.getName(), circuitBreakResult);
}
ServiceUpdateRequest updateRequest = buildServiceUpdateRequest(serviceKey, allResults);
if (CollectionUtils.isEmpty(updateRequest.getProperties())) {
return;
}
LOG.info("update cache for circuitbreaker, value is {}", updateRequest);
extensions.getLocalRegistry().updateInstances(updateRequest);
}
Aggregations