Support adding prefix to Dubbo service resource name in Sentinel Dubbo Adapter (#859)
This commit is contained in:
parent
e71d036794
commit
39293c118b
|
|
@ -15,6 +15,7 @@
|
||||||
*/
|
*/
|
||||||
package com.alibaba.csp.sentinel.adapter.dubbo;
|
package com.alibaba.csp.sentinel.adapter.dubbo;
|
||||||
|
|
||||||
|
import com.alibaba.csp.sentinel.util.StringUtil;
|
||||||
import org.apache.dubbo.rpc.Invocation;
|
import org.apache.dubbo.rpc.Invocation;
|
||||||
import org.apache.dubbo.rpc.Invoker;
|
import org.apache.dubbo.rpc.Invoker;
|
||||||
|
|
||||||
|
|
@ -35,9 +36,9 @@ public final class DubboUtils {
|
||||||
public static String getResourceName(Invoker<?> invoker, Invocation invocation) {
|
public static String getResourceName(Invoker<?> invoker, Invocation invocation) {
|
||||||
StringBuilder buf = new StringBuilder(64);
|
StringBuilder buf = new StringBuilder(64);
|
||||||
buf.append(invoker.getInterface().getName())
|
buf.append(invoker.getInterface().getName())
|
||||||
.append(":")
|
.append(":")
|
||||||
.append(invocation.getMethodName())
|
.append(invocation.getMethodName())
|
||||||
.append("(");
|
.append("(");
|
||||||
boolean isFirst = true;
|
boolean isFirst = true;
|
||||||
for (Class<?> clazz : invocation.getParameterTypes()) {
|
for (Class<?> clazz : invocation.getParameterTypes()) {
|
||||||
if (!isFirst) {
|
if (!isFirst) {
|
||||||
|
|
@ -50,5 +51,17 @@ public final class DubboUtils {
|
||||||
return buf.toString();
|
return buf.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
private DubboUtils() {}
|
public static String getResourceName(Invoker<?> invoker, Invocation invocation, String prefix) {
|
||||||
|
if (StringUtil.isNotBlank(prefix)) {
|
||||||
|
return new StringBuilder(64)
|
||||||
|
.append(prefix)
|
||||||
|
.append(getResourceName(invoker, invocation))
|
||||||
|
.toString();
|
||||||
|
} else {
|
||||||
|
return getResourceName(invoker, invocation);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private DubboUtils() {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -19,10 +19,10 @@ import com.alibaba.csp.sentinel.Entry;
|
||||||
import com.alibaba.csp.sentinel.EntryType;
|
import com.alibaba.csp.sentinel.EntryType;
|
||||||
import com.alibaba.csp.sentinel.SphU;
|
import com.alibaba.csp.sentinel.SphU;
|
||||||
import com.alibaba.csp.sentinel.Tracer;
|
import com.alibaba.csp.sentinel.Tracer;
|
||||||
|
import com.alibaba.csp.sentinel.adapter.dubbo.config.DubboConfig;
|
||||||
|
import com.alibaba.csp.sentinel.adapter.dubbo.fallback.DubboFallbackRegistry;
|
||||||
import com.alibaba.csp.sentinel.log.RecordLog;
|
import com.alibaba.csp.sentinel.log.RecordLog;
|
||||||
import com.alibaba.csp.sentinel.slots.block.BlockException;
|
import com.alibaba.csp.sentinel.slots.block.BlockException;
|
||||||
|
|
||||||
import com.alibaba.csp.sentinel.adapter.dubbo.fallback.DubboFallbackRegistry;
|
|
||||||
import org.apache.dubbo.common.extension.Activate;
|
import org.apache.dubbo.common.extension.Activate;
|
||||||
import org.apache.dubbo.rpc.Filter;
|
import org.apache.dubbo.rpc.Filter;
|
||||||
import org.apache.dubbo.rpc.Invocation;
|
import org.apache.dubbo.rpc.Invocation;
|
||||||
|
|
@ -32,7 +32,7 @@ import org.apache.dubbo.rpc.RpcException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>Dubbo service consumer filter for Sentinel. Auto activated by default.</p>
|
* <p>Dubbo service consumer filter for Sentinel. Auto activated by default.</p>
|
||||||
*
|
* <p>
|
||||||
* If you want to disable the consumer filter, you can configure:
|
* If you want to disable the consumer filter, you can configure:
|
||||||
* <pre>
|
* <pre>
|
||||||
* <dubbo:consumer filter="-sentinel.dubbo.consumer.filter"/>
|
* <dubbo:consumer filter="-sentinel.dubbo.consumer.filter"/>
|
||||||
|
|
@ -53,7 +53,7 @@ public class SentinelDubboConsumerFilter implements Filter {
|
||||||
Entry interfaceEntry = null;
|
Entry interfaceEntry = null;
|
||||||
Entry methodEntry = null;
|
Entry methodEntry = null;
|
||||||
try {
|
try {
|
||||||
String resourceName = DubboUtils.getResourceName(invoker, invocation);
|
String resourceName = DubboUtils.getResourceName(invoker, invocation, DubboConfig.getDubboConsumerPrefix());
|
||||||
interfaceEntry = SphU.entry(invoker.getInterface().getName(), EntryType.OUT);
|
interfaceEntry = SphU.entry(invoker.getInterface().getName(), EntryType.OUT);
|
||||||
methodEntry = SphU.entry(resourceName, EntryType.OUT);
|
methodEntry = SphU.entry(resourceName, EntryType.OUT);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,11 +19,11 @@ import com.alibaba.csp.sentinel.Entry;
|
||||||
import com.alibaba.csp.sentinel.EntryType;
|
import com.alibaba.csp.sentinel.EntryType;
|
||||||
import com.alibaba.csp.sentinel.SphU;
|
import com.alibaba.csp.sentinel.SphU;
|
||||||
import com.alibaba.csp.sentinel.Tracer;
|
import com.alibaba.csp.sentinel.Tracer;
|
||||||
|
import com.alibaba.csp.sentinel.adapter.dubbo.config.DubboConfig;
|
||||||
import com.alibaba.csp.sentinel.adapter.dubbo.fallback.DubboFallbackRegistry;
|
import com.alibaba.csp.sentinel.adapter.dubbo.fallback.DubboFallbackRegistry;
|
||||||
import com.alibaba.csp.sentinel.context.ContextUtil;
|
import com.alibaba.csp.sentinel.context.ContextUtil;
|
||||||
import com.alibaba.csp.sentinel.log.RecordLog;
|
import com.alibaba.csp.sentinel.log.RecordLog;
|
||||||
import com.alibaba.csp.sentinel.slots.block.BlockException;
|
import com.alibaba.csp.sentinel.slots.block.BlockException;
|
||||||
|
|
||||||
import org.apache.dubbo.common.extension.Activate;
|
import org.apache.dubbo.common.extension.Activate;
|
||||||
import org.apache.dubbo.rpc.Filter;
|
import org.apache.dubbo.rpc.Filter;
|
||||||
import org.apache.dubbo.rpc.Invocation;
|
import org.apache.dubbo.rpc.Invocation;
|
||||||
|
|
@ -34,7 +34,7 @@ import org.apache.dubbo.rpc.RpcException;
|
||||||
/**
|
/**
|
||||||
* <p>Apache Dubbo service provider filter that enables integration with Sentinel. Auto activated by default.</p>
|
* <p>Apache Dubbo service provider filter that enables integration with Sentinel. Auto activated by default.</p>
|
||||||
* <p>Note: this only works for Apache Dubbo 2.7.x or above version.</p>
|
* <p>Note: this only works for Apache Dubbo 2.7.x or above version.</p>
|
||||||
*
|
* <p>
|
||||||
* If you want to disable the provider filter, you can configure:
|
* If you want to disable the provider filter, you can configure:
|
||||||
* <pre>
|
* <pre>
|
||||||
* <dubbo:provider filter="-sentinel.dubbo.provider.filter"/>
|
* <dubbo:provider filter="-sentinel.dubbo.provider.filter"/>
|
||||||
|
|
@ -58,7 +58,7 @@ public class SentinelDubboProviderFilter implements Filter {
|
||||||
Entry interfaceEntry = null;
|
Entry interfaceEntry = null;
|
||||||
Entry methodEntry = null;
|
Entry methodEntry = null;
|
||||||
try {
|
try {
|
||||||
String resourceName = DubboUtils.getResourceName(invoker, invocation);
|
String resourceName = DubboUtils.getResourceName(invoker, invocation, DubboConfig.getDubboProviderPrefix());
|
||||||
String interfaceName = invoker.getInterface().getName();
|
String interfaceName = invoker.getInterface().getName();
|
||||||
// Only need to create entrance context at provider side, as context will take effect
|
// Only need to create entrance context at provider side, as context will take effect
|
||||||
// at entrance of invocation chain only (for inbound traffic).
|
// at entrance of invocation chain only (for inbound traffic).
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,62 @@
|
||||||
|
/*
|
||||||
|
* 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.adapter.dubbo.config;
|
||||||
|
|
||||||
|
import com.alibaba.csp.sentinel.config.SentinelConfig;
|
||||||
|
import com.alibaba.csp.sentinel.util.StringUtil;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* Responsible for dubbo service provider, consumer attribute configuration
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @author lianglin
|
||||||
|
* @since 1.7.0
|
||||||
|
*/
|
||||||
|
public final class DubboConfig {
|
||||||
|
|
||||||
|
public static final String DUBBO_USE_PREFIX = "csp.sentinel.dubbo.resource.use.prefix";
|
||||||
|
private static final String TRUE_STR = "true";
|
||||||
|
|
||||||
|
public static final String DUBBO_PROVIDER_PREFIX = "csp.sentinel.dubbo.resource.provider.prefix";
|
||||||
|
public static final String DUBBO_CONSUMER_PREFIX = "csp.sentinel.dubbo.resource.consumer.prefix";
|
||||||
|
|
||||||
|
private static final String DEFAULT_DUBBO_PROVIDER_PREFIX = "dubbo:provider:";
|
||||||
|
private static final String DEFAULT_DUBBO_CONSUMER_PREFIX = "dubbo:consumer:";
|
||||||
|
|
||||||
|
|
||||||
|
public static boolean isUsePrefix(){
|
||||||
|
return TRUE_STR.equalsIgnoreCase(SentinelConfig.getConfig(DUBBO_USE_PREFIX));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getDubboProviderPrefix() {
|
||||||
|
if (isUsePrefix()) {
|
||||||
|
String config = SentinelConfig.getConfig(DUBBO_PROVIDER_PREFIX);
|
||||||
|
return StringUtil.isNotBlank(config) ? config : DEFAULT_DUBBO_PROVIDER_PREFIX;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getDubboConsumerPrefix() {
|
||||||
|
if (isUsePrefix()) {
|
||||||
|
String config = SentinelConfig.getConfig(DUBBO_CONSUMER_PREFIX);
|
||||||
|
return StringUtil.isNotBlank(config) ? config : DEFAULT_DUBBO_CONSUMER_PREFIX;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -15,15 +15,18 @@
|
||||||
*/
|
*/
|
||||||
package com.alibaba.csp.sentinel.adapter.dubbo;
|
package com.alibaba.csp.sentinel.adapter.dubbo;
|
||||||
|
|
||||||
|
import com.alibaba.csp.sentinel.adapter.dubbo.config.DubboConfig;
|
||||||
|
import com.alibaba.csp.sentinel.adapter.dubbo.provider.DemoService;
|
||||||
|
import com.alibaba.csp.sentinel.config.SentinelConfig;
|
||||||
import org.apache.dubbo.rpc.Invocation;
|
import org.apache.dubbo.rpc.Invocation;
|
||||||
import org.apache.dubbo.rpc.Invoker;
|
import org.apache.dubbo.rpc.Invoker;
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
|
||||||
import com.alibaba.csp.sentinel.adapter.dubbo.provider.DemoService;
|
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.fail;
|
import static org.junit.Assert.fail;
|
||||||
import static org.mockito.Mockito.*;
|
import static org.mockito.Mockito.*;
|
||||||
|
|
@ -33,12 +36,28 @@ import static org.mockito.Mockito.*;
|
||||||
*/
|
*/
|
||||||
public class DubboUtilsTest {
|
public class DubboUtilsTest {
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() {
|
||||||
|
SentinelConfig.setConfig("csp.sentinel.dubbo.resource.use.prefix", "true");
|
||||||
|
SentinelConfig.setConfig(DubboConfig.DUBBO_PROVIDER_PREFIX, "");
|
||||||
|
SentinelConfig.setConfig(DubboConfig.DUBBO_CONSUMER_PREFIX, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void tearDown() {
|
||||||
|
SentinelConfig.setConfig("csp.sentinel.dubbo.resource.use.prefix", "false");
|
||||||
|
SentinelConfig.setConfig(DubboConfig.DUBBO_PROVIDER_PREFIX, "");
|
||||||
|
SentinelConfig.setConfig(DubboConfig.DUBBO_CONSUMER_PREFIX, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGetApplication() {
|
public void testGetApplication() {
|
||||||
Invocation invocation = mock(Invocation.class);
|
Invocation invocation = mock(Invocation.class);
|
||||||
when(invocation.getAttachments()).thenReturn(new HashMap<>());
|
when(invocation.getAttachments()).thenReturn(new HashMap<>());
|
||||||
when(invocation.getAttachment(DubboUtils.SENTINEL_DUBBO_APPLICATION_KEY, ""))
|
when(invocation.getAttachment(DubboUtils.SENTINEL_DUBBO_APPLICATION_KEY, ""))
|
||||||
.thenReturn("consumerA");
|
.thenReturn("consumerA");
|
||||||
|
|
||||||
String application = DubboUtils.getApplication(invocation, "");
|
String application = DubboUtils.getApplication(invocation, "");
|
||||||
verify(invocation).getAttachment(DubboUtils.SENTINEL_DUBBO_APPLICATION_KEY, "");
|
verify(invocation).getAttachment(DubboUtils.SENTINEL_DUBBO_APPLICATION_KEY, "");
|
||||||
|
|
@ -51,7 +70,7 @@ public class DubboUtilsTest {
|
||||||
Invocation invocation = mock(Invocation.class);
|
Invocation invocation = mock(Invocation.class);
|
||||||
when(invocation.getAttachments()).thenReturn(null);
|
when(invocation.getAttachments()).thenReturn(null);
|
||||||
when(invocation.getAttachment(DubboUtils.SENTINEL_DUBBO_APPLICATION_KEY, ""))
|
when(invocation.getAttachment(DubboUtils.SENTINEL_DUBBO_APPLICATION_KEY, ""))
|
||||||
.thenReturn("consumerA");
|
.thenReturn("consumerA");
|
||||||
|
|
||||||
DubboUtils.getApplication(invocation, "");
|
DubboUtils.getApplication(invocation, "");
|
||||||
|
|
||||||
|
|
@ -72,4 +91,31 @@ public class DubboUtilsTest {
|
||||||
|
|
||||||
assertEquals("com.alibaba.csp.sentinel.adapter.dubbo.provider.DemoService:sayHello(java.lang.String,int)", resourceName);
|
assertEquals("com.alibaba.csp.sentinel.adapter.dubbo.provider.DemoService:sayHello(java.lang.String,int)", resourceName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetResourceNameWithPrefix() {
|
||||||
|
Invoker invoker = mock(Invoker.class);
|
||||||
|
when(invoker.getInterface()).thenReturn(DemoService.class);
|
||||||
|
|
||||||
|
Invocation invocation = mock(Invocation.class);
|
||||||
|
Method method = DemoService.class.getMethods()[0];
|
||||||
|
when(invocation.getMethodName()).thenReturn(method.getName());
|
||||||
|
when(invocation.getParameterTypes()).thenReturn(method.getParameterTypes());
|
||||||
|
|
||||||
|
//test with default prefix
|
||||||
|
String resourceName = DubboUtils.getResourceName(invoker, invocation, DubboConfig.getDubboProviderPrefix());
|
||||||
|
assertEquals("dubbo:provider:com.alibaba.csp.sentinel.adapter.dubbo.provider.DemoService:sayHello(java.lang.String,int)", resourceName);
|
||||||
|
resourceName = DubboUtils.getResourceName(invoker, invocation, DubboConfig.getDubboConsumerPrefix());
|
||||||
|
assertEquals("dubbo:consumer:com.alibaba.csp.sentinel.adapter.dubbo.provider.DemoService:sayHello(java.lang.String,int)", resourceName);
|
||||||
|
|
||||||
|
|
||||||
|
//test with custom prefix
|
||||||
|
SentinelConfig.setConfig(DubboConfig.DUBBO_PROVIDER_PREFIX, "my:dubbo:provider:");
|
||||||
|
SentinelConfig.setConfig(DubboConfig.DUBBO_CONSUMER_PREFIX, "my:dubbo:consumer:");
|
||||||
|
resourceName = DubboUtils.getResourceName(invoker, invocation, DubboConfig.getDubboProviderPrefix());
|
||||||
|
assertEquals("my:dubbo:provider:com.alibaba.csp.sentinel.adapter.dubbo.provider.DemoService:sayHello(java.lang.String,int)", resourceName);
|
||||||
|
resourceName = DubboUtils.getResourceName(invoker, invocation, DubboConfig.getDubboConsumerPrefix());
|
||||||
|
assertEquals("my:dubbo:consumer:com.alibaba.csp.sentinel.adapter.dubbo.provider.DemoService:sayHello(java.lang.String,int)", resourceName);
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,7 @@
|
||||||
*/
|
*/
|
||||||
package com.alibaba.csp.sentinel.adapter.dubbo;
|
package com.alibaba.csp.sentinel.adapter.dubbo;
|
||||||
|
|
||||||
|
import com.alibaba.csp.sentinel.util.StringUtil;
|
||||||
import com.alibaba.dubbo.rpc.Filter;
|
import com.alibaba.dubbo.rpc.Filter;
|
||||||
import com.alibaba.dubbo.rpc.Invocation;
|
import com.alibaba.dubbo.rpc.Invocation;
|
||||||
import com.alibaba.dubbo.rpc.Invoker;
|
import com.alibaba.dubbo.rpc.Invoker;
|
||||||
|
|
@ -27,9 +28,9 @@ abstract class AbstractDubboFilter implements Filter {
|
||||||
protected String getResourceName(Invoker<?> invoker, Invocation invocation) {
|
protected String getResourceName(Invoker<?> invoker, Invocation invocation) {
|
||||||
StringBuilder buf = new StringBuilder(64);
|
StringBuilder buf = new StringBuilder(64);
|
||||||
buf.append(invoker.getInterface().getName())
|
buf.append(invoker.getInterface().getName())
|
||||||
.append(":")
|
.append(":")
|
||||||
.append(invocation.getMethodName())
|
.append(invocation.getMethodName())
|
||||||
.append("(");
|
.append("(");
|
||||||
boolean isFirst = true;
|
boolean isFirst = true;
|
||||||
for (Class<?> clazz : invocation.getParameterTypes()) {
|
for (Class<?> clazz : invocation.getParameterTypes()) {
|
||||||
if (!isFirst) {
|
if (!isFirst) {
|
||||||
|
|
@ -41,4 +42,16 @@ abstract class AbstractDubboFilter implements Filter {
|
||||||
buf.append(")");
|
buf.append(")");
|
||||||
return buf.toString();
|
return buf.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected String getResourceName(Invoker<?> invoker, Invocation invocation, String prefix) {
|
||||||
|
if (StringUtil.isBlank(prefix)) {
|
||||||
|
return getResourceName(invoker, invocation);
|
||||||
|
}
|
||||||
|
StringBuilder buf = new StringBuilder(64);
|
||||||
|
return buf.append(prefix)
|
||||||
|
.append(getResourceName(invoker, invocation))
|
||||||
|
.toString();
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -19,8 +19,8 @@ import com.alibaba.csp.sentinel.Entry;
|
||||||
import com.alibaba.csp.sentinel.EntryType;
|
import com.alibaba.csp.sentinel.EntryType;
|
||||||
import com.alibaba.csp.sentinel.SphU;
|
import com.alibaba.csp.sentinel.SphU;
|
||||||
import com.alibaba.csp.sentinel.Tracer;
|
import com.alibaba.csp.sentinel.Tracer;
|
||||||
|
import com.alibaba.csp.sentinel.adapter.dubbo.config.DubboConfig;
|
||||||
import com.alibaba.csp.sentinel.adapter.dubbo.fallback.DubboFallbackRegistry;
|
import com.alibaba.csp.sentinel.adapter.dubbo.fallback.DubboFallbackRegistry;
|
||||||
import com.alibaba.csp.sentinel.context.ContextUtil;
|
|
||||||
import com.alibaba.csp.sentinel.log.RecordLog;
|
import com.alibaba.csp.sentinel.log.RecordLog;
|
||||||
import com.alibaba.csp.sentinel.slots.block.BlockException;
|
import com.alibaba.csp.sentinel.slots.block.BlockException;
|
||||||
import com.alibaba.dubbo.common.extension.Activate;
|
import com.alibaba.dubbo.common.extension.Activate;
|
||||||
|
|
@ -53,7 +53,7 @@ public class SentinelDubboConsumerFilter extends AbstractDubboFilter implements
|
||||||
Entry interfaceEntry = null;
|
Entry interfaceEntry = null;
|
||||||
Entry methodEntry = null;
|
Entry methodEntry = null;
|
||||||
try {
|
try {
|
||||||
String resourceName = getResourceName(invoker, invocation);
|
String resourceName = getResourceName(invoker, invocation, DubboConfig.getDubboConsumerPrefix());
|
||||||
interfaceEntry = SphU.entry(invoker.getInterface().getName(), EntryType.OUT);
|
interfaceEntry = SphU.entry(invoker.getInterface().getName(), EntryType.OUT);
|
||||||
methodEntry = SphU.entry(resourceName, EntryType.OUT);
|
methodEntry = SphU.entry(resourceName, EntryType.OUT);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,11 +19,11 @@ import com.alibaba.csp.sentinel.Entry;
|
||||||
import com.alibaba.csp.sentinel.EntryType;
|
import com.alibaba.csp.sentinel.EntryType;
|
||||||
import com.alibaba.csp.sentinel.SphU;
|
import com.alibaba.csp.sentinel.SphU;
|
||||||
import com.alibaba.csp.sentinel.Tracer;
|
import com.alibaba.csp.sentinel.Tracer;
|
||||||
|
import com.alibaba.csp.sentinel.adapter.dubbo.config.DubboConfig;
|
||||||
import com.alibaba.csp.sentinel.adapter.dubbo.fallback.DubboFallbackRegistry;
|
import com.alibaba.csp.sentinel.adapter.dubbo.fallback.DubboFallbackRegistry;
|
||||||
import com.alibaba.csp.sentinel.context.ContextUtil;
|
import com.alibaba.csp.sentinel.context.ContextUtil;
|
||||||
import com.alibaba.csp.sentinel.log.RecordLog;
|
import com.alibaba.csp.sentinel.log.RecordLog;
|
||||||
import com.alibaba.csp.sentinel.slots.block.BlockException;
|
import com.alibaba.csp.sentinel.slots.block.BlockException;
|
||||||
import com.alibaba.csp.sentinel.slots.block.SentinelRpcException;
|
|
||||||
import com.alibaba.dubbo.common.extension.Activate;
|
import com.alibaba.dubbo.common.extension.Activate;
|
||||||
import com.alibaba.dubbo.rpc.Filter;
|
import com.alibaba.dubbo.rpc.Filter;
|
||||||
import com.alibaba.dubbo.rpc.Invocation;
|
import com.alibaba.dubbo.rpc.Invocation;
|
||||||
|
|
@ -57,7 +57,7 @@ public class SentinelDubboProviderFilter extends AbstractDubboFilter implements
|
||||||
Entry interfaceEntry = null;
|
Entry interfaceEntry = null;
|
||||||
Entry methodEntry = null;
|
Entry methodEntry = null;
|
||||||
try {
|
try {
|
||||||
String resourceName = getResourceName(invoker, invocation);
|
String resourceName = getResourceName(invoker, invocation, DubboConfig.getDubboProviderPrefix());
|
||||||
String interfaceName = invoker.getInterface().getName();
|
String interfaceName = invoker.getInterface().getName();
|
||||||
ContextUtil.enter(resourceName, application);
|
ContextUtil.enter(resourceName, application);
|
||||||
interfaceEntry = SphU.entry(interfaceName, EntryType.IN);
|
interfaceEntry = SphU.entry(interfaceName, EntryType.IN);
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,62 @@
|
||||||
|
/*
|
||||||
|
* 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.adapter.dubbo.config;
|
||||||
|
|
||||||
|
import com.alibaba.csp.sentinel.config.SentinelConfig;
|
||||||
|
import com.alibaba.csp.sentinel.util.StringUtil;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* Responsible for dubbo service provider, consumer attribute configuration
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @author lianglin
|
||||||
|
* @since 1.7.0
|
||||||
|
*/
|
||||||
|
public final class DubboConfig {
|
||||||
|
|
||||||
|
public static final String DUBBO_USE_PREFIX = "csp.sentinel.dubbo.resource.use.prefix";
|
||||||
|
private static final String TRUE_STR = "true";
|
||||||
|
|
||||||
|
public static final String DUBBO_PROVIDER_PREFIX = "csp.sentinel.dubbo.resource.provider.prefix";
|
||||||
|
public static final String DUBBO_CONSUMER_PREFIX = "csp.sentinel.dubbo.resource.consumer.prefix";
|
||||||
|
|
||||||
|
private static final String DEFAULT_DUBBO_PROVIDER_PREFIX = "dubbo:provider:";
|
||||||
|
private static final String DEFAULT_DUBBO_CONSUMER_PREFIX = "dubbo:consumer:";
|
||||||
|
|
||||||
|
public static boolean isUsePrefix() {
|
||||||
|
return TRUE_STR.equalsIgnoreCase(SentinelConfig.getConfig(DUBBO_USE_PREFIX));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static String getDubboProviderPrefix() {
|
||||||
|
if (isUsePrefix()) {
|
||||||
|
String config = SentinelConfig.getConfig(DUBBO_PROVIDER_PREFIX);
|
||||||
|
return StringUtil.isNotBlank(config) ? config : DEFAULT_DUBBO_PROVIDER_PREFIX;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getDubboConsumerPrefix() {
|
||||||
|
if (isUsePrefix()) {
|
||||||
|
String config = SentinelConfig.getConfig(DUBBO_CONSUMER_PREFIX);
|
||||||
|
return StringUtil.isNotBlank(config) ? config : DEFAULT_DUBBO_CONSUMER_PREFIX;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -1,22 +1,42 @@
|
||||||
package com.alibaba.csp.sentinel.adapter.dubbo;
|
package com.alibaba.csp.sentinel.adapter.dubbo;
|
||||||
|
|
||||||
|
import com.alibaba.csp.sentinel.adapter.dubbo.config.DubboConfig;
|
||||||
import com.alibaba.csp.sentinel.adapter.dubbo.provider.DemoService;
|
import com.alibaba.csp.sentinel.adapter.dubbo.provider.DemoService;
|
||||||
|
import com.alibaba.csp.sentinel.config.SentinelConfig;
|
||||||
import com.alibaba.dubbo.rpc.Invocation;
|
import com.alibaba.dubbo.rpc.Invocation;
|
||||||
import com.alibaba.dubbo.rpc.Invoker;
|
import com.alibaba.dubbo.rpc.Invoker;
|
||||||
import com.alibaba.dubbo.rpc.Result;
|
import com.alibaba.dubbo.rpc.Result;
|
||||||
import com.alibaba.dubbo.rpc.RpcException;
|
import com.alibaba.dubbo.rpc.RpcException;
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
import static org.junit.Assert.*;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.mockito.Mockito.*;
|
import static org.mockito.Mockito.mock;
|
||||||
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author cdfive
|
* @author cdfive
|
||||||
*/
|
*/
|
||||||
public class AbstractDubboFilterTest {
|
public class AbstractDubboFilterTest {
|
||||||
|
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() {
|
||||||
|
SentinelConfig.setConfig("csp.sentinel.dubbo.resource.use.prefix", "true");
|
||||||
|
SentinelConfig.setConfig(DubboConfig.DUBBO_PROVIDER_PREFIX, "");
|
||||||
|
SentinelConfig.setConfig(DubboConfig.DUBBO_CONSUMER_PREFIX, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void tearDown() {
|
||||||
|
SentinelConfig.setConfig("csp.sentinel.dubbo.resource.use.prefix", "false");
|
||||||
|
SentinelConfig.setConfig(DubboConfig.DUBBO_PROVIDER_PREFIX, "");
|
||||||
|
SentinelConfig.setConfig(DubboConfig.DUBBO_CONSUMER_PREFIX, "");
|
||||||
|
}
|
||||||
|
|
||||||
private AbstractDubboFilter filter = new AbstractDubboFilter() {
|
private AbstractDubboFilter filter = new AbstractDubboFilter() {
|
||||||
@Override
|
@Override
|
||||||
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
|
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
|
||||||
|
|
@ -24,6 +44,7 @@ public class AbstractDubboFilterTest {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGetResourceName() {
|
public void testGetResourceName() {
|
||||||
Invoker invoker = mock(Invoker.class);
|
Invoker invoker = mock(Invoker.class);
|
||||||
|
|
@ -38,4 +59,32 @@ public class AbstractDubboFilterTest {
|
||||||
|
|
||||||
assertEquals("com.alibaba.csp.sentinel.adapter.dubbo.provider.DemoService:sayHello(java.lang.String,int)", resourceName);
|
assertEquals("com.alibaba.csp.sentinel.adapter.dubbo.provider.DemoService:sayHello(java.lang.String,int)", resourceName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetResourceNameWithPrefix() {
|
||||||
|
Invoker invoker = mock(Invoker.class);
|
||||||
|
when(invoker.getInterface()).thenReturn(DemoService.class);
|
||||||
|
|
||||||
|
Invocation invocation = mock(Invocation.class);
|
||||||
|
Method method = DemoService.class.getMethods()[0];
|
||||||
|
when(invocation.getMethodName()).thenReturn(method.getName());
|
||||||
|
when(invocation.getParameterTypes()).thenReturn(method.getParameterTypes());
|
||||||
|
|
||||||
|
//test with default prefix
|
||||||
|
String resourceName = filter.getResourceName(invoker, invocation, DubboConfig.getDubboProviderPrefix());
|
||||||
|
System.out.println("resourceName = " + resourceName);
|
||||||
|
assertEquals("dubbo:provider:com.alibaba.csp.sentinel.adapter.dubbo.provider.DemoService:sayHello(java.lang.String,int)", resourceName);
|
||||||
|
resourceName = filter.getResourceName(invoker, invocation, DubboConfig.getDubboConsumerPrefix());
|
||||||
|
assertEquals("dubbo:consumer:com.alibaba.csp.sentinel.adapter.dubbo.provider.DemoService:sayHello(java.lang.String,int)", resourceName);
|
||||||
|
|
||||||
|
|
||||||
|
//test with custom prefix
|
||||||
|
SentinelConfig.setConfig(DubboConfig.DUBBO_PROVIDER_PREFIX, "my:dubbo:provider:");
|
||||||
|
SentinelConfig.setConfig(DubboConfig.DUBBO_CONSUMER_PREFIX, "my:dubbo:consumer:");
|
||||||
|
resourceName = filter.getResourceName(invoker, invocation, DubboConfig.getDubboProviderPrefix());
|
||||||
|
assertEquals("my:dubbo:provider:com.alibaba.csp.sentinel.adapter.dubbo.provider.DemoService:sayHello(java.lang.String,int)", resourceName);
|
||||||
|
resourceName = filter.getResourceName(invoker, invocation, DubboConfig.getDubboConsumerPrefix());
|
||||||
|
assertEquals("my:dubbo:consumer:com.alibaba.csp.sentinel.adapter.dubbo.provider.DemoService:sayHello(java.lang.String,int)", resourceName);
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue