如何在凡科上做网站,wordpress源码最新,网站开发算固定资产,做网站赚钱 优帮云dubbo开启token服务后#xff0c;使用集群容错策略为FailoverClusterInvoker#xff0c;当出现服务调用失败进行转移#xff0c;重试其它服务器时#xff0c;会出现token invalid错误#xff0c;provider会拒绝服务调用。
原因#xff1a;
消费端#xff1a;
1、com.…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);}InvokerT 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}MapString, 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 HashMapString, 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();MapString, 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是一致的 telnetinvoke,status,replacetokentimeout1000timestamp1418813410249token020f16e2-e060-4c85-a31a-017aa0ee268cversion1.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 [id27484, version2.0.0, twowaytrue, eventfalse, brokenfalse, dataRpcInvocation […], attachments{token020f16e2-e060-4c85-a31a-017aa0ee268c,
。。。。。。。 2、失败重连此时附件token与url的不一致 …pid29465revision1.0.1sideconsumerstatusspring,loadtelnetinvoke,status,replacetokentimeout1000timestamp1418813410249 token0f3103ad-ac7b-4906-897c-b51e69ab3b96version1.0 - RpcInvocation […], attachments{token020f16e2-e060-4c85-a31a-017aa0ee268c, 。。。。。。。 3、出现token invalid com.alibaba.dubbo.rpc.RpcException: Invalid token! Forbid invoke remote service interface
可以将token设置为false解决