Skip to content

Commit 0d15c3d

Browse files
authored
feat: support tsf gw (#621)
1 parent 104a2cf commit 0d15c3d

File tree

7 files changed

+219
-18
lines changed

7 files changed

+219
-18
lines changed

polaris-common/polaris-metadata/src/main/java/com/tencent/polaris/metadata/core/constant/TsfMetadataConstants.java

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,57 +26,57 @@ public final class TsfMetadataConstants {
2626
/**
2727
* tsf application id.
2828
*/
29-
public static String TSF_APPLICATION_ID = "TSF_APPLICATION_ID";
29+
public static final String TSF_APPLICATION_ID = "TSF_APPLICATION_ID";
3030

3131
/**
3232
* tsf program version.
3333
*/
34-
public static String TSF_PROG_VERSION = "TSF_PROG_VERSION";
34+
public static final String TSF_PROG_VERSION = "TSF_PROG_VERSION";
3535

3636
/**
3737
* tsf group id.
3838
*/
39-
public static String TSF_GROUP_ID = "TSF_GROUP_ID";
39+
public static final String TSF_GROUP_ID = "TSF_GROUP_ID";
4040

4141
/**
4242
* tsf namespace id.
4343
*/
44-
public static String TSF_NAMESPACE_ID = "TSF_NAMESPACE_ID";
44+
public static final String TSF_NAMESPACE_ID = "TSF_NAMESPACE_ID";
4545

4646
/**
4747
* tsf instance id.
4848
*/
49-
public static String TSF_INSTNACE_ID = "TSF_INSTNACE_ID";
49+
public static final String TSF_INSTNACE_ID = "TSF_INSTNACE_ID";
5050

5151
/**
5252
* tsf region.
5353
*/
54-
public static String TSF_REGION = "TSF_REGION";
54+
public static final String TSF_REGION = "TSF_REGION";
5555

5656
/**
5757
* tsf zone.
5858
*/
59-
public static String TSF_ZONE = "TSF_ZONE";
59+
public static final String TSF_ZONE = "TSF_ZONE";
6060

6161
/**
6262
* tsf SDK version.
6363
*/
64-
public static String TSF_SDK_VERSION = "TSF_SDK_VERSION";
64+
public static final String TSF_SDK_VERSION = "TSF_SDK_VERSION";
6565

6666
/**
6767
* tsf tags.
6868
*/
69-
public static String TSF_TAGS = "TSF_TAGS";
69+
public static final String TSF_TAGS = "TSF_TAGS";
7070

7171
/**
7272
* IPV4.
7373
*/
74-
public static String TSF_ADDRESS_IPV4 = "TSF_ADDRESS_IPV4";
74+
public static final String TSF_ADDRESS_IPV4 = "TSF_ADDRESS_IPV4";
7575

7676
/**
7777
* IPV6.
7878
*/
79-
public static String TSF_ADDRESS_IPV6 = "TSF_ADDRESS_IPV6";
79+
public static final String TSF_ADDRESS_IPV6 = "TSF_ADDRESS_IPV6";
8080

8181
private TsfMetadataConstants() {
8282
}

polaris-common/polaris-model/src/main/java/com/tencent/polaris/api/utils/StringUtils.java

Lines changed: 184 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,16 @@
2121

2222
public class StringUtils {
2323

24+
private static final int NOT_FOUND = -1;
25+
26+
private static final int TO_STRING_LIMIT = 16;
27+
2428
public static final String EMPTY = "";
2529

2630
private static final String[] EMPTY_STRING_ARRAY = new String[0];
2731

32+
private static final int INDEX_NOT_FOUND = -1;
33+
2834
public static boolean isBlank(String str) {
2935
int strLen;
3036
if (str != null && (strLen = str.length()) != 0) {
@@ -380,4 +386,182 @@ public static String[] split(String original, String separator) {
380386
}
381387
return original.split(separator);
382388
}
389+
390+
public static int length(final CharSequence cs) {
391+
return cs == null ? 0 : cs.length();
392+
}
393+
394+
public static int ordinalIndexOf(final CharSequence str, final CharSequence searchStr, final int ordinal) {
395+
return ordinalIndexOf(str, searchStr, ordinal, false);
396+
}
397+
398+
/**
399+
* Copy from commons-lang3.
400+
* {@link org.apache.commons.lang3.StringUtils#ordinalIndexOf(java.lang.CharSequence, java.lang.CharSequence, int, boolean)}
401+
*/
402+
private static int ordinalIndexOf(final CharSequence str, final CharSequence searchStr, final int ordinal, final boolean lastIndex) {
403+
if (str == null || searchStr == null || ordinal <= 0) {
404+
return INDEX_NOT_FOUND;
405+
}
406+
if (searchStr.length() == 0) {
407+
return lastIndex ? str.length() : 0;
408+
}
409+
int found = 0;
410+
// set the initial index beyond the end of the string
411+
// this is to allow for the initial index decrement/increment
412+
int index = lastIndex ? str.length() : INDEX_NOT_FOUND;
413+
do {
414+
if (lastIndex) {
415+
index = lastIndexOf(str, searchStr, index - 1); // step backwards thru string
416+
} else {
417+
index = indexOf(str, searchStr, index + 1); // step forwards through string
418+
}
419+
if (index < 0) {
420+
return index;
421+
}
422+
found++;
423+
} while (found < ordinal);
424+
return index;
425+
}
426+
427+
/**
428+
* Copy from commons-lang3.
429+
* {@link org.apache.commons.lang3.CharSequenceUtils#lastIndexOf(java.lang.CharSequence, java.lang.CharSequence, int)}
430+
*/
431+
static int lastIndexOf(final CharSequence cs, final int searchChar, int start) {
432+
if (cs instanceof String) {
433+
return ((String) cs).lastIndexOf(searchChar, start);
434+
}
435+
final int sz = cs.length();
436+
if (start < 0) {
437+
return NOT_FOUND;
438+
}
439+
if (start >= sz) {
440+
start = sz - 1;
441+
}
442+
if (searchChar < Character.MIN_SUPPLEMENTARY_CODE_POINT) {
443+
for (int i = start; i >= 0; --i) {
444+
if (cs.charAt(i) == searchChar) {
445+
return i;
446+
}
447+
}
448+
return NOT_FOUND;
449+
}
450+
//supplementary characters (LANG1300)
451+
//NOTE - we must do a forward traversal for this to avoid duplicating code points
452+
if (searchChar <= Character.MAX_CODE_POINT) {
453+
final char[] chars = Character.toChars(searchChar);
454+
//make sure it's not the last index
455+
if (start == sz - 1) {
456+
return NOT_FOUND;
457+
}
458+
for (int i = start; i >= 0; i--) {
459+
final char high = cs.charAt(i);
460+
final char low = cs.charAt(i + 1);
461+
if (chars[0] == high && chars[1] == low) {
462+
return i;
463+
}
464+
}
465+
}
466+
return NOT_FOUND;
467+
}
468+
469+
/**
470+
* copy from commons-lang3.
471+
* {@link org.apache.commons.lang3.CharSequenceUtils#lastIndexOf(java.lang.CharSequence, int, int)}
472+
*/
473+
static int lastIndexOf(final CharSequence cs, final CharSequence searchChar, int start) {
474+
if (searchChar == null || cs == null) {
475+
return NOT_FOUND;
476+
}
477+
if (searchChar instanceof String) {
478+
if (cs instanceof String) {
479+
return ((String) cs).lastIndexOf((String) searchChar, start);
480+
} else if (cs instanceof StringBuilder) {
481+
return ((StringBuilder) cs).lastIndexOf((String) searchChar, start);
482+
} else if (cs instanceof StringBuffer) {
483+
return ((StringBuffer) cs).lastIndexOf((String) searchChar, start);
484+
}
485+
}
486+
487+
final int len1 = cs.length();
488+
final int len2 = searchChar.length();
489+
490+
if (start > len1) {
491+
start = len1;
492+
}
493+
494+
if (start < 0 || len2 < 0 || len2 > len1) {
495+
return NOT_FOUND;
496+
}
497+
498+
if (len2 == 0) {
499+
return start;
500+
}
501+
502+
if (len2 <= TO_STRING_LIMIT) {
503+
if (cs instanceof String) {
504+
return ((String) cs).lastIndexOf(searchChar.toString(), start);
505+
} else if (cs instanceof StringBuilder) {
506+
return ((StringBuilder) cs).lastIndexOf(searchChar.toString(), start);
507+
} else if (cs instanceof StringBuffer) {
508+
return ((StringBuffer) cs).lastIndexOf(searchChar.toString(), start);
509+
}
510+
}
511+
512+
if (start + len2 > len1) {
513+
start = len1 - len2;
514+
}
515+
516+
final char char0 = searchChar.charAt(0);
517+
518+
int i = start;
519+
while (true) {
520+
while (cs.charAt(i) != char0) {
521+
i--;
522+
if (i < 0) {
523+
return NOT_FOUND;
524+
}
525+
}
526+
if (checkLaterThan1(cs, searchChar, len2, i)) {
527+
return i;
528+
}
529+
i--;
530+
if (i < 0) {
531+
return NOT_FOUND;
532+
}
533+
}
534+
}
535+
536+
/**
537+
* copy from commons-lang3.
538+
* {link org.apache.commons.lang3.CharSequenceUtils#checkLaterThan1(java.lang.CharSequence, java.lang.CharSequence, int, int)}
539+
*/
540+
private static boolean checkLaterThan1(final CharSequence cs, final CharSequence searchChar, final int len2, final int start1) {
541+
for (int i = 1, j = len2 - 1; i <= j; i++, j--) {
542+
if (cs.charAt(start1 + i) != searchChar.charAt(i)
543+
||
544+
cs.charAt(start1 + j) != searchChar.charAt(j)
545+
) {
546+
return false;
547+
}
548+
}
549+
return true;
550+
}
551+
552+
/**
553+
* copy from commons-lang3.
554+
* {@link org.apache.commons.lang3.CharSequenceUtils#indexOf(java.lang.CharSequence, java.lang.CharSequence, int)}
555+
*/
556+
static int indexOf(final CharSequence cs, final CharSequence searchChar, final int start) {
557+
if (cs instanceof String) {
558+
return ((String) cs).indexOf(searchChar.toString(), start);
559+
} else if (cs instanceof StringBuilder) {
560+
return ((StringBuilder) cs).indexOf(searchChar.toString(), start);
561+
} else if (cs instanceof StringBuffer) {
562+
return ((StringBuffer) cs).indexOf(searchChar.toString(), start);
563+
}
564+
return cs.toString().indexOf(searchChar.toString(), start);
565+
}
566+
383567
}

polaris-common/polaris-model/src/main/java/com/tencent/polaris/api/utils/TrieUtil.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,6 @@ public static boolean checkSimpleApi(TrieNode<String> root, String apiPathInfo)
8484
} else {
8585
method = null;
8686
}
87-
// 因为前端的改动(最初的 tagValue 只有 path,某次前端组件改动后变成了 path-method,非客户提的),有兼容性问题,
88-
// 临时简化处理,不处理 method,前面逻辑保留是为了取出正确的 path
89-
method = null;
9087
String[] apiPaths = path.split("/");
9188

9289
TrieNode<String> node = root;
@@ -100,14 +97,23 @@ public static boolean checkSimpleApi(TrieNode<String> root, String apiPathInfo)
10097
if (node == null) {
10198
return false;
10299
} else {
103-
return StringUtils.equals(TrieNode.SIMPLE_VALID_INFO + "method:" + method, node.getNodeInfo());
100+
return checkApiNodeInfo(node, method);
104101
}
105102
}
106103
}
107104

