blob: e7dabe3d59fe84cba25da00440d4a798b8084f20 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.servicecomb.loadbalance;
import java.util.Map;
import org.apache.servicecomb.config.ConfigUtil;
import org.apache.servicecomb.core.Invocation;
import org.apache.servicecomb.foundation.common.LegacyPropertyFactory;
/**
* configuration items
*
*/
public final class Configuration {
//// 2.1 configuration items
public static final String ROOT = "servicecomb.loadbalance.";
public static final String RULE_STRATEGY_GLOBAL = "servicecomb.loadbalance.strategy.name";
public static final String RULE_STRATEGY_NAME = "strategy.name";
// 2.0 configuration items
public static final String ROOT_20 = "ribbon.";
// SessionStickinessRule configruation
public static final String SESSION_TIMEOUT_IN_SECONDS = "SessionStickinessRule.sessionTimeoutInSeconds";
public static final String SUCCESSIVE_FAILED_TIMES = "SessionStickinessRule.successiveFailedTimes";
public static final String FILTER_ISOLATION = "isolation.";
public static final String FILTER_MAX_SINGLE_TEST_WINDOW = "maxSingleTestWindow";
public static final String TRANSACTIONCONTROL_OPTIONS_PREFIX_PATTERN =
"servicecomb.loadbalance.%s.transactionControl.options";
public static final Configuration INSTANCE = new Configuration();
public record RuleType(int type, String value) {
public static final int TYPE_SCHEMA = 1;
public static final int TYPE_OPERATION = 2;
public String getValue() {
return value;
}
public int getType() {
return type;
}
}
private Configuration() {
}
public RuleType getRuleStrategyName(Invocation invocation) {
String value = getStringProperty(null, ROOT + invocation.getMicroserviceName() + "." +
invocation.getSchemaId() + "." + invocation.getOperationName() + "." + RULE_STRATEGY_NAME);
if (value != null) {
return new RuleType(RuleType.TYPE_OPERATION, value);
}
value = getStringProperty(null, ROOT + invocation.getMicroserviceName() + "." +
invocation.getSchemaId() + "." + RULE_STRATEGY_NAME);
if (value != null) {
return new RuleType(RuleType.TYPE_SCHEMA, value);
}
value = getStringProperty(null, ROOT + invocation.getMicroserviceName() + "." +
RULE_STRATEGY_NAME);
if (value != null) {
return new RuleType(RuleType.TYPE_SCHEMA, value);
}
return new RuleType(RuleType.TYPE_SCHEMA,
getStringProperty("RoundRobin", RULE_STRATEGY_GLOBAL));
}
public int getSessionTimeoutInSeconds(String microservice) {
final int defaultValue = 30;
String p = getStringProperty("30",
ROOT + microservice + "." + SESSION_TIMEOUT_IN_SECONDS,
ROOT + SESSION_TIMEOUT_IN_SECONDS);
try {
return Integer.parseInt(p); // can be negative
} catch (NumberFormatException e) {
return defaultValue;
}
}
public int getSuccessiveFailedTimes(String microservice) {
final int defaultValue = 5;
String p = getStringProperty("5",
ROOT + microservice + "." + SUCCESSIVE_FAILED_TIMES,
ROOT + SUCCESSIVE_FAILED_TIMES);
try {
return Integer.parseInt(p); // can be negative
} catch (NumberFormatException e) {
return defaultValue;
}
}
public int getMaxSingleTestWindow() {
final int defaultValue = 60000;
String p = getStringProperty(Integer.toString(defaultValue),
ROOT + FILTER_ISOLATION + FILTER_MAX_SINGLE_TEST_WINDOW);
try {
int result = Integer.parseInt(p);
if (result >= 0) {
return result;
}
return defaultValue;
} catch (NumberFormatException e) {
return defaultValue;
}
}
public Map<String, String> getFlowsplitFilterOptions(String microservice) {
String keyPrefix = String.format(TRANSACTIONCONTROL_OPTIONS_PREFIX_PATTERN, microservice);
return ConfigUtil.stringPropertiesWithPrefix(LegacyPropertyFactory.getEnvironment(), keyPrefix);
}
public static String getStringProperty(String defaultValue, String... keys) {
String property;
for (String key : keys) {
property = LegacyPropertyFactory.getStringProperty(key);
if (property != null) {
return property;
}
}
return defaultValue;
}
}