Forbid consumer...Please check registry access list(whitelist/blacklis)

5305 ワード

最近プロジェクトをしている時に、デバッグするので、直結dubboを選びました
公式ドキュメントによる構成
次のように構成されています.
 
<dubbo:reference id="xxxService" interface="com.alibaba.xxx.XxxService" url="dubbo://localhost:20890" />

しかし、使用時にはエラーが報告され、スタック情報は以下の通りです.
 
 
com.alibaba.dubbo.rpc.RpcException: Forbid consumer xx.xx.xx.xx access service xx.xx.xxx.xxx.xxx.xxx from registry 127.0.0.1:2181 use dubbo version 2.5.3, Please check registry access list (whitelist/blacklist).
	at com.alibaba.dubbo.registry.integration.RegistryDirectory.doList(RegistryDirectory.java:579) ~[dubbo-2.5.3.jar:2.5.3]
	at com.alibaba.dubbo.rpc.cluster.directory.AbstractDirectory.list(AbstractDirectory.java:73) ~[dubbo-2.5.3.jar:2.5.3]
	at com.alibaba.dubbo.rpc.cluster.support.AbstractClusterInvoker.list(AbstractClusterInvoker.java:260) ~[dubbo-2.5.3.jar:2.5.3]
	at com.alibaba.dubbo.rpc.cluster.support.AbstractClusterInvoker.invoke(AbstractClusterInvoker.java:219) ~[dubbo-2.5.3.jar:2.5.3]
	at com.alibaba.dubbo.rpc.cluster.support.wrapper.MockClusterInvoker.invoke(MockClusterInvoker.java:72) ~[dubbo-2.5.3.jar:2.5.3]
	at com.alibaba.dubbo.rpc.proxy.InvokerInvocationHandler.invoke(InvokerInvocationHandler.java:52) ~[dubbo-2.5.3.jar:2.5.3]
	at com.alibaba.dubbo.common.bytecode.proxy2.refundOrderAllMoney(proxy2.java) ~[na:2.5.3]
	at .....

 直結しているのではないでしょうか.どうして登録センターがあるのですか.
 
 
チェック:
公式に与えられた配置は間違いないでしょう.Demoプログラムを構築し、上記の構成に従ってサービスプロバイダに直接接続し、接続に成功し、エラーは発生しませんでした.では問題は私のコードにあります
dubboプロファイルとエラーログをよくチェックして、やっと問題を発見しました:同じサービスで2回定義しました!!!そのうちの1つだけが直結を構成し、もう1つは直結を構成していないので、登録センターに行ってサービスを探して、登録センターにサービスがなければ自然に間違っています.
 
解決:
重複するサービス参照を削除し、問題を解決
 
その他:
コードの繰り返しによる問題は私はもう3回も出会ったことがあるので、毎回卵が痛くて、コードを見て死んでも問題が見えません.問題コードが全然そこにないからです.だから、今度このコードに遭遇したら明らかに大丈夫ですが、実行結果に問題がある場合は、コード重複の問題があるかどうかを調べることも考えられます.コードが実行されているのは別の場所かもしれません.
コード繰返しには、コードメソッド定義繰返し、構成繰返し、クラスロード繰返し、コードバージョンエラーなどが含まれます.
 
 
---------------------------------------------------------------------------------------------------
(下のこの塊は見なくてもいいですが、もともと拡張点を書こうと思っていたのですが、書いてあると何を書いているのか分かりません)
ネット上で1つのドキュメントがあります:《dubboソースコード解析2.0.pdf》はとても詳しく書いて、dubboの実現を理解したいのはこのドキュメントを見ることができます
拡張:
直結式はどうやってできたのですか?登録センターをスキップするにはどうすればいいですか?
1)ダイレクトサービスプロバイダを配置する場合
ReferenceConfig.createProxyメソッドで戻ってurlが指定されているかどうかを判断します
 
if (url != null && url.length() > 0) { //     URL,   URL          ,        URL
                String[] us = Constants.SEMICOLON_SPLIT_PATTERN.split(url);
                if (us != null && us.length > 0) {
                    for (String u : us) {
                        URL url = URL.valueOf(u);
                        if (url.getPath() == null || url.getPath().length() == 0) {
                            url = url.setPath(interfaceName);
                        }
                        if (Constants.REGISTRY_PROTOCOL.equals(url.getProtocol())) {
                            urls.add(url.addParameterAndEncoded(Constants.REFER_KEY, StringUtils.toQueryString(map)));
                        } else {
                            urls.add(ClusterUtils.mergeUrl(url, map));
                        }
                    }
                }
            }

 仮に、urlが1つしか指定されておらず、このurlが登録センターのurlではない場合、このコードを実行するとurlsにはurlが1つしか指定されておらず、指定されたサービスプロバイダのアドレスの直後に上のコードが下にあるとします.
 
 
if (urls.size() == 1) {
        invoker = refprotocol.refer(interfaceClass, urls.get(0));
    }

 
このときのrefprotocol.referがエージェントクラスで実行されるとurlに従って対応するProtocolにマッチします.
ダイレクトサービスプロバイダの場合、ここで構成したurlはdubbo://xx.xxx.xxx.xxx:xxxx;では、彼のプロトコルはdubboで、対応するDubboProtocolクラスを見つけてreferメソッドを実行し、DubboProtocolメソッドではurlに基づいてクライアントを作成し、Invokeを生産します.
 
2)ダイレクトサービスプロバイダが設定されていない
ダイレクト・サービス・プロバイダが構成されていない場合、ReferenceConfig.createProxyメソッドで実行されるパスです.
else { //           URL
   List<URL> us = loadRegistries(false);
   if (us != null && us.size() > 0) {
       for (URL u : us) {
           URL monitorUrl = loadMonitor(u);
            if (monitorUrl != null) {
                map.put(Constants.MONITOR_KEY, URL.encode(monitorUrl.toFullString()));
            }
           urls.add(u.addParameterAndEncoded(Constants.REFER_KEY, StringUtils.toQueryString(map)));
        }
   }
   if (urls == null || urls.size() == 0) {
        throw new IllegalStateException("No such any registry to reference " + interfaceName  + " on the consumer " + NetUtils.getLocalHost() + " use dubbo version " + Version.getVersion() + ", please config <dubbo:registry address=\"...\" /> to your spring config.");
    }
}

  登録センターから利用可能なサービスプロバイダのurlを取得し、取得した後、これらのサービスプロバイダのurlを順番にreferし、接続を作成し、invoker