移除 Dubbo 依赖,Dubbo 在国内使用率太低
This commit is contained in:
@@ -13,16 +13,14 @@ import static cn.iocoder.yudao.framework.env.core.util.EnvUtils.HOST_NAME_VALUE;
|
||||
|
||||
/**
|
||||
* 多环境的 {@link EnvEnvironmentPostProcessor} 实现类
|
||||
* 将 yudao.env.tag 设置到 dubbo、nacos 等组件对应的 tag 配置项,当且仅当它们不存在时
|
||||
* 将 yudao.env.tag 设置到 nacos 等组件对应的 tag 配置项,当且仅当它们不存在时
|
||||
*
|
||||
* @author 芋道源码
|
||||
*/
|
||||
public class EnvEnvironmentPostProcessor implements EnvironmentPostProcessor {
|
||||
|
||||
private static final Set<String> TARGET_TAG_KEYS = SetUtils.asSet(
|
||||
"spring.cloud.nacos.discovery.metadata.tag", // Nacos 注册中心
|
||||
"dubbo.provider.tag", // Dubbo 服务提供者的 tag
|
||||
"dubbo.consumer.tag" // Dubbo 服务消费者的 tag
|
||||
"spring.cloud.nacos.discovery.metadata.tag" // Nacos 注册中心
|
||||
// MQ TODO
|
||||
);
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@ import org.springframework.boot.autoconfigure.AutoConfiguration;
|
||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||
import org.springframework.cloud.client.loadbalancer.LoadBalancerClientsProperties;
|
||||
import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClientSpecification;
|
||||
import org.springframework.cloud.loadbalancer.config.LoadBalancerAutoConfiguration;
|
||||
import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
|
||||
@@ -24,24 +25,10 @@ public class YudaoEnvRpcAutoConfiguration {
|
||||
|
||||
// ========== Feign 相关 ==========
|
||||
|
||||
// TODO @芋艿:由于 loadBalancerClientFactoryBeanPostProcessor 拦截不到 LoadBalancerClientFactory,所以采用 loadBalancerClientFactory 实现
|
||||
// @Bean
|
||||
// public BeanPostProcessor loadBalancerClientFactoryBeanPostProcessor(LoadBalancerClientsProperties properties) {
|
||||
// return new BeanPostProcessor() {
|
||||
// @Override
|
||||
// public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
|
||||
// if (!(bean instanceof LoadBalancerClientFactory)) {
|
||||
// return bean;
|
||||
// }
|
||||
// return bean;
|
||||
// }
|
||||
// };
|
||||
// }
|
||||
|
||||
/**
|
||||
* 创建 {@link EnvLoadBalancerClientFactory} Bean
|
||||
*
|
||||
* 参考 {@link org.springframework.cloud.loadbalancer.config.LoadBalancerAutoConfiguration#loadBalancerClientFactory(LoadBalancerClientsProperties)} 方法
|
||||
* 参考 {@link LoadBalancerAutoConfiguration#loadBalancerClientFactory(LoadBalancerClientsProperties)} 方法
|
||||
*/
|
||||
@Bean
|
||||
public LoadBalancerClientFactory loadBalancerClientFactory(LoadBalancerClientsProperties properties,
|
||||
@@ -56,6 +43,4 @@ public class YudaoEnvRpcAutoConfiguration {
|
||||
return new EnvRequestInterceptor();
|
||||
}
|
||||
|
||||
// ========== Dubbo 相关 ==========
|
||||
|
||||
}
|
||||
|
||||
@@ -1,36 +0,0 @@
|
||||
package cn.iocoder.yudao.framework.env.core.dubbo;
|
||||
|
||||
import cn.iocoder.yudao.framework.env.core.context.EnvContextHolder;
|
||||
import org.apache.dubbo.common.constants.CommonConstants;
|
||||
import org.apache.dubbo.common.extension.Activate;
|
||||
import org.apache.dubbo.rpc.Invocation;
|
||||
import org.apache.dubbo.rpc.cluster.interceptor.ClusterInterceptor;
|
||||
import org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
/**
|
||||
* Consumer 方,在调用 Provider 时,将 {@link EnvContextHolder} 中的 Tag 通过 Dubbo 隐式传参。
|
||||
*
|
||||
* 完整逻辑说明,见 {@link DubboProviderRouterTagFilter}
|
||||
*
|
||||
* 注意,这里需要设置到 order = 1 的原因,是需要保证排在 ConsumerContextClusterInterceptor 之后
|
||||
*/
|
||||
@Activate(group = CommonConstants.CONSUMER, order = 1)
|
||||
public class DubboConsumerRouterTagClusterInterceptor implements ClusterInterceptor {
|
||||
|
||||
@Override
|
||||
public void before(AbstractClusterInvoker<?> clusterInvoker, Invocation invocation) {
|
||||
// 设置 Dubbo Tag 到 Dubbo 隐式传参
|
||||
String tag = EnvContextHolder.getTag();
|
||||
if (StringUtils.hasText(tag)) {
|
||||
invocation.setAttachment(CommonConstants.TAG_KEY, tag);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void after(AbstractClusterInvoker<?> clusterInvoker, Invocation invocation) {
|
||||
// 清空 Dubbo Tag 的隐式传参
|
||||
invocation.setAttachment(CommonConstants.TAG_KEY, null);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,43 +0,0 @@
|
||||
package cn.iocoder.yudao.framework.env.core.dubbo;
|
||||
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import cn.iocoder.yudao.framework.env.core.context.EnvContextHolder;
|
||||
import org.apache.dubbo.common.constants.CommonConstants;
|
||||
import org.apache.dubbo.common.extension.Activate;
|
||||
import org.apache.dubbo.rpc.*;
|
||||
import org.apache.dubbo.rpc.cluster.router.tag.TagRouter;
|
||||
|
||||
/**
|
||||
* 基于 Dubbo 标签路由规则(http://dubbo.apache.org/zh-cn/docs/user/demos/routing-rule.html),实现如下功能:
|
||||
* 1. 本地开发调试时,在带有 Dubbo Tag 的情况下,优先调用指定 Tag 的服务提供者。这样,我们可以将本地启动的服务提供者打上相应的 Tag,即可优先调用本地;
|
||||
* 并且,前端在调用开发环境上的 Dubbo 服务时,因为不带有 Dubbo Tag,所以不会调用到后端开发本地启动的 Dubbo 服务提供者;
|
||||
* 2. TODO 优化点:蓝绿发布、灰度发布
|
||||
*
|
||||
* 实现逻辑为:
|
||||
* 1. 对于 Consumer 方,在调用 Provider 时,{@link DubboConsumerRouterTagClusterInterceptor} 会将 {@link EnvContextHolder} 中的 Tag 通过 Dubbo 隐式传参。
|
||||
* 同时,Dubbo 自带 {@link TagRouter},会根据该参数,会选择符合该 Tag 的 Provider。
|
||||
* 2. 对于 Provider 方,在通过 Dubbo 隐式传参获得到 Tag 时,会设置到 {@link EnvContextHolder} 中。
|
||||
* 这样,在 Provider 作为 Consumer 角色时,调用其它 Provider 时,可以继续实现标签路由的功能。
|
||||
*/
|
||||
@Activate(group = {CommonConstants.PROVIDER, CommonConstants.CONSUMER}, order = -1000)
|
||||
public class DubboProviderRouterTagFilter implements Filter {
|
||||
|
||||
@Override
|
||||
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
|
||||
// 情况一,没有 tag 时,直接调用即可
|
||||
String tag = invocation.getAttachment(CommonConstants.TAG_KEY);
|
||||
if (StrUtil.isEmpty(tag)) {
|
||||
return invoker.invoke(invocation);
|
||||
}
|
||||
|
||||
// 情况二,有 tag 时,从 Dubbo 隐式传参获得 Dubbo Tag
|
||||
EnvContextHolder.setTag(tag);
|
||||
// 继续调用
|
||||
try {
|
||||
return invoker.invoke(invocation);
|
||||
} finally {
|
||||
EnvContextHolder.removeTag();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,14 +1,13 @@
|
||||
package cn.iocoder.yudao.framework.env.core.util;
|
||||
|
||||
import cn.hutool.core.net.NetUtil;
|
||||
import cn.hutool.core.util.IdUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import cn.iocoder.yudao.framework.env.config.EnvProperties;
|
||||
import feign.RequestTemplate;
|
||||
import lombok.SneakyThrows;
|
||||
import org.springframework.cloud.client.ServiceInstance;
|
||||
import org.springframework.core.env.Environment;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.net.InetAddress;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
@@ -44,8 +43,14 @@ public class EnvUtils {
|
||||
requestTemplate.header(HEADER_TAG, tag);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获得 hostname 主机名
|
||||
*
|
||||
* @return 主机名
|
||||
*/
|
||||
@SneakyThrows
|
||||
public static String getHostName() {
|
||||
return StrUtil.blankToDefault(NetUtil.getLocalHostName(), IdUtil.fastSimpleUUID());
|
||||
return InetAddress.getLocalHost().getHostName();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
dubboProviderRouterTagFilter=cn.iocoder.yudao.framework.env.core.dubbo.DubboProviderRouterTagFilter
|
||||
@@ -1 +0,0 @@
|
||||
dubboConsumerRouterTagClusterInterceptor=cn.iocoder.yudao.framework.env.core.dubbo.DubboConsumerRouterTagClusterInterceptor
|
||||
Reference in New Issue
Block a user