1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.shardingsphere.traffic.engine;
19
20 import lombok.RequiredArgsConstructor;
21 import org.apache.shardingsphere.infra.algorithm.loadbalancer.core.LoadBalanceAlgorithm;
22 import org.apache.shardingsphere.infra.instance.InstanceContext;
23 import org.apache.shardingsphere.infra.instance.metadata.InstanceMetaData;
24 import org.apache.shardingsphere.infra.instance.metadata.InstanceType;
25 import org.apache.shardingsphere.infra.session.query.QueryContext;
26 import org.apache.shardingsphere.traffic.rule.TrafficRule;
27 import org.apache.shardingsphere.traffic.rule.TrafficStrategyRule;
28
29 import java.util.ArrayList;
30 import java.util.Map;
31 import java.util.Optional;
32
33
34
35
36 @RequiredArgsConstructor
37 public final class TrafficEngine {
38
39 private final TrafficRule trafficRule;
40
41 private final InstanceContext instanceContext;
42
43
44
45
46
47
48
49
50 public Optional<String> dispatch(final QueryContext queryContext, final boolean inTransaction) {
51 Optional<TrafficStrategyRule> strategyRule = trafficRule.findMatchedStrategyRule(queryContext, inTransaction);
52 if (!strategyRule.isPresent() || isInvalidStrategyRule(strategyRule.get())) {
53 return Optional.empty();
54 }
55 Map<String, InstanceMetaData> instances = instanceContext.getAllClusterInstances(InstanceType.PROXY, strategyRule.get().getLabels());
56 if (!instances.isEmpty()) {
57 LoadBalanceAlgorithm loadBalancer = strategyRule.get().getLoadBalancer();
58 String instanceId = 1 == instances.size() ? instances.keySet().iterator().next() : loadBalancer.getTargetName(strategyRule.get().getName(), new ArrayList<>(instances.keySet()));
59 return Optional.of(instanceId);
60 }
61 return Optional.empty();
62 }
63
64 private boolean isInvalidStrategyRule(final TrafficStrategyRule strategyRule) {
65 return strategyRule.getLabels().isEmpty() || null == strategyRule.getLoadBalancer();
66 }
67 }