Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 26 additions & 10 deletions dubbo-common/src/main/java/org/apache/dubbo/common/URLBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -123,14 +123,14 @@ public static URLBuilder from(URL url) {
Map<String, String> parameters = new HashMap<>(url.getParameters());
Map<String, Object> attributes = new HashMap<>(url.getAttributes());
return new URLBuilder(
protocol,
username,
password,
host,
port,
path,
parameters,
attributes);
protocol,
username,
password,
host,
port,
path,
parameters,
attributes);
}

public ServiceConfigURL build() {
Expand Down Expand Up @@ -159,6 +159,7 @@ public URLBuilder putAttribute(String key, Object obj) {
return this;
}

@Override
public URLBuilder setProtocol(String protocol) {
this.protocol = protocol;
return this;
Expand All @@ -170,6 +171,7 @@ public URLBuilder setUsername(String username) {
return this;
}

@Override
public URLBuilder setPassword(String password) {
this.password = password;
return this;
Expand Down Expand Up @@ -223,59 +225,71 @@ public URLBuilder addParameterAndEncoded(String key, String value) {
return addParameter(key, URL.encode(value));
}

@Override
public URLBuilder addParameter(String key, boolean value) {
return addParameter(key, String.valueOf(value));
}

@Override
public URLBuilder addParameter(String key, char value) {
return addParameter(key, String.valueOf(value));
}

@Override
public URLBuilder addParameter(String key, byte value) {
return addParameter(key, String.valueOf(value));
}

@Override
public URLBuilder addParameter(String key, short value) {
return addParameter(key, String.valueOf(value));
}

@Override
public URLBuilder addParameter(String key, int value) {
return addParameter(key, String.valueOf(value));
}

@Override
public URLBuilder addParameter(String key, long value) {
return addParameter(key, String.valueOf(value));
}

@Override
public URLBuilder addParameter(String key, float value) {
return addParameter(key, String.valueOf(value));
}

@Override
public URLBuilder addParameter(String key, double value) {
return addParameter(key, String.valueOf(value));
}

@Override
public URLBuilder addParameter(String key, Enum<?> value) {
if (value == null) {
return this;
}
return addParameter(key, String.valueOf(value));
}

@Override
public URLBuilder addParameter(String key, Number value) {
if (value == null) {
return this;
}
return addParameter(key, String.valueOf(value));
}

@Override
public URLBuilder addParameter(String key, CharSequence value) {
if (value == null || value.length() == 0) {
return this;
}
return addParameter(key, String.valueOf(value));
}

@Override
public URLBuilder addParameter(String key, String value) {
if (StringUtils.isEmpty(key) || StringUtils.isEmpty(value)) {
return this;
Expand Down Expand Up @@ -354,7 +368,7 @@ public URLBuilder addParametersIfAbsent(Map<String, String> parameters) {
if (CollectionUtils.isEmptyMap(parameters)) {
return this;
}
for(Map.Entry<String, String> entry : parameters.entrySet()) {
for (Map.Entry<String, String> entry : parameters.entrySet()) {
this.parameters.putIfAbsent(entry.getKey(), entry.getValue());
}
return this;
Expand Down Expand Up @@ -447,15 +461,17 @@ public boolean hasMethodParameter(String method, String key) {
return value != null && value.length() > 0;
}

@Override
public String getParameter(String key) {
return parameters.get(key);
}

@Override
public String getMethodParameter(String method, String key) {
Map<String, String> keyMap = methodParameters.get(method);
String value = null;
if (keyMap != null) {
value = keyMap.get(key);
value = keyMap.get(key);
}
return value;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,8 @@ public class DefaultTPSLimiter implements TPSLimiter {

@Override
public boolean isAllowable(URL url, Invocation invocation) {
int rate = url.getParameter(TPS_LIMIT_RATE_KEY, -1);
long interval = url.getParameter(TPS_LIMIT_INTERVAL_KEY, DEFAULT_TPS_LIMIT_INTERVAL);
int rate = url.getMethodParameter(invocation.getMethodName(), TPS_LIMIT_RATE_KEY, -1);
long interval = url.getMethodParameter(invocation.getMethodName(), TPS_LIMIT_INTERVAL_KEY, DEFAULT_TPS_LIMIT_INTERVAL);
String serviceKey = url.getServiceKey();
if (rate > 0) {
StatItem statItem = stats.get(serviceKey);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
public class DefaultTPSLimiterTest {

private static final int TEST_LIMIT_RATE = 2;
private DefaultTPSLimiter defaultTPSLimiter = new DefaultTPSLimiter();
private final DefaultTPSLimiter defaultTPSLimiter = new DefaultTPSLimiter();

@Test
public void testIsAllowable() throws Exception {
Expand Down Expand Up @@ -64,6 +64,23 @@ public void testIsNotAllowable() throws Exception {
}
}

@Test
public void testTPSLimiterForMethodLevelConfig() throws Exception {
Invocation invocation = new MockInvocation();
URL url = URL.valueOf("test://test");
url = url.addParameter(INTERFACE_KEY, "org.apache.dubbo.rpc.file.TpsService");
url = url.addParameter(TPS_LIMIT_RATE_KEY, TEST_LIMIT_RATE);
int tpsConfigForMethodLevel = 3;
url = url.addParameter("echo.tps", tpsConfigForMethodLevel);
url = url.addParameter(TPS_LIMIT_INTERVAL_KEY, 1000);
for (int i = 1; i <= tpsConfigForMethodLevel + 1; i++) {
if (i == tpsConfigForMethodLevel + 1) {
Assertions.assertFalse(defaultTPSLimiter.isAllowable(url, invocation));
} else {
Assertions.assertTrue(defaultTPSLimiter.isAllowable(url, invocation));
}
}
}

@Test
public void testConfigChange() throws Exception {
Expand Down