108105
return false;
109106
}
110107

108+
public static boolean checkApiNodeInfo(TrieNode<String> node, String method) {
109+
// trie 的 node info 里 method 为 null,说明是旧规则,兼容作用,直接匹配
110+
if (StringUtils.equals(TrieNode.SIMPLE_VALID_INFO + "method:" + "null", node.getNodeInfo())) {
111+
return true;
112+
} else {
113+
return StringUtils.equals(TrieNode.SIMPLE_VALID_INFO + "method:" + method, node.getNodeInfo());
114+
}
115+
}
116+
111117
public static TrieNode<String> buildConfigTrieNode(String prefix) {
112118
TrieNode<String> root = new TrieNode<>(TrieNode.ROOT_PATH);
113119
return buildConfigTrieNode(prefix, root);

polaris-distribution/polaris-all/pom.xml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,11 @@
5252
<artifactId>opentelemetry-api</artifactId>
5353
<version>${otel.version}</version>
5454
</dependency>
55+
<dependency>
56+
<groupId>commons-io</groupId>
57+
<artifactId>commons-io</artifactId>
58+
<version>${commons.io.version}</version>
59+
</dependency>
5560
</dependencies>
5661

5762
<build>
@@ -192,6 +197,10 @@
192197
<pattern>io.netty</pattern>
193198
<shadedPattern>shade.polaris.io.netty</shadedPattern>
194199
</relocation>
200+
<relocation>
201+
<pattern>org.apache.commons.io</pattern>
202+
<shadedPattern>shade.polaris.org.apache.commons.io</shadedPattern>
203+
</relocation>
195204
</relocations>
196205
<artifactSet>
197206
<excludes>

polaris-plugins/polaris-plugins-connector/connector-consul/src/main/java/com/tencent/polaris/plugins/connector/consul/service/InstanceService.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,13 +87,14 @@ public void sendRequest(ServiceUpdateTask serviceUpdateTask) {
8787
UrlParameters tagParams = StringUtils.isNotBlank(tag) ? new SingleUrlParameters("tag", tag) : null;
8888
UrlParameters passingParams = onlyPassing ? new SingleUrlParameters("passing") : null;
8989
UrlParameters nsTypeParam = new SingleUrlParameters("nsType", "DEF_AND_GLOBAL");
90+
UrlParameters namespaceParameter = StringUtils.isNotBlank(namespace) ? new SingleUrlParameters("nid", namespace) : null;;
9091
Long currentIndex = getServersConsulIndex(serviceId);
9192
int code = ServerCodes.DATA_NO_CHANGE;
9293
QueryParams queryParams = new QueryParams(consulContext.getWaitTime(), currentIndex);
9394
try {
94-
LOG.debug("Begin get service instances of {} sync", serviceId);
95+
LOG.debug("Begin get service instances of :{}/{} sync", namespace, serviceId);
9596
HttpResponse rawResponse = consulRawClient.makeGetRequest("/v1/health/service/" + serviceId, tagParams,
96-
passingParams, tokenParam, nsTypeParam, queryParams);
97+
passingParams, tokenParam, nsTypeParam, namespaceParameter, queryParams);
9798
if (rawResponse != null) {
9899
if (!currentIndex.equals(rawResponse.getConsulIndex())) {
99100
code = ServerCodes.EXECUTE_SUCCESS;

polaris-plugins/polaris-plugins-connector/connector-consul/src/main/java/com/tencent/polaris/plugins/connector/consul/service/lane/LaneService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ private List<LaneProto.LaneGroup> parseResponse(LaneInfoResponse laneInfoRespons
240240
laneRuleBuilder.setName(laneRule.getLaneId());
241241
laneRuleBuilder.setGroupName("tsf");
242242
laneRuleBuilder.setEnable(true);
243-
laneRuleBuilder.setMatchMode(LaneProto.LaneRule.LaneMatchMode.STRICT);
243+
laneRuleBuilder.setMatchMode(LaneProto.LaneRule.LaneMatchMode.PERMISSIVE);
244244
laneRuleBuilder.setPriority(laneRule.getPriority());
245245
laneRuleBuilder.setLabelKey(TSF_GROUP_ID);
246246
// set TrafficMatchRule

polaris-plugins/polaris-plugins-router/router-lane/src/main/java/com/tencent/polaris/plugins/router/lane/LaneRouter.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,7 @@ private List<Instance> redirectToBase(List<LaneProto.LaneGroup> laneGroupList, S
221221
String[] split = defaultLabelValue.split(",");
222222
laneKeyValueMap.get(labelKey).addAll(Arrays.asList(split));
223223
}
224+
LOG.debug("lane_group: {}, rulesList:{}, laneKeyValueMap: {}", laneGroup.getName(), laneGroup.getRulesList(), laneKeyValueMap);
224225
if (CollectionUtils.isNotEmpty(laneKeyValueMap)) {
225226
for (Map.Entry<String, String> entry : metadata.entrySet()) {
226227
if (laneKeyValueMap.containsKey(entry.getKey()) && laneKeyValueMap.get(entry.getKey()).contains(entry.getValue())) {

0 commit comments

Comments
 (0)