/* * Copyright 2008-2009 the original author or authors. * * Licensed 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 net.hasor.rsf.address.route.flowcontrol.unit; import net.hasor.core.Settings; import net.hasor.rsf.InterAddress; import net.hasor.rsf.address.route.rule.AbstractRule; import net.hasor.rsf.utils.MatchUtils; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * 单元流量控制规则,用来控制跨单元调用。<p> * <pre>例: * 配置实例: * <flowControl enable="true|false" type="unit"> * <threshold>0.3</threshold> * <exclusions>172.23.*,172.19.*</exclusions> * </flowControl> * </pre> * 解释: 对某一服务,开启本单元优先调用策略 * 但当本单元内的可用机器的数量占服务地址全部数量的比例小于0.3时,本单元优先调用策略失效,启用跨单元调用。 * 该规则对以下网段的服务消费者不生效:172.23.*,172.19.* */ public class UnitFlowControl extends AbstractRule { private float threshold; private List<String> exclusions; // public void paserControl(Settings settings) { this.enable(settings.getBoolean("flowControl.enable")); this.threshold = settings.getFloat("flowControl.threshold"); String exclusions = settings.getString("flowControl.exclusions"); this.exclusions = Arrays.asList(exclusions.split(",")); } public float getThreshold() { return this.threshold; } public List<String> getExclusions() { return this.exclusions; } // /** * 是否启用本地机房优先规则 * @param allAmount 所有可用地址数量 * @param localAmount 本地机房地址数量 */ public boolean isLocalUnit(int allAmount, int localAmount) { if (localAmount == 0 || !this.enable()) { return false; } float value = (localAmount + 0.0F) / allAmount; if (value >= this.getThreshold()) { return true; } return false; } // /**筛选本机房地址*/ public List<InterAddress> siftUnitAddress(String unitName, List<InterAddress> address) { if (address == null || address.isEmpty()) return null; // List<InterAddress> local = new ArrayList<InterAddress>(); List<String> exclusions = getExclusions(); for (InterAddress inter : address) { boolean appendMark = false; //A.如果位于规则排除名单中,则直接标记appendMark为 true if (exclusions != null && !exclusions.isEmpty()) { String hostIP = inter.getHost(); for (String ipPattern : exclusions) { if (MatchUtils.matchWild(ipPattern, hostIP)) { appendMark = true; break; } } } //B.如果匹配规则,则直接标记appendMark为 true if (!appendMark) { appendMark = unitName.equalsIgnoreCase(inter.getFormUnit()); } // if (appendMark) { local.add(inter); } } return local; } }