Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
Y
yudao-cloud
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
hblj
yudao-cloud
Commits
92c2d79d
提交
92c2d79d
authored
7月 21, 2020
作者:
YunaiV
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
1. 重新实现 Dubbo 路由的过滤器,之前的版本有问题
2. Spring Cloud Alibaba Dubbo 的 URL 处理有问题,切回到 Dubbo 原生注册中心,不使用 Spring Cloud 注册中心
上级
1dadf934
隐藏空白字符变更
内嵌
并排
正在显示
12 个修改的文件
包含
94 行增加
和
45 行删除
+94
-45
pom.xml
common/mall-spring-boot-starter-dubbo/pom.xml
+8
-2
DubboWebAutoConfiguration.java
.../iocoder/mall/dubbo/config/DubboWebAutoConfiguration.java
+7
-1
DubboConsumerRouterTagClusterInterceptor.java
...interceptor/DubboConsumerRouterTagClusterInterceptor.java
+37
-0
DubboProviderRouterTagFilter.java
.../mall/dubbo/core/filter/DubboProviderRouterTagFilter.java
+17
-35
DubboRouterTagContextHolder.java
...r/mall/dubbo/core/router/DubboRouterTagContextHolder.java
+3
-1
DubboRouterTagWebInterceptor.java
...der/mall/dubbo/core/web/DubboRouterTagWebInterceptor.java
+7
-1
com.alibaba.dubbo.rpc.Filter
...ain/resources/META-INF/dubbo/com.alibaba.dubbo.rpc.Filter
+1
-1
org.apache.dubbo.rpc.cluster.interceptor.ClusterInterceptor
...g.apache.dubbo.rpc.cluster.interceptor.ClusterInterceptor
+1
-0
pom.xml
mall-dependencies/pom.xml
+1
-1
application-local.yml
management-web-app/src/main/resources/application-local.yml
+7
-1
SystemServiceApplication.java
.../iocoder/mall/systemservice/SystemServiceApplication.java
+3
-1
application-local.yaml
...tem-service-app/src/main/resources/application-local.yaml
+2
-1
没有找到文件。
common/mall-spring-boot-starter-dubbo/pom.xml
浏览文件 @
92c2d79d
...
@@ -26,9 +26,15 @@
...
@@ -26,9 +26,15 @@
</dependency>
</dependency>
<!-- RPC 相关 -->
<!-- RPC 相关 -->
<!-- TODO 优化点:Spring Cloud Alibaba Dubbo 的示例 -->
<!-- <dependency>-->
<!-- <groupId>com.alibaba.cloud</groupId>-->
<!-- <artifactId>spring-cloud-starter-dubbo</artifactId>-->
<!-- </dependency>-->
<dependency>
<dependency>
<groupId>
com.alibaba.cloud
</groupId>
<groupId>
org.apache.dubbo
</groupId>
<artifactId>
spring-cloud-starter-dubbo
</artifactId>
<artifactId>
dubbo-spring-boot-starter
</artifactId>
</dependency>
</dependency>
<!-- 日志相关 -->
<!-- 日志相关 -->
...
...
common/mall-spring-boot-starter-dubbo/src/main/java/cn/iocoder/mall/dubbo/config/DubboWebAutoConfiguration.java
浏览文件 @
92c2d79d
package
cn
.
iocoder
.
mall
.
dubbo
.
config
;
package
cn
.
iocoder
.
mall
.
dubbo
.
config
;
import
cn.iocoder.mall.dubbo.core.web.DubboRouterTagWebInterceptor
;
import
cn.iocoder.mall.dubbo.core.web.DubboRouterTagWebInterceptor
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.beans.factory.NoSuchBeanDefinitionException
;
import
org.springframework.beans.factory.NoSuchBeanDefinitionException
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.context.annotation.Configuration
;
...
@@ -11,14 +13,18 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
...
@@ -11,14 +13,18 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@ConditionalOnWebApplication
(
type
=
ConditionalOnWebApplication
.
Type
.
SERVLET
)
@ConditionalOnWebApplication
(
type
=
ConditionalOnWebApplication
.
Type
.
SERVLET
)
public
class
DubboWebAutoConfiguration
implements
WebMvcConfigurer
{
public
class
DubboWebAutoConfiguration
implements
WebMvcConfigurer
{
private
Logger
logger
=
LoggerFactory
.
getLogger
(
DubboWebAutoConfiguration
.
class
);
// ========== 拦截器相关 ==========
// ========== 拦截器相关 ==========
@Override
@Override
public
void
addInterceptors
(
InterceptorRegistry
registry
)
{
public
void
addInterceptors
(
InterceptorRegistry
registry
)
{
try
{
try
{
// 设置为 -1000 的原因,保证在比较前面就处理该逻辑。例如说,认证拦截器;
registry
.
addInterceptor
(
new
DubboRouterTagWebInterceptor
()).
order
(-
1000
);
registry
.
addInterceptor
(
new
DubboRouterTagWebInterceptor
()).
order
(-
1000
);
logger
.
info
(
"[addInterceptors][加载 DubboRouterTagWebInterceptor 拦截器完成]"
);
}
catch
(
NoSuchBeanDefinitionException
e
)
{
}
catch
(
NoSuchBeanDefinitionException
e
)
{
// logger.warn("[addInterceptors][无法获取 AccessLogInterceptor 拦截器,因此不启动 AccessLog 的记录
]");
logger
.
warn
(
"[addInterceptors][无法获取 DubboRouterTagWebInterceptor 拦截器,无法使用 Dubbo 标签路由
]"
);
}
}
}
}
...
...
common/mall-spring-boot-starter-dubbo/src/main/java/cn/iocoder/mall/dubbo/core/cluster/interceptor/DubboConsumerRouterTagClusterInterceptor.java
0 → 100644
浏览文件 @
92c2d79d
package
cn
.
iocoder
.
mall
.
dubbo
.
core
.
cluster
.
interceptor
;
import
cn.iocoder.common.framework.util.StringUtils
;
import
cn.iocoder.mall.dubbo.core.filter.DubboProviderRouterTagFilter
;
import
cn.iocoder.mall.dubbo.core.router.DubboRouterTagContextHolder
;
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
;
/**
* Consumer 方,在调用 Provider 时,将 {@link DubboRouterTagContextHolder} 中的 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
dubboTag
=
DubboRouterTagContextHolder
.
getTag
();
if
(
StringUtils
.
hasText
(
dubboTag
))
{
invocation
.
setAttachment
(
CommonConstants
.
TAG_KEY
,
dubboTag
);
}
}
@Override
public
void
after
(
AbstractClusterInvoker
<?>
clusterInvoker
,
Invocation
invocation
)
{
// 清空 Dubbo Tag 的隐式传参
invocation
.
setAttachment
(
CommonConstants
.
TAG_KEY
,
null
);
}
}
common/mall-spring-boot-starter-dubbo/src/main/java/cn/iocoder/mall/dubbo/core/filter/DubboRouterTagFilter.java
→
common/mall-spring-boot-starter-dubbo/src/main/java/cn/iocoder/mall/dubbo/core/filter/Dubbo
Provider
RouterTagFilter.java
浏览文件 @
92c2d79d
package
cn
.
iocoder
.
mall
.
dubbo
.
core
.
filter
;
package
cn
.
iocoder
.
mall
.
dubbo
.
core
.
filter
;
import
cn.iocoder.common.framework.util.StringUtils
;
import
cn.iocoder.common.framework.util.StringUtils
;
import
cn.iocoder.mall.dubbo.core.cluster.interceptor.DubboConsumerRouterTagClusterInterceptor
;
import
cn.iocoder.mall.dubbo.core.router.DubboRouterTagContextHolder
;
import
cn.iocoder.mall.dubbo.core.router.DubboRouterTagContextHolder
;
import
org.apache.dubbo.common.constants.CommonConstants
;
import
org.apache.dubbo.common.constants.CommonConstants
;
import
org.apache.dubbo.common.extension.Activate
;
import
org.apache.dubbo.common.extension.Activate
;
import
org.apache.dubbo.rpc.*
;
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),实现如下功能:
* 基于 Dubbo 标签路由规则(http://dubbo.apache.org/zh-cn/docs/user/demos/routing-rule.html),实现如下功能:
...
@@ -12,49 +14,29 @@ import org.apache.dubbo.rpc.*;
...
@@ -12,49 +14,29 @@ import org.apache.dubbo.rpc.*;
* 2. TODO 优化点:蓝绿发布、灰度发布
* 2. TODO 优化点:蓝绿发布、灰度发布
*
*
* 实现逻辑为:
* 实现逻辑为:
* 1. 对于 Consumer 方,在调用 Provider 时,会将 {@link DubboRouterTagContextHolder} 中的 Tag 通过 Dubbo 隐式传参。
* 1. 对于 Consumer 方,在调用 Provider 时,
{@link DubboConsumerRouterTagClusterInterceptor}
会将 {@link DubboRouterTagContextHolder} 中的 Tag 通过 Dubbo 隐式传参。
* 同时,Dubbo 自带 {@link
org.apache.dubbo.rpc.cluster.router.tag.
TagRouter},会根据该参数,会选择符合该 Tag 的 Provider。
* 同时,Dubbo 自带 {@link TagRouter},会根据该参数,会选择符合该 Tag 的 Provider。
* 2. 对于 Provider 方,在通过 Dubbo 隐式传参获得到 Tag 时,会设置到 {@link DubboRouterTagContextHolder} 中。
* 2. 对于 Provider 方,在通过 Dubbo 隐式传参获得到 Tag 时,会设置到 {@link DubboRouterTagContextHolder} 中。
* 这样,在 Provider 作为 Consumer 角色时,调用其它 Provider 时,可以继续实现标签路由的功能。
* 这样,在 Provider 作为 Consumer 角色时,调用其它 Provider 时,可以继续实现标签路由的功能。
*/
*/
@Activate
(
group
=
{
CommonConstants
.
PROVIDER
,
CommonConstants
.
CONSUMER
},
order
=
-
1000
)
@Activate
(
group
=
{
CommonConstants
.
PROVIDER
,
CommonConstants
.
CONSUMER
},
order
=
-
1000
)
public
class
DubboRouterTagFilter
implements
Filter
{
public
class
Dubbo
Provider
RouterTagFilter
implements
Filter
{
@Override
@Override
public
Result
invoke
(
Invoker
<?>
invoker
,
Invocation
invocation
)
throws
RpcException
{
public
Result
invoke
(
Invoker
<?>
invoker
,
Invocation
invocation
)
throws
RpcException
{
// 消费端
// 从 Dubbo 隐式传参获得 Dubbo Tag
if
(
RpcContext
.
getContext
().
isConsumerSide
())
{
String
dubboTag
=
invocation
.
getAttachment
(
CommonConstants
.
TAG_KEY
);
// 设置 Dubbo Tag 到 Dubbo 隐式传参
boolean
hasDubboTag
=
StringUtils
.
hasText
(
dubboTag
);
String
dubboTag
=
DubboRouterTagContextHolder
.
getTag
();
if
(
hasDubboTag
)
{
boolean
hasDubboTag
=
StringUtils
.
hasText
(
dubboTag
);
invocation
.
setAttachment
(
CommonConstants
.
TAG_KEY
,
dubboTag
);
if
(
hasDubboTag
)
{
}
invocation
.
setAttachment
(
CommonConstants
.
TAG_KEY
,
dubboTag
);
// 继续调用
}
try
{
// 继续调用
return
invoker
.
invoke
(
invocation
);
try
{
}
finally
{
return
invoker
.
invoke
(
invocation
);
// 清理
}
finally
{
// 解决极端情况下,本地 injvm 调用时,消费端会调用 DubboRouterTagContextHolder.clear() 上下文,导致消费端也被清理了,因为在同一个 JVM 进程内。
if
(
hasDubboTag
)
{
DubboRouterTagContextHolder
.
setTag
(
dubboTag
);
}
}
// 提供端
}
else
{
// 从 Dubbo 隐式传参获得 Dubbo Tag
String
dubboTag
=
invocation
.
getAttachment
(
CommonConstants
.
TAG_KEY
);
boolean
hasDubboTag
=
StringUtils
.
hasText
(
dubboTag
);
if
(
hasDubboTag
)
{
if
(
hasDubboTag
)
{
invocation
.
setAttachment
(
CommonConstants
.
TAG_KEY
,
dubboTag
);
DubboRouterTagContextHolder
.
clear
();
}
// 继续调用
try
{
return
invoker
.
invoke
(
invocation
);
}
finally
{
// 清理
if
(
hasDubboTag
)
{
DubboRouterTagContextHolder
.
clear
();
}
}
}
}
}
}
}
...
...
common/mall-spring-boot-starter-dubbo/src/main/java/cn/iocoder/mall/dubbo/core/router/DubboRouterTagContextHolder.java
浏览文件 @
92c2d79d
package
cn
.
iocoder
.
mall
.
dubbo
.
core
.
router
;
package
cn
.
iocoder
.
mall
.
dubbo
.
core
.
router
;
import
cn.iocoder.mall.dubbo.core.filter.DubboProviderRouterTagFilter
;
/**
/**
* Dubbo 路由 Tag 的上下文
* Dubbo 路由 Tag 的上下文
*
*
* @see
cn.iocoder.mall.dubbo.core.filter.Dubbo
RouterTagFilter
* @see
DubboProvider
RouterTagFilter
* @see cn.iocoder.mall.dubbo.core.web.DubboRouterTagWebInterceptor
* @see cn.iocoder.mall.dubbo.core.web.DubboRouterTagWebInterceptor
*/
*/
public
class
DubboRouterTagContextHolder
{
public
class
DubboRouterTagContextHolder
{
...
...
common/mall-spring-boot-starter-dubbo/src/main/java/cn/iocoder/mall/dubbo/core/web/DubboRouterTagWebInterceptor.java
浏览文件 @
92c2d79d
package
cn
.
iocoder
.
mall
.
dubbo
.
core
.
web
;
package
cn
.
iocoder
.
mall
.
dubbo
.
core
.
web
;
import
cn.iocoder.common.framework.util.StringUtils
;
import
cn.iocoder.common.framework.util.StringUtils
;
import
cn.iocoder.mall.dubbo.core.cluster.interceptor.DubboConsumerRouterTagClusterInterceptor
;
import
cn.iocoder.mall.dubbo.core.filter.DubboProviderRouterTagFilter
;
import
cn.iocoder.mall.dubbo.core.router.DubboRouterTagContextHolder
;
import
cn.iocoder.mall.dubbo.core.router.DubboRouterTagContextHolder
;
import
org.apache.dubbo.common.constants.CommonConstants
;
import
org.apache.dubbo.rpc.RpcContext
;
import
org.springframework.web.servlet.HandlerInterceptor
;
import
org.springframework.web.servlet.HandlerInterceptor
;
import
org.springframework.web.servlet.ModelAndView
;
import
org.springframework.web.servlet.ModelAndView
;
...
@@ -11,7 +15,8 @@ import javax.servlet.http.HttpServletResponse;
...
@@ -11,7 +15,8 @@ import javax.servlet.http.HttpServletResponse;
/**
/**
* Dubbo 路由标签的 Web 拦截器,将请求 Header 中的 {@link #HEADER_DUBBO_TAG} 设置到 {@link DubboRouterTagContextHolder} 中。
* Dubbo 路由标签的 Web 拦截器,将请求 Header 中的 {@link #HEADER_DUBBO_TAG} 设置到 {@link DubboRouterTagContextHolder} 中。
*
*
* @see cn.iocoder.mall.dubbo.core.filter.DubboRouterTagFilter
* @see DubboProviderRouterTagFilter
* @see DubboConsumerRouterTagClusterInterceptor
*/
*/
public
class
DubboRouterTagWebInterceptor
implements
HandlerInterceptor
{
public
class
DubboRouterTagWebInterceptor
implements
HandlerInterceptor
{
...
@@ -22,6 +27,7 @@ public class DubboRouterTagWebInterceptor implements HandlerInterceptor {
...
@@ -22,6 +27,7 @@ public class DubboRouterTagWebInterceptor implements HandlerInterceptor {
String
tag
=
request
.
getHeader
(
HEADER_DUBBO_TAG
);
String
tag
=
request
.
getHeader
(
HEADER_DUBBO_TAG
);
if
(
StringUtils
.
hasText
(
tag
))
{
if
(
StringUtils
.
hasText
(
tag
))
{
DubboRouterTagContextHolder
.
setTag
(
tag
);
DubboRouterTagContextHolder
.
setTag
(
tag
);
RpcContext
.
getContext
().
setAttachment
(
CommonConstants
.
TAG_KEY
,
tag
);
}
}
return
true
;
return
true
;
}
}
...
...
common/mall-spring-boot-starter-dubbo/src/main/resources/META-INF/dubbo/com.alibaba.dubbo.rpc.Filter
浏览文件 @
92c2d79d
dubboExceptionFilter=cn.iocoder.mall.dubbo.core.filter.DubboProviderExceptionFilter
dubboExceptionFilter=cn.iocoder.mall.dubbo.core.filter.DubboProviderExceptionFilter
dubbo
RouterTagFilter=cn.iocoder.mall.dubbo.core.filter.Dubbo
RouterTagFilter
dubbo
ProviderRouterTagFilter=cn.iocoder.mall.dubbo.core.filter.DubboProvider
RouterTagFilter
common/mall-spring-boot-starter-dubbo/src/main/resources/META-INF/dubbo/org.apache.dubbo.rpc.cluster.interceptor.ClusterInterceptor
0 → 100644
浏览文件 @
92c2d79d
dubboConsumerRouterTagClusterInterceptor=cn.iocoder.mall.dubbo.core.cluster.interceptor.DubboConsumerRouterTagClusterInterceptor
mall-dependencies/pom.xml
浏览文件 @
92c2d79d
...
@@ -41,7 +41,7 @@
...
@@ -41,7 +41,7 @@
<mybatis-plus.version>
3.1.1
</mybatis-plus.version>
<mybatis-plus.version>
3.1.1
</mybatis-plus.version>
<spring-boot-starter-data-jest.version>
3.2.5.RELEASE
</spring-boot-starter-data-jest.version>
<spring-boot-starter-data-jest.version>
3.2.5.RELEASE
</spring-boot-starter-data-jest.version>
<!-- RPC 相关 -->
<!-- RPC 相关 -->
<dubbo.version>
2.7.
6
</dubbo.version>
<dubbo.version>
2.7.
7
</dubbo.version>
<!-- Job 相关 -->
<!-- Job 相关 -->
<xxl-job.version>
2.0.1
</xxl-job.version>
<xxl-job.version>
2.0.1
</xxl-job.version>
<!-- Transaction 相关 -->
<!-- Transaction 相关 -->
...
...
management-web-app/src/main/resources/application-local.yml
浏览文件 @
92c2d79d
...
@@ -11,4 +11,10 @@ spring:
...
@@ -11,4 +11,10 @@ spring:
dubbo
:
dubbo
:
# Dubbo 注册中心
# Dubbo 注册中心
registry
:
registry
:
address
:
spring-cloud://400-infra.server.iocoder.cn:8848
# 指定 Dubbo 服务注册中心的地址
# address: spring-cloud://400-infra.server.iocoder.cn:8848 # 指定 Dubbo 服务注册中心的地址
# address: nacos://400-infra.server.iocoder.cn:8848?namespace=local # 指定 Dubbo 服务注册中心的地址
protocol
:
nacos
address
:
400-infra.server.iocoder.cn:8848?namespace=local
timeout
:
20000
register
:
true
subscribe
:
true
system-service-project/system-service-app/src/main/java/cn/iocoder/mall/systemservice/SystemServiceApplication.java
浏览文件 @
92c2d79d
...
@@ -2,12 +2,14 @@ package cn.iocoder.mall.systemservice;
...
@@ -2,12 +2,14 @@ package cn.iocoder.mall.systemservice;
import
org.springframework.boot.SpringApplication
;
import
org.springframework.boot.SpringApplication
;
import
org.springframework.boot.autoconfigure.SpringBootApplication
;
import
org.springframework.boot.autoconfigure.SpringBootApplication
;
import
org.springframework.context.ConfigurableApplicationContext
;
@SpringBootApplication
@SpringBootApplication
public
class
SystemServiceApplication
{
public
class
SystemServiceApplication
{
public
static
void
main
(
String
[]
args
)
{
public
static
void
main
(
String
[]
args
)
{
SpringApplication
.
run
(
SystemServiceApplication
.
class
,
args
);
ConfigurableApplicationContext
context
=
SpringApplication
.
run
(
SystemServiceApplication
.
class
,
args
);
System
.
out
.
println
(
context
);
}
}
}
}
system-service-project/system-service-app/src/main/resources/application-local.yaml
浏览文件 @
92c2d79d
...
@@ -17,4 +17,5 @@ spring:
...
@@ -17,4 +17,5 @@ spring:
dubbo
:
dubbo
:
# Dubbo 注册中心
# Dubbo 注册中心
registry
:
registry
:
address
:
spring-cloud://400-infra.server.iocoder.cn:8848
# 指定 Dubbo 服务注册中心的地址
# address: spring-cloud://400-infra.server.iocoder.cn:8848 # 指定 Dubbo 服务注册中心的地址
address
:
nacos://400-infra.server.iocoder.cn:8848?namespace=local
# 指定 Dubbo 服务注册中心的地址
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论