From 658284bed3e18520cfdca1c771ee646f465c5e7e Mon Sep 17 00:00:00 2001 From: Uncarbon <75737767+uncarbon97@users.noreply.github.com> Date: Mon, 8 Nov 2021 10:34:37 +0800 Subject: [PATCH] =?UTF-8?q?docs=20=E8=A1=A5=E5=85=85Dubbo=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sa-token-doc/doc/plugin/dubbo-extend.md | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/sa-token-doc/doc/plugin/dubbo-extend.md b/sa-token-doc/doc/plugin/dubbo-extend.md index 82c949de..a372d09c 100644 --- a/sa-token-doc/doc/plugin/dubbo-extend.md +++ b/sa-token-doc/doc/plugin/dubbo-extend.md @@ -60,7 +60,7 @@ RPC 模式的调用,可以让我们像调用本地方法一样完成服务通 我们有两种方式完成整合。 -##### 方式一、使用配置 +##### 方式一、使用配置(推荐) 直接在 `application.yml` 配置即可: @@ -70,8 +70,14 @@ sa-token: check-id-token: true ``` +成功后, [ 被调用端 ] 可以自由使用 `StpUtil` 中的方法,如: +``` java +String appId = StpUtil.getSession().get("appId"); +``` + ##### 方式二、自建 Dubbo 过滤器校验 +> 适用于需要另外传递自定义附加数据( attachment )的情况 1、在 [ 调用端 ] 的 `\resources\META-INF\dubbo\` 目录新建 `org.apache.dubbo.rpc.Filter` 文件 ``` html @@ -99,7 +105,9 @@ public class DubboConsumerFilter implements Filter { public Result invoke(Invoker invoker, Invocation invocation) throws RpcException { // 追加 Id-Token 参数 - RpcContext.getContext().setAttachment(SaIdUtil.ID_TOKEN, SaIdUtil.getToken()); + RpcContext.getContext().setAttachment(SaIdUtil.ID_TOKEN, SaIdUtil.getToken()); + // 如果有其他自定义附加数据,如租户 + // RpcContext.getContext().setAttachment("tenantContext", tenantContextBO); // 开始调用 return invoker.invoke(invocation); @@ -138,6 +146,9 @@ public class DubboProviderFilter implements Filter { String idToken = invocation.getAttachment(SaIdUtil.ID_TOKEN); SaIdUtil.checkToken(idToken); + // 取出其他自定义附加数据 + // TenantContext tenantContext = invocation.getAttachment("tenantContext"); + // 开始调用 return invoker.invoke(invocation); } @@ -148,3 +159,12 @@ public class DubboProviderFilter implements Filter { 然后我们就可以进行安全的 RPC 调用了,不带有 Id-Token 参数的调用都会抛出异常,无法调用成功。 +### 题外话 +一定程度上来说,这样使得Dubbo调用变成“有状态”了。若项目或团队风格有要求,使用“无状态”的调用方式也未尝不可,只是略显繁琐,如: +``` java +// 取C端用户信用 +appMemberDubboService.getCredit(UserContext currentUser, TenantContext tenantContext); + +// 后台管理分页列表支付订单 +paymentOrderDubboService.adminPage(UserContext currentUser, TenantContext tenantContext, PageParam pageParam, AdminPagePaymentOrderDTO dto); +``` \ No newline at end of file