diff --git a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/DefaultSlotChainBuilder.java b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/DefaultSlotChainBuilder.java index 9bf2596d30..025d12791d 100755 --- a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/DefaultSlotChainBuilder.java +++ b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/DefaultSlotChainBuilder.java @@ -15,17 +15,15 @@ */ package com.alibaba.csp.sentinel.slots; +import com.alibaba.csp.sentinel.log.RecordLog; +import com.alibaba.csp.sentinel.slotchain.AbstractLinkedProcessorSlot; import com.alibaba.csp.sentinel.slotchain.DefaultProcessorSlotChain; +import com.alibaba.csp.sentinel.slotchain.ProcessorSlot; import com.alibaba.csp.sentinel.slotchain.ProcessorSlotChain; import com.alibaba.csp.sentinel.slotchain.SlotChainBuilder; -import com.alibaba.csp.sentinel.slots.block.authority.AuthoritySlot; -import com.alibaba.csp.sentinel.slots.block.degrade.DegradeSlot; -import com.alibaba.csp.sentinel.slots.block.flow.FlowSlot; -import com.alibaba.csp.sentinel.slots.clusterbuilder.ClusterBuilderSlot; -import com.alibaba.csp.sentinel.slots.logger.LogSlot; -import com.alibaba.csp.sentinel.slots.nodeselector.NodeSelectorSlot; -import com.alibaba.csp.sentinel.slots.statistic.StatisticSlot; -import com.alibaba.csp.sentinel.slots.system.SystemSlot; +import com.alibaba.csp.sentinel.util.SpiLoader; + +import java.util.List; /** * Builder for a default {@link ProcessorSlotChain}. @@ -38,16 +36,17 @@ public class DefaultSlotChainBuilder implements SlotChainBuilder { @Override public ProcessorSlotChain build() { ProcessorSlotChain chain = new DefaultProcessorSlotChain(); - chain.addLast(new NodeSelectorSlot()); - chain.addLast(new ClusterBuilderSlot()); - chain.addLast(new LogSlot()); - chain.addLast(new StatisticSlot()); - chain.addLast(new SystemSlot()); - chain.addLast(new AuthoritySlot()); - chain.addLast(new FlowSlot()); - chain.addLast(new DegradeSlot()); + + List sortedSlotList = SpiLoader.loadInstanceListSorted(ProcessorSlot.class); + for (ProcessorSlot slot : sortedSlotList) { + if (!(slot instanceof AbstractLinkedProcessorSlot)) { + RecordLog.warn("The ProcessorSlot(" + slot.getClass().getCanonicalName() + ") is not an instance of AbstractLinkedProcessorSlot, can't be added into ProcessorSlotChain"); + continue; + } + + chain.addLast((AbstractLinkedProcessorSlot) slot); + } return chain; } - } diff --git a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/authority/AuthoritySlot.java b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/authority/AuthoritySlot.java index f7920baa9c..3146429a23 100755 --- a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/authority/AuthoritySlot.java +++ b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/authority/AuthoritySlot.java @@ -23,6 +23,7 @@ import com.alibaba.csp.sentinel.slotchain.AbstractLinkedProcessorSlot; import com.alibaba.csp.sentinel.slotchain.ProcessorSlot; import com.alibaba.csp.sentinel.slotchain.ResourceWrapper; +import com.alibaba.csp.sentinel.spi.SpiOrder; /** * A {@link ProcessorSlot} that dedicates to {@link AuthorityRule} checking. @@ -30,6 +31,7 @@ * @author leyou * @author Eric Zhao */ +@SpiOrder(-3000) public class AuthoritySlot extends AbstractLinkedProcessorSlot { @Override diff --git a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/degrade/DegradeSlot.java b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/degrade/DegradeSlot.java index f76d81f8cd..8e8dd19109 100755 --- a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/degrade/DegradeSlot.java +++ b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/degrade/DegradeSlot.java @@ -20,12 +20,14 @@ import com.alibaba.csp.sentinel.slotchain.AbstractLinkedProcessorSlot; import com.alibaba.csp.sentinel.slotchain.ProcessorSlot; import com.alibaba.csp.sentinel.slotchain.ResourceWrapper; +import com.alibaba.csp.sentinel.spi.SpiOrder; /** * A {@link ProcessorSlot} dedicates to {@link DegradeRule} checking. * * @author leyou */ +@SpiOrder(-1000) public class DegradeSlot extends AbstractLinkedProcessorSlot { @Override diff --git a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/flow/FlowSlot.java b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/flow/FlowSlot.java index 9aa900ecd3..179ea8caa3 100755 --- a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/flow/FlowSlot.java +++ b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/flow/FlowSlot.java @@ -23,6 +23,7 @@ import com.alibaba.csp.sentinel.slotchain.AbstractLinkedProcessorSlot; import com.alibaba.csp.sentinel.slotchain.ResourceWrapper; import com.alibaba.csp.sentinel.slots.block.BlockException; +import com.alibaba.csp.sentinel.spi.SpiOrder; /** *

@@ -133,6 +134,7 @@ * @author jialiang.linjl * @author Eric Zhao */ +@SpiOrder(-2000) public class FlowSlot extends AbstractLinkedProcessorSlot { @Override diff --git a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/clusterbuilder/ClusterBuilderSlot.java b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/clusterbuilder/ClusterBuilderSlot.java index 1757e9dc35..1cd5f138a0 100755 --- a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/clusterbuilder/ClusterBuilderSlot.java +++ b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/clusterbuilder/ClusterBuilderSlot.java @@ -30,6 +30,7 @@ import com.alibaba.csp.sentinel.slotchain.ProcessorSlotChain; import com.alibaba.csp.sentinel.slotchain.ResourceWrapper; import com.alibaba.csp.sentinel.slotchain.StringResourceWrapper; +import com.alibaba.csp.sentinel.spi.SpiOrder; /** *

@@ -44,6 +45,7 @@ * * @author jialiang.linjl */ +@SpiOrder(-8000) public class ClusterBuilderSlot extends AbstractLinkedProcessorSlot { /** diff --git a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/logger/LogSlot.java b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/logger/LogSlot.java index 802690a9ab..57b1ca19dc 100755 --- a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/logger/LogSlot.java +++ b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/logger/LogSlot.java @@ -21,11 +21,13 @@ import com.alibaba.csp.sentinel.slotchain.AbstractLinkedProcessorSlot; import com.alibaba.csp.sentinel.slotchain.ResourceWrapper; import com.alibaba.csp.sentinel.slots.block.BlockException; +import com.alibaba.csp.sentinel.spi.SpiOrder; /** * A {@link com.alibaba.csp.sentinel.slotchain.ProcessorSlot} that is response for logging block exceptions * to provide concrete logs for troubleshooting. */ +@SpiOrder(-7000) public class LogSlot extends AbstractLinkedProcessorSlot { @Override diff --git a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/nodeselector/NodeSelectorSlot.java b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/nodeselector/NodeSelectorSlot.java index 5693ad87ae..a2dd085e67 100755 --- a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/nodeselector/NodeSelectorSlot.java +++ b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/nodeselector/NodeSelectorSlot.java @@ -25,6 +25,7 @@ import com.alibaba.csp.sentinel.node.EntranceNode; import com.alibaba.csp.sentinel.slotchain.AbstractLinkedProcessorSlot; import com.alibaba.csp.sentinel.slotchain.ResourceWrapper; +import com.alibaba.csp.sentinel.spi.SpiOrder; /** *

@@ -122,6 +123,7 @@ * @see EntranceNode * @see ContextUtil */ +@SpiOrder(-9000) public class NodeSelectorSlot extends AbstractLinkedProcessorSlot { /** diff --git a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/statistic/StatisticSlot.java b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/statistic/StatisticSlot.java index d35a8bddc2..20bdee2465 100755 --- a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/statistic/StatisticSlot.java +++ b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/statistic/StatisticSlot.java @@ -20,6 +20,7 @@ import com.alibaba.csp.sentinel.slotchain.ProcessorSlotEntryCallback; import com.alibaba.csp.sentinel.slotchain.ProcessorSlotExitCallback; import com.alibaba.csp.sentinel.slots.block.flow.PriorityWaitException; +import com.alibaba.csp.sentinel.spi.SpiOrder; import com.alibaba.csp.sentinel.util.TimeUtil; import com.alibaba.csp.sentinel.Constants; import com.alibaba.csp.sentinel.EntryType; @@ -46,6 +47,7 @@ * @author jialiang.linjl * @author Eric Zhao */ +@SpiOrder(-6000) public class StatisticSlot extends AbstractLinkedProcessorSlot { @Override diff --git a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/system/SystemSlot.java b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/system/SystemSlot.java index 1f67e4263e..f87cf68045 100755 --- a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/system/SystemSlot.java +++ b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/system/SystemSlot.java @@ -20,6 +20,7 @@ import com.alibaba.csp.sentinel.slotchain.AbstractLinkedProcessorSlot; import com.alibaba.csp.sentinel.slotchain.ProcessorSlot; import com.alibaba.csp.sentinel.slotchain.ResourceWrapper; +import com.alibaba.csp.sentinel.spi.SpiOrder; /** * A {@link ProcessorSlot} that dedicates to {@link SystemRule} checking. @@ -27,6 +28,7 @@ * @author jialiang.linjl * @author leyou */ +@SpiOrder(-4000) public class SystemSlot extends AbstractLinkedProcessorSlot { @Override diff --git a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/util/SpiLoader.java b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/util/SpiLoader.java index 6632b792f0..af89ea7f83 100644 --- a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/util/SpiLoader.java +++ b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/util/SpiLoader.java @@ -92,6 +92,7 @@ public static T loadHighestPriorityInstance(Class clazz) { } /** + * Load and sorted SPI instance list. * Load the SPI instance list for provided SPI interface. * * @param clazz class of the SPI @@ -124,6 +125,8 @@ public static List loadInstanceList(Class clazz) { /** * Load the sorted SPI instance list for provided SPI interface. * + * Note: each call return new instances. + * * @param clazz class of the SPI * @param SPI type * @return sorted SPI instance list @@ -131,13 +134,8 @@ public static List loadInstanceList(Class clazz) { */ public static List loadInstanceListSorted(Class clazz) { try { - String key = clazz.getName(); - // Not thread-safe, as it's expected to be resolved in a thread-safe context. - ServiceLoader serviceLoader = SERVICE_LOADER_MAP.get(key); - if (serviceLoader == null) { - serviceLoader = ServiceLoader.load(clazz); - SERVICE_LOADER_MAP.put(key, serviceLoader); - } + // Call ServiceLoader.load(clazz) to get new instance + ServiceLoader serviceLoader = ServiceLoader.load(clazz); List> orderWrappers = new ArrayList<>(); for (T spi : serviceLoader) { diff --git a/sentinel-core/src/main/resources/META-INF/services/com.alibaba.csp.sentinel.slotchain.ProcessorSlot b/sentinel-core/src/main/resources/META-INF/services/com.alibaba.csp.sentinel.slotchain.ProcessorSlot new file mode 100644 index 0000000000..f4a3cf7955 --- /dev/null +++ b/sentinel-core/src/main/resources/META-INF/services/com.alibaba.csp.sentinel.slotchain.ProcessorSlot @@ -0,0 +1,9 @@ +# Sentinel default ProcessorSlots +com.alibaba.csp.sentinel.slots.nodeselector.NodeSelectorSlot +com.alibaba.csp.sentinel.slots.clusterbuilder.ClusterBuilderSlot +com.alibaba.csp.sentinel.slots.logger.LogSlot +com.alibaba.csp.sentinel.slots.statistic.StatisticSlot +com.alibaba.csp.sentinel.slots.system.SystemSlot +com.alibaba.csp.sentinel.slots.block.authority.AuthoritySlot +com.alibaba.csp.sentinel.slots.block.flow.FlowSlot +com.alibaba.csp.sentinel.slots.block.degrade.DegradeSlot \ No newline at end of file diff --git a/sentinel-core/src/test/java/com/alibaba/csp/sentinel/slots/DefaultSlotChainBuilderTest.java b/sentinel-core/src/test/java/com/alibaba/csp/sentinel/slots/DefaultSlotChainBuilderTest.java new file mode 100644 index 0000000000..e90f2206fe --- /dev/null +++ b/sentinel-core/src/test/java/com/alibaba/csp/sentinel/slots/DefaultSlotChainBuilderTest.java @@ -0,0 +1,89 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * 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 com.alibaba.csp.sentinel.slots; + +import com.alibaba.csp.sentinel.slotchain.AbstractLinkedProcessorSlot; +import com.alibaba.csp.sentinel.slotchain.ProcessorSlotChain; +import com.alibaba.csp.sentinel.slots.block.authority.AuthoritySlot; +import com.alibaba.csp.sentinel.slots.block.degrade.DegradeSlot; +import com.alibaba.csp.sentinel.slots.block.flow.FlowSlot; +import com.alibaba.csp.sentinel.slots.clusterbuilder.ClusterBuilderSlot; +import com.alibaba.csp.sentinel.slots.logger.LogSlot; +import com.alibaba.csp.sentinel.slots.nodeselector.NodeSelectorSlot; +import com.alibaba.csp.sentinel.slots.statistic.StatisticSlot; +import com.alibaba.csp.sentinel.slots.system.SystemSlot; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Test cases for {@link DefaultSlotChainBuilder}. + * + * @author cdfive + */ +public class DefaultSlotChainBuilderTest { + + @Test + public void testBuild() { + DefaultSlotChainBuilder builder = new DefaultSlotChainBuilder(); + ProcessorSlotChain slotChain = builder.build(); + assertNotNull(slotChain); + + // Verify the order of slot + AbstractLinkedProcessorSlot next = slotChain.getNext(); + assertTrue(next instanceof NodeSelectorSlot); + + // Store the first NodeSelectorSlot instance + NodeSelectorSlot nodeSelectorSlot = (NodeSelectorSlot) next; + + next = next.getNext(); + assertTrue(next instanceof ClusterBuilderSlot); + + next = next.getNext(); + assertTrue(next instanceof LogSlot); + + next = next.getNext(); + assertTrue(next instanceof StatisticSlot); + + next = next.getNext(); + assertTrue(next instanceof SystemSlot); + + next = next.getNext(); + assertTrue(next instanceof AuthoritySlot); + + next = next.getNext(); + assertTrue(next instanceof FlowSlot); + + next = next.getNext(); + assertTrue(next instanceof DegradeSlot); + + next = next.getNext(); + assertNull(next); + + // Build again to verify different instances + ProcessorSlotChain slotChain2 = builder.build(); + assertNotNull(slotChain2); + // Verify the two ProcessorSlotChain instances are different + assertNotSame(slotChain, slotChain2); + + next = slotChain2.getNext(); + assertTrue(next instanceof NodeSelectorSlot); + // Store the second NodeSelectorSlot instance + NodeSelectorSlot nodeSelectorSlot2 = (NodeSelectorSlot) next; + // Verify the two NodeSelectorSlot instances are different + assertNotSame(nodeSelectorSlot, nodeSelectorSlot2); + } +} diff --git a/sentinel-core/src/test/java/com/alibaba/csp/sentinel/util/SpiLoaderTest.java b/sentinel-core/src/test/java/com/alibaba/csp/sentinel/util/SpiLoaderTest.java new file mode 100644 index 0000000000..35944be4b5 --- /dev/null +++ b/sentinel-core/src/test/java/com/alibaba/csp/sentinel/util/SpiLoaderTest.java @@ -0,0 +1,114 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * 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 com.alibaba.csp.sentinel.util; + +import com.alibaba.csp.sentinel.slotchain.ProcessorSlot; +import com.alibaba.csp.sentinel.slotchain.SlotChainBuilder; +import com.alibaba.csp.sentinel.slots.DefaultSlotChainBuilder; +import com.alibaba.csp.sentinel.slots.block.authority.AuthoritySlot; +import com.alibaba.csp.sentinel.slots.block.degrade.DegradeSlot; +import com.alibaba.csp.sentinel.slots.block.flow.FlowSlot; +import com.alibaba.csp.sentinel.slots.clusterbuilder.ClusterBuilderSlot; +import com.alibaba.csp.sentinel.slots.logger.LogSlot; +import com.alibaba.csp.sentinel.slots.nodeselector.NodeSelectorSlot; +import com.alibaba.csp.sentinel.slots.statistic.StatisticSlot; +import com.alibaba.csp.sentinel.slots.system.SystemSlot; +import org.junit.Test; + +import java.util.List; + +import static org.junit.Assert.*; + +/** + * Test cases for {@link SpiLoader}. + * + * @author cdfive + */ +public class SpiLoaderTest { + + @Test + public void testLoadFirstInstance() { + ProcessorSlot processorSlot = SpiLoader.loadFirstInstance(ProcessorSlot.class); + assertNotNull(processorSlot); + + SlotChainBuilder slotChainBuilder = SpiLoader.loadFirstInstance(SlotChainBuilder.class); + assertNotNull(slotChainBuilder); + assertTrue(slotChainBuilder instanceof DefaultSlotChainBuilder); + } + + @Test + public void testLoadHighestPriorityInstance() { + ProcessorSlot processorSlot = SpiLoader.loadHighestPriorityInstance(ProcessorSlot.class); + assertNotNull(processorSlot); + + // NodeSelectorSlot is highest order with @SpiOrder(-9000), among all slots + assertTrue(processorSlot instanceof NodeSelectorSlot); + } + + @Test + public void testLoadInstanceList() { + List slots = SpiLoader.loadInstanceList(ProcessorSlot.class); + assertNotNull(slots); + + // Total 8 default slot in sentinel-core + assertEquals(8, slots.size()); + + // Store the first slot of slots + ProcessorSlot firstSlot = slots.get(0); + + // Call loadInstanceList again + List slots2 = SpiLoader.loadInstanceList(ProcessorSlot.class); + assertNotSame(slots, slots2); + + // Store the first slot of slots + ProcessorSlot firstSlot2 = slots2.get(0); + + // As SERVICE_LOADER_MAP in SpiLoader cached the instance, so they're same instances + assertSame(firstSlot, firstSlot2); + } + + @Test + public void testLoadInstanceListSorted() { + List sortedSlots = SpiLoader.loadInstanceListSorted(ProcessorSlot.class); + assertNotNull(sortedSlots); + + // Total 8 default slot in sentinel-core + assertEquals(8, sortedSlots.size()); + + // Verify the order of slot + int index = 0; + assertTrue(sortedSlots.get(index++) instanceof NodeSelectorSlot); + assertTrue(sortedSlots.get(index++) instanceof ClusterBuilderSlot); + assertTrue(sortedSlots.get(index++) instanceof LogSlot); + assertTrue(sortedSlots.get(index++) instanceof StatisticSlot); + assertTrue(sortedSlots.get(index++) instanceof SystemSlot); + assertTrue(sortedSlots.get(index++) instanceof AuthoritySlot); + assertTrue(sortedSlots.get(index++) instanceof FlowSlot); + assertTrue(sortedSlots.get(index++) instanceof DegradeSlot); + + // Verify each call return different instances + List sortedSlots2 = SpiLoader.loadInstanceListSorted(ProcessorSlot.class); + assertNotSame(sortedSlots, sortedSlots2); + assertEquals(sortedSlots.size(), sortedSlots2.size()); + for (int i = 0; i < sortedSlots.size(); i++) { + ProcessorSlot slot = sortedSlots.get(i); + ProcessorSlot slot2 = sortedSlots2.get(i); + assertNotSame(slot, slot2); + assertNotEquals(slot, slot2); + assertEquals(slot.getClass(), slot2.getClass()); + } + } +} diff --git a/sentinel-extension/sentinel-parameter-flow-control/src/main/java/com/alibaba/csp/sentinel/slots/HotParamSlotChainBuilder.java b/sentinel-extension/sentinel-parameter-flow-control/src/main/java/com/alibaba/csp/sentinel/slots/HotParamSlotChainBuilder.java deleted file mode 100644 index 61705fe5df..0000000000 --- a/sentinel-extension/sentinel-parameter-flow-control/src/main/java/com/alibaba/csp/sentinel/slots/HotParamSlotChainBuilder.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 1999-2018 Alibaba Group Holding Ltd. - * - * 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 com.alibaba.csp.sentinel.slots; - -import com.alibaba.csp.sentinel.slotchain.DefaultProcessorSlotChain; -import com.alibaba.csp.sentinel.slotchain.ProcessorSlotChain; -import com.alibaba.csp.sentinel.slotchain.SlotChainBuilder; -import com.alibaba.csp.sentinel.slots.block.authority.AuthoritySlot; -import com.alibaba.csp.sentinel.slots.block.degrade.DegradeSlot; -import com.alibaba.csp.sentinel.slots.block.flow.FlowSlot; -import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowSlot; -import com.alibaba.csp.sentinel.slots.clusterbuilder.ClusterBuilderSlot; -import com.alibaba.csp.sentinel.slots.logger.LogSlot; -import com.alibaba.csp.sentinel.slots.nodeselector.NodeSelectorSlot; -import com.alibaba.csp.sentinel.slots.statistic.StatisticSlot; -import com.alibaba.csp.sentinel.slots.system.SystemSlot; - -/** - * @author Eric Zhao - * @since 0.2.0 - */ -public class HotParamSlotChainBuilder implements SlotChainBuilder { - - @Override - public ProcessorSlotChain build() { - ProcessorSlotChain chain = new DefaultProcessorSlotChain(); - chain.addLast(new NodeSelectorSlot()); - chain.addLast(new ClusterBuilderSlot()); - chain.addLast(new LogSlot()); - chain.addLast(new StatisticSlot()); - chain.addLast(new ParamFlowSlot()); - chain.addLast(new SystemSlot()); - chain.addLast(new AuthoritySlot()); - chain.addLast(new FlowSlot()); - chain.addLast(new DegradeSlot()); - - return chain; - } -} diff --git a/sentinel-extension/sentinel-parameter-flow-control/src/main/java/com/alibaba/csp/sentinel/slots/block/flow/param/ParamFlowSlot.java b/sentinel-extension/sentinel-parameter-flow-control/src/main/java/com/alibaba/csp/sentinel/slots/block/flow/param/ParamFlowSlot.java index 001f7d3fdf..77129dbf78 100644 --- a/sentinel-extension/sentinel-parameter-flow-control/src/main/java/com/alibaba/csp/sentinel/slots/block/flow/param/ParamFlowSlot.java +++ b/sentinel-extension/sentinel-parameter-flow-control/src/main/java/com/alibaba/csp/sentinel/slots/block/flow/param/ParamFlowSlot.java @@ -27,6 +27,7 @@ import com.alibaba.csp.sentinel.slotchain.ResourceWrapper; import com.alibaba.csp.sentinel.slotchain.StringResourceWrapper; import com.alibaba.csp.sentinel.slots.block.BlockException; +import com.alibaba.csp.sentinel.spi.SpiOrder; import com.alibaba.csp.sentinel.util.StringUtil; /** @@ -36,6 +37,7 @@ * @author Eric Zhao * @since 0.2.0 */ +@SpiOrder(-5000) public class ParamFlowSlot extends AbstractLinkedProcessorSlot { private static final Map metricsMap = new ConcurrentHashMap<>(); diff --git a/sentinel-extension/sentinel-parameter-flow-control/src/main/resources/META-INF/services/com.alibaba.csp.sentinel.slotchain.ProcessorSlot b/sentinel-extension/sentinel-parameter-flow-control/src/main/resources/META-INF/services/com.alibaba.csp.sentinel.slotchain.ProcessorSlot new file mode 100644 index 0000000000..8832f16bbb --- /dev/null +++ b/sentinel-extension/sentinel-parameter-flow-control/src/main/resources/META-INF/services/com.alibaba.csp.sentinel.slotchain.ProcessorSlot @@ -0,0 +1 @@ +com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowSlot \ No newline at end of file diff --git a/sentinel-extension/sentinel-parameter-flow-control/src/main/resources/META-INF/services/com.alibaba.csp.sentinel.slotchain.SlotChainBuilder b/sentinel-extension/sentinel-parameter-flow-control/src/main/resources/META-INF/services/com.alibaba.csp.sentinel.slotchain.SlotChainBuilder deleted file mode 100644 index a0354c1ed6..0000000000 --- a/sentinel-extension/sentinel-parameter-flow-control/src/main/resources/META-INF/services/com.alibaba.csp.sentinel.slotchain.SlotChainBuilder +++ /dev/null @@ -1 +0,0 @@ -com.alibaba.csp.sentinel.slots.HotParamSlotChainBuilder \ No newline at end of file