@@ -31,6 +31,7 @@ | |||
<module>sentinel-okhttp-adapter</module> | |||
<module>sentinel-jax-rs-adapter</module> | |||
<module>sentinel-quarkus-adapter</module> | |||
<module>sentinel-motan-adapter</module> | |||
</modules> | |||
<dependencyManagement> | |||
@@ -0,0 +1,50 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<project xmlns="http://maven.apache.org/POM/4.0.0" | |||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | |||
<parent> | |||
<artifactId>sentinel-adapter</artifactId> | |||
<groupId>com.alibaba.csp</groupId> | |||
<version>1.8.1-SNAPSHOT</version> | |||
</parent> | |||
<modelVersion>4.0.0</modelVersion> | |||
<artifactId>sentinel-motan-adapter</artifactId> | |||
<packaging>jar</packaging> | |||
<properties> | |||
<motan.version>1.1.8</motan.version> | |||
</properties> | |||
<dependencies> | |||
<dependency> | |||
<groupId>com.alibaba.csp</groupId> | |||
<artifactId>sentinel-core</artifactId> | |||
</dependency> | |||
<dependency> | |||
<groupId>com.weibo</groupId> | |||
<artifactId>motan-core</artifactId> | |||
<version>${motan.version}</version> | |||
<scope>provided</scope> | |||
</dependency> | |||
<dependency> | |||
<groupId>com.weibo</groupId> | |||
<artifactId>motan-transport-netty4</artifactId> | |||
<version>${motan.version}</version> | |||
<scope>provided</scope> | |||
</dependency> | |||
</dependencies> | |||
<build> | |||
<plugins> | |||
<plugin> | |||
<groupId>org.apache.maven.plugins</groupId> | |||
<artifactId>maven-compiler-plugin</artifactId> | |||
<version>${maven.compiler.version}</version> | |||
<configuration> | |||
<source>1.8</source> | |||
<target>1.8</target> | |||
<encoding>${java.encoding}</encoding> | |||
</configuration> | |||
</plugin> | |||
</plugins> | |||
</build> | |||
</project> |
@@ -0,0 +1,89 @@ | |||
/* | |||
* Copyright 1999-2020 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 | |||
* | |||
* https://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.motan; | |||
import com.alibaba.csp.sentinel.adapter.motan.config.MotanAdapterGlobalConfig; | |||
import com.alibaba.csp.sentinel.util.StringUtil; | |||
import com.weibo.api.motan.rpc.Caller; | |||
import com.weibo.api.motan.rpc.Request; | |||
import com.weibo.api.motan.util.ReflectUtil; | |||
/** | |||
* @author zhangxn8 | |||
*/ | |||
public class MotanUtils { | |||
private MotanUtils() {} | |||
public static String getMethodResourceName(Caller<?> caller, Request request){ | |||
return getMethodResourceName(caller, request, false); | |||
} | |||
public static String getMethodResourceName(Caller<?> caller, Request request, Boolean useGroupAndVersion) { | |||
StringBuilder buf = new StringBuilder(64); | |||
String interfaceResource = useGroupAndVersion ? caller.getUrl().getPath(): caller.getInterface().getName(); | |||
buf.append(interfaceResource) | |||
.append(":") | |||
.append(request.getMethodName()) | |||
.append("("); | |||
boolean isFirst = true; | |||
try { | |||
Class<?>[] classTypes = ReflectUtil.forNames(request.getParamtersDesc()); | |||
for (Class<?> clazz : classTypes) { | |||
if (!isFirst) { | |||
buf.append(","); | |||
} | |||
buf.append(clazz.getName()); | |||
isFirst = false; | |||
} | |||
} catch (ClassNotFoundException e) { | |||
e.printStackTrace(); | |||
} | |||
buf.append(")"); | |||
return buf.toString(); | |||
} | |||
public static String getMethodResourceName(Caller<?> caller, Request request, String prefix) { | |||
if (StringUtil.isNotBlank(prefix)) { | |||
return new StringBuilder(64) | |||
.append(prefix) | |||
.append(getMethodResourceName(caller, request,MotanAdapterGlobalConfig.getMotanInterfaceGroupAndVersionEnabled())) | |||
.toString(); | |||
} else { | |||
return getMethodResourceName(caller, request,MotanAdapterGlobalConfig.getMotanInterfaceGroupAndVersionEnabled()); | |||
} | |||
} | |||
public static String getInterfaceName(Caller<?> caller) { | |||
return getInterfaceName(caller, false); | |||
} | |||
public static String getInterfaceName(Caller<?> caller, Boolean useGroupAndVersion) { | |||
return useGroupAndVersion ? caller.getUrl().getApplication() : caller.getInterface().getName(); | |||
} | |||
public static String getInterfaceName(Caller<?> caller, String prefix) { | |||
if (StringUtil.isNotBlank(prefix)) { | |||
return new StringBuilder(64) | |||
.append(prefix) | |||
.append(getInterfaceName(caller, MotanAdapterGlobalConfig.getMotanInterfaceGroupAndVersionEnabled())) | |||
.toString(); | |||
} else { | |||
return getInterfaceName(caller, MotanAdapterGlobalConfig.getMotanInterfaceGroupAndVersionEnabled()); | |||
} | |||
} | |||
} |
@@ -0,0 +1,74 @@ | |||
/* | |||
* Copyright 1999-2020 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 | |||
* | |||
* https://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.motan; | |||
import com.alibaba.csp.sentinel.*; | |||
import com.alibaba.csp.sentinel.adapter.motan.config.MotanAdapterGlobalConfig; | |||
import com.alibaba.csp.sentinel.log.RecordLog; | |||
import com.alibaba.csp.sentinel.slots.block.BlockException; | |||
import com.weibo.api.motan.common.MotanConstants; | |||
import com.weibo.api.motan.core.extension.Activation; | |||
import com.weibo.api.motan.core.extension.SpiMeta; | |||
import com.weibo.api.motan.exception.MotanAbstractException; | |||
import com.weibo.api.motan.filter.Filter; | |||
import com.weibo.api.motan.rpc.Caller; | |||
import com.weibo.api.motan.rpc.Request; | |||
import com.weibo.api.motan.rpc.Response; | |||
/** | |||
* @author zhangxn8 | |||
*/ | |||
@Activation(key = MotanConstants.NODE_TYPE_REFERER) | |||
@SpiMeta(name = MotanAdapterGlobalConfig.SENTINEL_MOTAN_CONSUMER) | |||
public class SentinelMotanConsumerFilter implements Filter { | |||
public SentinelMotanConsumerFilter(){ | |||
RecordLog.info("Sentinel motan consumer filter initialized"); | |||
} | |||
@Override | |||
public Response filter(Caller<?> caller, Request request) { | |||
Entry interfaceEntry = null; | |||
Entry methodEntry = null; | |||
String prefix = MotanAdapterGlobalConfig.getMotanConsumerPrefix(); | |||
String interfaceResourceName = MotanUtils.getInterfaceName(caller, prefix); | |||
String methodResourceName = MotanUtils.getMethodResourceName(caller, request, prefix); | |||
try { | |||
interfaceEntry = SphU.entry(interfaceResourceName, ResourceTypeConstants.COMMON_RPC, EntryType.OUT); | |||
methodEntry = SphU.entry(methodResourceName, ResourceTypeConstants.COMMON_RPC, EntryType.OUT, | |||
request.getArguments()); | |||
Response result = caller.call(request); | |||
if (result.getException() != null) { | |||
Tracer.traceEntry(result.getException(), interfaceEntry); | |||
Tracer.traceEntry(result.getException(), methodEntry); | |||
} | |||
return result; | |||
} catch (BlockException e) { | |||
return MotanAdapterGlobalConfig.getConsumerFallback().handle(caller, request, e); | |||
} catch (MotanAbstractException e) { | |||
Tracer.traceEntry(e, interfaceEntry); | |||
Tracer.traceEntry(e, methodEntry); | |||
throw e; | |||
} finally { | |||
if (methodEntry != null) { | |||
methodEntry.exit(1, request.getArguments()); | |||
} | |||
if (interfaceEntry != null) { | |||
interfaceEntry.exit(); | |||
} | |||
} | |||
} | |||
} |
@@ -0,0 +1,80 @@ | |||
/* | |||
* Copyright 1999-2020 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 | |||
* | |||
* https://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.motan; | |||
import com.alibaba.csp.sentinel.*; | |||
import com.alibaba.csp.sentinel.adapter.motan.config.MotanAdapterGlobalConfig; | |||
import com.alibaba.csp.sentinel.context.ContextUtil; | |||
import com.alibaba.csp.sentinel.log.RecordLog; | |||
import com.alibaba.csp.sentinel.slots.block.BlockException; | |||
import com.weibo.api.motan.common.MotanConstants; | |||
import com.weibo.api.motan.core.extension.Activation; | |||
import com.weibo.api.motan.core.extension.SpiMeta; | |||
import com.weibo.api.motan.exception.MotanAbstractException; | |||
import com.weibo.api.motan.filter.Filter; | |||
import com.weibo.api.motan.rpc.Caller; | |||
import com.weibo.api.motan.rpc.Request; | |||
import com.weibo.api.motan.rpc.Response; | |||
import java.util.Map; | |||
/** | |||
* @author zhangxn8 | |||
*/ | |||
@Activation(key = MotanConstants.NODE_TYPE_SERVICE) | |||
@SpiMeta(name = MotanAdapterGlobalConfig.SENTINEL_MOTAN_PROVIDER) | |||
public class SentinelMotanProviderFilter implements Filter { | |||
public SentinelMotanProviderFilter(){ | |||
RecordLog.info("Sentinel motan provider filter initialized"); | |||
} | |||
@Override | |||
public Response filter(Caller<?> caller, Request request) { | |||
Entry interfaceEntry = null; | |||
Entry methodEntry = null; | |||
Map<String, String> attachment = request.getAttachments(); | |||
String origin = attachment.getOrDefault(MotanAdapterGlobalConfig.APPLICATION, MotanAdapterGlobalConfig.MOTAN); | |||
String prefix = MotanAdapterGlobalConfig.getMotanProviderPrefix(); | |||
String interfaceResourceName = MotanUtils.getInterfaceName(caller, prefix); | |||
String methodResourceName = MotanUtils.getMethodResourceName(caller, request, prefix); | |||
try { | |||
ContextUtil.enter(methodResourceName, origin); | |||
interfaceEntry = SphU.entry(interfaceResourceName, ResourceTypeConstants.COMMON_RPC, EntryType.IN); | |||
methodEntry = SphU.entry(methodResourceName, ResourceTypeConstants.COMMON_RPC, EntryType.IN, | |||
request.getArguments()); | |||
Response result = caller.call(request); | |||
if (result.getException() != null) { | |||
Tracer.traceEntry(result.getException(), interfaceEntry); | |||
Tracer.traceEntry(result.getException(), methodEntry); | |||
} | |||
return result; | |||
} catch (BlockException e) { | |||
return MotanAdapterGlobalConfig.getProviderFallback().handle(caller, request, e); | |||
} catch (MotanAbstractException e) { | |||
Tracer.traceEntry(e, interfaceEntry); | |||
Tracer.traceEntry(e, methodEntry); | |||
throw e; | |||
} finally { | |||
if (methodEntry != null) { | |||
methodEntry.exit(1, request.getArguments()); | |||
} | |||
if (interfaceEntry != null) { | |||
interfaceEntry.exit(); | |||
} | |||
ContextUtil.exit(); | |||
} | |||
} | |||
} |
@@ -0,0 +1,94 @@ | |||
/* | |||
* Copyright 1999-2020 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 | |||
* | |||
* https://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.motan.config; | |||
import com.alibaba.csp.sentinel.adapter.motan.fallback.DefaultMotanFallback; | |||
import com.alibaba.csp.sentinel.adapter.motan.fallback.MotanFallback; | |||
import com.alibaba.csp.sentinel.config.SentinelConfig; | |||
import com.alibaba.csp.sentinel.util.AssertUtil; | |||
import com.alibaba.csp.sentinel.util.StringUtil; | |||
/** | |||
* @author zhangxn8 | |||
*/ | |||
public class MotanAdapterGlobalConfig { | |||
private static final String TRUE_STR = "true"; | |||
public static final String APPLICATION = "application"; | |||
public static final String MOTAN = "motan"; | |||
public static final String BASE_SENTINEL_MOTAN_FILTER = "baseSentinelMotanFilter"; | |||
public static final String MOTAN_APP_CONTEXT = "motanAppContext"; | |||
public static final String SENTINEL_MOTAN_CONSUMER = "sentinelMotanConsumer"; | |||
public static final String SENTINEL_MOTAN_PROVIDER = "sentinelMotanProvider"; | |||
public static final String MOTAN_RES_NAME_WITH_PREFIX_KEY = "csp.sentinel.motan.resource.use.prefix"; | |||
public static final String MOTAN_PROVIDER_RES_NAME_PREFIX_KEY = "csp.sentinel.motan.resource.provider.prefix"; | |||
public static final String MOTAN_CONSUMER_RES_NAME_PREFIX_KEY = "csp.sentinel.motan.resource.consumer.prefix"; | |||
public static final String MOTAN_INTERFACE_GROUP_VERSION_ENABLED = "csp.sentinel.motan.interface.group.version.enabled"; | |||
private static final String DEFAULT_MOTAN_PROVIDER_PREFIX = "motan:provider:"; | |||
private static final String DEFAULT_MOTAN_CONSUMER_PREFIX = "motan:consumer:"; | |||
private static volatile MotanFallback consumerFallback = new DefaultMotanFallback(); | |||
private static volatile MotanFallback providerFallback = new DefaultMotanFallback(); | |||
private MotanAdapterGlobalConfig() {} | |||
public static boolean isUsePrefix() { | |||
return TRUE_STR.equalsIgnoreCase(SentinelConfig.getConfig(MOTAN_RES_NAME_WITH_PREFIX_KEY)); | |||
} | |||
public static String getMotanProviderPrefix() { | |||
if (isUsePrefix()) { | |||
String config = SentinelConfig.getConfig(MOTAN_PROVIDER_RES_NAME_PREFIX_KEY); | |||
return StringUtil.isNotBlank(config) ? config : DEFAULT_MOTAN_PROVIDER_PREFIX; | |||
} | |||
return null; | |||
} | |||
public static String getMotanConsumerPrefix() { | |||
if (isUsePrefix()) { | |||
String config = SentinelConfig.getConfig(MOTAN_CONSUMER_RES_NAME_PREFIX_KEY); | |||
return StringUtil.isNotBlank(config) ? config : DEFAULT_MOTAN_CONSUMER_PREFIX; | |||
} | |||
return null; | |||
} | |||
public static Boolean getMotanInterfaceGroupAndVersionEnabled() { | |||
return TRUE_STR.equalsIgnoreCase(SentinelConfig.getConfig(MOTAN_INTERFACE_GROUP_VERSION_ENABLED)); | |||
} | |||
public static MotanFallback getConsumerFallback() { | |||
return consumerFallback; | |||
} | |||
public static void setConsumerFallback(MotanFallback consumerFallback) { | |||
AssertUtil.notNull(consumerFallback, "consumerFallback cannot be null"); | |||
MotanAdapterGlobalConfig.consumerFallback = consumerFallback; | |||
} | |||
public static MotanFallback getProviderFallback() { | |||
return providerFallback; | |||
} | |||
public static void setProviderFallback(MotanFallback providerFallback) { | |||
AssertUtil.notNull(providerFallback, "providerFallback cannot be null"); | |||
MotanAdapterGlobalConfig.providerFallback = providerFallback; | |||
} | |||
} |
@@ -0,0 +1,38 @@ | |||
/* | |||
* Copyright 1999-2020 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 | |||
* | |||
* https://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.motan.fallback; | |||
import com.alibaba.csp.sentinel.slots.block.BlockException; | |||
import com.weibo.api.motan.rpc.Caller; | |||
import com.weibo.api.motan.rpc.DefaultResponse; | |||
import com.weibo.api.motan.rpc.Request; | |||
import com.weibo.api.motan.rpc.Response; | |||
/** | |||
* @author zhangxn8 | |||
*/ | |||
public class DefaultMotanFallback implements MotanFallback{ | |||
@Override | |||
public Response handle(Caller<?> caller, Request request, BlockException ex) { | |||
DefaultResponse defaultResponse = new DefaultResponse(); | |||
defaultResponse.setException(ex.toRuntimeException()); | |||
defaultResponse.setRequestId(request.getRequestId()); | |||
defaultResponse.setAttachments(request.getAttachments()); | |||
defaultResponse.setRpcProtocolVersion(request.getRpcProtocolVersion()); | |||
return defaultResponse; | |||
} | |||
} |
@@ -0,0 +1,37 @@ | |||
/* | |||
* Copyright 1999-2020 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 | |||
* | |||
* https://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.motan.fallback; | |||
import com.alibaba.csp.sentinel.slots.block.BlockException; | |||
import com.weibo.api.motan.rpc.Caller; | |||
import com.weibo.api.motan.rpc.Request; | |||
import com.weibo.api.motan.rpc.Response; | |||
/** | |||
* @author zhangxn8 | |||
*/ | |||
public interface MotanFallback { | |||
/** | |||
* Handle the block exception and provide fallback result. | |||
* @param caller | |||
* @param request | |||
* @param ex | |||
* @return | |||
*/ | |||
Response handle(Caller<?> caller, Request request, BlockException ex); | |||
} |
@@ -0,0 +1,2 @@ | |||
com.alibaba.csp.sentinel.adapter.motan.SentinelMotanProviderFilter | |||
com.alibaba.csp.sentinel.adapter.motan.SentinelMotanConsumerFilter |
@@ -44,6 +44,7 @@ | |||
<module>sentinel-demo-jax-rs</module> | |||
<module>sentinel-demo-quarkus</module> | |||
<module>sentinel-demo-annotation-cdi-interceptor</module> | |||
<module>sentinel-demo-motan</module> | |||
</modules> | |||
<dependencies> | |||
@@ -0,0 +1,68 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<project xmlns="http://maven.apache.org/POM/4.0.0" | |||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | |||
<parent> | |||
<artifactId>sentinel-demo</artifactId> | |||
<groupId>com.alibaba.csp</groupId> | |||
<version>1.8.1-SNAPSHOT</version> | |||
</parent> | |||
<modelVersion>4.0.0</modelVersion> | |||
<artifactId>sentinel-demo-motan</artifactId> | |||
<properties> | |||
<motan.version>1.1.8</motan.version> | |||
<slf4j.version>1.7.28</slf4j.version> | |||
</properties> | |||
<dependencies> | |||
<dependency> | |||
<groupId>com.alibaba.csp</groupId> | |||
<artifactId>sentinel-motan-adapter</artifactId> | |||
<version>${project.version}</version> | |||
</dependency> | |||
<dependency> | |||
<groupId>com.alibaba.csp</groupId> | |||
<artifactId>sentinel-transport-simple-http</artifactId> | |||
<version>${project.version}</version> | |||
</dependency> | |||
<dependency> | |||
<groupId>com.weibo</groupId> | |||
<artifactId>motan-core</artifactId> | |||
<version>${motan.version}</version> | |||
<scope>compile</scope> | |||
</dependency> | |||
<dependency> | |||
<groupId>com.weibo</groupId> | |||
<artifactId>motan-transport-netty4</artifactId> | |||
<version>${motan.version}</version> | |||
</dependency> | |||
<dependency> | |||
<groupId>org.slf4j</groupId> | |||
<artifactId>slf4j-api</artifactId> | |||
<version>${slf4j.version}</version> | |||
</dependency> | |||
<dependency> | |||
<groupId>org.slf4j</groupId> | |||
<artifactId>slf4j-log4j12</artifactId> | |||
<version>${slf4j.version}</version> | |||
<scope>test</scope> | |||
</dependency> | |||
</dependencies> | |||
<build> | |||
<plugins> | |||
<plugin> | |||
<groupId>org.apache.maven.plugins</groupId> | |||
<artifactId>maven-compiler-plugin</artifactId> | |||
<version>${maven.compiler.version}</version> | |||
<configuration> | |||
<source>1.8</source> | |||
<target>1.8</target> | |||
<encoding>${java.encoding}</encoding> | |||
</configuration> | |||
</plugin> | |||
</plugins> | |||
</build> | |||
</project> |
@@ -0,0 +1,90 @@ | |||
/* | |||
* Copyright 1999-2020 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 | |||
* | |||
* https://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.demo.motan; | |||
import com.alibaba.csp.sentinel.demo.motan.service.MotanDemoService; | |||
import com.alibaba.csp.sentinel.slots.block.RuleConstant; | |||
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule; | |||
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager; | |||
import com.weibo.api.motan.config.ProtocolConfig; | |||
import com.weibo.api.motan.config.RefererConfig; | |||
import com.weibo.api.motan.config.RegistryConfig; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
/** | |||
* @author zhangxn8 | |||
*/ | |||
public class SentinelMotanConsumerService { | |||
private static final String INTERFACE_RES_KEY = MotanDemoService.class.getName(); | |||
private static final String RES_KEY = INTERFACE_RES_KEY + ":hello(java.lang.String)"; | |||
public static void main(String[] args) { | |||
RefererConfig<MotanDemoService> motanDemoServiceReferer = new RefererConfig<MotanDemoService>(); | |||
// 设置接口及实现类 | |||
motanDemoServiceReferer.setInterface(MotanDemoService.class); | |||
// 配置服务的group以及版本号 | |||
motanDemoServiceReferer.setGroup("motan-demo-rpc"); | |||
motanDemoServiceReferer.setVersion("1.0"); | |||
motanDemoServiceReferer.setRequestTimeout(100000); | |||
// 配置注册中心直连调用 | |||
RegistryConfig registry = new RegistryConfig(); | |||
//use direct registry | |||
registry.setRegProtocol("direct"); | |||
registry.setAddress("127.0.0.1:8002"); | |||
// use ZooKeeper: 2181 or consul:8500 registry | |||
// registry.setRegProtocol("consul"); | |||
// registry.setAddress("127.0.0.1:8500"); | |||
motanDemoServiceReferer.setRegistry(registry); | |||
// 配置RPC协议 | |||
ProtocolConfig protocol = new ProtocolConfig(); | |||
protocol.setId("motan"); | |||
protocol.setName("motan"); | |||
motanDemoServiceReferer.setProtocol(protocol); | |||
motanDemoServiceReferer.setDirectUrl("localhost:8002"); // 注册中心直连调用需添加此配置 | |||
initFlowRule(5, false); | |||
// 使用服务 | |||
MotanDemoService service = motanDemoServiceReferer.getRef(); | |||
for (int i = 0 ;i< 5000 ;i++) { | |||
System.out.println(service.hello("motan")); | |||
} | |||
System.exit(0); | |||
} | |||
private static void initFlowRule(int interfaceFlowLimit, boolean method) { | |||
FlowRule flowRule = new FlowRule(INTERFACE_RES_KEY) | |||
.setCount(interfaceFlowLimit) | |||
.setGrade(RuleConstant.FLOW_GRADE_QPS); | |||
List<FlowRule> list = new ArrayList<>(); | |||
if (method) { | |||
FlowRule flowRule1 = new FlowRule(RES_KEY) | |||
.setCount(5) | |||
.setGrade(RuleConstant.FLOW_GRADE_QPS); | |||
list.add(flowRule1); | |||
} | |||
list.add(flowRule); | |||
FlowRuleManager.loadRules(list); | |||
} | |||
} |
@@ -0,0 +1,72 @@ | |||
/* | |||
* Copyright 1999-2020 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 | |||
* | |||
* https://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.demo.motan; | |||
import com.alibaba.csp.sentinel.demo.motan.service.MotanDemoService; | |||
import com.alibaba.csp.sentinel.demo.motan.service.impl.MotanDemoServiceImpl; | |||
import com.alibaba.csp.sentinel.init.InitExecutor; | |||
import com.weibo.api.motan.common.MotanConstants; | |||
import com.weibo.api.motan.config.ProtocolConfig; | |||
import com.weibo.api.motan.config.RegistryConfig; | |||
import com.weibo.api.motan.config.ServiceConfig; | |||
import com.weibo.api.motan.util.MotanSwitcherUtil; | |||
/** | |||
* @author zhangxn8 | |||
*/ | |||
public class SentinelMotanProviderService { | |||
public static void main(String[] args) { | |||
InitExecutor.doInit(); | |||
ServiceConfig<MotanDemoService> motanDemoService = new ServiceConfig<MotanDemoService>(); | |||
// 设置接口及实现类 | |||
motanDemoService.setInterface(MotanDemoService.class); | |||
motanDemoService.setRef(new MotanDemoServiceImpl()); | |||
// 配置服务的group以及版本号 | |||
motanDemoService.setGroup("motan-demo-rpc"); | |||
motanDemoService.setVersion("1.0"); | |||
// 配置注册中心直连调用 | |||
RegistryConfig registry = new RegistryConfig(); | |||
//use local registry | |||
registry.setRegProtocol("local"); | |||
// use ZooKeeper: 2181 or consul:8500 registry | |||
// registry.setRegProtocol("consul"); | |||
// registry.setAddress("127.0.0.1:8500"); | |||
// registry.setCheck("false"); //是否检查是否注册成功 | |||
motanDemoService.setRegistry(registry); | |||
// 配置RPC协议 | |||
ProtocolConfig protocol = new ProtocolConfig(); | |||
protocol.setId("motan"); | |||
protocol.setName("motan"); | |||
motanDemoService.setProtocol(protocol); | |||
motanDemoService.setExport("motan:8002"); | |||
motanDemoService.export(); | |||
MotanSwitcherUtil.setSwitcherValue(MotanConstants.REGISTRY_HEARTBEAT_SWITCHER, true); | |||
System.out.println("server start..."); | |||
} | |||
} |
@@ -0,0 +1,25 @@ | |||
/* | |||
* Copyright 1999-2020 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 | |||
* | |||
* https://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.demo.motan.service; | |||
/** | |||
* @author zhangxn8 | |||
*/ | |||
public interface MotanDemoService { | |||
String hello(String name); | |||
} |
@@ -0,0 +1,30 @@ | |||
/* | |||
* Copyright 1999-2020 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 | |||
* | |||
* https://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.demo.motan.service.impl; | |||
import com.alibaba.csp.sentinel.demo.motan.service.MotanDemoService; | |||
/** | |||
* @author zhangxn8 | |||
*/ | |||
public class MotanDemoServiceImpl implements MotanDemoService { | |||
@Override | |||
public String hello(String name) { | |||
System.out.println(name); | |||
return "Hello " + name + "!"; | |||
} | |||
} |
@@ -0,0 +1 @@ | |||
csp.sentinel.dashboard.server=localhost:8080 |