日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Dubbo调用时报错Invalid token Forbid invoke remote service interface

發布時間:2024/8/23 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Dubbo调用时报错Invalid token Forbid invoke remote service interface 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

dubbo開啟token服務后,使用集群容錯策略為FailoverClusterInvoker,當出現服務調用失敗進行轉移,重試其它服務器時,會出現token invalid錯誤,provider會拒絕服務調用。

原因:

消費端:

1、com.alibaba.dubbo.rpc.cluster.support.FailoverClusterInvoker#doInvoke:

for (int i = 0; i < len; i++) {//重試時,進行重新選擇,避免重試時invoker列表已發生變化.//注意:如果列表發生了變化,那么invoked判斷會失效,因為invoker示例已經改變if (i > 0) {checkWheatherDestoried();copyinvokers = list(invocation);//重新檢查一下checkInvokers(copyinvokers, invocation);}Invoker<T> invoker = select(loadbalance, invocation, copyinvokers, invoked);invoked.add(invoker);RpcContext.getContext().setInvokers((List)invoked);try {if (le != null && logger.isWarnEnabled()) {logger.warn("Although retry the method " + invocation.getMethodName()+ " in the service " + getInterface().getName()+ " was successful by the provider " + invoker.getUrl().getAddress()+ ", but there have been failed providers " + providers + " (" + providers.size() + "/" + copyinvokers.size()+ ") from the registry " + directory.getUrl().getAddress()+ " on the consumer " + NetUtils.getLocalHost()+ " using the dubbo version " + Version.getVersion() + ". Last error is: "+ le.getMessage(), le);}return result;} catch (RpcException e) {if (e.isBiz()) { // biz exception.throw e;}le = e;} catch (Throwable e) {le = new RpcException(e.getMessage(), e);} finally {providers.add(invoker.getUrl().getAddress());}

2、com.alibaba.dubbo.rpc.protocol.AbstractInvoker#invoke

RpcInvocation invocation = (RpcInvocation) inv;invocation.setInvoker(this);if (attachment != null && attachment.size() > 0) {invocation.addAttachmentsIfAbsent(attachment); //添加相關參數到附件attachments,如token}Map<String, String> context = RpcContext.getContext().getAttachments();if (context != null) {invocation.addAttachmentsIfAbsent(context);}

3、addAttachmentsIfAbsent實現:

public void setAttachmentIfAbsent(String key, String value) {if (attachments == null) {attachments = new HashMap<String, String>();}if (! attachments.containsKey(key)) { //key不存在時才進行賦值,因此不能進行覆蓋操作attachments.put(key, value);}}

服務提供方:

public class TokenFilter implements Filter {public Result invoke(Invoker<?> invoker, Invocation inv)throws RpcException {String token = invoker.getUrl().getParameter(Constants.TOKEN_KEY);if (ConfigUtils.isNotEmpty(token)) {Class<?> serviceType = invoker.getInterface();Map<String, String> attachments = inv.getAttachments();//解析attachments String remoteToken = attachments == null ? null : attachments.get(Constants.TOKEN_KEY);if (! token.equals(remoteToken)) {throw new RpcException("Invalid token! Forbid invoke remote service " + serviceType + " method " + inv.getMethodName() + "() from consumer " + RpcContext.getContext().getRemoteHost() + " to provider " + RpcContext.getContext().getLocalHost());}}return invoker.invoke(inv);}}

通過上面的代碼分析可知,當消費者調用服務方服務出現超時進行失敗重連時,要重連的Invoker的token沒有覆蓋上一次的invoker的token,而服務端比較token時比較的是attachment, 進而出現token invalid錯誤。相當于失敗重連無效.

錯誤現象:

1、請求超時,此時token是一致的
telnet=invoke,status,replacetoken&timeout=1000&timestamp=1418813410249&token=020f16e2-e060-4c85-a31a-017aa0ee268c&version=1.0, cause: Waiting server-side response timeout. start time: 2014-12-17 21:42:26.735, end time: 2014-12-17 21:42:27.736, client elapsed: 0 ms, server elapsed: 1001 ms, timeout: 1000 ms, request: Request [id=27484, version=2.0.0, twoway=true, event=false, broken=false, data=RpcInvocation […], attachments={token=020f16e2-e060-4c85-a31a-017aa0ee268c,

。。。。。。。
2、失敗重連,此時附件token與url的不一致
…&pid=29465&revision=1.0.1&side=consumer&status=spring,load&telnet=invoke,status,replacetoken&timeout=1000&timestamp=1418813410249
&token=0f3103ad-ac7b-4906-897c-b51e69ab3b96&version=1.0 -> RpcInvocation […],
attachments={token=020f16e2-e060-4c85-a31a-017aa0ee268c,
。。。。。。。
3、出現token invalid
com.alibaba.dubbo.rpc.RpcException: Invalid token! Forbid invoke remote service interface

可以將token設置為false解決

總結

以上是生活随笔為你收集整理的Dubbo调用时报错Invalid token Forbid invoke remote service interface的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。